@mcptoolshop/housekeeping 0.0.0 → 1.3.1
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 +103 -0
- package/LICENSE +21 -0
- package/README.es.md +217 -0
- package/README.fr.md +195 -0
- package/README.hi.md +195 -0
- package/README.it.md +195 -0
- package/README.ja.md +199 -0
- package/README.md +246 -5
- package/README.pt-BR.md +222 -0
- package/README.zh.md +197 -0
- package/housekeeping.config.example.json +4 -0
- package/package.json +55 -5
- package/rules/atlas-map.md +30 -0
- package/rules/github-actions.md +59 -0
- package/rules/repo-first.md +12 -0
- package/rules/shipcheck-product-standards.md +37 -0
- package/src/analyze.mjs +1360 -0
- package/src/cli.mjs +316 -0
- package/src/collect.mjs +1184 -0
- package/src/config.mjs +75 -0
- package/src/cost.mjs +271 -0
- package/src/errors.mjs +102 -0
- package/src/gh.mjs +286 -0
- package/src/load.mjs +907 -0
- package/src/lockfile.mjs +272 -0
- package/src/log.mjs +41 -0
- package/src/mcp.mjs +298 -0
- package/src/paths.mjs +31 -0
- package/src/report.mjs +570 -0
- package/src/schema.sql +385 -0
- package/src/workflow-risks.mjs +455 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
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.1] - 2026-09-30
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
|
|
10
|
+
- `CI_FAILING` no longer fires on a default branch whose only non-green checks
|
|
11
|
+
are cancelled runs replaced by a green run of the same check on the same
|
|
12
|
+
commit. GitHub's check rollup counts a cancelled run as a failure, so a
|
|
13
|
+
commit pushed twice read as red forever. `hk ci`, the MCP server and the
|
|
14
|
+
report read the same decision, and the finding now names the failing checks.
|
|
15
|
+
|
|
16
|
+
## [1.3.0] - 2026-09-30
|
|
17
|
+
|
|
18
|
+
The first release on npm, as `@mcptoolshop/housekeeping`.
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- Publishable to npm as `@mcptoolshop/housekeeping`, with the `hk` and
|
|
23
|
+
`hk-mcp` commands. A release workflow publishes it with provenance when a
|
|
24
|
+
GitHub release is published, through npm Trusted Publishing.
|
|
25
|
+
- `HK_HOME`: where data, reports and the config live. Unset, a clone keeps
|
|
26
|
+
them in itself as before, and an installed package keeps them in the
|
|
27
|
+
directory it runs from, never inside `node_modules`.
|
|
28
|
+
- The default-branch CI findings say where a red run broke: the failed job and
|
|
29
|
+
step, matched to the workflow file by name. One REST call per red run.
|
|
30
|
+
- With an Atlas map, the failed step is joined to the map's entry for it, and
|
|
31
|
+
a map finding recorded against that same step is cited as a prediction.
|
|
32
|
+
- `run_failed_step` table.
|
|
33
|
+
- This repository keeps its own Atlas map in `atlas/`, made by
|
|
34
|
+
`@dogfood-lab/atlas` 1.24.0 and checked in CI at the same version, as the
|
|
35
|
+
rule in `rules/atlas-map.md` asks of every repository that runs workflows.
|
|
36
|
+
- The report's Atlas section lists each map's door findings (D1: a toolchain a
|
|
37
|
+
package refuses; D2: a lockfile without the job's platform) and the checks
|
|
38
|
+
Atlas could not judge, counted only among maps made by Atlas 1.24.0 or later.
|
|
39
|
+
- The deploy rules take a job's environment from the Atlas map where the map
|
|
40
|
+
records one, and keep the workflow's own reading beside it
|
|
41
|
+
(`workflow_environment.source`, `.parsed`); the report counts disagreements.
|
|
42
|
+
- The lockfile audit reads `pnpm-lock.yaml` (lockfile versions 5, 6 and 9) as
|
|
43
|
+
well as `package-lock.json`. In a 9.x lock, what ships is found by walking
|
|
44
|
+
the dependency graph from every workspace package's production
|
|
45
|
+
dependencies.
|
|
46
|
+
|
|
47
|
+
### Changed
|
|
48
|
+
|
|
49
|
+
- `ATLAS_ENGINE_BEHIND` is `low`, and counts in the health score, for a
|
|
50
|
+
snapshot taken after the first fleet pin-bump wave ended; an earlier
|
|
51
|
+
snapshot keeps it at `info`, so rebuilding it reproduces that day's
|
|
52
|
+
findings. The rule's Transition section says the same.
|
|
53
|
+
- A new logo: a broom and a magnifier over a database. The README header,
|
|
54
|
+
the handbook's header mark and the favicon all use it, and the lockup
|
|
55
|
+
also ships at the repository root as `logo.png`, where the org's logo sync
|
|
56
|
+
finds it (not `readme.png`, which npm would pack as a README).
|
|
57
|
+
|
|
58
|
+
### Fixed
|
|
59
|
+
|
|
60
|
+
- The Atlas map record kept a command's `directory`, a key no map writes; it
|
|
61
|
+
now keeps `dir`, and keeps the door's `unresolvedChecks`. Cached records are
|
|
62
|
+
re-read once.
|
|
63
|
+
|
|
64
|
+
## [1.2.0] - 2026-09-30
|
|
65
|
+
|
|
66
|
+
The first public release.
|
|
67
|
+
|
|
68
|
+
### Added
|
|
69
|
+
|
|
70
|
+
- `hk help`, and `--help` / `-h` on any command. The help text is generated
|
|
71
|
+
from the table that dispatches the commands.
|
|
72
|
+
- Structured errors: every failure prints `error [CODE] message` and a hint.
|
|
73
|
+
- Exit codes: 0 ok, 1 user error, 2 runtime error, 3 partial.
|
|
74
|
+
- Log levels: `--quiet`, `--verbose`, `--debug`, or `HK_LOG`.
|
|
75
|
+
- `hk report [snapshot-id]` writes the audit report for a loaded snapshot.
|
|
76
|
+
- `housekeeping.config.json`: the organization to sweep, and the repositories
|
|
77
|
+
that are not shipped products. A malformed file is an error.
|
|
78
|
+
- `npm run verify`: the test suite, then a smoke run of the CLI.
|
|
79
|
+
- The written rules the findings cite, under `rules/`.
|
|
80
|
+
- A landing page and a handbook.
|
|
81
|
+
|
|
82
|
+
### Changed
|
|
83
|
+
|
|
84
|
+
- `hk refresh` writes the report itself, and exits 3 when the sweep finished
|
|
85
|
+
with collection errors or an incomplete cost pass. The snapshot and the
|
|
86
|
+
report are still written.
|
|
87
|
+
- A sweep refused for lack of API quota exits 2, as `RATE_LIMITED`.
|
|
88
|
+
- An unknown command is an error with exit 1. It used to print the usage text
|
|
89
|
+
and exit 0.
|
|
90
|
+
- `HK_DB` selects the database for the CLI as well as the MCP server.
|
|
91
|
+
- The MCP server returns every failure as a structured result.
|
|
92
|
+
|
|
93
|
+
### Fixed
|
|
94
|
+
|
|
95
|
+
- `hk sql` is read-only, as documented. It ran any statement on a writable
|
|
96
|
+
connection.
|
|
97
|
+
- Running `hk help`, or mistyping a command, no longer creates a database.
|
|
98
|
+
|
|
99
|
+
### Security
|
|
100
|
+
|
|
101
|
+
- `fast-uri` 3.1.8 and `ip-address` 10.7.2, both advisory fixes in transitive
|
|
102
|
+
dependencies.
|
|
103
|
+
- 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>
|