Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-25 02:51 UTC

cnizzardini / cakephp-swagger-bake

Automatically generate OpenAPI, Swagger, and Redoc documentation from your existing CakePHP code.

PHPMIT★ 60 Sterne⑂ 24 Forksseit Apr. 2020Auf GitHub ansehen ↗

cnizzardini/cakephp-swagger-bake erreicht einen Gesundheitsindex von 59 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Engineering Quality (80/100) ab, am schwächsten bei Security (35/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

59
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

59
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

Chris NizzardiniPersönliches Konto
38 Follower29 öffentliche Reposseit Dez. 2009

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
Packagistcnizzardini/cakephp-swagger-bakev3.3.610.160111vor 94 Tagencakephp-swaggercake-swaggercakephp5-swaggercakephp-openapicakephp5-openapicake-openapi

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

62Mittel · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
4.2/36Commit-Rhythmus — 6/52 Wochen mit Commits
7.6/18Commit-Volumen — 6 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Verwendete Eingangsdaten
commits_last_year6
human_commit_share1
days_since_last_push0
active_weeks_last_year6
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 100 Releases veröffentlicht
27/36Release-Aktualität — letztes Release vor 94 Tagen
19.8/27Release-Rhythmus — ein Release etwa alle 63 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count100
latest_release_tagv3.3.6
releases_from_tagsnein
days_since_latest_release94
mean_days_between_releases63
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

49Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
28.7/60Stars — 60 Stars
11.3/25Forks — 24 Forks
3.9/15Watcher — 6 Watcher
Verwendete Eingangsdaten
forks24
stars60
watchers6
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
53.4/80Downloads pro Monat — 10.160 Downloads/Monat über packagist
3.2/20Abhängige in der Registry — 2 Pakete hängen davon ab
Verwendete Eingangsdaten
packagescnizzardini/cakephp-swagger-bake
dependents2
ecosystemspackagist
total_downloads200.027
monthly_downloads10.160

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

63Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0.5/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 98 % der Commits
13.5/13.5Breite der Beitragenden — 13 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled13
top_contributor_share0,976
Wie die Bewertung erfolgt
46.6/46.8Issue-Lösungsquote — 100 % der Issues geschlossen
35/38.3PR-Annahme — 291/318 entschiedene PRs gemergt
3/15OpenSSF Scorecard: Code-Review — Found 8/30 approved changesets -- score normalized to 2
Verwendete Eingangsdaten
merged_prs291
open_issues1
closed_issues262
issue_closed_ratio0,996
closed_unmerged_prs27
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
11.4/25Reichweite des Inhabers — 38 Follower von cnizzardini
22.8/25Kontohistorie — 29 öffentliche Repos, Kontoalter ca. 16 Jahre
Verwendete Eingangsdaten
followers38
owner_typeUser
is_verified
owner_logincnizzardini
public_repos29
account_age_days6.057
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf packagist
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 94 Tagen
20/20Versionshistorie — 111 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagescnizzardini/cakephp-swagger-bake
ecosystemspackagist
any_deprecatednein
min_days_since_publish94

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

80Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 2 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — phpcs.xml, phpstan.neon
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
2/20OpenSSF Scorecard: CI-Tests — 5 out of 28 merged PRs checked by a CI test -- score normalized to 1
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_confignein

Dokumentation

100Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — http://cakephpswaggerbake.cnizz.com/
10/10Repository-Beschreibung
10/10Topics — 10 Topics
10/10Wiki
Verwendete Eingangsdaten
topicscakephp, cakephp4, cakephp-plugin, cake-plugin, swagger-ui, swagger-documentation, swagger-bake, openapi, cakephp-api, redoc
has_wikija
homepagehttp://cakephpswaggerbake.cnizz.com/
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

35Gefährdet · 16 % des Gesamtindex

Sicherheitslage

35Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — keine Daten
0.2/2.5CI-Tests — 5 out of 28 merged PRs checked by a CI test -- score normalized to 1
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
1.5/7.5Code-Review — Found 8/30 approved changesets -- score normalized to 2
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
0/7.5Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
0/5Packaging — keine Daten
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3,5
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): branch_protection, packaging, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

39Gefährdet · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
37.9/40Lesbare Commit-Historie — 71 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,71
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — phpcs.xml, phpstan.neon
0/11Statische Typprüfung
0/10Reproduzierbare Umgebung
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfilenein
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — PHP ohne Typprüfungs-Konfiguration
54/55Handhabbare Dateigrößen — 4/219 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePHP
largest_source_bytes1.400.569
source_files_sampled219
oversized_source_files4
Wie die Bewertung erfolgt
40/40API-Schema (OpenAPI/GraphQL/proto) — assets/swagger.yml, tests/test_app/config/swagger.yml
0/20MCP-Server
0/40Lauffähige Beispiele
Verwendete Eingangsdaten
example_dirs
has_mcp_signalnein
api_schema_filesassets/swagger.yml, tests/test_app/config/swagger.yml

Eckdaten

60GitHub-Sterne
13Mitwirkende
6Commits, letzte 12 Monate
0Tage seit letztem Push
100Releases
1Bus-Faktor
1offene Issues
PackagistPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • No resolved dependencies carried a version and a supported ecosystem

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 24 ⇿
0Sterne
24Forks
92Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

048121620242422020-052023-012025-10
Major 2Minor 13Patch 77

Jeder Punkt umfasst 5 Tage.

OpenSSF Scorecard 3.5 / 10
3.5Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-25 02:51 UTC

10Binary-Artifactsno binaries found in the repo
k. A.Branch-Protectioninternal 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
1CI-Tests5 out of 28 merged PRs checked by a CI test -- score normalized to 1
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
2Code-ReviewFound 8/30 approved changesets -- score normalized to 2
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintained0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direkte Abhängigkeiten 3
RegistryPaketVersionsvorgabeManifest
Packagistcakephp/cakephp^5.0composer.json
Packagistsymfony/yaml^5.0composer.json
Packagistmixerapi/core^2.0composer.json
Alle Abhängigkeiten 14

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 3 direkte und 11 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
Packagistcakephp/cakephpdirekt
Packagistmixerapi/coredirekt
Packagistsymfony/yamldirekt
Packagistcakephp/authenticationindirekt
Packagistcakephp/bakeindirekt
Packagistcakephp/cakephp-codesnifferindirekt
Packagistcakephp/debug_kitindirekt
Packagistcakephp/migrationsindirekt
Packagistfriendsofcake/searchindirekt
Packagistphpindirekt
Packagistphpdocumentor/reflection-docblockindirekt
Packagistphpmd/phpmdindirekt
Packagistphpstan/phpstanindirekt
Packagistphpunit/phpunitindirekt
Abhängigkeits-Advisories nicht bewertet

Der Advisory-Abgleich konnte für diesen Bericht nicht ausgeführt werden: No resolved dependencies carried a version and a supported ecosystem

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "cakephp",
        "cakephp4",
        "cakephp-plugin",
        "cake-plugin",
        "swagger-ui",
        "swagger-documentation",
        "swagger-bake",
        "openapi",
        "cakephp-api",
        "redoc"
      ],
      "is_fork": false,
      "size_kb": 8782,
      "has_wiki": true,
      "homepage": "http://cakephpswaggerbake.cnizz.com/",
      "languages": {
        "PHP": 636332,
        "HTML": 2431,
        "Twig": 6444
      },
      "pushed_at": "2026-07-25T02:48:27Z",
      "created_at": "2020-04-10T23:27:29Z",
      "owner_type": "User",
      "updated_at": "2026-04-22T01:36:51Z",
      "description": "Automatically generate OpenAPI, Swagger, and Redoc documentation from your existing CakePHP code.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "PHP",
      "significant_languages": [
        "PHP"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Chris Nizzardini",
      "type": "User",
      "login": "cnizzardini",
      "company": null,
      "location": "Erase Borders",
      "followers": 38,
      "avatar_url": "https://avatars.githubusercontent.com/u/171294?v=4",
      "created_at": "2009-12-23T07:21:12Z",
      "is_verified": null,
      "public_repos": 29,
      "account_age_days": 6057
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v3.3.6",
          "kind": "patch",
          "published_at": "2026-04-22T01:40:15Z"
        },
        {
          "tag": "v3.3.5",
          "kind": "patch",
          "published_at": "2026-02-15T15:55:37Z"
        },
        {
          "tag": "v3.3.4",
          "kind": "patch",
          "published_at": "2025-10-29T21:31:09Z"
        },
        {
          "tag": "v3.3.3",
          "kind": "patch",
          "published_at": "2025-10-19T21:52:37Z"
        },
        {
          "tag": "v3.3.2",
          "kind": "patch",
          "published_at": "2025-10-12T15:30:33Z"
        },
        {
          "tag": "v3.3.1",
          "kind": "patch",
          "published_at": "2025-04-11T02:09:45Z"
        },
        {
          "tag": "v3.3.0",
          "kind": "minor",
          "published_at": "2025-04-06T14:42:54Z"
        },
        {
          "tag": "v3.2.0",
          "kind": "minor",
          "published_at": "2025-04-05T21:43:49Z"
        },
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2025-03-28T19:38:39Z"
        },
        {
          "tag": "v2.5.10",
          "kind": "patch",
          "published_at": "2024-10-02T02:17:38Z"
        },
        {
          "tag": "v3.0.5",
          "kind": "patch",
          "published_at": "2024-10-02T02:18:03Z"
        },
        {
          "tag": "v3.0.4",
          "kind": "patch",
          "published_at": "2024-06-28T12:00:21Z"
        },
        {
          "tag": "v3.0.3",
          "kind": "patch",
          "published_at": "2024-05-15T12:13:10Z"
        },
        {
          "tag": "v3.0.2",
          "kind": "patch",
          "published_at": "2024-05-11T01:22:33Z"
        },
        {
          "tag": "v3.0.1",
          "kind": "patch",
          "published_at": "2024-02-25T15:16:09Z"
        },
        {
          "tag": "v2.5.9",
          "kind": "patch",
          "published_at": "2024-02-19T19:56:01Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2024-01-11T02:08:47Z"
        },
        {
          "tag": "v2.5.8",
          "kind": "patch",
          "published_at": "2023-10-17T03:19:07Z"
        },
        {
          "tag": "v2.5.7",
          "kind": "patch",
          "published_at": "2023-06-14T02:08:34Z"
        },
        {
          "tag": "v2.5.6",
          "kind": "patch",
          "published_at": "2023-06-06T16:11:05Z"
        },
        {
          "tag": "v2.5.5",
          "kind": "patch",
          "published_at": "2023-05-25T02:24:22Z"
        },
        {
          "tag": "v2.5.4",
          "kind": "patch",
          "published_at": "2023-03-08T22:31:12Z"
        },
        {
          "tag": "v2.5.3",
          "kind": "patch",
          "published_at": "2023-02-12T15:15:39Z"
        },
        {
          "tag": "v2.5.2",
          "kind": "patch",
          "published_at": "2023-01-05T23:01:38Z"
        },
        {
          "tag": "v2.5.1",
          "kind": "patch",
          "published_at": "2022-12-14T14:17:36Z"
        },
        {
          "tag": "v1.7.11",
          "kind": "patch",
          "published_at": "2022-12-02T16:42:32Z"
        },
        {
          "tag": "v1.7.10",
          "kind": "patch",
          "published_at": "2022-11-27T13:37:05Z"
        },
        {
          "tag": "v2.5.0",
          "kind": "minor",
          "published_at": "2022-11-18T23:10:48Z"
        },
        {
          "tag": "v2.4.11",
          "kind": "patch",
          "published_at": "2022-11-16T12:48:36Z"
        },
        {
          "tag": "v2.4.10",
          "kind": "patch",
          "published_at": "2022-10-29T18:25:32Z"
        },
        {
          "tag": "v1.7.9",
          "kind": "patch",
          "published_at": "2022-10-29T18:13:15Z"
        },
        {
          "tag": "v2.4.9",
          "kind": "patch",
          "published_at": "2022-10-02T03:46:27Z"
        },
        {
          "tag": "v2.4.8",
          "kind": "patch",
          "published_at": "2022-09-05T20:15:51Z"
        },
        {
          "tag": "v2.4.7",
          "kind": "patch",
          "published_at": "2022-09-05T04:13:14Z"
        },
        {
          "tag": "v2.4.6",
          "kind": "patch",
          "published_at": "2022-09-03T16:58:45Z"
        },
        {
          "tag": "v2.4.5",
          "kind": "patch",
          "published_at": "2022-08-31T14:24:46Z"
        },
        {
          "tag": "v2.4.4",
          "kind": "patch",
          "published_at": "2022-08-24T18:36:49Z"
        },
        {
          "tag": "v2.4.3",
          "kind": "patch",
          "published_at": "2022-08-11T20:11:28Z"
        },
        {
          "tag": "v1.7.8",
          "kind": "patch",
          "published_at": "2022-08-11T11:40:34Z"
        },
        {
          "tag": "v2.4.2",
          "kind": "patch",
          "published_at": "2022-07-17T15:16:36Z"
        },
        {
          "tag": "v2.4.1",
          "kind": "patch",
          "published_at": "2022-07-09T14:55:51Z"
        },
        {
          "tag": "v1.7.7",
          "kind": "patch",
          "published_at": "2022-07-16T00:09:03Z"
        },
        {
          "tag": "v2.4.0",
          "kind": "minor",
          "published_at": "2022-06-23T00:46:46Z"
        },
        {
          "tag": "v2.3.0",
          "kind": "minor",
          "published_at": "2022-06-09T00:08:39Z"
        },
        {
          "tag": "v2.2.13",
          "kind": "patch",
          "published_at": "2022-05-25T23:19:13Z"
        },
        {
          "tag": "v2.2.12",
          "kind": "patch",
          "published_at": "2022-04-23T12:28:54Z"
        },
        {
          "tag": "v2.2.11",
          "kind": "patch",
          "published_at": "2022-04-03T16:11:10Z"
        },
        {
          "tag": "v2.2.10",
          "kind": "patch",
          "published_at": "2022-04-01T22:30:24Z"
        },
        {
          "tag": "v2.2.9",
          "kind": "patch",
          "published_at": "2022-03-28T21:25:19Z"
        },
        {
          "tag": "v2.2.8",
          "kind": "patch",
          "published_at": "2022-03-09T03:13:38Z"
        },
        {
          "tag": "v2.2.7",
          "kind": "patch",
          "published_at": "2022-03-04T00:34:20Z"
        },
        {
          "tag": "v2.2.6",
          "kind": "patch",
          "published_at": "2022-02-21T14:16:27Z"
        },
        {
          "tag": "v2.2.5",
          "kind": "patch",
          "published_at": "2022-02-19T22:00:45Z"
        },
        {
          "tag": "v2.2.4",
          "kind": "patch",
          "published_at": "2022-02-19T00:30:59Z"
        },
        {
          "tag": "v2.2.3",
          "kind": "patch",
          "published_at": "2022-02-19T00:07:27Z"
        },
        {
          "tag": "v2.2.2",
          "kind": "patch",
          "published_at": "2022-02-04T00:26:16Z"
        },
        {
          "tag": "v2.2.1",
          "kind": "patch",
          "published_at": "2022-02-02T12:17:28Z"
        },
        {
          "tag": "v2.2.0",
          "kind": "minor",
          "published_at": "2022-02-01T00:50:35Z"
        },
        {
          "tag": "v2.1.2",
          "kind": "patch",
          "published_at": "2022-01-16T14:18:25Z"
        },
        {
          "tag": "v2.1.1",
          "kind": "patch",
          "published_at": "2021-12-31T17:02:06Z"
        },
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2021-12-30T15:52:25Z"
        },
        {
          "tag": "v2.0.4",
          "kind": "patch",
          "published_at": "2021-12-27T16:34:53Z"
        },
        {
          "tag": "v2.0.3",
          "kind": "patch",
          "published_at": "2021-12-15T03:32:03Z"
        },
        {
          "tag": "v2.0.2",
          "kind": "patch",
          "published_at": "2021-11-26T20:39:50Z"
        },
        {
          "tag": "v1.7.6",
          "kind": "patch",
          "published_at": "2021-11-24T22:52:09Z"
        },
        {
          "tag": "v2.0.1",
          "kind": "patch",
          "published_at": "2021-11-24T20:03:27Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2021-11-17T01:00:28Z"
        },
        {
          "tag": "v1.7.5",
          "kind": "patch",
          "published_at": "2021-07-07T14:36:12Z"
        },
        {
          "tag": "v1.7.4",
          "kind": "patch",
          "published_at": "2021-07-07T14:22:13Z"
        },
        {
          "tag": "v1.7.3",
          "kind": "patch",
          "published_at": "2021-06-30T18:07:19Z"
        },
        {
          "tag": "v1.7.2",
          "kind": "patch",
          "published_at": "2021-05-21T16:19:07Z"
        },
        {
          "tag": "v1.7.1",
          "kind": "patch",
          "published_at": "2021-05-01T20:12:41Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2021-04-11T00:16:06Z"
        },
        {
          "tag": "1.6.9",
          "kind": "patch",
          "published_at": "2021-03-26T14:15:32Z"
        },
        {
          "tag": "v1.6.8",
          "kind": "patch",
          "published_at": "2021-03-13T15:52:21Z"
        },
        {
          "tag": "v1.6.7",
          "kind": "patch",
          "published_at": "2021-02-13T02:39:36Z"
        },
        {
          "tag": "v1.6.6",
          "kind": "patch",
          "published_at": "2021-01-17T15:47:46Z"
        },
        {
          "tag": "v1.6.5",
          "kind": "patch",
          "published_at": "2021-01-04T00:11:39Z"
        },
        {
          "tag": "v1.6.4",
          "kind": "patch",
          "published_at": "2020-12-20T16:00:40Z"
        },
        {
          "tag": "v1.6.3",
          "kind": "patch",
          "published_at": "2020-12-06T15:34:13Z"
        },
        {
          "tag": "v1.6.2",
          "kind": "patch",
          "published_at": "2020-11-11T23:24:31Z"
        },
        {
          "tag": "v1.6.1",
          "kind": "patch",
          "published_at": "2020-11-11T16:54:37Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2020-10-25T13:40:02Z"
        },
        {
          "tag": "v1.5.9",
          "kind": "patch",
          "published_at": "2020-10-06T12:42:18Z"
        },
        {
          "tag": "v1.5.8",
          "kind": "patch",
          "published_at": "2020-10-04T15:59:33Z"
        },
        {
          "tag": "v1.5.7",
          "kind": "patch",
          "published_at": "2020-09-12T03:47:04Z"
        },
        {
          "tag": "v1.5.6",
          "kind": "patch",
          "published_at": "2020-09-10T21:53:10Z"
        },
        {
          "tag": "v1.5.5",
          "kind": "patch",
          "published_at": "2020-08-22T16:10:18Z"
        },
        {
          "tag": "v1.5.4",
          "kind": "patch",
          "published_at": "2020-08-13T13:33:14Z"
        },
        {
          "tag": "v1.5.3",
          "kind": "patch",
          "published_at": "2020-08-11T21:01:05Z"
        },
        {
          "tag": "v1.5.2",
          "kind": "patch",
          "published_at": "2020-08-10T21:41:11Z"
        },
        {
          "tag": "v1.5.1",
          "kind": "patch",
          "published_at": "2020-08-02T13:28:13Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2020-08-01T16:14:13Z"
        },
        {
          "tag": "v1.4.2",
          "kind": "patch",
          "published_at": "2020-07-17T21:49:26Z"
        },
        {
          "tag": "v1.4.1",
          "kind": "patch",
          "published_at": "2020-07-05T18:11:19Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2020-07-02T21:15:40Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2020-06-05T13:11:55Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2020-05-24T18:03:08Z"
        },
        {
          "tag": "v1.1.1",
          "kind": "patch",
          "published_at": "2020-05-18T22:24:02Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2020-05-18T22:08:46Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "50557deb6161a9ce4299c3bc2551ea51c2c31176",
          "body": "* Fix OperationResponseAssociation ignoring controller defaultTable\n\nWhen associations['table'] is not explicitly set,\nOperationResponseAssociation::build() now resolves the table via\nthe controller's fetchTable() method, which respects $defaultTable,\nbefore falling back to the controller name. This aligns with the\npattern already used in ModelScanner::routeHasModel().",
          "is_bot": false,
          "headline": "Fix OperationResponseAssociation ignoring controller defaultTable (#582)",
          "author_name": "Jamison Bryant",
          "author_login": "jamisonbryant",
          "committed_at": "2026-04-22T01:36:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e52c954b3c4cb3cb96a353c76eb62d58e8003bbd",
          "body": "This PR updates SwaggerBake to address CakePHP 5.3 deprecations by adjusting plugin/bootstrap conventions and replacing deprecated API usage in test and extension code.",
          "is_bot": false,
          "headline": "Handle cakephp 5.3 deprecations (#580)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2026-02-15T15:51:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29b9aa5d920961fdd7ef5827e4ffe3eca03a3690",
          "body": null,
          "is_bot": false,
          "headline": "Remove grumphp and set composer prefer stable (#578)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2025-10-29T21:30:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c6a9ce9de70ad99241624dfc24aac41fdf18c57",
          "body": "* Pass config into Association class\n\n* Use config to determine configured connection",
          "is_bot": false,
          "headline": "Fix OperationResponseAssociation not using configured connection (#577)",
          "author_name": "Jamison Bryant",
          "author_login": "jamisonbryant",
          "committed_at": "2025-10-19T21:32:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03a7d1c08723f690755e698a1dd965778b80bd9e",
          "body": "* Allow QueryParameters for any operation methods : GET, PUT, POST, DELETE... (#573)",
          "is_bot": false,
          "headline": "Allow QueryParameters for any operation methods (#574)",
          "author_name": "ThierryAgueda",
          "author_login": "ThierryAgueda",
          "committed_at": "2025-10-12T15:28:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7139734b6ee1d4b9a1f8e792be6267dc90d32c2",
          "body": "- Fixes breaking change mentioned here: https://github.com/cakephp/cakephp-codesniffer/releases/tag/5.3.0 and locks cakephp/cakephp-codesniffer to ~5.3.0\n- Ignores phpstan issue in src/Lib/Extension/CakeSearch/Extension.php and also locks phpstan to ~1.12.0",
          "is_bot": false,
          "headline": "Fixes various linter issues (#575)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2025-10-10T23:55:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6348137eb4defdad660785b9c02a175cc194684d",
          "body": "* Fixes schema collection bug",
          "is_bot": false,
          "headline": "Fixes schema collection bug (#569)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2025-04-11T02:08:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56dd2c00fddbaac729190b7586ca71c2a88f0eb5",
          "body": "* Fix custom array schema",
          "is_bot": false,
          "headline": "Fix custom array schema (#568)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2025-04-06T14:42:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "498d33fdc9c667ec6cbf7670f16f16320a374236",
          "body": "* Add support for collections in OpenApiResponse",
          "is_bot": false,
          "headline": "Add support for collections in OpenApiResponse (#566)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2025-04-05T21:43:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8c2792e108f056461988d1e3adab76a35814967",
          "body": null,
          "is_bot": false,
          "headline": "Adding collection schema to methods that use openApiPaginator (#563)",
          "author_name": "Masa",
          "author_login": "MasaKni",
          "committed_at": "2025-02-07T00:16:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75ceab80c40e0a797e06058e3339afadab623aaf",
          "body": "* Add PHP 8.4 and CakePHP 5.1 to CI",
          "is_bot": false,
          "headline": "Add PHP 8.4 and CakePHP 5.1 to CI (#565)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2025-02-07T00:10:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42c70bff80d99f422242a3f6d8dd47f8c34f5269",
          "body": null,
          "is_bot": false,
          "headline": "Fix bug, isNullable is not being set from Attribute (#560)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2024-10-02T02:15:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "491ffec9ebeeef044c4fb179b36f2fb27bc5a044",
          "body": "* Fix plugin with `/` in the name",
          "is_bot": false,
          "headline": "Fix plugin with `/` in the name (#553)",
          "author_name": "Tomas Saghy",
          "author_login": "segy",
          "committed_at": "2024-06-28T11:59:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a24990be2b772a2549efa8ce1fe052eb15eaefb",
          "body": "* Pass enums through array_values",
          "is_bot": false,
          "headline": "Pass enums through array_values (#549)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2024-05-15T12:12:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbb7f7cd8fe5ae304c75b3b5509980c5e39792fc",
          "body": "\r\nHidden properties were correctly not showing in operation response sample, but still displaying in schema sample. This hides them always.",
          "is_bot": false,
          "headline": "Hidden properties take precedence in being hidden (#547)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2024-05-11T01:21:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3e741f67f6150eb949dc6df51d4048506011caa",
          "body": null,
          "is_bot": false,
          "headline": "fix build badge",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2024-02-25T15:13:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f840a6e743b315551790f962925f8048803ad47b",
          "body": "* Only do file exists check for YML config",
          "is_bot": false,
          "headline": "Only do file exists check for YML config (#542)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2024-02-25T15:11:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06683286132e12aed1fbbffb6483041bb48cb56c",
          "body": "* Mepeiso/add false option to associations white list (#538)\r\n\r\nAllow empty whitelist of OpenApiResponse(associations: $var)\r\n---------\r\n\r\nCo-authored-by: Manuel Peiso <mepeiso@ticketsauce.com>\r\n\r\n* Fix extra slash being added to test src path\r\n\r\n* Update how swagger is constructed in the test\r\n\r\n---------\r\n\r\nCo-authored-by: Manuel Enrique Peiso Cruz <100145779+manuelpeiso@users.noreply.github.com>\r\nCo-authored-by: Manuel Peiso <mepeiso@ticketsauce.com>",
          "is_bot": false,
          "headline": "Merge from 2.x (#541)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2024-02-25T15:04:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28de36b665ed6f14b7f2a0c256ef6a0db1d7e88d",
          "body": null,
          "is_bot": false,
          "headline": "remove verbose flag from phpunit",
          "author_name": "Chris Nizzardini",
          "author_login": null,
          "committed_at": "2024-01-11T02:06:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f803dabc176a84f3442cd702ec38caa05de9950",
          "body": "* initial version 3 branch\r\n\r\n* Remove deprecated code (#426)\r\n\r\nRemoves all methods, properties etc. and related documentation that was marked deprecated in 2.x\r\n\r\n* WIP\r\n\r\n* convert attribute properties to readonly where possible + phpstan fixes\r\n\r\n* add constant\r\n\r\n* doc updates\r\n\r\n* update docs\r\n[…]\n deps and fix static analysis warnings (#535)\r\n\r\n* small readme updates\r\n\r\n* upgrade to latest swaggerui and redocly\r\n\r\n---------\r\n\r\nCo-authored-by: Chris Nizzardini <chris.nizzardini@thecmigroupa.ca>",
          "is_bot": false,
          "headline": "Release version 3 (cakephp 5 support) (#536)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2024-01-11T02:05:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "39503222c9103b73d62c493d660116ee9a71f680",
          "body": "fix build badge",
          "is_bot": false,
          "headline": "Update README.md (#533)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2023-10-17T03:34:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a621743978eee34da50645a5e71c271fcb9815e",
          "body": "* The response attribute takes precedence over doc blocks\r\n\r\n* update pipeline for cakephp 4.5\r\n\r\n* pipeline cleanup",
          "is_bot": false,
          "headline": "Response attribute takes precedence over doc block (#531)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2023-10-17T03:18:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7321ee28a7ab30895fe6e53941ce6357c37fcc9",
          "body": "* Adds timers and memory tracking if DebugKit is loaded\r\n\r\n* appease the static analyzer\r\n\r\n* require debugkit 4.4 to maintain compatibility with cakephp 4.2",
          "is_bot": false,
          "headline": "Adds timers and memory tracking if DebugKit is loaded (#524)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2023-07-01T00:06:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04d0df0b95b33077f873e21e9802c7147f42679d",
          "body": "* Resolves bug in exception code, do not instantiate exceptions.",
          "is_bot": false,
          "headline": "Resolve bug in exception code, do not instantiate exceptions (#523)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2023-06-12T21:36:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1853acf3a9c4ba5d18ff5890e1a140d3207cc9da",
          "body": "* Backport fix from 3.x branch",
          "is_bot": false,
          "headline": "Use hasBehavior instead of calling finder in OpenApiSearch  (#522)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2023-06-12T21:35:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "181e32873ae9d991c64f8c9ec6c3a246a88ce87d",
          "body": "… (#517)",
          "is_bot": false,
          "headline": "Map timestamptimezone to OA type of string and OA format of date-time…",
          "author_name": "Mike Glenn",
          "author_login": "TheGlenn88",
          "committed_at": "2023-06-06T16:10:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7e516494efb23a4a9b3554c33f0eef02c802770",
          "body": "…rty types (#515)",
          "is_bot": false,
          "headline": "resolves bug. openapi items property was not being set on array prope…",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2023-05-25T02:23:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d7ebc5a2b2e13b0d439e1c30d070f25aad9bcb8",
          "body": "* pass the config to the SwaggerFactory\r\n\r\n* Make the configurable properties protected so the Configuration can be simply extended",
          "is_bot": false,
          "headline": "Extendable configuration (#514)",
          "author_name": "Tomas Saghy",
          "author_login": "segy",
          "committed_at": "2023-05-25T01:35:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17e2ad01278c7aea533792042c885a92fdf75229",
          "body": "* adds support for json type\r\n\r\n* set type to null then oneof instead of hardcoding object\r\n\r\n* appease the static analyzer\r\n\r\n* add test coverage",
          "is_bot": false,
          "headline": "Adds support for json type (#511)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2023-03-08T22:28:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fcccfdbaf69880ccf48c5850e9e2f7597e56250",
          "body": "* Fix OpenApiResponse bug on schemaType: 'array'+ref\r\n\r\n* Fix to pass test (modified test case)",
          "is_bot": false,
          "headline": "Issue #508: Fix OpenApiResponse bug on schemaType: 'array'+ref (#509)",
          "author_name": "noma",
          "author_login": "nomahideki",
          "committed_at": "2023-03-08T12:47:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03824e546baca13db933b72af8547bdc2af0a2c9",
          "body": null,
          "is_bot": false,
          "headline": "add error handling for when config is missing (#506)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2023-02-12T15:15:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee89699f2192f46388bcaecb43a9af0986436d11",
          "body": "Adds ignore rule to phpstan for AllowDynamicProperties for php < 8.2 and supresses reporting when unmatched for php >= 8.2",
          "is_bot": false,
          "headline": "Handle dynamic property deprecation mess (#504)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2023-01-05T22:48:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c23bf0d31942f2e1fe8096d88e2e69b4eefa4043",
          "body": "* Add trait to suppress dynamic properties error in php 8.2",
          "is_bot": false,
          "headline": "Add trait to suppress dynamic properties error (#501)",
          "author_name": "Jamison Bryant",
          "author_login": "jamisonbryant",
          "committed_at": "2023-01-05T22:38:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5637e01c55010eaa617876b00c6524c37fa901cc",
          "body": "* Add isRequired property to OpenApiPathParam attribute\r\n\r\n* fix static analysis",
          "is_bot": false,
          "headline": "Add isRequired property to OpenApiPathParam attribute (#497)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-12-14T14:16:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95c728c823cee096a73fb30bc1753684d9ed366b",
          "body": null,
          "is_bot": false,
          "headline": "Check if class is subclass of Table in ModelScanner (#493)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-12-14T14:15:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e9b52e7667adb8b5374c8a62892ece075f4be84",
          "body": "* Do not throw exception if no routes are found\r\n\r\n* remove unused class",
          "is_bot": false,
          "headline": "Do not throw exception if no routes are found (#492)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-12-14T14:15:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edf60bc1ccb2bef8e4cd7d532b73b8afad223299",
          "body": null,
          "is_bot": false,
          "headline": "add php 8.2 to ci matrix (#498)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-12-14T14:13:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7c61b9c91c2a2b55471a2fbd9261e3d562b29a2",
          "body": null,
          "is_bot": false,
          "headline": "Redoc 2.0.0 (#482)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-11-18T23:09:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0839dea52735a41d0b35ad85dcfb30e676c1cde9",
          "body": null,
          "is_bot": false,
          "headline": "SwaggerUI 4.15.5 (#481)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-11-18T23:09:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "acc035a4b7b0c788aea77d4957be730791d07b0f",
          "body": null,
          "is_bot": false,
          "headline": "Adds support for modelless forms in OpenApiDto attribute (#480)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-11-18T23:09:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95777e3f6a5dfc7a1a1a447c0400e677a7c4fbe7",
          "body": "…s a forward slash (#479)",
          "is_bot": false,
          "headline": "Fixes setting RouteDecorator::controllerFqn when route prefix contain…",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-11-16T12:46:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c915cd27b1dd824d03aaf54cc9074cfb736ecece",
          "body": null,
          "is_bot": false,
          "headline": "Allow mixed type for RouteDecorator::prefix (#476)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-10-29T18:25:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45cbd740b61f30ceb172fb56a0fbb866d294da85",
          "body": "* Adds default schema type to OpenApiSearch query parameters",
          "is_bot": false,
          "headline": "Adds default schema type to OpenApiSearch query parameters (#474)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-10-02T03:46:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4166b9d8e1a44e9e8db2f7f43e49cfd382756d5b",
          "body": "* Check if table class is instantiable to prevent exception on Abstract classes in Table namespace\r\n\r\nCo-authored-by: Tomas Saghy <tomas.saghy@riesenia.com>",
          "is_bot": false,
          "headline": "Check if table class is instantiable (#467)",
          "author_name": "Tomas Saghy",
          "author_login": "segy",
          "committed_at": "2022-09-05T20:15:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89463c73ebab5733bb24391d5f44c0bcf5b3ac63",
          "body": "Resolves #464",
          "is_bot": false,
          "headline": "Docblock parsing of @link not working (#466)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-09-05T04:12:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "248a425b79bb21db87715e54879ccd2eec658fbc",
          "body": "* Add $connectionName property to config file and Configuration class\r\n\r\n* Model scanner consume and use configured connection name\r\n\r\nCo-authored-by: Jamison Bryant <jbryant@ticketsauce.com>",
          "is_bot": false,
          "headline": "Add support for customizable connection alias for table lookups (#462)",
          "author_name": "Jamison Bryant",
          "author_login": "jamisonbryant",
          "committed_at": "2022-09-03T16:57:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb72b535726dc52ede845a3139e5c0700d82deea",
          "body": null,
          "is_bot": false,
          "headline": "Adds note on modelless forms and DTOs to docs (#463)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-09-02T03:20:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce77f3d3bcbdf5ad129d5a034fd8e4f725668597",
          "body": "Resolves #457",
          "is_bot": false,
          "headline": "Add return type changing attribute (#458)",
          "author_name": "Jamison Bryant",
          "author_login": "jamisonbryant",
          "committed_at": "2022-08-31T14:21:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fbc60c9cdc5582665728b18fd06ad18148fb1a99",
          "body": "…by the user (#456)",
          "is_bot": false,
          "headline": "removes loading swagger_bake config automatically, this must be done …",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-08-24T18:35:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f58d1811b825f41210a2d6b6cf15e49b94bdd822",
          "body": "* Refactor OpenApiSearch to better support `TableLocator::get()`. Now supports `alias` and `options`, meanwhile `tableClass` has been marked deprecated. See #438",
          "is_bot": false,
          "headline": "Refactor OpenApiSearch to better support TableLocator::get (#442)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-08-11T20:08:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d7217192b4216558171e89934a1d4350eb45c0f",
          "body": "…ay (#445)\n\nResolves issue #443",
          "is_bot": false,
          "headline": "Fixes issues with OpenApiResponse associations when schemaType is arr…",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-08-11T19:48:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20e92c4916c5617da4251ac7fdbb14a59bae78eb",
          "body": "Resolves #449",
          "is_bot": false,
          "headline": "Map timestamp to OA type of string and OA format of date-time (#450)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-08-11T11:46:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b30d989e6b5655d44521c7b7358d676bda1d3531",
          "body": "- `readOnly` was not being properly set when reading in properties from YAML\r\n- When using a YAML ref in OpenApiRequestBody that contained a nested object the code was failing as it was expecting a SchemaProperty instead of a Schema.",
          "is_bot": false,
          "headline": "bug fixes for openapirequestbody::ref (#441)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-07-17T15:04:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aeeccdfcf08a02c0de83ab0a2d50cfa5d4030fec",
          "body": "* Adds support for simple lists from OA YAML",
          "is_bot": false,
          "headline": "Support array list from yaml (#440)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-07-17T13:58:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6205ab5bf4b6495b639c35f15f7e5494882627d2",
          "body": "* Windows support | version for master\r\n\r\n* Windows support | account for config in unix standard",
          "is_bot": false,
          "headline": "Support windows compatibility in test suite (#436)",
          "author_name": "Raff",
          "author_login": "ArchangelDesign",
          "committed_at": "2022-07-09T22:32:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6aab8c5dc4aeeb43a4b9e308b1675602b843da6",
          "body": "….4.2 changes (#433)\n\n* Support controllers defined in snake_case form from routes\r\n* support changes made to LocatorAwareTrait in cakephp 4.4.2\r\n* make code backwards compatible with cakephp < 4.4.2",
          "is_bot": false,
          "headline": "Support controllers defined in snake_case form from routes and cake 4…",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-07-09T14:53:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26c4e338ed09712a5d5c3613abbc9e3f5b673532",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-06-23T00:46:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40bbb07db9d52127112a13dcaac808ac504f11d7",
          "body": "* breaking change to remove config loading from plugin bootstrap",
          "is_bot": false,
          "headline": "breaking change to remove config loading from plugin bootstrap (#429)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-06-23T00:42:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "201ea7e602f6ffafc76f4f2f096112c3a474729c",
          "body": "* Refactor configuration class (#412)\r\n\r\nRefactors configuration class to use proper getter/setters, deprecates generic getter/setters.\r\n\r\n* Refactors (#413)\r\n\r\n- Removes usage of Configuration classes deprecated generic getters/setters.\r\n- Adds breaking change to main Swagger class unless using Swa\n[…]\n Extension\r\n- Refactors ExtensionLoader\r\n\r\n* refactors yaml factories to default to null instead of empty string\r\n\r\n* adds mass assignment and hidden to model cmd\r\n\r\n* adds a security example to event",
          "is_bot": false,
          "headline": "v2.3.0 (#425)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-06-09T00:07:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e40752b2df7108e4fd9e8baf9eb1f9f830ce6168",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-06-08T01:27:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e73dd56a3c6f2df9d067ab61a4d51fac8cdc6ca9",
          "body": "Updates github action",
          "is_bot": false,
          "headline": "adds cakephp 4.4 to ci matrix (#424)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-06-07T22:20:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e2e405966990d67eb2a9cbd8df31faebb4e59e7",
          "body": "* Resolves #419\r\n* apply fix in from yaml class instead\r\n* conditionally set type on schema property from yaml\r\n* cleans up structural error in paths: should NOT have additional properties additionalProperty: tags",
          "is_bot": false,
          "headline": "Allow empty type from openapi yaml (#420)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-05-25T23:15:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "24dbc2ce23a33918bcc5afff16732d3b4a6a1da7",
          "body": null,
          "is_bot": false,
          "headline": "resolves bug (#418)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-04-23T12:27:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e7cff4ca368ef77a3b2296ddb4f3813b6bd14d9",
          "body": null,
          "is_bot": false,
          "headline": "Allow DTO properties at class-level (#408)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-04-03T16:10:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c24d64d8adcb189b7057ea027c7956debb903461",
          "body": null,
          "is_bot": false,
          "headline": "upgrade to latest swagger and redoc (#409)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-04-03T16:07:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9029ac6e45c6252644357a13fa46fb4db1b12e93",
          "body": "- Sets PHPStan to level 7\r\n- Fixes misspelling in OpenApiSchema visibility constants, deprecates old misspelled constants.\r\n- Adds OpenApiPath::tags (#402)",
          "is_bot": false,
          "headline": "v2.2.10 (#403)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-04-01T22:27:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c532df5df0ce0940e65080cececab66923189ace",
          "body": "* WIP for issue #399\r\n* refactors RouteScanner and RouteDecorator. Adds some coverage to RouteDecorator",
          "is_bot": false,
          "headline": "Plugin routes not showing due to namespace collision (#401)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-03-28T21:24:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16955c707e2b5d81c8e4e56b2d921351be427fe7",
          "body": null,
          "is_bot": false,
          "headline": "resolves #394 (#395)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-03-09T03:13:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00146e4ae438b3ecb5e33463f290ccfbc8fc8719",
          "body": null,
          "is_bot": false,
          "headline": "notes on v1 docs.",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-03-05T14:14:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc4722efc759bb263241cf48b1e3ff8d7cd9705b",
          "body": null,
          "is_bot": false,
          "headline": "notes on version 1 docs",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-03-05T14:12:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "016cff563e03d7c3ec2fd77058351ffe7e91e63b",
          "body": "* Adding timestampfractional (PostgreSQL) to datatype conversion\r\n\r\n* Removing space bars\r\n\r\n* Adding test cases\r\n\r\nCo-authored-by: Julyano <julyano.silva@bbmlogistica.com.br>",
          "is_bot": false,
          "headline": "Adding timestampfractional (PostgreSQL) to datatype conversion (#393)",
          "author_name": "Julyano",
          "author_login": "JulyanoF",
          "committed_at": "2022-03-04T00:32:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bad2df51474b0435f773aa5e9966fa689ee8fb0a",
          "body": null,
          "is_bot": false,
          "headline": "Update attributes.md",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-26T21:14:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ed6dd8a689c6786f19b57c6efeb36185df61d7c",
          "body": null,
          "is_bot": false,
          "headline": "Update attributes.md",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-26T21:13:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a50a6351263d26aed38093041c371b98f0715e01",
          "body": null,
          "is_bot": false,
          "headline": "Resolves #390",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-21T14:16:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40f8dced98eaa6ebed39d4ab0ed970b0984a9b97",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-19T23:49:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca1bd38c0fe73b5fb333cc8bcffec9e4677454af",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-19T23:48:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25a317a4f88d9e70b9142d09f5875d00e9d320fa",
          "body": null,
          "is_bot": false,
          "headline": "Update attributes.md",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-19T22:10:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd6e28cc0a77be9a18548285dbca09008b2ded76",
          "body": null,
          "is_bot": false,
          "headline": "Update attributes.md",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-19T22:08:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d426d2a97c3a4f50c9f2bbf8aea460516e179373",
          "body": null,
          "is_bot": false,
          "headline": "Update attributes.md",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-19T22:07:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46212f8f6cd50c95fbd31b728a599da87e996ee3",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-19T22:06:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "337d0fe4826f67d0d0904762d72ba5d537ba77a4",
          "body": "…piQueryParam and OpenApiSchemaProperty (#388)\n\n* Resolves #384",
          "is_bot": false,
          "headline": "Deprecate OpenApiDtoQuery and OpenApiDtoRequestBody in favor of OpenA…",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-19T21:59:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "740642d8ff3e8ec1ee6f5171bde35248828677ef",
          "body": "ReflectionMethod.",
          "is_bot": false,
          "headline": "Resolves ReflectionException if reflectionMethod is not an instance of",
          "author_name": "chris cnizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-19T00:29:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c01fa4a1ced479829b13e3ae1e5e318bd6fc88fc",
          "body": "Resolves #383",
          "is_bot": false,
          "headline": "Support adding DTOs and Responses to openapi components schemas (#387)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-19T00:03:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e50e7a2b786690a81a027f0bda777b442d691e81",
          "body": null,
          "is_bot": false,
          "headline": "resolves bug (#382)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-04T00:25:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bdb78572570c9730651ae46e7a69a106f4f01687",
          "body": null,
          "is_bot": false,
          "headline": "fixes bug, was setting allOf incorrectly, must be an array",
          "author_name": "chris cnizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-02T12:15:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0efddd3f06d47c338e5ab5f75f44140c66ac82f",
          "body": null,
          "is_bot": false,
          "headline": "fixes bug, was setting allOf incorrectly, must be an array",
          "author_name": "chris cnizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-02T11:49:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31c3923b294d17608b9910ae67a4267b5a3ea6ea",
          "body": null,
          "is_bot": false,
          "headline": "fix markdown tables and update exception response section",
          "author_name": "chris cnizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-02T10:35:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb16a82ca509a12045f2a37ec9edcdcb35ff1e9f",
          "body": null,
          "is_bot": false,
          "headline": "fix markdown tables and update attribute prop defaults",
          "author_name": "chris cnizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-02T10:29:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1afeab13bc3b0dbda3607fee2e5104d3445efcb0",
          "body": null,
          "is_bot": false,
          "headline": "fix markdown tables and update attribute prop defaults",
          "author_name": "chris cnizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-02T10:27:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8311db17fe2bb77a58e1d62dc936423b05ca6d4a",
          "body": null,
          "is_bot": false,
          "headline": "doc fixes",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-01T01:08:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90bf2668608942872d9465ce333dcbfa6a70ad40",
          "body": "* Enhance Custom Schema for OpenApiResponse attribute (#375)",
          "is_bot": false,
          "headline": "v2.2.0 (#377)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-02-01T00:49:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25fa710b886dc741d7611fc35be77beb0ffc70f2",
          "body": null,
          "is_bot": false,
          "headline": "mixerapi api v1 compat (#372)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2022-01-16T14:16:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e2d3fcf685ce3a44178b47931ee160be318baee",
          "body": null,
          "is_bot": false,
          "headline": "fix docs",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2021-12-31T17:35:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b583a8a2bc217c8a7c67b19c67619127d24dd13",
          "body": null,
          "is_bot": false,
          "headline": "fix gha (#371)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2021-12-31T17:06:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92d922227b19e5933e05d93a1a20be1b30ec531a",
          "body": "- Catches InvalidArgumentException thrown by CakePHP when an association does not exist and adds more information.\r\n- Only uses existing $ref schema if schema exists. Otherwise adds full schema.",
          "is_bot": false,
          "headline": "Fix association bug (#370)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2021-12-31T17:01:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee3fa56a75d63941bc92f34774bd05ad3c854279",
          "body": "* Remove all annotations (#360)\r\n\r\n* Improve custom exceptions #358 (#361)\r\n\r\n* Resolves #353 (#362)\r\n\r\n* Adds support for the `@link` tag\r\n\r\n* Remove custom read/write schemas\r\n\r\n* Resolves #359\r\n\r\n* Associated schema depth (#369)\r\n\r\n* Resolves #365",
          "is_bot": false,
          "headline": "v2.1.0 release (#368)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2021-12-30T15:51:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "869c8c970ed41b74350eb2514a1d867286de7a8d",
          "body": "Resolves #363",
          "is_bot": false,
          "headline": "Fixes OpenApiResponse association permenantly modifying the Schema",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2021-12-27T16:32:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a53bc2d78e8b05987625fc3088bed653454af920",
          "body": "* Resolves #356",
          "is_bot": false,
          "headline": " PHP 8.1 JsonSerializable::jsonSerialize() Deprecated warnings (#357)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2021-12-15T03:28:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "caafcf83558346aa913d4a480b6621c4dc1982ce",
          "body": "fix test matrix, tests not running for 8.1",
          "is_bot": false,
          "headline": "fix test matrix (#355)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2021-11-27T17:52:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ace3d6356b2a23ab89a66058969778c1023fdb6",
          "body": null,
          "is_bot": false,
          "headline": "Adds php 8.1 to matrix (#352)",
          "author_name": "Chris Nizzardini",
          "author_login": "cnizzardini",
          "committed_at": "2021-11-26T20:46:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 6,
      "latest_release_at": "2026-04-22T01:40:15Z",
      "latest_release_tag": "v3.3.6",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 6,
      "days_since_latest_release": 94,
      "mean_days_between_releases": 63
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "cnizzardini/cakephp-swagger-bake",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "cakephp swagger",
            "cake swagger",
            "cakephp5 swagger",
            "cakephp openapi",
            "cakephp5 openapi",
            "cake openapi"
          ],
          "ecosystem": "packagist",
          "matches_repo": true,
          "registry_url": "https://packagist.org/packages/cnizzardini/cakephp-swagger-bake",
          "is_deprecated": false,
          "latest_version": "v3.3.6",
          "repository_url": "https://github.com/cnizzardini/cakephp-swagger-bake",
          "versions_count": 111,
          "total_downloads": 200027,
          "dependents_count": 2,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 10160,
          "first_published_at": null,
          "latest_published_at": "2026-04-22T01:36:46Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 94
        }
      ]
    },
    "popularity": {
      "forks": 24,
      "stars": 60,
      "watchers": 6,
      "fork_history": {
        "days": [
          {
            "date": "2020-05-28",
            "count": 1
          },
          {
            "date": "2020-08-15",
            "count": 1
          },
          {
            "date": "2020-09-07",
            "count": 1
          },
          {
            "date": "2021-02-24",
            "count": 1
          },
          {
            "date": "2021-03-12",
            "count": 1
          },
          {
            "date": "2021-05-06",
            "count": 1
          },
          {
            "date": "2021-08-16",
            "count": 1
          },
          {
            "date": "2021-08-25",
            "count": 1
          },
          {
            "date": "2022-03-03",
            "count": 1
          },
          {
            "date": "2022-07-07",
            "count": 1
          },
          {
            "date": "2022-08-31",
            "count": 1
          },
          {
            "date": "2022-09-05",
            "count": 1
          },
          {
            "date": "2023-03-03",
            "count": 1
          },
          {
            "date": "2023-03-07",
            "count": 1
          },
          {
            "date": "2023-06-03",
            "count": 1
          },
          {
            "date": "2023-06-06",
            "count": 1
          },
          {
            "date": "2024-02-19",
            "count": 2
          },
          {
            "date": "2024-04-27",
            "count": 1
          },
          {
            "date": "2024-06-02",
            "count": 1
          },
          {
            "date": "2024-12-11",
            "count": 1
          },
          {
            "date": "2025-01-17",
            "count": 1
          },
          {
            "date": "2025-03-07",
            "count": 1
          },
          {
            "date": "2025-10-08",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 24,
        "total_forks": 24
      },
      "star_history": null,
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [
        "assets/swagger.yml",
        "tests/test_app/config/swagger.yml"
      ],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 1400569,
      "source_files_sampled": 219,
      "oversized_source_files": 4,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "composer.json"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 14,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "packagist"
      ],
      "dependencies": [
        {
          "name": "cakephp/cakephp",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^5.0"
        },
        {
          "name": "symfony/yaml",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^5.0"
        },
        {
          "name": "mixerapi/core",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^2.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "cakephp/cakephp",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "mixerapi/core",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/yaml",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "cakephp/authentication",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "cakephp/bake",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "cakephp/cakephp-codesniffer",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "cakephp/debug_kit",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "cakephp/migrations",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "friendsofcake/search",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "php",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "phpdocumentor/reflection-docblock",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "phpmd/phpmd",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "phpstan/phpstan",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "phpunit/phpunit",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 14,
        "direct_count": 3,
        "indirect_count": 11
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 291,
        "open_issues": 1,
        "closed_ratio": 0.996,
        "closed_issues": 262,
        "closed_unmerged_prs": 27
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "cnizzardini",
          "commits": 891,
          "avatar_url": "https://avatars.githubusercontent.com/u/171294?v=4"
        },
        {
          "type": "User",
          "login": "jamisonbryant",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/6774110?v=4"
        },
        {
          "type": "User",
          "login": "bmudda",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/1568534?v=4"
        },
        {
          "type": "User",
          "login": "segy",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/1355459?v=4"
        },
        {
          "type": "User",
          "login": "adrian-tiberius",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1635084?v=4"
        },
        {
          "type": "User",
          "login": "dogmatic69",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/94674?v=4"
        },
        {
          "type": "User",
          "login": "JulyanoF",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/17284704?v=4"
        },
        {
          "type": "User",
          "login": "lpj145",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/11980109?v=4"
        },
        {
          "type": "User",
          "login": "MasaKni",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/65139438?v=4"
        },
        {
          "type": "User",
          "login": "TheGlenn88",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/5333026?v=4"
        }
      ],
      "contributors_sampled": 13,
      "top_contributor_share": 0.976
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "pull-request.yml",
        "push.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "phpcs.xml",
        "phpstan.neon"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "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": 1,
            "reason": "5 out of 28 merged PRs checked by a CI test -- score normalized to 1",
            "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": 2,
            "reason": "Found 8/30 approved changesets -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "50557deb6161a9ce4299c3bc2551ea51c2c31176",
        "ran_at": "2026-07-25T02:51:01Z",
        "aggregate_score": 3.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-05-20T15:34:10Z",
      "oldest_open_prs": [
        {
          "number": 583,
          "created_at": "2026-07-25T02:48:56Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-04-22T01:36:46Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": [
        {
          "number": 570,
          "created_at": "2025-04-17T11:17:59Z",
          "last_comment_at": "2025-05-06T08:13:07Z",
          "last_comment_author": "PaulHendriks"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/cnizzardini/cakephp-swagger-bake",
    "host": "github.com",
    "name": "cakephp-swagger-bake",
    "owner": "cnizzardini"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 59,
      "inputs": {
        "security": 35,
        "vitality": 62,
        "community": 49,
        "governance": 63,
        "engineering": 80
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 62,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "at_risk",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "commits_last_year": 6,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 6
            },
            "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": "6/52 weeks with commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "6 commits in the last year",
                "points": 7.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 82,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "v3.3.6",
              "releases_from_tags": false,
              "days_since_latest_release": 94,
              "mean_days_between_releases": 63
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 94 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 94
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~63 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 63
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 94,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 94 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 94
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 49,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 44,
            "inputs": {
              "forks": 24,
              "stars": 60,
              "watchers": 6,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "60 stars",
                "points": 28.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 60
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "24 forks",
                "points": 11.3,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "packages": [
                "cnizzardini/cakephp-swagger-bake"
              ],
              "dependents": 2,
              "ecosystems": "packagist",
              "total_downloads": 200027,
              "monthly_downloads": 10160
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "10,160 downloads/month across packagist",
                "points": 53.4,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 10160,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "2 packages depend on it",
                "points": 3.2,
                "status": "partial",
                "details": [
                  {
                    "code": "registry_dependents",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 63,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 26,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 13,
              "top_contributor_share": 0.976
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 98% of commits",
                "points": 0.5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "13 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "merged_prs": 291,
              "open_issues": 1,
              "closed_issues": 262,
              "issue_closed_ratio": 0.996,
              "closed_unmerged_prs": 27
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.6,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "291/318 decided PRs merged",
                "points": 35,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 291,
                      "decided": 318
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 8/30 approved changesets -- score normalized to 2",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 55,
            "inputs": {
              "followers": 38,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "cnizzardini",
              "public_repos": 29,
              "account_age_days": 6057
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "38 followers of cnizzardini",
                "points": 11.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 38,
                      "login": "cnizzardini"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "29 public repos, account ~16 yr old",
                "points": 22.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 29
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 16
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "cnizzardini/cakephp-swagger-bake"
              ],
              "ecosystems": "packagist",
              "any_deprecated": false,
              "min_days_since_publish": 94
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on packagist",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 94 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 94
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "111 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 111
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 80,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "phpcs.xml, phpstan.neon",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "phpcs.xml, phpstan.neon"
                    }
                  }
                ],
                "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": "5 out of 28 merged PRs checked by a CI test -- score normalized to 1",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "cakephp",
                "cakephp4",
                "cakephp-plugin",
                "cake-plugin",
                "swagger-ui",
                "swagger-documentation",
                "swagger-bake",
                "openapi",
                "cakephp-api",
                "redoc"
              ],
              "has_wiki": true,
              "homepage": "http://cakephpswaggerbake.cnizz.com/",
              "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": "http://cakephpswaggerbake.cnizz.com/",
                "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": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 35,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 35,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 3.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "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": "5 out of 28 merged PRs checked by a CI test -- score normalized to 1",
                "points": 0.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/30 approved changesets -- score normalized to 2",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 12
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "at_risk",
        "name": "AI Readiness",
        "value": 39,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.71,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "71 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 37.9,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 71,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 33,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "phpcs.xml, phpstan.neon",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "phpcs.xml, phpstan.neon"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "primary_language": "PHP",
              "largest_source_bytes": 1400569,
              "source_files_sampled": 219,
              "oversized_source_files": 4
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "PHP without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "PHP"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "4/219 source files over 60KB",
                "points": 54,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 219,
                      "oversized": 4
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": false,
              "api_schema_files": [
                "assets/swagger.yml",
                "tests/test_app/config/swagger.yml"
              ]
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": "assets/swagger.yml, tests/test_app/config/swagger.yml",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "assets/swagger.yml, tests/test_app/config/swagger.yml"
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T02:51:21.088461Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/cnizzardini/cakephp-swagger-bake.svg",
  "full_name": "cnizzardini/cakephp-swagger-bake",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenPackagist.