@mcptoolshop/ai-loadout 1.0.2 → 1.0.3

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 CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.3 — 2026-03-06
4
+
5
+ - Brand logo URL (mcp-tool-shop-org/brand)
6
+ - Code coverage via c8 + Codecov badge
7
+ - Translations re-done via polyglot-mcp (TranslateGemma 12B)
8
+ - SHIP_GATE.md and SCORECARD.md (shipcheck audit: 100% pass)
9
+ - dependabot.yml (monthly, grouped)
10
+ - .gitignore: site/.astro/, site/dist/, .polyglot-cache.json
11
+
12
+ ## 1.0.2 — 2026-03-06
13
+
14
+ - Shipcheck gates added (SHIP_GATE.md, SCORECARD.md)
15
+ - dependabot.yml
16
+
3
17
  ## 1.0.1 — 2026-03-06
4
18
 
5
19
  - Add `hint` field to `ValidationIssue` (Tier 1 error shape compliance)
package/README.es.md CHANGED
@@ -1,35 +1,37 @@
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
+
1
5
  <p align="center">
2
- <a href="README.md">English</a> | <a href="README.zh.md">中文</a> | <a href="README.es.md">Español</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> | <a href="README.ja.md">日本語</a>
6
+ <img src="https://raw.githubusercontent.com/mcp-tool-shop-org/brand/main/logos/ai-loadout/readme.png" width="400" alt="ai-loadout">
3
7
  </p>
4
-
5
- <p align="center">
6
- <img src="logo.png" width="400" alt="ai-loadout">
7
- </p>
8
-
8
+
9
9
  <p align="center">
10
10
  <a href="https://github.com/mcp-tool-shop-org/ai-loadout/actions/workflows/ci.yml"><img src="https://github.com/mcp-tool-shop-org/ai-loadout/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
11
+ <a href="https://codecov.io/gh/mcp-tool-shop-org/ai-loadout"><img src="https://codecov.io/gh/mcp-tool-shop-org/ai-loadout/graph/badge.svg" alt="Coverage"></a>
11
12
  <a href="https://www.npmjs.com/package/@mcptoolshop/ai-loadout"><img src="https://img.shields.io/npm/v/@mcptoolshop/ai-loadout" alt="npm"></a>
12
- <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="Licencia MIT"></a>
13
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT License"></a>
14
+ <a href="https://mcp-tool-shop-org.github.io/ai-loadout/"><img src="https://img.shields.io/badge/Landing_Page-live-blue" alt="Landing Page"></a>
13
15
  </p>
14
-
15
- Enrutador de conocimiento contextual para agentes de IA.
16
-
17
- `ai-loadout` es el formato de tabla de despacho y motor de coincidencia que permite a los agentes de IA cargar el conocimiento adecuado para la tarea en cuestión. En lugar de volcar todo en el contexto, mantienes un índice pequeño y cargas los contenidos bajo demanda.
18
-
19
- Piensa en ello como un equipamiento de videojuego equipas al agente con exactamente el conocimiento que necesita antes de cada misión.
20
-
21
- ## Instalación
22
-
16
+
17
+ Enrutador de conocimiento contextual para agentes de IA.
18
+
19
+ `ai-loadout` es el formato de la tabla de distribución y el motor de coincidencia que permite a los agentes de IA cargar el conocimiento adecuado para la tarea en cuestión. En lugar de incluir todo en el contexto, se mantiene un índice pequeño y se cargan los datos según sea necesario.
20
+
21
+ Piénselo como la configuración de un juego: se equipa al agente con exactamente el conocimiento que necesita antes de cada misión.
22
+
23
+ ## Instalación
24
+
23
25
  ```bash
24
26
  npm install @mcptoolshop/ai-loadout
25
27
  ```
26
-
27
- ## Conceptos Fundamentales
28
-
29
- ### La Tabla de Despacho
30
-
31
- Un `LoadoutIndex` es un índice estructurado de contenidos de conocimiento:
32
-
28
+
29
+ ## Conceptos básicos
30
+
31
+ ### La tabla de distribución
32
+
33
+ Un `LoadoutIndex` es un índice estructurado de datos de conocimiento:
34
+
33
35
  ```json
34
36
  {
35
37
  "version": "1.0.0",
@@ -55,19 +57,19 @@ Un `LoadoutIndex` es un índice estructurado de contenidos de conocimiento:
55
57
  }
56
58
  }
57
59
  ```
58
-
59
- ### Niveles de Prioridad
60
-
61
- | Nivel | Comportamiento | Ejemplo |
62
- |-------|---------------|---------|
63
- | `core` | Siempre cargado | "nunca omitas tests para que CI pase" |
64
- | `domain` | Cargado cuando las palabras clave de la tarea coinciden | Reglas de CI al editar workflows |
65
- | `manual` | Nunca se carga automáticamente, solo búsqueda explícita | Problemas oscuros de plataforma |
66
-
67
- ### Frontmatter del Contenido
68
-
69
- Cada archivo de contenido lleva sus propios metadatos de enrutamiento:
70
-
60
+
61
+ ### Niveles de prioridad
62
+
63
+ | Nivel | Comportamiento | Ejemplo |
64
+ |------|----------|---------|
65
+ | `core` | Cargado siempre | "nunca omitir pruebas para que la integración continua sea exitosa" |
66
+ | `domain` | Cargado cuando las palabras clave de la tarea coinciden | Reglas de integración continua al editar flujos de trabajo |
67
+ | `manual` | Nunca se carga automáticamente, solo búsqueda explícita | Aspectos técnicos de la plataforma que pueden ser difíciles de entender |
68
+
69
+ ### Metadatos del archivo de datos
70
+
71
+ Cada archivo de datos contiene sus propios metadatos de enrutamiento:
72
+
71
73
  ```markdown
72
74
  ---
73
75
  id: github-actions
@@ -83,41 +85,41 @@ triggers:
83
85
  # GitHub Actions Rules
84
86
  CI minutes are finite...
85
87
  ```
86
-
87
- El frontmatter es la fuente de verdad. El índice se deriva de él.
88
-
89
- ## API
90
-
91
- ### `matchLoadout(task, index)`
92
-
93
- Compara una descripción de tarea contra un índice de loadout. Devuelve las entradas que deben cargarse, ordenadas por fuerza de coincidencia.
94
-
88
+
89
+ El metadato es la fuente de la verdad. El índice se deriva de él.
90
+
91
+ ## API
92
+
93
+ ### `matchLoadout(tarea, índice)`
94
+
95
+ Compara una descripción de la tarea con un índice de configuración. Devuelve las entradas que deben cargarse, clasificadas por la fuerza de la coincidencia.
96
+
95
97
  ```typescript
96
98
  import { matchLoadout } from "@mcptoolshop/ai-loadout";
97
99
 
98
100
  const results = matchLoadout("fix the CI workflow", index);
99
101
  // [{ entry: { id: "github-actions", ... }, score: 0.67, matchedKeywords: ["ci", "workflow"] }]
100
102
  ```
101
-
102
- - Las entradas core siempre se incluyen (puntuación 1.0)
103
- - Las entradas manual nunca se incluyen automáticamente
104
- - Las entradas domain se puntúan por coincidencia de palabras clave + bonificación de patrón
105
- - Los resultados se ordenan por puntuación descendente
106
-
107
- ### `lookupEntry(id, index)`
108
-
109
- Busca una entrada específica por ID. Para entradas manuales o acceso explícito.
110
-
103
+
104
+ - Las entradas principales siempre se incluyen (puntuación 1.0)
105
+ - Las entradas manuales nunca se incluyen automáticamente
106
+ - Las entradas de dominio se puntúan según la superposición de palabras clave + bonificación de patrones
107
+ - Los resultados se ordenan por puntuación descendente
108
+
109
+ ### `lookupEntry(id, índice)`
110
+
111
+ Busca una entrada específica por ID. Para entradas manuales o acceso explícito.
112
+
111
113
  ```typescript
112
114
  import { lookupEntry } from "@mcptoolshop/ai-loadout";
113
115
 
114
116
  const entry = lookupEntry("github-actions", index);
115
117
  ```
116
-
117
- ### `parseFrontmatter(content)`
118
-
119
- Analiza el frontmatter tipo YAML de un archivo de contenido.
120
-
118
+
119
+ ### `parseFrontmatter(contenido)`
120
+
121
+ Analiza el metadato en formato YAML de un archivo de datos.
122
+
121
123
  ```typescript
122
124
  import { parseFrontmatter } from "@mcptoolshop/ai-loadout";
123
125
 
@@ -126,15 +128,15 @@ if (frontmatter) {
126
128
  console.log(frontmatter.id, frontmatter.keywords);
127
129
  }
128
130
  ```
129
-
130
- ### `serializeFrontmatter(fm)`
131
-
132
- Serializa un objeto `Frontmatter` de vuelta a cadena de texto.
133
-
134
- ### `validateIndex(index)`
135
-
136
- Valida la integridad estructural de un `LoadoutIndex`. Devuelve un arreglo de problemas.
137
-
131
+
132
+ ### `serializeFrontmatter(fm)`
133
+
134
+ Serializa un objeto `Frontmatter` de nuevo a una cadena.
135
+
136
+ ### `validateIndex(índice)`
137
+
138
+ Valida la integridad estructural de un `LoadoutIndex`. Devuelve un array de problemas.
139
+
138
140
  ```typescript
139
141
  import { validateIndex } from "@mcptoolshop/ai-loadout";
140
142
 
@@ -144,21 +146,21 @@ if (errors.length > 0) {
144
146
  console.error("Index has errors:", errors);
145
147
  }
146
148
  ```
147
-
148
- Verifica: campos requeridos, IDs únicos, formato kebab-case, límites de resumen, presencia de palabras clave para entradas domain, prioridades válidas, presupuestos no negativos.
149
-
150
- ### `estimateTokens(text)`
151
-
152
- Estima el conteo de tokens de un texto. Usa la heurística de caracteres/4.
153
-
149
+
150
+ Comprobaciones: campos obligatorios, IDs únicos, formato kebab-case, límites del resumen, presencia de palabras clave para entradas de dominio, prioridades válidas, presupuestos no negativos.
151
+
152
+ ### `estimateTokens(texto)`
153
+
154
+ Estima el número de tokens a partir de un texto. Utiliza la heurística de chars/4.
155
+
154
156
  ```typescript
155
157
  import { estimateTokens } from "@mcptoolshop/ai-loadout";
156
158
 
157
159
  const tokens = estimateTokens(fileContent); // ~250
158
160
  ```
159
-
160
- ## Tipos
161
-
161
+
162
+ ## Tipos
163
+
162
164
  ```typescript
163
165
  import type {
164
166
  LoadoutEntry,
@@ -171,26 +173,26 @@ import type {
171
173
  Budget,
172
174
  } from "@mcptoolshop/ai-loadout";
173
175
  ```
174
-
175
- ## Consumidores
176
-
177
- - **[@mcptoolshop/claude-rules](https://github.com/mcp-tool-shop-org/claude-rules)** — Optimizador de CLAUDE.md para Claude Code. Usa ai-loadout para la tabla de despacho y el motor de coincidencia.
178
-
179
- ## Seguridad
180
-
181
- Este paquete es una biblioteca de datos pura. No accede al sistema de archivos, no realiza solicitudes de red ni recopila telemetría. Todo el I/O es responsabilidad del consumidor.
182
-
183
- ### Modelo de Amenazas
184
-
185
- | Amenaza | Mitigación |
186
- |---------|------------|
187
- | Entrada de frontmatter malformado | `parseFrontmatter()` devuelve `null` ante entrada inválida sin excepciones, sin eval |
188
- | Contaminación de prototipo | El parser manual usa literales de objeto planos, sin `JSON.parse` de estructuras anidadas no confiables |
189
- | Índice con datos incorrectos | `validateIndex()` detecta problemas estructurales antes de que se propaguen |
190
- | DoS por Regex | Sin regex proporcionado por el usuario los patrones se comparan como búsquedas de texto plano |
191
-
192
- Consulta [SECURITY.md](SECURITY.md) para la política de seguridad completa.
193
-
176
+
177
+ ## Consumidores
178
+
179
+ - **[@mcptoolshop/claude-rules](https://github.com/mcp-tool-shop-org/claude-rules)** — Optimizador de CLAUDE.md para Claude Code. Utiliza ai-loadout para la tabla de distribución y la coincidencia.
180
+
181
+ ## Seguridad
182
+
183
+ Este paquete es una biblioteca de datos pura. No accede al sistema de archivos, realiza solicitudes de red ni recopila datos de telemetría. Toda la entrada/salida es responsabilidad del consumidor.
184
+
185
+ ### Modelo de amenazas
186
+
187
+ | Amenaza | Mitigación |
188
+ |--------|------------|
189
+ | Metadato de entrada con formato incorrecto | `parseFrontmatter()` devuelve `null` en caso de entrada no válida; no se generan excepciones ni se utiliza `eval` |
190
+ | Contaminación de prototipos | El analizador personalizado utiliza literales de objetos simples, no `JSON.parse` de estructuras anidadas no confiables. |
191
+ | Índice con datos incorrectos | `validateIndex()` detecta problemas estructurales antes de que se propaguen. |
192
+ | Ataque de denegación de servicio con expresiones regulares | No se utilizan expresiones regulares proporcionadas por el usuario; los patrones se comparan como búsquedas de cadenas simples. |
193
+
194
+ Consulte [SECURITY.md](SECURITY.md) para obtener la política de seguridad completa.
195
+
194
196
  ---
195
-
196
- Creado por [MCP Tool Shop](https://mcp-tool-shop.github.io/)
197
+
198
+ Creado por [MCP Tool Shop](https://mcp-tool-shop.github.io/)
package/README.fr.md CHANGED
@@ -1,35 +1,37 @@
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
+
1
5
  <p align="center">
2
- <a href="README.md">English</a> | <a href="README.zh.md">中文</a> | <a href="README.es.md">Español</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> | <a href="README.ja.md">日本語</a>
6
+ <img src="https://raw.githubusercontent.com/mcp-tool-shop-org/brand/main/logos/ai-loadout/readme.png" width="400" alt="ai-loadout">
3
7
  </p>
4
-
5
- <p align="center">
6
- <img src="logo.png" width="400" alt="ai-loadout">
7
- </p>
8
-
8
+
9
9
  <p align="center">
10
10
  <a href="https://github.com/mcp-tool-shop-org/ai-loadout/actions/workflows/ci.yml"><img src="https://github.com/mcp-tool-shop-org/ai-loadout/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
11
+ <a href="https://codecov.io/gh/mcp-tool-shop-org/ai-loadout"><img src="https://codecov.io/gh/mcp-tool-shop-org/ai-loadout/graph/badge.svg" alt="Coverage"></a>
11
12
  <a href="https://www.npmjs.com/package/@mcptoolshop/ai-loadout"><img src="https://img.shields.io/npm/v/@mcptoolshop/ai-loadout" alt="npm"></a>
12
- <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="Licence MIT"></a>
13
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT License"></a>
14
+ <a href="https://mcp-tool-shop-org.github.io/ai-loadout/"><img src="https://img.shields.io/badge/Landing_Page-live-blue" alt="Landing Page"></a>
13
15
  </p>
14
-
15
- Routeur de connaissances contextuel pour agents IA.
16
-
17
- `ai-loadout` est le format de table de dispatch et le moteur de correspondance qui permet aux agents IA de charger les bonnes connaissances pour la tache en cours. Au lieu de tout charger dans le contexte, vous gardez un petit index et chargez les contenus a la demande.
18
-
19
- Pensez-y comme un equipement de jeu video vous equipez l'agent avec exactement les connaissances dont il a besoin avant chaque mission.
20
-
21
- ## Installation
22
-
16
+
17
+ Routeur de connaissances contextuel pour les agents d'IA.
18
+
19
+ `ai-loadout` est le format de table de répartition et le moteur de correspondance qui permet aux agents d'IA de charger les connaissances appropriées pour la tâche en cours. Au lieu de tout inclure dans le contexte, vous conservez un index minimal et chargez les données à la demande.
20
+
21
+ Considérez cela comme une configuration de jeu : vous équipez l'agent des connaissances dont il a strictement besoin avant chaque mission.
22
+
23
+ ## Installation
24
+
23
25
  ```bash
24
26
  npm install @mcptoolshop/ai-loadout
25
27
  ```
26
-
27
- ## Concepts Fondamentaux
28
-
29
- ### La Table de Dispatch
30
-
31
- Un `LoadoutIndex` est un index structure de contenus de connaissances :
32
-
28
+
29
+ ## Concepts clés
30
+
31
+ ### La table de répartition
32
+
33
+ Un `LoadoutIndex` est un index structuré des données de connaissances :
34
+
33
35
  ```json
34
36
  {
35
37
  "version": "1.0.0",
@@ -55,19 +57,19 @@ Un `LoadoutIndex` est un index structure de contenus de connaissances :
55
57
  }
56
58
  }
57
59
  ```
58
-
59
- ### Niveaux de Priorite
60
-
61
- | Niveau | Comportement | Exemple |
62
- |--------|-------------|---------|
63
- | `core` | Toujours charge | "ne jamais ignorer les tests pour faire passer la CI" |
64
- | `domain` | Charge quand les mots-cles de la tache correspondent | Regles CI lors de l'edition de workflows |
65
- | `manual` | Jamais charge automatiquement, consultation explicite uniquement | Problemes obscurs de plateforme |
66
-
67
- ### Frontmatter du Contenu
68
-
69
- Chaque fichier de contenu porte ses propres metadonnees de routage :
70
-
60
+
61
+ ### Niveaux de priorité
62
+
63
+ | Niveau | Comportement | Exemple |
64
+ |------|----------|---------|
65
+ | `core` | Toujours chargé | "Ne jamais ignorer les tests pour que l'intégration continue soit réussie" |
66
+ | `domain` | Chargé lorsque les mots-clés de la tâche correspondent | Règles d'intégration continue lors de la modification des flux de travail |
67
+ | `manual` | Jamais chargé automatiquement, recherche explicite uniquement | Détails spécifiques à certaines plateformes |
68
+
69
+ ### Métadonnées du fichier de données
70
+
71
+ Chaque fichier de données contient ses propres métadonnées de routage :
72
+
71
73
  ```markdown
72
74
  ---
73
75
  id: github-actions
@@ -83,41 +85,41 @@ triggers:
83
85
  # GitHub Actions Rules
84
86
  CI minutes are finite...
85
87
  ```
86
-
87
- Le frontmatter est la source de verite. L'index en est derive.
88
-
89
- ## API
90
-
91
- ### `matchLoadout(task, index)`
92
-
93
- Compare une description de tache avec un index de loadout. Retourne les entrees qui doivent etre chargees, classees par force de correspondance.
94
-
88
+
89
+ Les métadonnées sont la source de vérité. L'index est dérivé de celles-ci.
90
+
91
+ ## API
92
+
93
+ ### `matchLoadout(tâche, index)`
94
+
95
+ Fait correspondre une description de tâche à un index de configuration. Renvoie les entrées qui doivent être chargées, classées par force de correspondance.
96
+
95
97
  ```typescript
96
98
  import { matchLoadout } from "@mcptoolshop/ai-loadout";
97
99
 
98
100
  const results = matchLoadout("fix the CI workflow", index);
99
101
  // [{ entry: { id: "github-actions", ... }, score: 0.67, matchedKeywords: ["ci", "workflow"] }]
100
102
  ```
101
-
102
- - Les entrees core sont toujours incluses (score 1.0)
103
- - Les entrees manual ne sont jamais incluses automatiquement
104
- - Les entrees domain sont notees par chevauchement de mots-cles + bonus de patron
105
- - Les resultats sont tries par score decroissant
106
-
107
- ### `lookupEntry(id, index)`
108
-
109
- Recherche une entree specifique par ID. Pour les entrees manuelles ou l'acces explicite.
110
-
103
+
104
+ - Les entrées principales sont toujours incluses (score de 1,0)
105
+ - Les entrées manuelles ne sont jamais incluses automatiquement
106
+ - Les entrées spécifiques à un domaine sont notées en fonction du chevauchement des mots-clés et d'un bonus de motif
107
+ - Les résultats sont triés par score décroissant
108
+
109
+ ### `lookupEntry(id, index)`
110
+
111
+ Recherche une entrée spécifique par ID. Pour les entrées manuelles ou l'accès explicite.
112
+
111
113
  ```typescript
112
114
  import { lookupEntry } from "@mcptoolshop/ai-loadout";
113
115
 
114
116
  const entry = lookupEntry("github-actions", index);
115
117
  ```
116
-
117
- ### `parseFrontmatter(content)`
118
-
119
- Analyse le frontmatter de type YAML d'un fichier de contenu.
120
-
118
+
119
+ ### `parseFrontmatter(contenu)`
120
+
121
+ Analyse les métadonnées au format YAML d'un fichier de données.
122
+
121
123
  ```typescript
122
124
  import { parseFrontmatter } from "@mcptoolshop/ai-loadout";
123
125
 
@@ -126,15 +128,15 @@ if (frontmatter) {
126
128
  console.log(frontmatter.id, frontmatter.keywords);
127
129
  }
128
130
  ```
129
-
130
- ### `serializeFrontmatter(fm)`
131
-
132
- Serialise un objet `Frontmatter` en chaine de caracteres.
133
-
134
- ### `validateIndex(index)`
135
-
136
- Valide l'integrite structurelle d'un `LoadoutIndex`. Retourne un tableau de problemes.
137
-
131
+
132
+ ### `serializeFrontmatter(fm)`
133
+
134
+ Série les métadonnées d'un objet `Frontmatter` en une chaîne de caractères.
135
+
136
+ ### `validateIndex(index)`
137
+
138
+ Valide l'intégrité structurelle d'un `LoadoutIndex`. Renvoie un tableau de problèmes.
139
+
138
140
  ```typescript
139
141
  import { validateIndex } from "@mcptoolshop/ai-loadout";
140
142
 
@@ -144,21 +146,21 @@ if (errors.length > 0) {
144
146
  console.error("Index has errors:", errors);
145
147
  }
146
148
  ```
147
-
148
- Verifie : champs requis, IDs uniques, format kebab-case, limites de resume, presence de mots-cles pour les entrees domain, priorites valides, budgets non negatifs.
149
-
150
- ### `estimateTokens(text)`
151
-
152
- Estime le nombre de tokens d'un texte. Utilise l'heuristique caracteres/4.
153
-
149
+
150
+ Vérifications : champs obligatoires, ID uniques, format kebab-case, limites du résumé, présence de mots-clés pour les entrées de domaine, priorités valides, budgets non négatifs.
151
+
152
+ ### `estimateTokens(texte)`
153
+
154
+ Estime le nombre de jetons à partir d'un texte. Utilise l'heuristique chars/4.
155
+
154
156
  ```typescript
155
157
  import { estimateTokens } from "@mcptoolshop/ai-loadout";
156
158
 
157
159
  const tokens = estimateTokens(fileContent); // ~250
158
160
  ```
159
-
160
- ## Types
161
-
161
+
162
+ ## Types
163
+
162
164
  ```typescript
163
165
  import type {
164
166
  LoadoutEntry,
@@ -171,26 +173,26 @@ import type {
171
173
  Budget,
172
174
  } from "@mcptoolshop/ai-loadout";
173
175
  ```
174
-
175
- ## Consommateurs
176
-
177
- - **[@mcptoolshop/claude-rules](https://github.com/mcp-tool-shop-org/claude-rules)** — Optimiseur de CLAUDE.md pour Claude Code. Utilise ai-loadout pour la table de dispatch et la correspondance.
178
-
179
- ## Securite
180
-
181
- Ce paquet est une bibliotheque de donnees pure. Il n'accede pas au systeme de fichiers, ne fait pas de requetes reseau et ne collecte pas de telemetrie. Toutes les operations d'E/S sont de la responsabilite du consommateur.
182
-
183
- ### Modele de Menaces
184
-
185
- | Menace | Attenuation |
186
- |--------|-------------|
187
- | Entree de frontmatter malformee | `parseFrontmatter()` retourne `null` sur une entree invalide pas d'exceptions, pas d'eval |
188
- | Pollution de prototype | Le parser manuel utilise des litteraux d'objet simples, pas de `JSON.parse` de structures imbriquees non fiables |
189
- | Index avec des donnees incorrectes | `validateIndex()` detecte les problemes structurels avant qu'ils ne se propagent |
190
- | DoS par Regex | Pas de regex fournie par l'utilisateur les patrons sont compares comme des recherches de texte brut |
191
-
192
- Consultez [SECURITY.md](SECURITY.md) pour la politique de securite complete.
193
-
176
+
177
+ ## Consommateurs
178
+
179
+ - **[@mcptoolshop/claude-rules](https://github.com/mcp-tool-shop-org/claude-rules)** — Optimiseur CLAUDE.md pour Claude Code. Utilise ai-loadout pour la table de répartition et la correspondance.
180
+
181
+ ## Sécurité
182
+
183
+ Ce paquet est une bibliothèque de données pure. Il n'accède pas au système de fichiers, ne fait pas de requêtes réseau ni ne collecte de données télémétriques. Toutes les opérations d'entrée/sortie sont de la responsabilité du consommateur.
184
+
185
+ ### Modèle de menace
186
+
187
+ | Menace | Atténuation |
188
+ |--------|------------|
189
+ | Métadonnées corrompues | `parseFrontmatter()` renvoie `null` en cas d'entrée invalide, sans exceptions ni évaluation de code. |
190
+ | Pollution de prototype | L'analyseur personnalisé utilise des littéraux d'objets simples, sans `JSON.parse` de structures imbriquées non fiables. |
191
+ | Index avec des données incorrectes | `validateIndex()` détecte les problèmes structurels avant qu'ils ne se propagent. |
192
+ | Attaque par regex DoS | Aucune expression régulière fournie par l'utilisateur, les motifs sont correspondés comme des recherches de chaînes simples. |
193
+
194
+ Consultez [SECURITY.md](SECURITY.md) pour la politique de sécurité complète.
195
+
194
196
  ---
195
-
196
- Cree par [MCP Tool Shop](https://mcp-tool-shop.github.io/)
197
+
198
+ Développé par [MCP Tool Shop](https://mcp-tool-shop.github.io/)