Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrellas⑂ 24 forksdesde abr 2020Ver en GitHub ↗

cnizzardini/cakephp-swagger-bake tiene un índice de salud de 59 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (80/100) y la más baja, Security (35/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

59
global / 100
Moderado

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

Chris NizzardiniCuenta personal
38 seguidores29 repositorios públicosdesde dic 2009

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
Packagistcnizzardini/cakephp-swagger-bakev3.3.610.160111hace 94 díascakephp-swaggercake-swaggercakephp5-swaggercakephp-openapicakephp5-openapicake-openapi

Métricas por categoría

Vitalidad

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

62Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
4.2/36Cadencia de commits — 6/52 semanas con commits
7.6/18Volumen de commits — 6 commits en el último año
0/10OpenSSF Scorecard: Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Datos de entrada utilizados
commits_last_year6
human_commit_share1
days_since_last_push0
active_weeks_last_year6
Cómo se puntúa
27/27Publica versiones — 100 versiones publicadas
27/36Recencia de las versiones — última versión hace 94 días
19.8/27Cadencia de publicación — una versión cada ~63 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count100
latest_release_tagv3.3.6
releases_from_tagsno
days_since_latest_release94
mean_days_between_releases63
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

49En riesgo · 18% del índice global
Cómo se puntúa
28.7/60Estrellas — 60 estrellas
11.3/25Forks — 24 forks
3.9/15Observadores — 6 observadores
Datos de entrada utilizados
forks24
stars60
watchers6
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
53.4/80Descargas mensuales — 10.160 descargas/mes en packagist
3.2/20Dependientes en el registro — 2 paquetes dependen de él
Datos de entrada utilizados
packagescnizzardini/cakephp-swagger-bake
dependents2
ecosystemspackagist
total_downloads200.027
monthly_downloads10.160

Sostenibilidad y Gobernanza

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

63Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.5/22.5Distribución de commits — el principal contribuyente firma el 98% de los commits
13.5/13.5Amplitud de contribuyentes — 13 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled13
top_contributor_share0,976
Cómo se puntúa
46.6/46.8Resolución de issues — 100% de issues cerradas
35/38.3Aceptación de PR — 291/318 PR decididos fusionados
3/15OpenSSF Scorecard: Code-Review — Found 8/30 approved changesets -- score normalized to 2
Datos de entrada utilizados
merged_prs291
open_issues1
closed_issues262
issue_closed_ratio0,996
closed_unmerged_prs27
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
11.4/25Alcance del propietario — 38 seguidores de cnizzardini
22.8/25Trayectoria — 29 repos públicos, cuenta de ~16 años
Datos de entrada utilizados
followers38
owner_typeUser
is_verified
owner_logincnizzardini
public_repos29
account_age_days6057
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en packagist
35/35Recencia de publicación — última publicación hace 94 días
20/20Historial de versiones — 111 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagescnizzardini/cakephp-swagger-bake
ecosystemspackagist
any_deprecatedno
min_days_since_publish94

Calidad de Ingeniería

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

80Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — phpcs.xml, phpstan.neon
0/9.6Hooks de pre-commit
0/6.4.editorconfig
2/20OpenSSF Scorecard: CI-Tests — 5 out of 28 merged PRs checked by a CI test -- score normalized to 1
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — http://cakephpswaggerbake.cnizz.com/
10/10Descripción del repositorio
10/10Topics — 10 topics
10/10Wiki
Datos de entrada utilizados
topicscakephp, cakephp4, cakephp-plugin, cake-plugin, swagger-ui, swagger-documentation, swagger-bake, openapi, cakephp-api, redoc
has_wiki
homepagehttp://cakephpswaggerbake.cnizz.com/
has_readme
has_docs_dir
has_description

Seguridad

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

35En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
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.5Licencia — 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 — sin datos
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 — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3,5
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

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

39En riesgo · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
37.9/40Historial de commits legible — 71 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,71
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — phpcs.xml, phpstan.neon
0/11Verificación estática de tipos
0/10Entorno reproducible
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
0/45Código verificable por tipos — PHP sin configuración de verificación de tipos
54/55Tamaños de archivo manejables — 4/219 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePHP
largest_source_bytes1.400.569
source_files_sampled219
oversized_source_files4
Cómo se puntúa
40/40Esquema de API (OpenAPI/GraphQL/proto) — assets/swagger.yml, tests/test_app/config/swagger.yml
0/20Servidor MCP
0/40Ejemplos ejecutables
Datos de entrada utilizados
example_dirs
has_mcp_signalno
api_schema_filesassets/swagger.yml, tests/test_app/config/swagger.yml

Datos clave

60estrellas de GitHub
13contribuidores
6commits en los últimos 12 meses
0días desde el último push
100versiones publicadas
1factor bus
1issues abiertas
Packagistecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

Historial de estrellas y forks 0 ★ / 24 ⇿
0Estrellas
24Forks
92Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

048121620242422020-052023-012025-10
Mayor 2Menor 13Parche 77

Cada punto abarca 5 días.

OpenSSF Scorecard 3.5 / 10
3.5agregado

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

10Binary-Artifactsno binaries found in the repo
n/dBranch-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
n/dPackagingpackaging 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
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 3
RegistroPaqueteRestricción de versiónManifiesto
Packagistcakephp/cakephp^5.0composer.json
Packagistsymfony/yaml^5.0composer.json
Packagistmixerapi/core^2.0composer.json
Todas las dependencias 14

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 3 paquetes directos y 11 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
Packagistcakephp/cakephpdirecta
Packagistmixerapi/coredirecta
Packagistsymfony/yamldirecta
Packagistcakephp/authenticationindirecta
Packagistcakephp/bakeindirecta
Packagistcakephp/cakephp-codesnifferindirecta
Packagistcakephp/debug_kitindirecta
Packagistcakephp/migrationsindirecta
Packagistfriendsofcake/searchindirecta
Packagistphpindirecta
Packagistphpdocumentor/reflection-docblockindirecta
Packagistphpmd/phpmdindirecta
Packagistphpstan/phpstanindirecta
Packagistphpunit/phpunitindirecta
Avisos de dependencias sin evaluar

El cotejo de avisos no pudo ejecutarse para este informe: No resolved dependencies carried a version and a supported ecosystem

Informe JSON sin procesar legible por máquina
{
  "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"
}

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

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

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