Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-24 03:08 UTC

raymondchins / agentmap

The repo map your coding agent is forced to use — ~98% fewer tokens (up to 99.9% per task) to understand a TS/JS codebase. PageRank hubs, Aider-style symbol ranking, token-budgeted digest, --any router, wired into the agent loop.

JavaScriptMIT★ 45 estrellas⑂ 10 forksdesde jun 2026Ver en GitHub ↗

raymondchins/agentmap tiene un índice de salud de 65 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Security (75/100) y la más baja, AI Readiness (50/100). Se actualizó por última vez hace 1 día. Una sola persona concentra la mayor parte del trabajo reciente.

65
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.

65
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

Raymond ChinCuenta personal
56 seguidores3 repositorios públicosdesde jun 2015Genesis

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

Métricas por categoría

Vitalidad

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

74Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 1 días
2.8/36Cadencia de commits — 4/52 semanas con commits
18/18Volumen de commits — 105 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year105
human_commit_share0,99
days_since_last_push1
active_weeks_last_year4
Cómo se puntúa
27/27Publica versiones — 10 versiones publicadas
36/36Recencia de las versiones — última versión hace 5 días
27/27Cadencia de publicación — una versión cada ~1,7 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count10
latest_release_tagv0.15.1
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases1,7
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?

55Moderado · 18% del índice global
Cómo se puntúa
26.7/60Estrellas — 45 estrellas
8/25Forks — 10 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks10
stars45
watchers0
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)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_template
Cómo se puntúa
46.7/80Descargas mensuales — 3162 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@raymondchins/agentmap
dependents
ecosystemsnpm
total_downloads
monthly_downloads3162
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

53Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
2.6/22.5Distribución de commits — el principal contribuyente firma el 88% de los commits
5.4/13.5Amplitud de contribuyentes — 4 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 4 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled4
top_contributor_share0,885
Cómo se puntúa
38.2/46.8Resolución de issues — 82% de issues cerradas
13.8/38.3Aceptación de PR — 9/25 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/29 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs9
open_issues2
closed_issues9
issue_closed_ratio0,818
closed_unmerged_prs16
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
12.6/25Alcance del propietario — 56 seguidores de raymondchins
16.4/25Trayectoria — 3 repos públicos, cuenta de ~11 años
Datos de entrada utilizados
followers56
owner_typeUser
is_verified
owner_loginraymondchins
public_repos3
account_age_days4055
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 npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 24 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@raymondchins/agentmap
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

71Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 2 out of 2 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
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?

75Bueno · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 2 out of 2 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/29 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 4 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
5/5Pinned-Dependencies — all dependencies are pinned
5/5SAST — SAST tool is run on all commits
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6,9
Excluidos de la puntuación (sin datos o no aplicable): signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages10
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de npm:@raymondchins/agentmap@0.15.1 —lo que arrastra la instalación del paquete publicado—: 10 paquetes. No se analiza la alcanzabilidad.

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.

50Moderado · 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)
40/40Historial de commits legible — 99 de 99 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
0/11Verificación estática de tipos
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 13 de los últimos 100 commits con autoría o crédito de agente
8/8Mantenimiento automatizado — 1 de los últimos 100 commits son actualizaciones automáticas de dependencias
10/10OpenSSF Scorecard: Pinned-Dependencies — all dependencies are pinned
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,13
toolchain_manifests
dependency_bot_commit_share0,01
Cómo se puntúa
0/45Código verificable por tipos — JavaScript sin configuración de verificación de tipos
54.1/55Tamaños de archivo manejables — 1/63 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageJavaScript
largest_source_bytes189.599
source_files_sampled63
oversized_source_files1
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

45estrellas de GitHub
4contribuidores
105commits en los últimos 12 meses
1días desde el último push
10versiones publicadas
1factor bus
2issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

Historial de estrellas y forks 0 ★ / 10 ⇿
0Estrellas
10Forks
1Versiones

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.

2468101052026-062026-062026-07
Mayor 0Menor 1Parche 0
OpenSSF Scorecard 6.9 / 10
6.9agregado

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-24 03:08 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests2 out of 2 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/29 approved changesets -- score normalized to 0
10Contributorsproject has 4 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
10Pinned-Dependenciesall dependencies are pinned
10SASTSAST tool is run on all commits
10Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 1
RegistroPaqueteRestricción de versiónManifiesto
npmts-morph28.0.0package.json
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Avisos de dependencias 0

Instalar npm:@raymondchins/agentmap@0.15.1 arrastra 10 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 633,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Shell": 3821,
        "JavaScript": 408804
      },
      "pushed_at": "2026-07-22T09:59:29Z",
      "created_at": "2026-06-13T11:29:36Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T09:59:47Z",
      "description": "The repo map your coding agent is forced to use — ~98% fewer tokens (up to 99.9% per task) to understand a TS/JS codebase. PageRank hubs, Aider-style symbol ranking, token-budgeted digest, --any router, wired into the agent loop.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "JavaScript",
      "significant_languages": [
        "JavaScript"
      ]
    },
    "owner": {
      "blog": "https://genesis.ceo/",
      "name": "Raymond Chin",
      "type": "User",
      "login": "raymondchins",
      "company": "Genesis",
      "location": "Jakarta",
      "followers": 56,
      "avatar_url": "https://avatars.githubusercontent.com/u/12913191?v=4",
      "created_at": "2015-06-16T14:24:28Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 4055
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-07-18T17:17:26Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-07-18T17:12:46Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-07-04T13:48:17Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-07-04T12:36:18Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-07-04T11:42:07Z"
        },
        {
          "tag": "v0.12.3",
          "kind": "patch",
          "published_at": "2026-07-04T10:19:52Z"
        },
        {
          "tag": "v0.12.2",
          "kind": "patch",
          "published_at": "2026-07-04T09:54:18Z"
        },
        {
          "tag": "v0.12.1",
          "kind": "patch",
          "published_at": "2026-07-04T09:10:40Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-07-04T07:51:57Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-03T15:15:39Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "79bffa9497982ed1e804703e597ed437128dba61",
          "body": "…on advisory (#36)\n\n* chore(ci): bump codeql-action to v4.37.1 and group future bumps\n\nBump both codeql-action/init and codeql-action/analyze from v4.37.0 to\nv4.37.1 in a single commit. Dependabot split these into separate PRs\n(#34, #35), each of which failed CI: CodeQL requires init and analyze to\n\n[…]\nass locally.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01QToCLNU4rAYgf79Y7HTfUo\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(ci): green the build — bump codeql-action + clear brace-expansi…",
          "author_name": "Raymond Chin",
          "author_login": "raymondchins",
          "committed_at": "2026-07-22T09:58:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a17eaf22a6ae404569ad530ea1bc4a2bc11efb76",
          "body": "Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.4.0 to 7.0.0.\n- [Release notes](https://github.com/actions/setup-node/releases)\n- [Commits](https://github.com/actions/setup-node/compare/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e...820762786026740c76f36085b0efc47a31fe5020)\n\n---\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(ci): bump actions/setup-node from 6.4.0 to 7.0.0 (#33)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-21T04:19:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "af4e3731c000a7a6f6f9d4121a3d01a8d7e123f0",
          "body": "…Registry (v0.15.1)\n\nRegistry added a 100-char description limit; v0.15.0's MCP Registry\npublish 422'd on it (npm publish was unaffected). No code changes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(release): shorten server.json description to <=100 chars for MCP …",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-18T17:14:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bd9c0aac4fc13ca9380eb9408bf446073ff5b6bb",
          "body": "All four nudge hooks (Claude Code, Codex, Gemini, OpenCode) now walk up\nfrom the tool call's cwd looking for node_modules/@raymondchins/agentmap\nor .claude/agentmap/map.json and stay silent when absent — global/plugin\ninstalls no longer fire in repos without agentmap. Codex gate fails open.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hooks): self-gate all nudge variants on project presence (v0.15.0)",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-18T17:09:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ead82586c6331bd9f6dce54192e3fc7cb5024441",
          "body": "Bump both init and analyze together — CodeQL requires matching versions,\nso the split Dependabot PRs (#31 analyze-only, #32 init-only) each fail with\n'Loaded a configuration file for version 4.36.3, but running version 4.37.0'.\nMerging as one commit keeps main green and closes both PRs.\n\nCloses #31, closes #32\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: bump github/codeql-action init+analyze to v4.37.0 (paired)",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-16T05:28:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "87ec3121a841df3f070b78e3b3f40d0e0dae6506",
          "body": "The tool-count blurbs and reference tables lagged behind the 0.13-0.14\nfeature ships. Brings them current:\n  - README: MCP tool count 8 -> 11 (search/callers/calls); document the RSC\n    boundary tag in --relates; add --no-locals/--include-dts to the flags table\n  - package.json/server.json/plugin.j\n[…]\n  - CONTRIBUTING: add the new commands to the run list + a scope note; npm test\n  - SECURITY: supported version 0.12.x -> 0.14.x\n  - ROADMAP: mark batches 4 & 5 partial (mostly shipped) + add a legend",
          "is_bot": false,
          "headline": "docs: sync public docs + metadata with the v0.14.0 surface",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-05T10:20:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "878bbe729b6e954f254b512bfdd16275d68cead6",
          "body": "Bumps pinned GitHub Actions to current majors and hardens the default\nGITHUB_TOKEN to read-only (jobs re-declare wider scopes where needed):\n  - actions/checkout      v5 -> v7.0.0\n  - actions/setup-node    v5 -> v6.4.0\n  - github/codeql-action  v3 -> v4.36.3 (init + analyze in lockstep)\n  - gitleaks\n[…]\npendabot PRs they mismatch and fail CI.\nSupersedes #24 #25 #26 #27 #28 and the CI-hardening part of #30.\n\nCo-authored-by: daemon-blockint-tech <281118572+daemon-blockint-tech@users.noreply.github.com>",
          "is_bot": false,
          "headline": "ci: adopt action bumps + least-privilege token permissions",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-05T10:17:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ebb2f4ee2643dd7ae79460f75cf9e1f868ca8827",
          "body": "…munity-health\n\n- RSC boundary tagging: per-file rsc:'client'|'server' from the directive prologue\n  (compiler-accurate), surfaced in --relates. Additive; byte-identical for non-Next.\n- Hybrid lexical retrieval: --search <q> + a BM25 rung in --any (fires only on\n  exact-miss, so exact routing stays \n[…]\nissue/PR templates, CONTRIBUTING PR section, README uninstall +\n  troubleshooting.\n- SCHEMA_VERSION 4 -> 5 (per-file rsc + top-level lexical index).\n\n+17 regression tests (332 total). Release v0.14.0.",
          "is_bot": false,
          "headline": "feat: v0.14.0 — RSC boundary tags, BM25 lexical search, --export, com…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T13:45:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "18d84775996676b945e9b0517ec281ec2270be2c",
          "body": "…osure)\n\n--calls <symbol>: the companion to --callers — every in-project symbol a symbol\nINVOKES, resolved by the TS language service (getDefinitionNodes follows imports\nto the real declaration). Constructors + member calls resolve; node_modules / TS\nbuiltins excluded; dynamic/higher-order honestly \n[…]\n-level PageRank deferred (needs findReferences over every symbol — too heavy\nfor the fast build path; revisit with an incremental symbol-ref index).\n\n+14 regression tests (315 total). Release v0.13.1.",
          "is_bot": false,
          "headline": "feat(query): --calls (outgoing call graph) + --depth N (transitive cl…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T12:33:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c3aa459d199bbfe81be57306094bc1e5c962ad8",
          "body": "--find/--any (+ MCP) now surface non-exported top-level declarations as\ndiscovery-only `locals` (never ranked, so --map/--symbols/--hubs stay\nbyte-identical; --no-locals opts out). Schema 3 -> 4.\n\nNew --callers <symbol> (+ callers MCP tool): compiler-accurate symbol-level\nblast radius via the TS lan\n[…]\n (builds a Project only on the query), so the map build and\nevery other query stay fast; nothing persisted. --in <path> disambiguates.\nExperimental.\n\n+20 regression tests (301 total). Release v0.13.0.",
          "is_bot": false,
          "headline": "feat(query): non-exported symbol indexing + compiler-accurate call graph",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T11:39:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6100aa21f8cbef989cc8feb0584d69a22fccdb73",
          "body": "Syncs npm with main: the skills/agentmap/SKILL.md layout (npx skills add\nraymondchins/agentmap) + the honest TS/JS-accuracy README positioning +\nthe Codex gate + server.json, all now in the published package. 280 tests green.",
          "is_bot": false,
          "headline": "chore(release): v0.12.3 — npx skills add layout + npm sync",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T10:17:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc5059d5ff6910931656904208680e379f260d58",
          "body": null,
          "is_bot": false,
          "headline": "docs: npx skills add note + changelog for the skills/<name> layout",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T10:00:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "750641321833017c7efaddaf2f3f8ddfbcd3fcd4",
          "body": "Moved the packaged skill skills/SKILL.md -> skills/agentmap/SKILL.md, the\nskills/<name>/SKILL.md layout that vercel-labs/skills (`npx skills add\nraymondchins/agentmap`) + skills.sh expect. The SKILL.md already carries the\nrequired frontmatter (name: agentmap + description). install.mjs's source path\n[…]\n installs + the 13 install-skill tests are unchanged, and\n`claude plugin validate --strict` still passes. Gets agentmap onto the skills.sh\nleaderboard + one-command install across Claude/Cursor/Codex.",
          "is_bot": false,
          "headline": "feat(skills): skills/<name>/SKILL.md layout so `npx skills add` works",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T09:58:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "041b206a95ab85d26269324b164fc4fb02a956a0",
          "body": "…dex gate + MCP Registry)\n\nAdded: Codex CLI PreToolUse gate (docs-only -> live enforcement, deny-narrow +\nescape hatch); MCP Registry server.json (published live at\nio.github.raymondchins/agentmap) + CI auto-publish on tag via GitHub OIDC.\nChanged: honest competitive positioning — reframed around compiler-grade\nts-morph TS/JS accuracy (the real wedge) instead of the false 'agent-loop\nunmatched' claim; tagline -> 'The TS/JS-accurate repo map'; keywords broadened.\n\n280 tests green.",
          "is_bot": false,
          "headline": "chore(release): v0.12.2 — distribution batch (honest positioning + Co…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T09:52:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1705157b4df0a2ddaeb8691aa2ee3606defd39be",
          "body": "publish.yml now, after npm publish + the GitHub Release, installs mcp-publisher\nand runs `login github-oidc` + `publish ./server.json` — every future `git tag\nvX.Y.Z` push lists the new version in the official MCP Registry with zero\nsecrets (the job already has id-token: write). Runs LAST so a registry hiccup\nnever blocks the npm publish or the Release. The tag/version gate now also\nrequires server.json version + packages[0].version to match the tag.",
          "is_bot": false,
          "headline": "ci: auto-publish server.json to the MCP Registry on tag (GitHub OIDC)",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T09:50:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22b66319a0b73c55743f32df2138f3a82d1533a9",
          "body": "…gistry limit)\n\nThe MCP Registry rejects body.description > 100 chars (422). Trimmed to a\n93-char TS/JS-accuracy line. Published live: io.github.raymondchins/agentmap\n0.12.1. gitignore the downloaded mcp-publisher binary.",
          "is_bot": false,
          "headline": "fix(mcp-registry): shorten server.json description to <=100 chars (re…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T09:37:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a510805d2679f6613bafe21c40cd8eae479c0d12",
          "body": "… distribution batch\n\nREADME onboarding matrix: Codex row docs-only → live PreToolUse gate (with the\nallow-fallback + AGENTMAP_CODEX_GATE=0 bypass + trust/hooks-GA caveats).\nCHANGELOG [Unreleased]: Codex gate, MCP Registry server.json, honest positioning.\nROADMAP: ticked the Codex CLI PreToolUse hook item.",
          "is_bot": false,
          "headline": "docs: onboarding matrix (Codex→live gate), CHANGELOG, ROADMAP for the…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T09:30:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75c04062ca5e2cad1cd3adb10d02c34c282d64dd",
          "body": "Codex CLI was the biggest untapped enforcement gap (skill/AGENTS.md only, no\nlive hook). --install-skill --platform codex now also writes a PreToolUse hook\n(hooks/agentmap-codex-nudge.mjs) + a fenced block in .codex/config.toml.\n\nCodex PreToolUse only honors permissionDecision deny/allow — an 'ask' \n[…]\ngex-test only, never interpolated).\n\nInstaller writes are idempotent (fenced config.toml splice); existing\n--install-skill tests stay green. +test/codex-nudge (9 gate-boundary cases).\n280 tests green.",
          "is_bot": false,
          "headline": "feat(codex): PreToolUse gate — Codex from docs-only to real enforcement",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T09:29:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5ab3007657bc0858daaaeb5eeb1cea4fb1439507",
          "body": "Competitive-honesty fix (the audit found a false claim): the README implied\nagentmap's post-commit-refresh + PreToolUse nudge (the 'agent-loop wiring')\nwas unmatched — it isn't (CodeGraph ships native-OS-event auto-sync). Reframed\naround the REAL, defensible wedge: compiler-grade ts-morph TS/JS accu\n[…]\nymondchins/agentmap, npm package + stdio transport, --mcp arg) so\n`mcp-publisher publish` can list agentmap. Ships in the npm tarball too.\nPublishing is a separate maintainer step (GitHub OIDC login).",
          "is_bot": false,
          "headline": "docs+dist: honest TS/JS-accuracy positioning + MCP Registry server.json",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T09:25:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e806c947cc2e010d964ab4ab7e68cdd80483b049",
          "body": "Added: package.json \"imports\" (#internal/*) resolution.\nPerformance: in-process MCP server (no per-call Node spawn; byte-identical to\nthe CLI, agentmap --mcp verified end-to-end).\nSecurity (full audit): fixed a real ReDoS in the .agentmapignore matcher\n(~80s hang -> <1.5s), SHA-pinned all 9 GitHub A\n[…]\nnt output against prompt-injection, --install-hooks no longer\nclobbers an existing post-commit hook, SECURITY.md bumped to 0.12.x.\n\n271 tests green; byte-identity verified on a frozen 519-file corpus.",
          "is_bot": false,
          "headline": "chore(release): v0.12.1 — pkg imports + in-process MCP + security batch",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T09:08:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "967f55bcbcb344a01138f68c10def0ff3e40ca5b",
          "body": "…ening\n\nFixes from a full security audit (0 committed secrets, npm audit clean,\nconfig-readers never execute repo config — the dangerous surfaces were already\nright; these close the real bug + defense-in-depth):\n\n- H1 (HIGH, real DoS): ReDoS in the .agentmapignore glob→regex matcher — a\n  line of co\n[…]\n- M4: --install-hooks no longer silently clobbers a user's existing\n  post-commit hook — backs it up to post-commit.pre-agentmap + warns.\n- SECURITY.md: bump supported line 0.9.x → 0.12.x (was stale).",
          "is_bot": false,
          "headline": "fix(security): ReDoS in .agentmapignore + supply-chain & footgun hard…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T09:06:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5406554027ab2e6ee2af91e40b640685ce3bbfb5",
          "body": "Every MCP tool call used to execFile a fresh `node agentmap.mjs --json …`\n(double Node spawn + whole-repo reparse per call; the ~1.7s/query dirty-tree\ncost that IS the entire experience for Cursor/Cline/Claude-Desktop users, for\nwhom MCP is the only integration).\n\nmcp.mjs now runs queries in-process\n[…]\nnt byte-identical on a frozen 519-file corpus. +test/mcp-inprocess.\n\nMeasured: warm-clean ~93ms spawn -> ~22ms in-process; a burst of dirty calls\ncollapses to ONE ts-morph reparse. CLI path untouched.",
          "is_bot": false,
          "headline": "perf(mcp): answer the 8 MCP tools in-process, no per-call Node spawn",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T08:52:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8948d15b4f8e4c8e0466e65e79c999c3897b47f2",
          "body": "Node's package.json \"imports\" field (self-referencing internal specifiers\nlike import x from '#lib/util' / '#internal/*') was unhandled — only tsconfig/\nvite/workspace aliases resolved, so every #-prefixed edge was silently dropped.\n\nNew packageImportsToPaths() normalizes an \"imports\" map (condition\n[…]\nd first so the\nladder lands the .ts/.tsx source (source-over-dist).\n\nA repo without an \"imports\" field is byte-identical (loop skips) — verified\nA/B on a frozen 519-file corpus. +test/pkg-imports (4).",
          "is_bot": false,
          "headline": "feat(resolve): package.json Node imports subpath maps (#internal/*)",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T08:48:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "11f3c635bbc86f932041e4ff0cfb016b26f1030e",
          "body": "Nine stacked commits promoted to 0.12.0. Theme: the growth blocker was a\ntrust cliff, not a feature gap — strangers hit a tool that silently returned\na broken/empty map on common non-Next shapes and whose flagship nudge never\nfired on the most common search. This release closes that.\n\nAdded: map-hea\n[…]\n correctness (6 bugs);\nBatch 3 symbol-match cap.\n\n261 tests green; byte-identity verified on a fixed external corpus at every\nstep. plugin/marketplace validated with `claude plugin validate --strict`.",
          "is_bot": false,
          "headline": "chore(release): v0.12.0 — trust-cliff batch (make-it-work-and-say-so)",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T07:49:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08da428d7ac36733d17e72ce22078833a1ad8bef",
          "body": "CHANGELOG [Unreleased]: Added (map-health signal, vite/webpack alias,\nworkspace resolution, .agentmapignore, Claude Code plugin/marketplace/MCP\nRegistry), Changed (.d.ts default-exclude — blast radius noted), Fixed\n(Grep bare-symbol + npx nudge path, Gemini systemMessage inject).\n\nROADMAP: ticked the landed items (Batch 4 plugin+marketplace, MCP Registry\nname, Gemini nudge fix; Batch 5 vite/webpack + workspace resolution,\n.agentmapignore; Batch B Claude nudge npx path).",
          "is_bot": false,
          "headline": "docs: changelog + roadmap for the v0.12.0 trust-cliff batch",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T07:44:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0edd0cec769beeb723198fbd6105d40329be748d",
          "body": "…boarding matrix\n\nDiscovery + onboarding-honesty surfaces (no agentmap.mjs logic touched):\n- .claude-plugin/plugin.json + .claude-plugin/marketplace.json so\n  `/plugin marketplace add raymondchins/agentmap` && `/plugin install\n  agentmap@agentmap` bundle the SKILL, the PreToolUse Grep+Bash nudge (vi\n[…]\n alias/workspace\n  resolution + edgeCoverage + .agentmapignore/.d.ts scoping.\n\nNo registry/marketplace submission is performed here — the manifests are\nlocal; publishing is a separate maintainer step.",
          "is_bot": false,
          "headline": "feat(dist): Claude Code plugin + marketplace + MCP Registry name + on…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T07:41:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1c741610a3cbff5bbeaf64d4411bed8f85fe7922",
          "body": "A monorepo — the highest-value ICP — got zero edges across package walls:\n`import '@org/pkg'` from packages/web never resolved, so blast-radius and hub\nranking silently broke at the boundary. Now discoverWorkspacePackages() maps\nevery tracked NAMED package.json to its SOURCE entry (exports['.'] → mo\n[…]\nmiss → alias).\n\nNo named nested package.json ⇒ the map is empty ⇒ the branch never fires ⇒\na single-package repo is byte-identical (verified on content-os: sha\nunchanged). +test/workspace-resolve (6).",
          "is_bot": false,
          "headline": "feat(resolve): workspace cross-package imports (pnpm/npm/yarn)",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T07:37:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c56d9db846622e6987c43e128eeef99aaada145",
          "body": "…pass\n\nTwo first-run-quality fixes for a stranger's repo:\n- .agentmapignore (repo root, gitignore-style subset — anchored /, dir /,\n  * globs, # comments; dependency-free matcher) lets users exclude\n  generated/vendored/dist code the hardcoded node_modules/.git/.next skip\n  list can't. Absent/empty \n[…]\nny repo with tracked/loaded .d.ts changes by default (this\nis the point). Verified on content-os: the ONLY delta is next-env.d.ts\ndropped as a node — 0 other files/edges changed. +test/ignore-dts (6).",
          "is_bot": false,
          "headline": "feat(scope): .agentmapignore + default-exclude .d.ts from the symbol …",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T07:36:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "95514f45f53d9f5440e4ec4c6e81bd34a20e426f",
          "body": "The largest non-Next audience — a default `npm create vite` app aliases '@/'\nin vite.config, NOT tsconfig — got a FULLY inert map: zero resolved edges,\nflat PageRank, an unranked alphabetical --map dump. Now discoverPackageAlias\nConfigs also reads vite/vitest/webpack.config.{js,ts,mjs,cjs}.\n\nreadBun\n[…]\nalias being UNresolvable — which this fix resolves — so the\nfixture now uses a genuinely unresolvable `@/` (no config agentmap reads),\nkeeping the degraded-signal test valid pre- and post-this-change.",
          "is_bot": false,
          "headline": "feat(resolve): read vite/webpack resolve.alias into the alias resolver",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T07:33:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "809a9dabf59be45e1a5e04333be3146a74433bcd",
          "body": "…ng on broken maps\n\nThe #1 retention fix. On a repo where imports don't resolve (Vite/webpack\nalias only, or a non-git custom layout), agentmap printed a flat map or\n'built 0 files' and exited 0 with zero signal — a stranger reads garbage\nas success and uninstalls.\n\nNow extractFacts() tallies repo-l\n[…]\n).\nHealthy repos (coverage ~1) never trip the warning — verified on content-os\n(edgeCoverage 0.9974, degraded false, no warning, map deep-equal modulo the\ntwo new keys). +test/map-health.test.mjs (5).",
          "is_bot": false,
          "headline": "feat(core): map-health signal — edgeCoverage + degraded, honest warni…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T07:25:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ee5d3d73c0f107c3b2659af24c0d53b0f8d5ff0e",
          "body": "…ionalContext\n\nGemini CLI does not support hookSpecificOutput.additionalContext on the\nBeforeTool event (parsed and silently dropped) — only AfterTool/BeforeAgent\ndo. The nudge therefore never reached the model: --install-skill wired it,\n--doctor reported it installed, but it did nothing. Emit a top\n[…]\nreTool-supported, model-visible field) instead.\n\nEvent + matcher (BeforeTool / run_shell_command|grep|search) are correct and\nunchanged; install-helpers needs no edit. +test/gemini-nudge.test.mjs (6).",
          "is_bot": false,
          "headline": "fix(hooks): Gemini nudge injects via systemMessage, not dropped addit…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T07:20:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "55ce886a1c44f262311cfa4b01edf65e7db89680",
          "body": "Two trust-cliff fixes to the Claude Code PreToolUse nudge:\n- #3: SYMBOL_RE (bare multi-hump PascalCase) now also gates the Grep\n  branch, not just Bash. {Grep, pattern:ProviderCard} — the most common\n  structural search on Claude Code — previously never nudged. Stays\n  silent on Tailwind classes, lo\n[…]\nludes the\n  tool is broken and falls back to grep permanently).\n\n+test/nudge-hook-grep-symbol.test.mjs (9 tests). README 'Fires on' note\ncorrected: bare PascalCase is caught in both Grep and Bash now.",
          "is_bot": false,
          "headline": "fix(hooks): nudge fires on Grep bare-symbol + npx-first command path",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-04T07:19:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d1ce813f65ee60fe819399b10c71fb83cc611f1f",
          "body": "Each found + confirmed with a repro (parallel research agents) and covered by a\nregression test; all byte-identical on a normal repo (verified on content-os):\n\n- tsconfig `extends` origin: anchor baseUrl to its DEFINING config's dir at read\n  time (joinPosixAbs in readTsconfigAliasOpts) so inherited\n[…]\nmjs (7), +2 in dirty-cache; 224 green.\nAn old \"untracked nested tsconfig\" test was reworked (committed config) since the\nnew dirty-config detection legitimately makes an untracked config a dirty tree.",
          "is_bot": false,
          "headline": "fix(correctness): Batch 5 quick-wins — 6 resolution/robustness bugs",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T17:25:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "90bcb65e3c356a181ec329b98396763540592a36",
          "body": "A broad --find/--any used to emit every matching export — thousands of lines\n(~93k tokens on a 5k-file repo), defeating the token-savings the tool exists for.\nMatches are now ranked by the containing file's PageRank and capped to\nSYMBOL_MATCH_LIMIT (50), so the most important matches survive truncat\n[…]\nSmall result sets are unchanged (truncated=false, no footer). +3 tests\n(test/symbol-cap.test.mjs), incl. a proof that PageRank ranking (not insertion\norder) keeps the high-rank match. 216 tests green.",
          "is_bot": false,
          "headline": "perf(query): cap --find/--any symbol matches, ranked by PageRank",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T15:27:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5f01a48bbb2961896b5ea19132520a4bdf84ee16",
          "body": "…er 2 opt-in)",
          "is_bot": false,
          "headline": "chore(release): v0.11.0 — dirty-tree perf (Tier 1 dirty-map cache; Ti…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T15:13:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf3946dfc671427aa32820baa66284515c0dd599",
          "body": "…-export gate\n\nThree rounds of adversarial verification (20 import-resolution shapes across 7 real\nrepos) confirmed Tier 2's isolated-stub reparse has a residual tail of edge cases\nwhere an ungated modify diverges from a full build (.d.ts edges, package.json\n\"exports\" field, barrel+target combos). E\n[…]\nate, not staying incremental — tests updated to match.\n\n213 tests green; default path verified Tier-1 (byte-identical); docs/ROADMAP/CHANGELOG\nupdated with the opt-in rationale and residual-tail list.",
          "is_bot": false,
          "headline": "perf(cache): make Tier 2 incremental opt-in (experimental); harden re…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T15:13:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0156568ba43fada609838db9821363c0986715c5",
          "body": "… adversarial suite\n\nA second adversarial verification pass (12 agents × import-resolution shapes) found\nthree more cases where the isolated-stub reparse diverges from a full whole-repo\nbuild. All now decline to a full dirty build (Tier-1 cached), verified byte-identical:\n\n- **CommonJS `module.expor\n[…]\n`--cached --others`, so an untracked\n  nested tsconfig slipped it. Both now use the same `--others` listing.\n\n+3 regression tests (test/incremental.test.mjs). 213 tests green; map.json byte-identical.",
          "is_bot": false,
          "headline": "perf(cache): harden Tier 2 incremental gates — 3 divergences found by…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T14:46:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "80a192e1351bf0809f31ae06e25b20accc4db2b5",
          "body": "When every dirty entry is a MODIFICATION of a file already in the map, agentmap\nnow reparses ONLY the changed files (against empty ts-morph stubs of the rest) and\nre-runs the cheap global assembly, producing a map byte-identical to a full dirty\nrebuild (content-os 365 files: dirty-1 ~1.8s → ~0.62s, \n[…]\n + shared assemble(); extractFacts(inc) subset mode\n- buildIncremental() + gates; makeProject(inc) stub-based resolution\n- test/incremental.test.mjs (+15), docs/batch3-dirty-tree-perf.md as-built note",
          "is_bot": false,
          "headline": "perf(cache): Tier 2 incremental dirty build — reparse only changed files",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T14:30:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "622ddd0a647f29677e1843dbd92620b8fc4363af",
          "body": "On a dirty git tree every query used to re-parse the whole repo (content-os 370\nfiles: ~1.7s each, zero reuse). Now the dirty build is cached to a separate\n.claude/agentmap/map.dirty.json keyed by sha1(HEAD + dirty-file path:mtime:size),\nso back-to-back queries on an unchanged dirty tree reuse ONE r\n[…]\nP_DIRTY/FACTS consts, build({target,extra}) param\n- ensureFresh() dirty-cache branch + buildDirty() (buildIncremental stub for T2)\n- test: test/dirty-cache.test.mjs (+4), runErr()/didReparse() helpers",
          "is_bot": false,
          "headline": "perf(cache): Tier 1 dirty-map cache — reuse one rebuild on a dirty tree",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T13:41:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "74890ac33b540ad2428a4a9db8ee42a554055033",
          "body": "…baseline\n\nTwo-tier plan (Tier 1 dirty-map cache byte-identical ~0.5d; Tier 2 true\nincremental) with exact edit points, regression test list, and a measured\nbaseline (content-os 370 files: warm 0.10s vs every dirty query 1.67s, zero\nreuse). Notes the cache-poison one-shot rebuild on dirty→clean transition.",
          "is_bot": false,
          "headline": "docs(batch3): implementation-ready dirty-tree perf design + measured …",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T13:25:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7b8d0e48fc8cbee86c7c31229883413eef90238",
          "body": "…t markers\n\nBatch 4 (release engineering) slice:\n- .github/workflows/publish.yml — push a v* tag → full test gate → npm publish\n  with provenance (OIDC-signed, only possible from CI) → GitHub Release. Guards\n  against tag/package.json version drift. Requires NPM_TOKEN repo secret.\n- README — privacy posture (fully local, no network/telemetry; verified zero\n  fetch/http in source) + name-collision caveat (use scoped @raymondchins/agentmap).\n- CHANGELOG [Unreleased], ROADMAP Batch 4 boxes ticked.",
          "is_bot": false,
          "headline": "ci(release): tag-triggered publish workflow + provenance; README trus…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T12:57:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe771695f68d3f9c0c1059743143ca3f8093dd79",
          "body": "Cuts the accumulated Batch 1 + Batch 2 work as 0.10.0 (npm is still on 0.9.0,\nwhich predates the post-commit-hook RCE fix and the MCP crash-masking fix — so\nthis release also closes a security gap for npm users). Map output stays\nbyte-identical; 191/191 tests green.\n\nImprovements landed in this rele\n[…]\n  into [0.10.0] - 2026-07-03 with fixed compare links.\n\nFull 0.10.0 notes (Batch 1 security/CI/docs + Batch 2 modularization, backend\nseam, command validation, exit-code contract) are in CHANGELOG.md.",
          "is_bot": false,
          "headline": "chore(release): v0.10.0 — expand secret denylist + housekeeping",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T09:47:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "811ef40db192b4f6b526cdaf35b86728fa3c2458",
          "body": "…r/checker pairs\n\nCompletes Batch 2 of the audit roadmap (tasks 6/7/8). The map output stays\nbyte-identical to the pre-Batch-2 build (verified via a --print diff); the\nchanges below are all in the CLI contract + internal structure. 189/189 tests\ngreen (+15 new).\n\nBehavior changes (CLI exit-code cont\n[…]\nontract.test.mjs\n(5), +1 writer/checker cross-consistency test; updated setup-mcp / install-skill\nexit-code assertions (1→3). Docs: README exit-code contract, CHANGELOG, ROADMAP\n(Batch 2 marked done).",
          "is_bot": false,
          "headline": "feat(cli): command-table validation + exit-code contract; unify write…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T09:34:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5b078a7887d68f7a8324ecd12e1013bcac7c2e72",
          "body": "…as red\n\ntest/vue-sfc/fixtures.mjs lazily require()d helpers.mjs via createRequire, but\nrequire() of an ES module is only supported on Node 22.12+, so the Node 18 CI\nmatrix leg failed with ERR_REQUIRE_ESM (40 vue-sfc tests). This pre-dates the\nBatch 2 work — commit 82259ee (docs-only) was already red on Node 18.\n\nengines still declares node >=18, so switch to a static ESM `import { run }`,\nwhich works on every supported version. No behavior change on 20/22; the full\nsuite stays 174/174 locally.",
          "is_bot": false,
          "headline": "fix(ci): static import for the vue-sfc harness — Node 18 matrix leg w…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T06:55:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2173315370ee5e4f59b913005e665ff5391faaf",
          "body": "… extractFacts()\n\nBatch 2 (structural core) of the audit roadmap. Behavior-preserving: the map,\nhubs, rankings, and exit codes are byte-identical to the pre-refactor build\n(verified via a `--print` diff at each step); 174/174 tests green.\n\n- main() guard + exports: the CLI arg-parse + dispatch now l\n[…]\ness unit tests (incl. the extractFacts seam\n  contract) that call the exported functions directly, no subprocess spawn.\n\nDocs: CHANGELOG [Unreleased] Added/Changed entries; ROADMAP batch-2 checkboxes.",
          "is_bot": false,
          "headline": "refactor(core): modularize for the backend seam — importable module +…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T06:52:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3fbf6638a5c4aecf0cd26257f7f04c11d8a69fb4",
          "body": "Pick-up-anywhere backlog derived from the 2026-07-03 multi-agent audit: 5\nsequenced batches (trust&truth done; modularize, dirty-tree perf, distribution,\nTS-depth) plus a cross-cutting low-severity backlog, each task anchored to\nfile:line with a fix approach and a checkbox. Includes the multi-language\nstrategic decision (build the backend seam, defer the languages).\n\nClaude-Session: https://claude.ai/code/session_016sYTGBwJXHRQ2K5Xv2ZTdv",
          "is_bot": false,
          "headline": "docs: add ROADMAP.md — prioritized improvement plan from the full audit",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T05:56:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa91e514226f0cd72765bcbb7d6fed3c5f556be1",
          "body": "The audit found SECURITY.md, README, hooks/INSTALL.md and CONTRIBUTING.md drifted\nbadly from the shipped code. Sync them and fix one real code bug they exposed:\n\n- SECURITY.md: supported version 0.3.x->0.9.x; drop the nonexistent 'agentmap\n  --refresh' (the hook runs the bare binary); fix cache path\n[…]\nrd* (only matched foo.password.ts); use\n  *password* so a plain password.txt is excluded. Adds a secret-leak regression\n  test.\n\nClaude-Session: https://claude.ai/code/session_016sYTGBwJXHRQ2K5Xv2ZTdv",
          "is_bot": false,
          "headline": "docs+fix: truth-sync stale docs and fix the *.password* exclusion typo",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T04:57:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa1d1e215fc9e0344c0d8eeec228118a269d54d8",
          "body": "Exit code 1 is overloaded: the CLI uses it for zero-results, but it is also\nNode's default code for an uncaught exception, so any hard crash of agentmap\n(failed atomic write, OOM in ts-morph, unexpected TypeError) was returned to\nthe MCP client as {text:'no results'} with no isError flag — the model\n[…]\n, which the old 'err.code === undefined' test missed\nand mislabeled as exit 1. Adds the first protocol-level tests for mcp.mjs.\n\nClaude-Session: https://claude.ai/code/session_016sYTGBwJXHRQ2K5Xv2ZTdv",
          "is_bot": false,
          "headline": "fix(mcp): surface CLI crashes as isError instead of a false 'no results'",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T04:50:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c61764d45f67972ccc36c1d17b9ee2803e55a8b",
          "body": "…efault\n\nThe post-commit hook preferred a working-tree ./agentmap.mjs over the\ninstalled package. That file is attacker-plantable: any branch or PR can add\nit, and the hook fires on the victim's next commit — arbitrary code execution,\ncontradicting SECURITY.md's guarantee that the hook runs only its\n[…]\nndchins/agentmap, or npx with the scoped name — closing the bare-PATH\nhijack too. Adds regression tests that run the real hook.\n\nClaude-Session: https://claude.ai/code/session_016sYTGBwJXHRQ2K5Xv2ZTdv",
          "is_bot": false,
          "headline": "fix(security): don't execute repo-local ./agentmap.mjs on commit by d…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T04:47:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "751df3564cde958609c0b87846dc90ffd784f929",
          "body": "…-sfc tests\n\nCI ran 'node --test test/*.test.mjs' (116 tests) while 'npm test' runs 159;\nthe entire test/vue-sfc/ suite had zero CI protection. Use npm test as the\nsingle source of truth.\n\nClaude-Session: https://claude.ai/code/session_016sYTGBwJXHRQ2K5Xv2ZTdv",
          "is_bot": false,
          "headline": "fix(ci): run the full test suite — test/*.test.mjs skipped all 43 vue…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T04:45:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc018c9adc566bcf99393133ffce4ce399380479",
          "body": "The v0.9.0 release commit bumped package.json but left the lockfile at\n0.8.0; npm install/test rewrites it on every run as a result.\n\nClaude-Session: https://claude.ai/code/session_016sYTGBwJXHRQ2K5Xv2ZTdv",
          "is_bot": false,
          "headline": "chore: sync package-lock.json version to 0.9.0",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-07-03T03:47:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b13dbe9777604d692ad320f035fcfa356f60b1b2",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.9.0 — add agentmap --doctor health report",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-16T04:08:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e6ecf2ac6d3967c52538de063817aa55fde8ea6",
          "body": "Read-only diagnostic that unifies hook-status, skill/rule freshness,\nMCP wiring, and map-cache state into one command. Always exits 0,\nsuggests fix commands, never writes files. Supports --json.\n\nRefs #7.\n\nCo-authored-by: mcpe500 <mcpe500@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(doctor): add agentmap --doctor harness health report (#14)",
          "author_name": "mcpe500",
          "author_login": "mcpe500",
          "committed_at": "2026-06-16T04:07:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04fde5e4582b6424d0497a6532c4d64cfb048776",
          "body": "…tends aliases (#9), Windows Gemini docs fix",
          "is_bot": false,
          "headline": "chore(release): 0.8.0 — multi-CLI install-skill (#6,#12), monorepo ex…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-15T02:22:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b6492c6486400eaefa443aec03527a312fea4da",
          "body": "Complete PR #9: a package tsconfig that only `extends` a shared base\n(Turborepo tsconfig.base.json holding all `paths`) now contributes its\ninherited baseUrl/paths to --relates. Single-level+ recursive, depth-capped,\nchild overrides parent, bare-package extends skipped. Verified: synthetic\nextends fixture 0->2 importers; non-regression on single-package @/* repo\n(grep 17 == --relates 17).",
          "is_bot": false,
          "headline": "feat(import-graph): follow tsconfig extends in alias resolution",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-15T02:22:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fa844709702f512aed1adc7c5d8b6e9b1f81427",
          "body": "…repos\n\nCloses #9. Authored by @muhajirdev.\nCo-authored-by: Muhammad Muhajir <muhajirframe@gmail.com>",
          "is_bot": false,
          "headline": "Merge PR #9: feat(import-graph) resolve tsconfig path aliases in mono…",
          "author_name": "Raymond Surya Chin",
          "author_login": "raymondchins",
          "committed_at": "2026-06-15T02:20:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d86cff7ed114c9a7f6b612b8090bc0104e0b7981",
          "body": "Mirror the skill dest win32 branch so docs land in the dir Gemini CLI\nactually reads on Windows (~/.agents) instead of ~/.gemini.",
          "is_bot": false,
          "headline": "fix(install-skill): route global Gemini GEMINI.md to .agents on Windows",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-15T02:20:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c95ce32e331e05ffa5c5e4699012f7e09548b3c0",
          "body": "….md merge, Gemini hook, OpenCode plugin)\n\nCloses #12. Authored by @muhajirdev.\nCo-authored-by: Muhammad Muhajir <muhajirframe@gmail.com>\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Merge PR #12: feat(install-skill) docs+hooks parity (GEMINI.md/AGENTS…",
          "author_name": "Raymond Surya Chin",
          "author_login": "raymondchins",
          "committed_at": "2026-06-15T02:19:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "96f223c02559c99314cd36b6eed66049cfee9bcd",
          "body": "…ode/Gemini/Antigravity/Copilot)\n\nCloses #6. Authored by @muhajirdev.\nCo-authored-by: Muhammad Muhajir <muhajirframe@gmail.com>\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Merge PR #6: feat(install-skill) expand Tier B platforms (Codex/OpenC…",
          "author_name": "Raymond Surya Chin",
          "author_login": "raymondchins",
          "committed_at": "2026-06-15T02:19:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f90d636cc3447babf69f5a59d17f60dfae6b14f0",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix stale --install-docs references in hook comments",
          "author_name": "Muhammad Muhajir",
          "author_login": "muhajirdev",
          "committed_at": "2026-06-14T19:36:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f2e6c860c603d99f9c9cb3d0a60aa306bdd35c3",
          "body": "Remove separate --install-docs flag and install-docs.mjs. Extend\nskills/install.mjs with GEMINI.md/AGENTS.md merge, Gemini hooks, and\nOpenCode plugin per platform registry. Extract install-helpers.mjs.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "refactor(install-skill): unify docs/hooks into --install-skill",
          "author_name": "Muhammad Muhajir",
          "author_login": "muhajirdev",
          "committed_at": "2026-06-14T19:36:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c463d306af932d5ee541426d5a8a692a65eafe12",
          "body": "…e plugin\n\nAdd --install-docs for always-on guidance deferred from install-skill PR #6:\nmerge-safe docs blocks, Gemini BeforeTool nudge in .gemini/settings.json,\nand OpenCode plugin scaffold. 145 tests pass.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(install-docs): GEMINI.md, AGENTS.md merge, Gemini hooks, OpenCod…",
          "author_name": "Muhammad Muhajir",
          "author_login": "muhajirdev",
          "committed_at": "2026-06-14T19:36:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a1fffce3ed62c39e2d96108ffc741ef64b9bbc8a",
          "body": "Discover package tsconfig/jsconfig files and apply nearest baseUrl+paths\nwhen resolving alias imports from repo root. Fixes --relates undercount\nfor TanStack/Vite #/* aliases when root tsconfig lacks paths.\n\nRefs raymondchins/agentmap#8\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat: resolve tsconfig paths per importing file (monorepo #/*)",
          "author_name": "Muhammad Muhajir",
          "author_login": "muhajirdev",
          "committed_at": "2026-06-14T19:06:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "39290afc92c606ec5e950b5073ba43b78e9f8791",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "docs: drop graphify references from install-skill docs",
          "author_name": "Muhammad Muhajir",
          "author_login": "muhajirdev",
          "committed_at": "2026-06-14T18:42:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "990e7ea8f1c77c6a8fa419d610a7196936af0564",
          "body": "Add codex, opencode, gemini, antigravity, and copilot to --install-skill with\nproject/global paths aligned to OpenCode, Antigravity, and Graphify conventions.\n\nBreaking: --platform all no longer includes legacy agents or writes\n~/.agents/skills/ globally by default; use --platform agents or antigravity\nexplicitly. Documented in CHANGELOG.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "feat(install-skill): expand Tier B platforms and align paths",
          "author_name": "Muhammad Muhajir",
          "author_login": "muhajirdev",
          "committed_at": "2026-06-14T18:37:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "af434499e994f9220cbf2ce9e8ad51c98ef1dd6e",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.7.0 — --hook-status (#5) + --install-skill (#4)",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-14T17:25:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3a2ded653aae1e52082beb5536d79eedcbbb4ab",
          "body": "* Add --install-skill for agent skills and Cursor rules.\n\nShip packaged SKILL.md and a Cursor always-on rule (graphify-style) so\nagents know when to query agentmap before grep. Includes tests and docs.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n* Drop Graphify references from install-skill do\n[…]\n/--find queries never load it\n  (matches the lazy ts-morph / lazy mcp.mjs discipline)\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\nCo-authored-by: raymondchins <raymondchin.s@gmail.com>",
          "is_bot": false,
          "headline": "Add --install-skill for agent skills and Cursor rules (#4)",
          "author_name": "Muhammad Muhajir",
          "author_login": "muhajirdev",
          "committed_at": "2026-06-14T17:24:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b6dd2ad48660cec723f5cc98c274f712b6863f54",
          "body": "* Add --hook-status to report git hook wiring.\n\nShows post-commit, PreToolUse nudge, and .gitignore state — inspired by\ngraphify hook status. Detects chained hooks when agentmap marker is missing.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n* test: chained post-commit (agentmap + another tool) still reports installed\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\nCo-authored-by: raymondchins <raymondchin.s@gmail.com>",
          "is_bot": false,
          "headline": "Add --hook-status for git hook wiring (#5)",
          "author_name": "Muhammad Muhajir",
          "author_login": "muhajirdev",
          "committed_at": "2026-06-14T17:20:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4f0f10a81cb79fe00067e2c148f47e22a89bddf7",
          "body": "…e correctness\n\n7 findings from a security/correctness/robustness audit (all verified):\n- build(): per-file try/catch so one bad file can't abort the whole map\n- resolveSpec: tsconfig baseUrl/paths aliases for side-effect/dynamic/require imports\n- rankSymbols: re-export barrels no longer counted as \n[…]\nno empty top file)\n- sourceFingerprint/Vue walk: per-dir try/catch + depth cap\n- docs: --any content fallback case-insensitivity\n\n+ test/audit-fixes.test.mjs (3 regression tests). Suite 127/127 green.",
          "is_bot": false,
          "headline": "fix(audit): graceful degradation, alias dynamic edges, ranking + cach…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-14T16:37:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "edcaa9b6e6c3988f732c5f371a0288edf07de276",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.6.0 — add --setup-mcp",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-14T10:20:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "447445736c137c2b201ea0496c0316b6c159d468",
          "body": "* feat: add --setup-mcp command to automate MCP configuration for OpenCode and Antigravity IDE\n\n* fix: resolve PR reviews for --setup-mcp\n\n* refactor(setup-mcp): reuse parseSettings, drop pointless .bak, dual Antigravity path\n\n- reuse parseSettings() for JSONC-tolerant parsing instead of raw JSON.pa\n[…]\nravity builds\n- simplify isNpx detection to the real _npx cache marker\n- table-driven targets to kill the duplicated per-config block\n\n---------\n\nCo-authored-by: raymondchins <raymondchin.s@gmail.com>",
          "is_bot": false,
          "headline": "Add --setup-mcp command for automated MCP configuration (#1)",
          "author_name": "Mikael A",
          "author_login": "mikaelaldy",
          "committed_at": "2026-06-14T10:20:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "26f154e95d11f8e19679d5f01818a86685e03d3d",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.5.0 — Vue SFC <script> indexing (#2)",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-14T09:52:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ce9e33d05374cc412d5f2975c2eccba98873d5f",
          "body": "The non-git .vue tree-walk used statSync without a symlink check, unlike\nsourceFingerprint() which uses lstatSync + isSymbolicLink skip. A circular\nsymlink would recurse until the stack overflowed (caught by the outer\ntry/catch, silently dropping all Vue indexing for that repo). Match the\nfingerprint walk: lstatSync + skip symlinks.",
          "is_bot": false,
          "headline": "fix(vue-sfc): guard non-git Vue walk against circular symlinks",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-14T09:50:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b78b6f12da8808e44f869e027b686fd796fdf368",
          "body": "… script regex\n\nTwo correctness bugs reported by PR #2 review:\n\n1. resolveSpec priority (resolveSpec in build()).\n   The extensionless-'.vue' fallback ran BEFORE the TS/JS RES_EXT loop, which\n   affected only the two paths that bypass ts-morph's\n   getModuleSpecifierSourceFile(): side-effect imports\n[…]\nity test for malformed input\n    (no silent corruption — the SFC is omitted rather than misparsed).\n\nTest results: 116/116 pass, 21/21 black-box eval checks, 0 regression\non the pre-existing 73 tests.",
          "is_bot": false,
          "headline": "fix(vue-sfc): fix resolver priority for dynamic imports + quote-aware…",
          "author_name": "mcpe500",
          "author_login": "mcpe500",
          "committed_at": "2026-06-14T09:48:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bf5c6f87404cf593b7cd1aa19997e3d65d0e325e",
          "body": "Add best-effort Single File Component support to agentmap via zero new\ndependencies. .vue files are now discovered through the same git ls-files\nchannel as TS/JS (with a non-git tree-walk fallback), their <script> or\n<script setup> block is extracted by a conservative regex, and the block\ntext is fe\n[…]\no-leak.test.mjs            (5)\n- test/vue-sfc/coexist.test.mjs           (3)\n- test/vue-sfc/cache-and-freshness.test.mjs (4)\n- benchmark/vue-sfc-eval.mjs              (standalone 21-check eval, 21/21)",
          "is_bot": false,
          "headline": "feat(vue-sfc): index <script>/<script setup> blocks from .vue files",
          "author_name": "mcpe500",
          "author_login": "mcpe500",
          "committed_at": "2026-06-14T09:48:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "531dc276406eca8cf4c949e861a0bd0847361a80",
          "body": "Added\n- eval/eval.mjs + EVAL.md (`npm run eval`): retrieval-accuracy harness scoring\n  symbol-definition top-1/top-3 and dependents precision/recall vs a git-grep\n  baseline, with runtime-derived ground truth on real repos.\n\nFixed\n- --install-hooks PreToolUse path now resolves under an npx install (\n[…]\n-script execution (+ AGENTMAP_HOOK_NO_LOCAL).\n\nDocs/CI\n- New SECURITY.md; token-cost methodology disclosure; CI security gates\n  (npm audit, CodeQL, npm pack --dry-run, gitleaks); package-lock synced.",
          "is_bot": false,
          "headline": "release: v0.4.0 — retrieval-accuracy eval + security/install hardening",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-14T09:31:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aa2a1f6983cf85ac5bf735e451ef4fa72035a2a4",
          "body": "….3.0)\n\nThe PreToolUse nudge hook now fires on the Bash tool (raw grep/rg/egrep/fgrep/ag/ack), not just the Grep tool — closing the gap where Bash-level searches bypassed the nudge entirely. Adds a multi-hump PascalCase symbol rule and un-anchors the TS-generic denylist so it suppresses generics mid-command (Bash) and mid-pattern (Grep). --install-hooks now wires both a Grep and a Bash matcher (idempotent). New test/nudge-hook.test.mjs (36 cases); 73/73 green.",
          "is_bot": false,
          "headline": "feat(nudge): cover Bash grep/rg searches + PascalCase symbol hunts (0…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-14T05:40:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "619a9c2984fc152af49ba1316ed2395a86152770",
          "body": "…nce 0.2.2)",
          "is_bot": false,
          "headline": "chore(release): 0.2.3 — sync npm README (docs only, no code change si…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T17:36:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "320835029e7d95e7c1ded30dc2db1511e2e1fc38",
          "body": "Reformat the proof table to the most convincing shape — one real 154-file repo,\neach row a real question the agent asks, with the literal token cost reading\nfiles vs querying agentmap (1,950->20, 81,038->616, 150,281->1,127). Total row\n257,778->4,451 (98.3%). Honest low rows (63%, 11%) kept in view. Re-ran all 3\nrepos at pinned shas to re-validate the totals before publishing. Frozen numbers\nuntouched.",
          "is_bot": false,
          "headline": "docs(readme): benchmark as before/after with raw token counts",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T17:29:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "420bb203e09dddfef4fb3970f1e809647ab69130",
          "body": "Markdown tables hug content width; switch the benchmark grid to an HTML table\nwith width=100% so it spans the column, and the wider cells give room to label\neach figure '99.3% saved' (no wrap). Same numbers.",
          "is_bot": false,
          "headline": "docs(readme): full-width benchmark table (HTML) + 'saved' label per cell",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T17:10:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c653b720c1217ca474e0e0fb2e868cbc530b6a0e",
          "body": "…r + file counts)\n\nCells are just the saved % now (no '(133×)' clutter, no '154f' in headers); the\nstriking multipliers live in one prose line below the grid. Cleanest read.",
          "is_bot": false,
          "headline": "docs(readme): benchmark table = clean % only (drop per-cell multiplie…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T17:07:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f2d2259e6e65da9fda08cf651d425873cac4f33",
          "body": "Each data cell was '99.3% · 133× fewer' which wrapped to two lines and made the\ntable noisy. Collapse to '99.3% (133×)', move the 'fewer tokens' explainer + task\ndefinitions into one small caption line, and shorten row labels. Same numbers,\nmuch cleaner grid.",
          "is_bot": false,
          "headline": "docs(readme): tidy benchmark table — compact cells, no per-cell wrapping",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T17:05:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60e3fa48f6007b8daeeb70d3fe7530d1beec3ba8",
          "body": "…f table\n\nMove Benchmark to #2, right under the hero — show the numbers before the pitch.\nEnrich it: per-task table across 3 repos with both savings% and the derived\nNx-fewer multiplier (133x / 646x map, 776x reuse), an explicit speed line\n(~1.2s cold / ~0.1s warm), and the honest weak spots kept (−313% single-file,\n75.9% tiny-symbol). All multipliers are baseline/agentmap from the captured\nbench numbers — no projections. Frozen headline figures untouched.",
          "is_bot": false,
          "headline": "docs(readme): lead with benchmark (above Why-different) + richer proo…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T17:02:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84e637e2bb3ec180f20b01dd333ae2a298dfc538",
          "body": "…cal signal\n\nCollapse the two-paragraph hero into one: pain → the precise definition\n(ts-morph import/symbol graph, personalized PageRank) → daily ask → savings →\nthe agent-loop hooks. ~half the length, still simple-then-technical.",
          "is_bot": false,
          "headline": "docs(readme): tighten hero to one paragraph, keep senior-grade techni…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T16:55:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c799e8371b7cd20f622369194c94644dda9be65a",
          "body": null,
          "is_bot": false,
          "headline": "docs(readme): keep '~98% fewer tokens on average' unbroken on one line",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T16:51:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55ca0bb7e2bc89b8474b285c7f23738aa3782113",
          "body": "…nd the codebase'\n\nNobody prompts their agent 'understand the codebase.' Ground the savings in the\nuniversal daily loop: ask for a feature/bugfix → the agent first hunts down the\nrelevant files/imports/existing code → that hunt is what agentmap collapses.",
          "is_bot": false,
          "headline": "docs(readme): frame the payoff around a real daily ask, not 'understa…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T16:51:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c258f5deb3e513682ec4ed735e8288166d3b2e11",
          "body": "…the plain hook\n\nThe junior-friendly rewrite dropped 'queryable, ranked code-relationship map for\nTS/JS' — restore it so every section reads simple-then-technical (what it does +\nwhy it works), not one or the other. Also tightened the hero a line.",
          "is_bot": false,
          "headline": "docs(readme): keep the precise tech definition in the hero alongside …",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T16:46:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6525b7368f21a1a72a0f43331192c3cc969aaeb3",
          "body": "Lead each section with the pain it kills in human terms (agent re-greps the\nrepo every session and burns tokens; maps go stale; agents ignore them) before\nthe technical detail — so a junior gets the 'wow' and a senior still gets the\ndepth. Frozen benchmark numbers untouched; honest-tone caveats kept.",
          "is_bot": false,
          "headline": "docs(readme): plain-language USP hooks atop key sections",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T16:43:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86c8034eed41e1bddc3243221d0422f2d66c09d5",
          "body": "…rence down\n\nReorder only (no content change): the differentiator (agent-loop wiring) and the\nproof (benchmark) now sit directly under the comparison table, so the page reads\nhook → why-different → how-it-wins → quickstart. The ~270-line --any router +\ncommand reference moves below the fold for readers who are already sold.",
          "is_bot": false,
          "headline": "docs(readme): lead with the agent-loop + benchmark, push command refe…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T16:38:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17640c471ad90cb482007e9516a225eec371caec",
          "body": "actions/checkout@v4 and setup-node@v4 run on the deprecated Node 20 runtime\n(removed from runners 2026-09-16). v5 runs on Node 24 — kills the deprecation\nannotation, no behavior change.",
          "is_bot": false,
          "headline": "ci: bump checkout + setup-node to v5 (Node 24)",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T16:23:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c34ace4889f89c0d046510278214da1b347a2188",
          "body": "…enforcement\n\n- Perf: lazy-load ts-morph via createRequire — the ~105ms compiler init now only\n  fires on a cold rebuild, so warm cache queries skip it entirely. Measured warm\n  217ms -> 105ms median (-52%, ~2.07x) on a clean-tree fixture. Cold unchanged.\n- --install-hooks now auto-wires the PreTool\n[…]\npotent) instead of only printing the\n  snippet, so map enforcement is on by default after install. +1 test (now 37).\n- Docs (README, hooks/INSTALL.md) updated; marketing strings untouched. Bump 0.2.2.",
          "is_bot": false,
          "headline": "feat: lazy-load ts-morph (2x faster warm) + install-hooks auto-wires …",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T16:07:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c293a37f67ddfb7cc8b1a61ac03cbad72aeaa228",
          "body": "agentmap's PageRank/symbol ranking is an independent JS reimplementation of a\npublic algorithm (Aider uses networkx; no Aider source is copied), so it is not\na derivative work and carries no Apache-2.0 obligation. Remove LICENSE-APACHE\nfrom the repo + tarball; keep Aider credited in NOTICE/README. Fixes the GitHub\n\"Unknown\" license classification. Bump 0.2.0 -> 0.2.1.",
          "is_bot": false,
          "headline": "chore(license): MIT-only, drop LICENSE-APACHE",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T15:08:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff374923dc3570dc2ca1ced2c97b4637d1fe43d8",
          "body": "node --test <dir> only auto-discovers on Node 21+; on the 18/20 matrix\nlegs it treated test/ as a module path and threw MODULE_NOT_FOUND.\nSwitch to test/*.test.mjs so the shell expands an explicit file list\n(works on all engines, excludes helpers.mjs).",
          "is_bot": false,
          "headline": "fix(ci): use shell-globbed test file list",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T15:02:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "758085cefdc5326b2558ed2a355984ba2d0a2f4f",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): v0.2.0",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T14:55:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03c34ed76c53ef3cee4bb565c78362360bf6c46a",
          "body": "Audit-driven hardening pass + OSS launch prep for v0.1.0.\n\nEngine (agentmap.mjs, renamed from repomap.mjs):\n- Fix stale-cache on new untracked dirs (git status --untracked-files=all)\n- Fix --any file-substring shadowing real symbol matches\n- Index monorepo/narrow-tsconfig siblings + alias imports; t\n[…]\nhooks/ + mcp.mjs in the npm tarball\n\nPackaging/legal:\n- Scoped all npm refs to @raymondchins/agentmap (bare name is a different pkg)\n- LICENSE-APACHE + NOTICE (Aider Apache-2.0 attribution), CHANGELOG",
          "is_bot": false,
          "headline": "feat: harden engine, add tests/CI/MCP, rename repomap→agentmap",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T14:52:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0915056410922ba520190fa1bd1db5f13a66cfbc",
          "body": null,
          "is_bot": false,
          "headline": "docs(copy): scope tagline to TS/JS (was misleading 'any codebase')",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T12:24:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67a8ffc76642af70f901289bb20e79d92e1b3045",
          "body": null,
          "is_bot": false,
          "headline": "docs(copy): lead with ~98% token savings in tagline + npm description",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T12:23:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f63e00248c3c92704c49c52bbe4c03a37a285058",
          "body": null,
          "is_bot": false,
          "headline": "design(banner): swap hero to polished PNG (icons+chips), drop old SVG",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T12:18:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dfc0e4d925d1fd86d8dfdd36c302655f44a7000",
          "body": "…gs' copy",
          "is_bot": false,
          "headline": "design(banner): consistent 48px padding, snug 98%+label, 'token savin…",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T12:03:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eeeb5d1440af8e57e8c9e1eb0b33b05c96400a7b",
          "body": "…right of 98%)",
          "is_bot": false,
          "headline": "fix(banner): clear text/number overlap in hero.svg (move label block …",
          "author_name": "raymondchins",
          "author_login": "raymondchins",
          "committed_at": "2026-06-13T11:57:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 10,
      "commits_last_year": 105,
      "latest_release_at": "2026-07-18T17:17:26Z",
      "latest_release_tag": "v0.15.1",
      "releases_from_tags": false,
      "days_since_last_push": 1,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 1.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 85,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@raymondchins/agentmap",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "agentmap",
            "repo-map",
            "repomap",
            "code-map",
            "codebase-map",
            "repository-map",
            "ts-morph",
            "typescript",
            "javascript",
            "pagerank",
            "static-analysis",
            "ast",
            "code-graph",
            "call-graph",
            "knowledge-graph",
            "dependency-graph",
            "import-graph",
            "code-intelligence",
            "code-search",
            "bm25",
            "mermaid",
            "context-engineering",
            "token-efficiency",
            "mcp",
            "claude-code",
            "cursor",
            "codex",
            "ai-agent",
            "coding-agent",
            "llm",
            "claude",
            "aider",
            "context"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@raymondchins/agentmap",
          "is_deprecated": false,
          "latest_version": "0.15.1",
          "repository_url": "https://github.com/raymondchins/agentmap",
          "versions_count": 24,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3162,
          "first_published_at": "2026-06-13T11:34:24.072000Z",
          "latest_published_at": "2026-07-18T17:17:25.495000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 10,
      "stars": 45,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-06-13",
            "count": 2
          },
          {
            "date": "2026-06-14",
            "count": 5
          },
          {
            "date": "2026-06-15",
            "count": 2
          },
          {
            "date": "2026-07-04",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 10,
        "total_forks": 10
      },
      "star_history": null,
      "open_issues_and_prs": 4
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 189599,
      "source_files_sampled": 63,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 10,
        "malicious_count": 0,
        "assessed_package": "npm:@raymondchins/agentmap@0.15.1",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "ts-morph",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "28.0.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 2,
        "merged_prs": 9,
        "open_issues": 2,
        "closed_ratio": 0.818,
        "closed_issues": 9,
        "closed_unmerged_prs": 16
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "raymondchins",
          "commits": 92,
          "avatar_url": "https://avatars.githubusercontent.com/u/12913191?v=4"
        },
        {
          "type": "User",
          "login": "muhajirdev",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/12745166?v=4"
        },
        {
          "type": "User",
          "login": "mcpe500",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/68177813?v=4"
        },
        {
          "type": "User",
          "login": "mikaelaldy",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/58765940?v=4"
        }
      ],
      "contributors_sampled": 4,
      "top_contributor_share": 0.885
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/29 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 4 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 10,
            "reason": "all dependencies are pinned",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool is run on all commits",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "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": "79bffa9497982ed1e804703e597ed437128dba61",
        "ran_at": "2026-07-24T03:08:08Z",
        "aggregate_score": 6.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T09:59:23Z",
      "oldest_open_prs": [
        {
          "number": 37,
          "created_at": "2026-07-22T09:59:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 38,
          "created_at": "2026-07-22T09:59:29Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-22T09:58:34Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 13,
          "created_at": "2026-06-15T12:32:17Z",
          "last_comment_at": "2026-06-15T12:38:54Z",
          "last_comment_author": "Laznology"
        },
        {
          "number": 29,
          "created_at": "2026-07-04T09:43:29Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/raymondchins/agentmap",
    "host": "github.com",
    "name": "agentmap",
    "owner": "raymondchins"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 65,
      "inputs": {
        "security": 75,
        "vitality": 74,
        "community": 55,
        "governance": 53,
        "engineering": 71
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 74,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "commits_last_year": 105,
              "human_commit_share": 0.99,
              "days_since_last_push": 1,
              "active_weeks_last_year": 4
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "105 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 105
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "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": 100,
            "inputs": {
              "releases_count": 10,
              "latest_release_tag": "v0.15.1",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 1.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "10 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 55,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "forks": 10,
              "stars": 45,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "45 stars",
                "points": 26.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 45
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "10 forks",
                "points": 8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 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": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 58,
            "inputs": {
              "packages": [
                "@raymondchins/agentmap"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3162
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,162 downloads/month across npm",
                "points": 46.7,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3162,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 53,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 27,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 4,
              "top_contributor_share": 0.885
            },
            "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 88% of commits",
                "points": 2.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 88
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "4 contributors",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 4 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "merged_prs": 9,
              "open_issues": 2,
              "closed_issues": 9,
              "issue_closed_ratio": 0.818,
              "closed_unmerged_prs": 16
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "82% of issues closed",
                "points": 38.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 82
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "9/25 decided PRs merged",
                "points": 13.8,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 9,
                      "decided": 25
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/29 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "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": 49,
            "inputs": {
              "followers": 56,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "raymondchins",
              "public_repos": 3,
              "account_age_days": 4055
            },
            "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": "56 followers of raymondchins",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 56,
                      "login": "raymondchins"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~11 yr old",
                "points": 16.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@raymondchins/agentmap"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "24 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "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": 71,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "good",
        "name": "Security",
        "value": 75,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 69,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 6.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/29 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 4 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "all dependencies are pinned",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@raymondchins/agentmap@0.15.1 runtime dependency closure — what installing the published package pulls in — 10 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@raymondchins/agentmap@0.15.1",
                  "assessed": 10
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 10,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 10,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "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": "moderate",
        "name": "AI Readiness",
        "value": 50,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "99 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.13,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.01
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "13 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 13,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "1 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "all dependencies are pinned",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "primary_language": "JavaScript",
              "largest_source_bytes": 189599,
              "source_files_sampled": 63,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "JavaScript without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "JavaScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/63 source files over 60KB",
                "points": 54.1,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 63,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T03:08:15.945185Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/raymondchins/agentmap.svg",
  "full_name": "raymondchins/agentmap",
  "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 agregadasnpm.