@mcptoolshop/housekeeping 0.0.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,93 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are recorded here.
4
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
+
6
+ ## [1.3.0] - 2026-09-30
7
+
8
+ The first release on npm, as `@mcptoolshop/housekeeping`.
9
+
10
+ ### Added
11
+
12
+ - Publishable to npm as `@mcptoolshop/housekeeping`, with the `hk` and
13
+ `hk-mcp` commands. A release workflow publishes it with provenance when a
14
+ GitHub release is published, through npm Trusted Publishing.
15
+ - `HK_HOME`: where data, reports and the config live. Unset, a clone keeps
16
+ them in itself as before, and an installed package keeps them in the
17
+ directory it runs from, never inside `node_modules`.
18
+ - The default-branch CI findings say where a red run broke: the failed job and
19
+ step, matched to the workflow file by name. One REST call per red run.
20
+ - With an Atlas map, the failed step is joined to the map's entry for it, and
21
+ a map finding recorded against that same step is cited as a prediction.
22
+ - `run_failed_step` table.
23
+ - This repository keeps its own Atlas map in `atlas/`, made by
24
+ `@dogfood-lab/atlas` 1.24.0 and checked in CI at the same version, as the
25
+ rule in `rules/atlas-map.md` asks of every repository that runs workflows.
26
+ - The report's Atlas section lists each map's door findings (D1: a toolchain a
27
+ package refuses; D2: a lockfile without the job's platform) and the checks
28
+ Atlas could not judge, counted only among maps made by Atlas 1.24.0 or later.
29
+ - The deploy rules take a job's environment from the Atlas map where the map
30
+ records one, and keep the workflow's own reading beside it
31
+ (`workflow_environment.source`, `.parsed`); the report counts disagreements.
32
+ - The lockfile audit reads `pnpm-lock.yaml` (lockfile versions 5, 6 and 9) as
33
+ well as `package-lock.json`. In a 9.x lock, what ships is found by walking
34
+ the dependency graph from every workspace package's production
35
+ dependencies.
36
+
37
+ ### Changed
38
+
39
+ - `ATLAS_ENGINE_BEHIND` is `low`, and counts in the health score, for a
40
+ snapshot taken after the first fleet pin-bump wave ended; an earlier
41
+ snapshot keeps it at `info`, so rebuilding it reproduces that day's
42
+ findings. The rule's Transition section says the same.
43
+ - A new logo: a broom and a magnifier over a database. The README header,
44
+ the handbook's header mark and the favicon all use it, and the lockup
45
+ also ships at the repository root as `logo.png`, where the org's logo sync
46
+ finds it (not `readme.png`, which npm would pack as a README).
47
+
48
+ ### Fixed
49
+
50
+ - The Atlas map record kept a command's `directory`, a key no map writes; it
51
+ now keeps `dir`, and keeps the door's `unresolvedChecks`. Cached records are
52
+ re-read once.
53
+
54
+ ## [1.2.0] - 2026-09-30
55
+
56
+ The first public release.
57
+
58
+ ### Added
59
+
60
+ - `hk help`, and `--help` / `-h` on any command. The help text is generated
61
+ from the table that dispatches the commands.
62
+ - Structured errors: every failure prints `error [CODE] message` and a hint.
63
+ - Exit codes: 0 ok, 1 user error, 2 runtime error, 3 partial.
64
+ - Log levels: `--quiet`, `--verbose`, `--debug`, or `HK_LOG`.
65
+ - `hk report [snapshot-id]` writes the audit report for a loaded snapshot.
66
+ - `housekeeping.config.json`: the organization to sweep, and the repositories
67
+ that are not shipped products. A malformed file is an error.
68
+ - `npm run verify`: the test suite, then a smoke run of the CLI.
69
+ - The written rules the findings cite, under `rules/`.
70
+ - A landing page and a handbook.
71
+
72
+ ### Changed
73
+
74
+ - `hk refresh` writes the report itself, and exits 3 when the sweep finished
75
+ with collection errors or an incomplete cost pass. The snapshot and the
76
+ report are still written.
77
+ - A sweep refused for lack of API quota exits 2, as `RATE_LIMITED`.
78
+ - An unknown command is an error with exit 1. It used to print the usage text
79
+ and exit 0.
80
+ - `HK_DB` selects the database for the CLI as well as the MCP server.
81
+ - The MCP server returns every failure as a structured result.
82
+
83
+ ### Fixed
84
+
85
+ - `hk sql` is read-only, as documented. It ran any statement on a writable
86
+ connection.
87
+ - Running `hk help`, or mistyping a command, no longer creates a database.
88
+
89
+ ### Security
90
+
91
+ - `fast-uri` 3.1.8 and `ip-address` 10.7.2, both advisory fixes in transitive
92
+ dependencies.
93
+ - CI runs `npm audit --audit-level=high` as a blocking step.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 mcp-tool-shop
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.es.md ADDED
@@ -0,0 +1,217 @@
1
+ <p align="center">
2
+ <a href="README.ja.md">日本語</a> | <a href="README.zh.md">中文</a> | <a href="README.md">English</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.it.md">Italiano</a> | <a href="README.pt-BR.md">Português (BR)</a>
3
+ </p>
4
+
5
+ <p align="center">
6
+ <img src="https://raw.githubusercontent.com/mcp-tool-shop-org/brand/main/logos/housekeeping/readme.png" alt="housekeeping" width="400" />
7
+ </p>
8
+
9
+ <h1 align="center">housekeeping</h1>
10
+
11
+ <p align="center">
12
+ An operational-health warehouse for a GitHub organization.<br>
13
+ One sweep, one SQLite database, findings you can argue with.
14
+ </p>
15
+
16
+ <p align="center">
17
+ <a href="https://github.com/mcp-tool-shop-org/housekeeping/actions/workflows/ci.yml"><img src="https://github.com/mcp-tool-shop-org/housekeeping/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
18
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT License" /></a>
19
+ <a href="https://mcp-tool-shop-org.github.io/housekeeping/"><img src="https://img.shields.io/badge/Landing_Page-live-blue" alt="Landing Page" /></a>
20
+ <a href="https://mcp-tool-shop-org.github.io/housekeeping/handbook/"><img src="https://img.shields.io/badge/Handbook-read-blue" alt="Handbook" /></a>
21
+ </p>
22
+
23
+ Una sola ejecución recopila el estado de CI de cada repositorio, los problemas abiertos y las solicitudes de incorporación de código, las versiones, las etiquetas de versión, los archivos de flujo de trabajo, la protección de ramas, las alertas de seguridad, los archivos de bloqueo y la facturación de Actions en SQLite, y luego realiza una auditoría de todo ello en función de las reglas establecidas.
24
+
25
+ Responde, para toda la organización a la vez:
26
+
27
+ - ¿Cuáles son las ramas predeterminadas que muestran un estado crítico y se trata de una rama principal defectuosa o de un historial obsoleto?
28
+ - ¿Cuáles son las solicitudes de incorporación de código que nunca se pueden fusionar, porque una comprobación requerida que no emite nada las está bloqueando?
29
+ - ¿Cuáles son las implementaciones que los propios ajustes del repositorio rechazan?
30
+ - ¿Dónde han divergido `package.json`, las etiquetas de Git y el registro de npm?
31
+ - ¿Cuáles son los flujos de trabajo que infringen las reglas de coste de Actions, cuánto costaron y qué trabajos los utilizaron?
32
+ - ¿Cuáles son los repositorios que contienen avisos que el recuento de alertas de GitHub no detecta?
33
+
34
+ Es un instrumento de auditoría, no un corrector. Lee GitHub y no modifica nada.
35
+
36
+ ## Por qué tiene esta forma
37
+
38
+ | Capa | Opción | Razón |
39
+ |---|---|---|
40
+ | Transporte | la CLI `gh` | Ya tiene su token. La herramienta nunca almacena ni solicita credenciales. |
41
+ | Recopilación | GitHub GraphQL, con paginación | Una sola consulta devuelve metadatos, problemas abiertos, solicitudes de incorporación de código abiertas, versiones y árboles de archivos para una página de repositorios. Una página que sigue superando el tiempo de espera se divide a la mitad y se vuelve a solicitar desde el mismo cursor. |
42
+ | Ejecuciones de Actions | REST | GraphQL no tiene una interfaz de Actions. |
43
+ | Coste de Actions | API de facturación más duraciones por trabajo | La factura indica qué repositorio; solo los trabajos indican qué flujo de trabajo. Los puntos finales `/timing` de GitHub devuelven ceros, por lo que la suma por trabajo se reconstruye y luego se concilia con la factura. |
44
+ | Tarifas de los ejecutores | se lee de la factura | Una tarifa facturada puede diferir del precio de lista, y una constante en el código fuente falsearía todos los números. |
45
+ | Almacenamiento | SQLite a través del `node:sqlite` integrado | No hay un paso de compilación nativo. |
46
+ | Fuente de la verdad | `data/snapshots/*.json` | Bruto, modificable y solo para anexar. La base de datos se deriva: `npm run rebuild` la reconstruye sin conexión. |
47
+ | Registro de la ejecución | `data/sweeps.jsonl` | Una línea por ejecución, incluidas las ejecuciones que fallaron y las ejecuciones que no encontraron nada nuevo. |
48
+
49
+ Las instantáneas son inmutables y aditivas, por lo que la desviación entre dos fechas es un `JOIN`.
50
+
51
+ ## Requisitos
52
+
53
+ - Node.js 22.5 o posterior.
54
+ - La [CLI de GitHub](https://cli.github.com/), con la sesión iniciada (`gh auth status`) como una
55
+ cuenta que puede leer la organización. La lectura de la facturación y las alertas de seguridad
56
+ requiere el acceso correspondiente; una ejecución sin ello registra "no medido" y
57
+ continúa. Nunca registra un permiso faltante como un resultado válido.
58
+ - Windows o Linux. Se desarrolla en Windows y sus pruebas se ejecutan en Linux en
59
+ CI. macOS debería funcionar y no se ha probado.
60
+
61
+ ## Uso
62
+
63
+ ```bash
64
+ npm install -g @mcptoolshop/housekeeping # puts `hk` and `hk-mcp` on your path
65
+ mkdir warehouse && cd warehouse # housekeeping keeps its data here
66
+ hk refresh your-org # collect, load, analyze, write reports/AUDIT-<date>.md
67
+ ```
68
+
69
+ Para conservar la configuración entre las ejecuciones, coloque un `housekeeping.config.json` en ese directorio (consulte la sección Configuración); luego, `hk refresh` no necesita ningún argumento.
70
+
71
+ O ejecútelo desde una copia, que conserva sus datos en la copia:
72
+
73
+ ```bash
74
+ git clone https://github.com/mcp-tool-shop-org/housekeeping.git
75
+ cd housekeeping
76
+ npm install
77
+ npm link # puts `hk` on your path
78
+ cp housekeeping.config.example.json housekeeping.config.json # then set "org"
79
+ hk refresh
80
+ ```
81
+
82
+ Luego, realice una consulta:
83
+
84
+ ```bash
85
+ hk summary # portfolio totals
86
+ hk ci # repositories whose default branch is red
87
+ hk findings # findings grouped by severity and code
88
+ hk health # per-repository health score, worst first
89
+ hk repo <name> # one repository in full
90
+ hk prs # every open pull request by age
91
+ hk versions # package.json against git tag against npm
92
+ hk actions # every workflow and its rule flags
93
+ hk cost # Actions cost, gross and net side by side
94
+ hk sql "SELECT ..." # one read-only statement
95
+ hk help # every command and flag
96
+ ```
97
+
98
+ En una copia sin `npm link`, cada `hk <command>` es `node src/cli.mjs <command>`.
99
+
100
+ `npm run rebuild` vuelve a derivar la base de datos y el informe a partir de las instantáneas que ya
101
+ existen en el disco, sin acceso a la red.
102
+
103
+ Una ejecución completa realiza unos pocos cientos de llamadas a la API. No ejecute `refresh` en un bucle.
104
+
105
+ Los resultados se envían a la salida estándar; el progreso y los errores se envían a la salida de error estándar. Cada
106
+ error imprime un código y una pista. Códigos de salida: 0 correcto, 1 error de usuario, 2 error de tiempo de ejecución, 3 parcial (la ejecución se completó, con lagunas).
107
+
108
+ ## Configuración
109
+
110
+ `housekeeping.config.json`, en el directorio en el que funciona la herramienta de limpieza (consulte a continuación):
111
+
112
+ ```json
113
+ {
114
+ "org": "your-org",
115
+ "metaRepos": [".github"]
116
+ }
117
+ ```
118
+
119
+ - `org` es la organización que se va a analizar. `hk refresh <org>` lo anula. Si no se especifica ninguno de los dos, una ejecución se negará a iniciarse.
120
+ - `metaRepos` son los repositorios que contienen los ajustes, los activos o
121
+ las herramientas de la organización, no un producto comercializado. Están exentos de los hallazgos que solo
122
+ tienen sentido para un producto: falta de archivos README, LICENSE y similares, no tener
123
+ flujos de trabajo y no tener versiones.
124
+
125
+ Un archivo con formato incorrecto es un error, nunca un valor predeterminado silencioso: una clave desconocida, un tipo incorrecto o un JSON dañado detienen la ejecución.
126
+
127
+ Ejecute desde un clon; la herramienta de limpieza mantiene `data/`, `reports/` y el archivo de configuración
128
+ en el clon. Ejecute como un paquete instalado; los mantiene en el directorio desde el que
129
+ lo ejecuta, o en `HK_HOME` cuando se establece.
130
+
131
+ Entorno: `HK_HOME` (donde residen los datos, los informes y la configuración),
132
+ `HK_CONFIG` (ruta de configuración), `HK_DB` (ruta de la base de datos), `HK_LOG`
133
+ (`silent`, `normal`, `verbose` o `debug`), `HK_COST_REPOS` y
134
+ `HK_COST_BUDGET` (límites del paso del coste por trabajo), `GH_PATH` (ruta a `gh`).
135
+
136
+ ## Mantenga los datos privados
137
+
138
+ **Lo que escribe una ejecución es confidencial. No incluya `data/` o `reports/` en un
139
+ repositorio público.**
140
+
141
+ Una instantánea registra los nombres y las descripciones de los repositorios privados, cada
142
+ alerta de seguridad abierta con el paquete que menciona, los archivos de flujo de trabajo y la facturación de Actions. GitHub oculta deliberadamente las alertas de seguridad de un repositorio público a todos, excepto a sus mantenedores; una instantánea publicada entregaría esa lista.
143
+
144
+ El `.gitignore` de este repositorio excluye `data/`, `reports/` y
145
+ `housekeeping.config.json`. Para mantener el historial, que es el objetivo de las instantáneas,
146
+ ejecute la herramienta desde un **repositorio privado** de su propiedad y guárdelas allí.
147
+
148
+ ## Servidor MCP
149
+
150
+ `hk-mcp` (o `npm run mcp` en una copia) sirve los datos al programa a través de stdio, por lo que un asistente puede hacer preguntas sin leer una instantánea de varios megabytes:
151
+
152
+ `hk_summary` · `hk_findings` · `hk_ci` · `hk_repo` · `hk_backlog` ·
153
+ `hk_health` · `hk_cost` · `hk_sql` · `hk_schema`
154
+
155
+ ```json
156
+ {
157
+ "mcpServers": {
158
+ "housekeeping": { "command": "hk-mcp", "env": { "HK_HOME": "/path/to/warehouse" } }
159
+ }
160
+ }
161
+ ```
162
+
163
+ `HK_HOME` es el directorio desde el que se realiza la ejecución. Si utiliza una copia, use `"command": "node", "args": ["/path/to/housekeeping/src/mcp.mjs"]` en su lugar.
164
+
165
+ `hk_sql` acepta una sola instrucción `SELECT` o `WITH` y abre la base de datos
166
+ en modo de solo lectura. Una llamada que falla devuelve un error estructurado, nunca un rastreo de pila.
167
+
168
+ ## Hallazgos
169
+
170
+ Las reglas se encuentran en `src/analyze.mjs`. Cada una de ellas cita la regla escrita que aplica,
171
+ por lo que un hallazgo se puede discutir en relación con un estándar y no con el gusto. Las reglas
172
+ que incluye este repositorio se encuentran en [`rules/`](rules/):
173
+
174
+ - [`rules/github-actions.md`](rules/github-actions.md): filtros de rutas, ejecutores, tamaño de la matriz, límite del archivo de flujo de trabajo, concurrencia.
175
+ - [`rules/shipcheck-product-standards.md`](rules/shipcheck-product-standards.md): la CI debe pasar, las etapas de lanzamiento, las versiones.
176
+ - [`rules/repo-first.md`](rules/repo-first.md): la rama predeterminada.
177
+ - [`rules/atlas-map.md`](rules/atlas-map.md): un mapa registrado de cada repositorio, verificado en la CI.
178
+
179
+ Son los estándares de una organización. Si los suyos son diferentes, cambie el archivo de reglas y la regla al mismo tiempo.
180
+
181
+ Las reglas se aseguran de mantener separados los elementos que parecen similares, porque combinarlos genera ruido:
182
+
183
+ - **Una rama predeterminada roja no es una rama de solicitud de incorporación de cambios roja.** Una rama de Dependabot que falla es un elemento pendiente; una ejecución de `push` que falla en la rama predeterminada es un problema. El evento de la ejecución decide cuál es.
184
+ - **El historial no es un problema.** Un flujo de trabajo que se mueve a desencadenadores solo para lanzamientos conserva su último fallo en la rama predeterminada para siempre. Un flujo de trabajo eliminado conserva sus ejecuciones. Ninguno de los dos es un defecto activo.
185
+ - **Una comprobación requerida que nada puede emitir no es una comprobación que no se ejecutó aquí.** Una indica que se elimine el requisito; la otra indica que se corrija el desencadenador. Las correcciones se contradicen entre sí.
186
+ - **Una ejecución fallida no es una ejecución cancelada.** `cancel-in-progress` existe para eliminar las ejecuciones obsoletas, por lo que los minutos cancelados suelen ser la regla de concurrencia en funcionamiento.
187
+ - **El costo bruto no es el costo neto.** GitHub mide los repositorios públicos a precio completo y les aplica un descuento hasta cero. El bruto es la capacidad de cómputo real; el neto es el dinero real. Nunca se suman.
188
+ - **Lo que no se mide no está limpio.** Un repositorio que GitHub no está analizando informa de cero alertas. Un repositorio para el que la verificación de costos no se realizó tiene una fila de costos nula. Ambos se informan como desconocidos.
189
+
190
+ La gravedad impulsa una puntuación de estado: crítica 40, alta 15, media 6, baja 2, informativa 0, que se deduce de 100. La puntuación clasifica la atención, no la calidad.
191
+
192
+ El [manual](https://mcp-tool-shop-org.github.io/housekeeping/handbook/) enumera cada hallazgo, comando, código de error y tabla.
193
+
194
+ ## Seguridad
195
+
196
+ - **Solo lectura.** El recopilador emite consultas GraphQL y solicitudes REST `GET`. Nunca combina, envía, lanza, publica ni edita una configuración.
197
+ - **Sin credenciales.** La autenticación es lo que `gh` ya tiene. No se escribe nada sobre esto en el disco.
198
+ - **Sin telemetría.** Los únicos hosts contactados son la API de GitHub, a través de `gh`, y el registro de npm, para buscar versiones y avisos.
199
+ - **Lo que almacena** es la parte sensible: consulte "Mantenga los datos privados".
200
+
201
+ Informe de una vulnerabilidad según lo descrito en [SECURITY.md](SECURITY.md).
202
+
203
+ ## Pruebas
204
+
205
+ ```bash
206
+ npm test
207
+ ```
208
+
209
+ Cada regla se prueba en ambas direcciones: la forma que debe activarse y la forma vecina que no debe activarse. Un verificador independiente vuelve a derivar una muestra de los hallazgos de GitHub en vivo a través de su propio transporte y omite, en voz alta, cuando no hay una base de datos o una red.
210
+
211
+ ## Licencia
212
+
213
+ MIT. Consulte [LICENSE](LICENSE).
214
+
215
+ ---
216
+
217
+ Creado por <a href="https://mcp-tool-shop.github.io/">MCP Tool Shop</a>
package/README.fr.md ADDED
@@ -0,0 +1,195 @@
1
+ <p align="center">
2
+ <a href="README.ja.md">日本語</a> | <a href="README.zh.md">中文</a> | <a href="README.es.md">Español</a> | <a href="README.md">English</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.it.md">Italiano</a> | <a href="README.pt-BR.md">Português (BR)</a>
3
+ </p>
4
+
5
+ <p align="center">
6
+ <img src="https://raw.githubusercontent.com/mcp-tool-shop-org/brand/main/logos/housekeeping/readme.png" alt="housekeeping" width="400" />
7
+ </p>
8
+
9
+ <h1 align="center">housekeeping</h1>
10
+
11
+ <p align="center">
12
+ An operational-health warehouse for a GitHub organization.<br>
13
+ One sweep, one SQLite database, findings you can argue with.
14
+ </p>
15
+
16
+ <p align="center">
17
+ <a href="https://github.com/mcp-tool-shop-org/housekeeping/actions/workflows/ci.yml"><img src="https://github.com/mcp-tool-shop-org/housekeeping/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
18
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT License" /></a>
19
+ <a href="https://mcp-tool-shop-org.github.io/housekeeping/"><img src="https://img.shields.io/badge/Landing_Page-live-blue" alt="Landing Page" /></a>
20
+ <a href="https://mcp-tool-shop-org.github.io/housekeeping/handbook/"><img src="https://img.shields.io/badge/Handbook-read-blue" alt="Handbook" /></a>
21
+ </p>
22
+
23
+ Une seule analyse collecte l’état du CI de chaque dépôt, les problèmes ouverts et les demandes de fusion, les versions, les étiquettes de version, les fichiers de flux de travail, la protection des branches, les alertes de sécurité, les fichiers de verrouillage et la facturation d’Actions dans SQLite, puis effectue un audit complet en fonction des règles définies.
24
+
25
+ Il répond, pour l’ensemble de l’organisation :
26
+
27
+ - Quelles sont les branches par défaut qui présentent des problèmes, et s’agit-il d’une branche principale défectueuse ou d’un historique obsolète ?
28
+ - Quelles demandes de fusion ne peuvent jamais être fusionnées, car une vérification requise qui ne renvoie aucune donnée les bloque-t-elle ?
29
+ - Quels déploiements les paramètres propres au dépôt refusent-ils ?
30
+ - Où `package.json`, les étiquettes Git et le registre npm ont-ils divergé ?
31
+ - Quels flux de travail enfreignent les règles de coût d’Actions, quel a été leur coût et quelles tâches ont consommé ces ressources ?
32
+ - Quels dépôts contiennent des avis que le propre système d’alerte de GitHub ne détecte pas ?
33
+
34
+ Il s’agit d’un outil d’audit, et non d’un correcteur. Il lit les données de GitHub et ne modifie rien.
35
+
36
+ ## Pourquoi il a cette structure
37
+
38
+ | Couche | Choix | Raison |
39
+ |---|---|---|
40
+ | Transport | l’interface de ligne de commande `gh` | Il contient déjà votre jeton. L’outil ne stocke ni ne demande jamais d’informations d’identification. |
41
+ | Collecte | GitHub GraphQL, avec pagination | Une seule requête renvoie les métadonnées, les problèmes ouverts, les demandes de fusion ouvertes, les versions et les arborescences de fichiers pour une page de dépôts. Une page dont le délai d’attente est constamment dépassé est divisée par deux et la requête est renvoyée à partir du même curseur. |
42
+ | Exécutions d’Actions | REST | GraphQL ne dispose pas d’interface Actions. |
43
+ | Coût d’Actions | API de facturation plus durées par tâche | La facture indique de quel dépôt il s’agit ; seules les tâches indiquent de quel flux de travail il s’agit. Les points de terminaison `/timing` de GitHub renvoient des zéros, de sorte que la somme par tâche est reconstruite, puis rapprochée de la facture. |
44
+ | Tarifs des exécuteurs | lu dans la facture | Un tarif facturé peut différer du prix catalogue, et une constante dans la source fausserait tous les chiffres. |
45
+ | Stockage | SQLite via l’outil `node:sqlite` intégré | Aucune étape de compilation native. |
46
+ | Source de vérité | `data/snapshots/*.json` | Brut, diffusable et en ajout uniquement. La base de données est dérivée : `npm run rebuild` la reconstruit hors ligne. |
47
+ | Journal d’analyse | `data/sweeps.jsonl` | Une ligne par analyse, y compris les analyses ayant échoué et les analyses n’ayant rien trouvé de nouveau. |
48
+
49
+ Les instantanés sont immuables et additifs, de sorte que la dérive entre deux dates est un `JOIN`.
50
+
51
+ ## Exigences
52
+
53
+ - Node.js 22.5 ou version ultérieure.
54
+ - L’[interface de ligne de commande GitHub](https://cli.github.com/), connectée (`gh auth status`) avec un compte qui peut lire l’organisation. La lecture de la facturation et des alertes de sécurité nécessite les autorisations correspondantes ; une analyse sans ces autorisations enregistre « non mesuré » et continue. Elle n’enregistre jamais une autorisation manquante comme un résultat valide.
55
+ - Windows ou Linux. Il est développé sur Windows et ses tests sont exécutés sur Linux dans le cadre de l’intégration continue. macOS devrait fonctionner et n’est pas testé.
56
+
57
+ ## Utilisation
58
+
59
+ ```bash
60
+ npm install -g @mcptoolshop/housekeeping # puts `hk` and `hk-mcp` on your path
61
+ mkdir warehouse && cd warehouse # housekeeping keeps its data here
62
+ hk refresh your-org # collect, load, analyze, write reports/AUDIT-<date>.md
63
+ ```
64
+
65
+ Pour conserver les paramètres entre les analyses, placez un fichier `housekeeping.config.json` dans ce répertoire (voir Configuration) ; ensuite, `hk refresh` n’aura besoin d’aucun argument.
66
+
67
+ Ou exécutez-le à partir d’une copie, ce qui conserve ses données dans la copie :
68
+
69
+ ```bash
70
+ git clone https://github.com/mcp-tool-shop-org/housekeeping.git
71
+ cd housekeeping
72
+ npm install
73
+ npm link # puts `hk` on your path
74
+ cp housekeeping.config.example.json housekeeping.config.json # then set "org"
75
+ hk refresh
76
+ ```
77
+
78
+ Ensuite, interrogez-la :
79
+
80
+ ```bash
81
+ hk summary # portfolio totals
82
+ hk ci # repositories whose default branch is red
83
+ hk findings # findings grouped by severity and code
84
+ hk health # per-repository health score, worst first
85
+ hk repo <name> # one repository in full
86
+ hk prs # every open pull request by age
87
+ hk versions # package.json against git tag against npm
88
+ hk actions # every workflow and its rule flags
89
+ hk cost # Actions cost, gross and net side by side
90
+ hk sql "SELECT ..." # one read-only statement
91
+ hk help # every command and flag
92
+ ```
93
+
94
+ Dans une copie sans fichier `npm link`, chaque exécution de `hk <command>` est `node src/cli.mjs <command>`.
95
+
96
+ `npm run rebuild` redérive la base de données et le rapport à partir des instantanés déjà présents sur le disque, sans accès au réseau.
97
+
98
+ Une analyse complète effectue quelques centaines d’appels d’API. N’exécutez pas `refresh` en boucle.
99
+
100
+ Les résultats sont envoyés vers la sortie standard ; les progrès et les erreurs sont envoyés vers la sortie d’erreur standard. Chaque erreur affiche un code et un indice. Codes de sortie : 0 (ok), 1 (erreur utilisateur), 2 (erreur d’exécution), 3 (partiel, l’analyse est terminée, mais avec des lacunes).
101
+
102
+ ## Configuration
103
+
104
+ `housekeeping.config.json`, dans le répertoire dans lequel l’outil de maintenance fonctionne (voir ci-dessous) :
105
+
106
+ ```json
107
+ {
108
+ "org": "your-org",
109
+ "metaRepos": [".github"]
110
+ }
111
+ ```
112
+
113
+ - `org` est l’organisation à analyser. `hk refresh <org>` le remplace. En l’absence des deux, une analyse refuse de démarrer.
114
+ - `metaRepos` sont les dépôts qui contiennent les paramètres, les ressources ou les outils de l’organisation, et non un produit commercialisé. Ils sont exemptés des résultats qui ne sont pertinents que pour un produit : absence de fichiers README, LICENSE et similaires, absence de flux de travail et absence de versions.
115
+
116
+ Un fichier malformé est une erreur, et non une valeur par défaut silencieuse : une clé inconnue, un type incorrect ou un JSON corrompu interrompent l’exécution.
117
+
118
+ Exécution à partir d’un clone, l’outil de maintenance conserve `data/`, `reports/` et le fichier de configuration dans le clone. Exécution en tant que package installé, il les conserve dans le répertoire à partir duquel vous l’exécutez, ou dans `HK_HOME` si celui-ci est défini.
119
+
120
+ Environnement : `HK_HOME` (où les données, les rapports et la configuration sont stockés), `HK_CONFIG` (chemin du fichier de configuration), `HK_DB` (chemin de la base de données), `HK_LOG` (`silent`, `normal`, `verbose` ou `debug`), `HK_COST_REPOS` et `HK_COST_BUDGET` (limites du coût par tâche), `GH_PATH` (chemin vers `gh`).
121
+
122
+ ## Gardez les données privées
123
+
124
+ **Ce qu’une analyse écrit est sensible. Ne committez pas `data/` ou `reports/` dans un dépôt public.**
125
+
126
+ Un instantané enregistre les noms et les descriptions des dépôts privés, chaque alerte de sécurité ouverte avec le package qu’elle mentionne, les fichiers de flux de travail et la facturation d’Actions. GitHub masque délibérément les alertes de sécurité d’un dépôt public à tous, sauf à ses responsables ; un instantané publié diffuserait cette liste.
127
+
128
+ Le `.gitignore` de ce dépôt exclut `data/`, `reports/` et `housekeeping.config.json`. Pour conserver l’historique, ce qui est l’objectif des instantanés, exécutez l’outil à partir d’un **dépôt privé** et committez-les dans celui-ci.
129
+
130
+ ## Serveur MCP
131
+
132
+ Le fichier `hk-mcp` (ou `npm run mcp` dans une copie) sert de référentiel via stdio, ce qui permet à un assistant de poser des questions sans avoir à lire un instantané de plusieurs mégaoctets :
133
+
134
+ `hk_summary` · `hk_findings` · `hk_ci` · `hk_repo` · `hk_backlog` · `hk_health` · `hk_cost` · `hk_sql` · `hk_schema`
135
+
136
+ ```json
137
+ {
138
+ "mcpServers": {
139
+ "housekeeping": { "command": "hk-mcp", "env": { "HK_HOME": "/path/to/warehouse" } }
140
+ }
141
+ }
142
+ ```
143
+
144
+ `HK_HOME` est le répertoire à partir duquel vous effectuez l’analyse. À partir d’une copie, utilisez `"command": "node", "args": ["/path/to/housekeeping/src/mcp.mjs"]` à la place.
145
+
146
+ `hk_sql` accepte une seule instruction `SELECT` ou `WITH` et ouvre la base de données en lecture seule. Un appel ayant échoué renvoie une erreur structurée, et non une trace de pile.
147
+
148
+ ## Résultats
149
+
150
+ Les règles sont stockées dans `src/analyze.mjs`. Chacune d’entre elles fait référence à la règle écrite qu’elle applique, de sorte qu’un résultat peut être contesté par rapport à une norme et non par rapport au goût. Les règles fournies avec ce dépôt sont disponibles dans [`rules/`](rules/) :
151
+
152
+ - [`rules/github-actions.md`](rules/github-actions.md) : filtres de chemins, exécuteurs, taille de la matrice, limite du fichier de flux de travail, concurrence.
153
+ - [`rules/shipcheck-product-standards.md`](rules/shipcheck-product-standards.md) : l’intégration continue doit réussir, les étapes de validation, les versions.
154
+ - [`rules/repo-first.md`](rules/repo-first.md) : la branche par défaut.
155
+ - [`rules/atlas-map.md`](rules/atlas-map.md) : une carte validée de chaque dépôt, vérifiée dans l’intégration continue.
156
+
157
+ Ce sont les normes d’une organisation. Si les vôtres sont différentes, modifiez le fichier de règle et la règle elle-même.
158
+
159
+ Les règles veillent à séparer les éléments qui se ressemblent, car les regrouper crée du bruit :
160
+
161
+ - **Une branche par défaut rouge n’est pas une branche de demande de fusion rouge.** Une branche Dependabot qui échoue est un élément en attente ; une exécution `push` qui échoue sur la branche par défaut est une erreur. L’événement de l’exécution détermine lequel.
162
+ - **L’historique n’est pas une erreur.** Un flux de travail déplacé vers des déclencheurs de publication uniquement conserve son dernier échec de branche par défaut pour toujours. Un flux de travail supprimé conserve ses exécutions. Aucun n’est un défaut actif.
163
+ - **Une vérification requise qui ne peut rien produire n’est pas une vérification qui n’a pas été exécutée ici.** L’une indique qu’il faut supprimer l’exigence ; l’autre indique qu’il faut corriger le déclencheur. Les corrections se contredisent.
164
+ - **Une exécution ayant échoué n’est pas une exécution annulée.** `cancel-in-progress` sert à arrêter les exécutions obsolètes, de sorte que les minutes annulées correspondent généralement au fonctionnement de la règle de concurrence.
165
+ - **Le coût brut n’est pas le coût net.** GitHub facture les dépôts publics au prix fort et les réduit à zéro. Le coût brut est la puissance de calcul réelle ; le coût net est l’argent réel. Ils ne sont jamais additionnés.
166
+ - **Ce qui n’est pas mesuré n’est pas propre.** Un dépôt GitHub qui n’effectue pas d’analyse signale zéro alerte. Un dépôt pour lequel le seuil de coût n’a pas été atteint n’a pas de ligne de coût. Les deux sont signalés comme inconnus.
167
+
168
+ La gravité détermine un score de santé : critique 40, élevé 15, moyen 6, faible 2, information 0, déduit de 100. Le score classe l’attention, et non la qualité.
169
+
170
+ Le [manuel](https://mcp-tool-shop-org.github.io/housekeeping/handbook/) répertorie chaque résultat, commande, code d’erreur et tableau.
171
+
172
+ ## Sécurité
173
+
174
+ - **Lecture seule.** Le collecteur effectue des requêtes GraphQL et des requêtes REST `GET`. Il ne fusionne, ne pousse, ne publie, ne distribue ni ne modifie jamais un paramètre.
175
+ - **Aucun identifiant.** L’authentification est ce que `gh` contient déjà. Rien n’est écrit sur le disque à ce sujet.
176
+ - **Aucune télémétrie.** Les seuls hôtes contactés sont l’API GitHub, via `gh`, et le registre npm, pour les recherches de versions et de conseils.
177
+ - **Ce qu’il stocke** est la partie sensible : voir « Conserver les données en privé ».
178
+
179
+ Signalez une vulnérabilité comme décrit dans [SECURITY.md](SECURITY.md).
180
+
181
+ ## Tests
182
+
183
+ ```bash
184
+ npm test
185
+ ```
186
+
187
+ Chaque règle est testée dans les deux sens : la forme qui doit être déclenchée et la forme voisine qui ne doit pas l’être. Un vérificateur distinct redérive un échantillon de résultats à partir de GitHub en direct via son propre transport, et saute, bruyamment, lorsqu’il n’y a pas de base de données ou de réseau.
188
+
189
+ ## Licence
190
+
191
+ MIT. Voir [LICENSE](LICENSE).
192
+
193
+ ---
194
+
195
+ Créé par <a href="https://mcp-tool-shop.github.io/">MCP Tool Shop</a>