claudeos-core 2.4.0 → 2.4.2
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 +74 -3
- package/README.de.md +253 -195
- package/README.es.md +242 -184
- package/README.fr.md +240 -182
- package/README.hi.md +248 -190
- package/README.ja.md +247 -189
- package/README.ko.md +220 -162
- package/README.md +163 -105
- package/README.ru.md +254 -196
- package/README.vi.md +250 -192
- package/README.zh-CN.md +252 -194
- package/package.json +1 -1
package/README.es.md
CHANGED
|
@@ -7,44 +7,40 @@
|
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
[](https://www.npmjs.com/package/claudeos-core)
|
|
9
9
|
|
|
10
|
-
**
|
|
10
|
+
**Una CLI que analiza tu código fuente y genera de forma reproducible `CLAUDE.md` y `.claude/rules/`. Combina un scanner en Node.js, una pipeline de 4 pasos sobre Claude y 5 validators. Soporta 12 stacks y 10 idiomas, y no inventa rutas que no existan en tu repo.**
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
13
|
npx claudeos-core init
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
Funciona sobre [**12 stacks**](#supported-stacks), monorepos incluidos. Un solo comando, sin configuración, segura ante interrupciones e idempotente al volver a ejecutarla.
|
|
17
|
+
|
|
16
18
|
[🇺🇸 English](README.md) · [🇰🇷 한국어](README.ko.md) · [🇨🇳 中文](README.zh-CN.md) · [🇯🇵 日本語](README.ja.md) · [🇻🇳 Tiếng Việt](README.vi.md) · [🇮🇳 हिन्दी](README.hi.md) · [🇷🇺 Русский](README.ru.md) · [🇫🇷 Français](README.fr.md) · [🇩🇪 Deutsch](README.de.md)
|
|
17
19
|
|
|
18
20
|
---
|
|
19
21
|
|
|
20
22
|
## ¿Qué es esto?
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
- Tu equipo usa MyBatis, pero Claude genera código JPA.
|
|
24
|
-
- Tu wrapper es `ApiResponse.ok()`, pero Claude escribe `ResponseEntity.success()`.
|
|
25
|
-
- Tus paquetes son `controller/order/`, pero Claude crea `order/controller/`.
|
|
24
|
+
Cada vez que abres una sesión nueva, Claude Code vuelve a los valores genéricos del framework. El equipo usa **MyBatis**, pero Claude escribe JPA. El wrapper de respuesta es `ApiResponse.ok()` y, aun así, Claude acaba escribiendo `ResponseEntity.success()`. Los paquetes se organizan por capa, pero el código generado los reorganiza por dominio. Mantener a mano un `.claude/rules/` por repositorio resuelve el problema; hasta que el código evoluciona y esas reglas dejan de cuadrar con la realidad.
|
|
26
25
|
|
|
27
|
-
|
|
26
|
+
**ClaudeOS-Core las regenera de forma reproducible a partir del código real.** Primero entra un scanner en Node.js que reconoce el stack, el ORM, la organización de paquetes y las rutas de archivos. A continuación, la pipeline de 4 pasos sobre Claude escribe el conjunto completo: `CLAUDE.md`, las reglas auto-cargadas en `.claude/rules/`, los estándares y las skills. Todo queda acotado por una lista explícita de rutas permitidas que el modelo no puede saltarse. Y para cerrar, cinco validators revisan el resultado antes de darlo por bueno.
|
|
28
27
|
|
|
29
|
-
|
|
28
|
+
De este modo, la misma entrada produce siempre la misma salida, byte a byte, en cualquiera de los 10 idiomas disponibles, y sin que aparezca jamás una ruta inexistente. Más abajo se entra en detalle en [Qué lo hace diferente](#qué-lo-hace-diferente).
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
Antes: Tú → Claude Code → código "generalmente bueno" → corrección manual
|
|
33
|
-
Después: Tú → Claude Code → código que coincide con tu proyecto → listo para enviar
|
|
34
|
-
```
|
|
30
|
+
Para proyectos de larga duración, además se prepara una [Memory Layer](#memory-layer-opcional-para-proyectos-de-larga-duración) aparte.
|
|
35
31
|
|
|
36
32
|
---
|
|
37
33
|
|
|
38
|
-
##
|
|
34
|
+
## Míralo en un proyecto real
|
|
39
35
|
|
|
40
|
-
|
|
36
|
+
Lo ejecutamos sobre [`spring-boot-realworld-example-app`](https://github.com/gothinkster/spring-boot-realworld-example-app): Java 11, Spring Boot 2.6, MyBatis, SQLite y 187 archivos fuente. El resultado: **75 archivos generados**, **53 minutos** en total y todos los validators en verde ✅.
|
|
41
37
|
|
|
42
38
|
<p align="center">
|
|
43
39
|
<img src="docs/assets/spring-boot-realworld-demo.gif" alt="ClaudeOS-Core init running on spring-boot-realworld-example-app — stack detection, 4-pass pipeline, validators, completion summary" width="769">
|
|
44
40
|
</p>
|
|
45
41
|
|
|
46
42
|
<details>
|
|
47
|
-
<summary><strong
|
|
43
|
+
<summary><strong>Salida de terminal (versión texto, para buscar y copiar)</strong></summary>
|
|
48
44
|
|
|
49
45
|
```text
|
|
50
46
|
╔════════════════════════════════════════════════════╗
|
|
@@ -79,18 +75,18 @@ Ejecutado en [`spring-boot-realworld-example-app`](https://github.com/gothinkste
|
|
|
79
75
|
[██████████░░░░░░░░░░] 50% (2/4)
|
|
80
76
|
|
|
81
77
|
[6] Pass 3 — Generating all files...
|
|
82
|
-
|
|
78
|
+
Pass 3 split mode (3a → 3b → 3c → 3d-aux)
|
|
83
79
|
✅ 3a complete (2m 57s) — pass3a-facts.md (187-path allowlist)
|
|
84
80
|
✅ 3b complete (18m 49s) — CLAUDE.md + 19 standards + 20 rules
|
|
85
81
|
✅ 3c complete (12m 35s) — 13 skills + 9 guides
|
|
86
82
|
✅ 3d-aux complete (3m 18s) — database/ + mcp-guide/
|
|
87
|
-
|
|
83
|
+
Pass 3 split complete: 4/4 stages successful
|
|
88
84
|
[███████████████░░░░░] 75% (3/4)
|
|
89
85
|
|
|
90
86
|
[7] Pass 4 — Memory scaffolding...
|
|
91
|
-
|
|
87
|
+
Pass 4 staged-rules: 6 rule files moved to .claude/rules/
|
|
92
88
|
✅ Pass 4 complete (5m)
|
|
93
|
-
|
|
89
|
+
Gap-fill: all 12 expected files already present
|
|
94
90
|
[████████████████████] 100% (4/4)
|
|
95
91
|
|
|
96
92
|
╔═══════════════════════════════════════╗
|
|
@@ -119,37 +115,45 @@ Ejecutado en [`spring-boot-realworld-example-app`](https://github.com/gothinkste
|
|
|
119
115
|
</details>
|
|
120
116
|
|
|
121
117
|
<details>
|
|
122
|
-
<summary><strong
|
|
118
|
+
<summary><strong>Lo que acaba en tu <code>CLAUDE.md</code> (extracto real, secciones 1 y 2)</strong></summary>
|
|
123
119
|
|
|
124
120
|
```markdown
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
121
|
+
# CLAUDE.md — spring-boot-realworld-example-app
|
|
122
|
+
|
|
123
|
+
> Reference implementation of the RealWorld backend specification on
|
|
124
|
+
> Java 11 + Spring Boot 2.6, exposing both REST and GraphQL endpoints
|
|
125
|
+
> over a hexagonal MyBatis persistence layer.
|
|
126
|
+
|
|
127
|
+
#### 1. Role Definition
|
|
128
|
+
|
|
129
|
+
As the senior developer for this repository, you are responsible for
|
|
130
|
+
writing, modifying, and reviewing code. Responses must be written in English.
|
|
131
|
+
A Java Spring Boot REST + GraphQL API server organized around a hexagonal
|
|
132
|
+
(ports & adapters) architecture, with a CQRS-lite read/write split inside
|
|
133
|
+
an XML-driven MyBatis persistence layer and JWT-based authentication.
|
|
134
|
+
|
|
135
|
+
#### 2. Project Overview
|
|
136
|
+
|
|
137
|
+
| Item | Value |
|
|
138
|
+
|---|---|
|
|
139
|
+
| Language | Java 11 |
|
|
140
|
+
| Framework | Spring Boot 2.6.3 |
|
|
141
|
+
| Build Tool | Gradle (Groovy DSL) |
|
|
142
|
+
| Persistence | MyBatis 3 via `mybatis-spring-boot-starter:2.2.2` (no JPA) |
|
|
143
|
+
| Database | SQLite (`org.xerial:sqlite-jdbc:3.36.0.3`) — `dev.db` (default), `:memory:` (test) |
|
|
144
|
+
| Migration | Flyway — single baseline `V1__create_tables.sql` |
|
|
145
|
+
| API Style | REST (`io.spring.api.*`) + GraphQL via Netflix DGS `:4.9.21` |
|
|
146
|
+
| Authentication | JWT HS512 (`jjwt-api:0.11.2`) + Spring Security `PasswordEncoder` |
|
|
147
|
+
| Server Port | 8080 (default) |
|
|
148
|
+
| Test Stack | JUnit Jupiter 5, Mockito, AssertJ, rest-assured, spring-mock-mvc |
|
|
145
149
|
```
|
|
146
150
|
|
|
147
|
-
|
|
151
|
+
Cada valor de la tabla anterior, desde las coordenadas exactas de cada dependencia hasta el nombre del archivo `dev.db`, el de la migración `V1__create_tables.sql` o ese «no JPA», sale del scanner. Lo extrae directamente de `build.gradle`, `application.properties` y el árbol de fuentes antes de que Claude empiece a escribir. Nada se adivina.
|
|
148
152
|
|
|
149
153
|
</details>
|
|
150
154
|
|
|
151
155
|
<details>
|
|
152
|
-
<summary><strong
|
|
156
|
+
<summary><strong>Una regla auto-cargada real (<code>.claude/rules/10.backend/01.controller-rules.md</code>)</strong></summary>
|
|
153
157
|
|
|
154
158
|
````markdown
|
|
155
159
|
---
|
|
@@ -157,298 +161,352 @@ paths:
|
|
|
157
161
|
- "**/*"
|
|
158
162
|
---
|
|
159
163
|
|
|
160
|
-
|
|
164
|
+
#### Controller Rules
|
|
165
|
+
|
|
166
|
+
##### REST (`io.spring.api.*`)
|
|
161
167
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
-
|
|
168
|
-
|
|
168
|
+
- Controllers are the SOLE response wrapper for HTTP — no aggregator/facade above them.
|
|
169
|
+
Return `ResponseEntity<?>` or a body Spring serializes via `JacksonCustomizations`.
|
|
170
|
+
- Each controller method calls exactly ONE application service method. Multi-source
|
|
171
|
+
composition lives in the application service.
|
|
172
|
+
- Controllers MUST NOT import `io.spring.infrastructure.*`. No direct `@Mapper` access.
|
|
173
|
+
- Validate command-param arguments with `@Valid`. Custom JSR-303 constraints live under
|
|
174
|
+
`io.spring.application.{aggregate}.*`.
|
|
175
|
+
- Resolve the current user via `@AuthenticationPrincipal User`.
|
|
176
|
+
- Let exceptions propagate to `io.spring.api.exception.CustomizeExceptionHandler`
|
|
177
|
+
(`@ControllerAdvice`). Do NOT `try/catch` business exceptions inside the controller.
|
|
169
178
|
|
|
170
|
-
|
|
171
|
-
- `<if>` predicates MUST guard both null and empty:
|
|
172
|
-
`<if test="X != null and X != ''">`. Empty-only is the existing HIGH-severity bug pattern.
|
|
173
|
-
- Prefer `LIMIT n OFFSET m` over MySQL-style `LIMIT m, n`.
|
|
179
|
+
##### GraphQL (`io.spring.graphql.*`)
|
|
174
180
|
|
|
175
|
-
|
|
181
|
+
- DGS components (`@DgsComponent`) are the sole GraphQL response wrappers.
|
|
182
|
+
Use `@DgsQuery` / `@DgsData` / `@DgsMutation`.
|
|
183
|
+
- Resolve the current user via `io.spring.graphql.SecurityUtil.getCurrentUser()`.
|
|
184
|
+
|
|
185
|
+
##### Examples
|
|
176
186
|
|
|
177
187
|
✅ Correct:
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
188
|
+
```java
|
|
189
|
+
@PostMapping
|
|
190
|
+
public ResponseEntity<?> createArticle(@AuthenticationPrincipal User user,
|
|
191
|
+
@Valid @RequestBody NewArticleParam param) {
|
|
192
|
+
Article article = articleCommandService.createArticle(param, user);
|
|
193
|
+
ArticleData data = articleQueryService.findById(article.getId(), user)
|
|
194
|
+
.orElseThrow(ResourceNotFoundException::new);
|
|
195
|
+
return ResponseEntity.ok(Map.of("article", data));
|
|
196
|
+
}
|
|
187
197
|
```
|
|
188
198
|
|
|
189
199
|
❌ Incorrect:
|
|
190
|
-
```
|
|
191
|
-
|
|
200
|
+
```java
|
|
201
|
+
@PostMapping
|
|
202
|
+
public ResponseEntity<?> create(@RequestBody NewArticleParam p) {
|
|
203
|
+
try {
|
|
204
|
+
articleCommandService.createArticle(p, currentUser);
|
|
205
|
+
} catch (Exception e) { // NO — let CustomizeExceptionHandler handle it
|
|
206
|
+
return ResponseEntity.status(500).body(e.getMessage()); // NO — leaks raw message
|
|
207
|
+
}
|
|
208
|
+
return ResponseEntity.ok().build();
|
|
209
|
+
}
|
|
192
210
|
```
|
|
193
211
|
````
|
|
194
212
|
|
|
195
|
-
El glob `paths: ["**/*"]`
|
|
213
|
+
El glob `paths: ["**/*"]` hace que Claude Code cargue esta regla automáticamente cada vez que se edita cualquier archivo del proyecto. Los nombres de clase, las rutas de paquete y el manejador de excepciones que aparecen en la regla salen tal cual del código escaneado; reflejan, por tanto, el `CustomizeExceptionHandler` y el `JacksonCustomizations` reales del proyecto.
|
|
196
214
|
|
|
197
215
|
</details>
|
|
198
216
|
|
|
199
217
|
<details>
|
|
200
|
-
<summary><strong
|
|
218
|
+
<summary><strong>Un seed de <code>decision-log.md</code> auto-generado (extracto real)</strong></summary>
|
|
201
219
|
|
|
202
220
|
```markdown
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
- **Context:**
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
`
|
|
209
|
-
|
|
210
|
-
- **Options considered:**
|
|
211
|
-
|
|
212
|
-
- **Decision:**
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
- **Consequences:**
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
221
|
+
#### 2026-04-26 — Hexagonal ports & adapters with MyBatis-only persistence
|
|
222
|
+
|
|
223
|
+
- **Context:** `io.spring.core.*` exposes `*Repository` ports (e.g.,
|
|
224
|
+
`io.spring.core.article.ArticleRepository`) implemented by
|
|
225
|
+
`io.spring.infrastructure.repository.MyBatis*Repository` adapters.
|
|
226
|
+
The domain layer has zero `org.springframework.*` /
|
|
227
|
+
`org.apache.ibatis.*` / `io.spring.infrastructure.*` imports.
|
|
228
|
+
- **Options considered:** JPA/Hibernate, Spring Data, MyBatis-Plus
|
|
229
|
+
`BaseMapper`. None adopted.
|
|
230
|
+
- **Decision:** MyBatis 3 (`mybatis-spring-boot-starter:2.2.2`) with
|
|
231
|
+
hand-written XML statements under `src/main/resources/mapper/*.xml`.
|
|
232
|
+
Hexagonal port/adapter wiring keeps the domain framework-free.
|
|
233
|
+
- **Consequences:** Every SQL lives in XML — `@Select`/`@Insert`/`@Update`/`@Delete`
|
|
234
|
+
annotations are forbidden. New aggregates require both a
|
|
235
|
+
`core.{aggregate}.{Aggregate}Repository` port AND a
|
|
236
|
+
`MyBatis{Aggregate}Repository` adapter; introducing a JPA repository would
|
|
237
|
+
split the persistence model.
|
|
219
238
|
```
|
|
220
239
|
|
|
221
|
-
Pass 4
|
|
240
|
+
Pass 4 deja sembrado `decision-log.md` con las decisiones de arquitectura que extrae de `pass2-merged.json`. De esta forma, en sesiones futuras no solo se recuerda *cómo* es el código, sino también *por qué*. Cada opción («JPA/Hibernate», «MyBatis-Plus») y cada consecuencia parten del bloque de dependencias real de `build.gradle`.
|
|
222
241
|
|
|
223
242
|
</details>
|
|
224
243
|
|
|
225
244
|
---
|
|
226
245
|
|
|
227
|
-
##
|
|
246
|
+
## Probado en
|
|
247
|
+
|
|
248
|
+
ClaudeOS-Core viene con benchmarks de referencia ejecutados sobre proyectos OSS reales. Si lo has usado en un repositorio público, [abre un issue](https://github.com/claudeos-core/claudeos-core/issues) y lo añadimos a la tabla.
|
|
249
|
+
|
|
250
|
+
| Proyecto | Stack | Escaneado → Generado | Estado |
|
|
251
|
+
|---|---|---|---|
|
|
252
|
+
| [`spring-boot-realworld-example-app`](https://github.com/gothinkster/spring-boot-realworld-example-app) | Java 11 · Spring Boot 2.6 · MyBatis · SQLite | 187 → 75 archivos | ✅ los 5 validators pasan |
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## Inicio rápido
|
|
228
257
|
|
|
229
|
-
**Requisitos previos:** Node.js 18
|
|
258
|
+
**Requisitos previos:** Node.js 18+ y [Claude Code](https://docs.anthropic.com/en/docs/claude-code) instalado y autenticado.
|
|
230
259
|
|
|
231
260
|
```bash
|
|
232
|
-
# 1.
|
|
261
|
+
# 1. Sitúate en la raíz del proyecto
|
|
233
262
|
cd my-spring-boot-project
|
|
234
263
|
|
|
235
|
-
# 2.
|
|
264
|
+
# 2. Lanza init (analiza el código y le pide a Claude que escriba las reglas)
|
|
236
265
|
npx claudeos-core init
|
|
237
266
|
|
|
238
|
-
# 3. Listo. Abre Claude Code y empieza a programar
|
|
267
|
+
# 3. Listo. Abre Claude Code y empieza a programar; las reglas ya están cargadas.
|
|
239
268
|
```
|
|
240
269
|
|
|
241
|
-
|
|
270
|
+
Cuando termina `init` te encuentras con esto:
|
|
242
271
|
|
|
243
272
|
```
|
|
244
273
|
your-project/
|
|
245
274
|
├── .claude/
|
|
246
|
-
│ └── rules/ ←
|
|
247
|
-
│ ├── 00.core/ (reglas generales
|
|
248
|
-
│ ├── 10.backend/ (reglas
|
|
249
|
-
│ ├── 20.frontend/ (reglas
|
|
250
|
-
│ ├── 30.security-db/ (convenciones de seguridad y
|
|
251
|
-
│ ├── 40.infra/ (env,
|
|
252
|
-
│ ├── 50.sync/ (recordatorios de
|
|
253
|
-
│ ├── 60.memory/ (reglas de memoria
|
|
275
|
+
│ └── rules/ ← Cargado automáticamente por Claude Code
|
|
276
|
+
│ ├── 00.core/ (reglas generales: nombrado, arquitectura)
|
|
277
|
+
│ ├── 10.backend/ (reglas del stack backend, si lo hay)
|
|
278
|
+
│ ├── 20.frontend/ (reglas del stack frontend, si lo hay)
|
|
279
|
+
│ ├── 30.security-db/ (convenciones de seguridad y BD)
|
|
280
|
+
│ ├── 40.infra/ (env, logs, CI/CD)
|
|
281
|
+
│ ├── 50.sync/ (recordatorios de sincronización docs, solo reglas)
|
|
282
|
+
│ ├── 60.memory/ (reglas de memoria, Pass 4, solo reglas)
|
|
254
283
|
│ ├── 70.domains/{type}/ (reglas por dominio, type = backend|frontend)
|
|
255
|
-
│ └── 80.verification/ (
|
|
284
|
+
│ └── 80.verification/ (recordatorios de testing y verificación de build)
|
|
256
285
|
├── claudeos-core/
|
|
257
|
-
│ ├── standard/ ←
|
|
258
|
-
│ │ ├── 00.core/ (
|
|
259
|
-
│ │ ├── 10.backend/ (referencia backend
|
|
260
|
-
│ │ ├── 20.frontend/ (referencia frontend
|
|
261
|
-
│ │ ├── 30.security-db/ (referencia de seguridad y
|
|
262
|
-
│ │ ├── 40.infra/ (referencia env /
|
|
286
|
+
│ ├── standard/ ← Documentación de referencia (misma estructura por categoría)
|
|
287
|
+
│ │ ├── 00.core/ (visión del proyecto, arquitectura, nombrado)
|
|
288
|
+
│ │ ├── 10.backend/ (referencia backend, si hay stack backend)
|
|
289
|
+
│ │ ├── 20.frontend/ (referencia frontend, si hay stack frontend)
|
|
290
|
+
│ │ ├── 30.security-db/ (referencia de seguridad y BD)
|
|
291
|
+
│ │ ├── 40.infra/ (referencia env / logs / CI-CD)
|
|
263
292
|
│ │ ├── 70.domains/{type}/ (referencia por dominio)
|
|
264
|
-
│ │ ├── 80.verification/ (referencia
|
|
265
|
-
│ │ └── 90.optional/ (extras
|
|
293
|
+
│ │ ├── 80.verification/ (referencia build / arranque / tests, solo standard)
|
|
294
|
+
│ │ └── 90.optional/ (extras según stack, solo standard)
|
|
266
295
|
│ ├── skills/ (patrones reutilizables que Claude puede aplicar)
|
|
267
|
-
│ ├── guide/ (guías how-to para tareas
|
|
268
|
-
│ ├── database/ (
|
|
296
|
+
│ ├── guide/ (guías how-to para tareas frecuentes)
|
|
297
|
+
│ ├── database/ (visión del esquema, guía de migraciones)
|
|
269
298
|
│ ├── mcp-guide/ (notas de integración MCP)
|
|
270
299
|
│ └── memory/ (decision log, failure patterns, compaction)
|
|
271
300
|
└── CLAUDE.md (el índice que Claude lee primero)
|
|
272
301
|
```
|
|
273
302
|
|
|
274
|
-
Las categorías que comparten
|
|
303
|
+
Las categorías que comparten prefijo numérico entre `rules/` y `standard/` representan la misma área conceptual; por ejemplo, las reglas de `10.backend` se corresponden con los estándares de `10.backend`. Solo viven en `rules/` las categorías `50.sync` (recordatorios de sincronización) y `60.memory` (memoria de Pass 4); en cambio, solo en `standard/` vive `90.optional` (extras por stack, sin enforcement). El resto de prefijos (`00`, `10`, `20`, `30`, `40`, `70`, `80`) aparece en ambos lados. Con eso, Claude Code ya conoce el proyecto.
|
|
275
304
|
|
|
276
305
|
---
|
|
277
306
|
|
|
278
307
|
## ¿Para quién es esto?
|
|
279
308
|
|
|
280
|
-
|
|
|
309
|
+
| Si eres... | El dolor que quita |
|
|
281
310
|
|---|---|
|
|
282
|
-
| **
|
|
283
|
-
| **
|
|
284
|
-
| **Ya usas Claude Code**
|
|
311
|
+
| **Dev en solitario** que arranca un proyecto con Claude Code | Se acabó lo de explicarle a Claude las convenciones del proyecto en cada sesión. Generas `CLAUDE.md` y las 8 categorías de `.claude/rules/` de una sola pasada. |
|
|
312
|
+
| **Tech lead** manteniendo estándares compartidos entre repos | Cuando alguien renombra paquetes, cambia de ORM o retoca el wrapper de respuesta, `.claude/rules/` deja de cuadrar. ClaudeOS-Core lo resincroniza siempre igual: misma entrada, misma salida byte a byte y sin ruido en el diff. |
|
|
313
|
+
| **Ya usas Claude Code** y estás cansado de corregir lo que genera | Wrapper equivocado, paquetes mal organizados, JPA cuando se usa MyBatis, `try/catch` esparcidos cuando ya hay middleware central. El scanner extrae las convenciones reales y cada paso de Claude se ejecuta contra una lista explícita de rutas permitidas. |
|
|
314
|
+
| **Te incorporas a un repo nuevo** (proyecto existente, llegada al equipo) | Lanzas `init` sobre el repo y obtienes un mapa vivo de la arquitectura: tabla de stack en CLAUDE.md, reglas por capa con ejemplos ✅/❌ y un decision log sembrado con el «por qué» de las decisiones grandes (JPA frente a MyBatis, REST frente a GraphQL, etc.). Leer 5 archivos sale más a cuenta que leer 5.000 fuentes. |
|
|
315
|
+
| **Trabajas en coreano, japonés, chino o 7 idiomas más** | La mayoría de generadores de reglas para Claude Code solo hablan inglés. ClaudeOS-Core escribe el conjunto completo en **10 idiomas** (`en/ko/ja/zh-CN/es/vi/hi/ru/fr/de`) con **validación estructural byte-identical**: el veredicto de `claude-md-validator` no varía según el idioma de salida. |
|
|
316
|
+
| **Trabajas en monorepo** (Turborepo, pnpm/yarn workspaces, Lerna) | En una sola ejecución se analizan los dominios de backend y frontend con prompts distintos. Recorre `apps/*/` y `packages/*/` automáticamente y emite las reglas de cada stack bajo `70.domains/{type}/`. |
|
|
317
|
+
| **Contribuyes a OSS o estás experimentando** | La salida es amigable con `.gitignore`: `claudeos-core/` es el directorio de trabajo local y al repo solo viajan `CLAUDE.md` y `.claude/`. Si interrumpes el proceso, lo retoma; al volver a ejecutarlo es idempotente y, sin `--force`, respeta las ediciones manuales. |
|
|
285
318
|
|
|
286
|
-
**No es para ti si:**
|
|
319
|
+
**No es para ti si:** buscas un pack único y universal de agents/skills/rules que funcione el primer día sin paso de escaneo (consulta [docs/es/comparison.md](docs/es/comparison.md) para ver qué encaja en cada caso); el proyecto todavía no entra en los [stacks soportados](#supported-stacks); o solo necesitas un único `CLAUDE.md`, en cuyo caso el `claude /init` integrado ya basta y no hace falta otra herramienta.
|
|
287
320
|
|
|
288
321
|
---
|
|
289
322
|
|
|
290
323
|
## ¿Cómo funciona?
|
|
291
324
|
|
|
292
|
-
ClaudeOS-Core invierte el flujo
|
|
325
|
+
ClaudeOS-Core invierte el flujo habitual de Claude Code:
|
|
293
326
|
|
|
294
327
|
```
|
|
295
|
-
Habitual:
|
|
296
|
-
|
|
328
|
+
Habitual: Tú describes el proyecto → Claude adivina tu stack → Claude escribe la documentación
|
|
329
|
+
Esto: El código lee tu stack → El código pasa hechos confirmados a Claude → Claude escribe a partir de hechos
|
|
297
330
|
```
|
|
298
331
|
|
|
299
|
-
La
|
|
332
|
+
La pipeline avanza en **tres etapas**, con código tanto antes como después de la llamada al LLM:
|
|
333
|
+
|
|
334
|
+
**1. Etapa A — Scanner (reproducible, sin LLM).** Un scanner en Node.js recorre la raíz del proyecto, lee `package.json`, `build.gradle`, `pom.xml` o `pyproject.toml`, parsea los archivos `.env*` (con redacción automática de variables sensibles como `PASSWORD/SECRET/TOKEN/JWT_SECRET/...`), clasifica el patrón de arquitectura (los 5 patrones A/B/C/D/E de Java, CQRS o multi-módulo en Kotlin, App Router o Pages Router en Next.js, FSD, components-pattern), descubre los dominios y compone una lista explícita con todas las rutas de archivos fuente que existen. El resultado se vuelca en `project-analysis.json`, la única fuente de verdad para lo que viene después.
|
|
335
|
+
|
|
336
|
+
**2. Etapa B — Pipeline de 4 pasos sobre Claude (limitada por los hechos de la etapa A).**
|
|
337
|
+
- **Pass 1** lee archivos representativos por grupo de dominios y extrae unas 50–100 convenciones por dominio: wrappers de respuesta, librería de logging, manejo de errores, convenciones de nombrado, patrones de tests. Se ejecuta una vez por grupo (`max 4 domains, 40 files per group`) para que el contexto nunca se desborde.
|
|
338
|
+
- **Pass 2** funde los análisis por dominio en una única visión del proyecto y resuelve los conflictos quedándose con la convención dominante.
|
|
339
|
+
- **Pass 3** escribe `CLAUDE.md`, `.claude/rules/`, `claudeos-core/standard/`, las skills y las guides. Va dividido en etapas (`3a` facts → `3b-core/3b-N` rules+standards → `3c-core/3c-N` skills+guides → `3d-aux` database+mcp-guide) para que el prompt de cada etapa quepa en la ventana de contexto incluso cuando `pass2-merged.json` es grande. Si hay 16 dominios o más, 3b/3c se subdividen en lotes de 15 como mucho.
|
|
340
|
+
- **Pass 4** siembra la capa de memoria L4 (`decision-log.md`, `failure-patterns.md`, `compaction.md`, `auto-rule-update.md`) y añade reglas de scaffolding universales. Pass 4 **tiene prohibido tocar `CLAUDE.md`**: la sección 8 que produce Pass 3 manda.
|
|
341
|
+
|
|
342
|
+
**3. Etapa C — Verificación (reproducible, sin LLM).** Cinco validators revisan la salida:
|
|
343
|
+
- `claude-md-validator`: 25 comprobaciones estructurales sobre `CLAUDE.md` (8 secciones, conteos de H3/H4, unicidad de archivos de memoria, invariante T1 de heading canónico). Es independiente del idioma; el veredicto es el mismo para cualquier `--lang`.
|
|
344
|
+
- `content-validator`: 10 comprobaciones de contenido, entre ellas la verificación de las rutas citadas (`STALE_PATH` caza referencias inventadas a `src/...`) y la detección de drift en MANIFEST.
|
|
345
|
+
- `pass-json-validator`: que los JSON de Pass 1/2/3/4 estén bien formados y tengan el número de secciones esperado según el stack.
|
|
346
|
+
- `plan-validator`: consistencia entre plan y disco (legacy, prácticamente no-op desde la v2.1.0).
|
|
347
|
+
- `sync-checker`: consistencia entre los 7 directorios rastreados en disco y `sync-map.json`.
|
|
348
|
+
|
|
349
|
+
Existen tres niveles de severidad (`fail` / `warn` / `advisory`), de modo que las alucinaciones del LLM que el usuario puede arreglar a mano nunca bloquean la CI con simples warnings.
|
|
300
350
|
|
|
301
|
-
|
|
351
|
+
La invariante que sostiene todo esto es clara: **Claude solo puede citar rutas que existan de verdad en el código**, porque la etapa A le pasa una lista cerrada. Y si aun así el LLM intenta inventarse algo (raro, pero pasa con ciertos seeds), la etapa C lo intercepta antes de entregar la documentación.
|
|
352
|
+
|
|
353
|
+
Para los detalles de cada paso, el sistema de resume basado en marcadores, el truco de staged-rules que esquiva el bloqueo de rutas sensibles de `.claude/` por parte de Claude Code, y la lógica interna de detección de stacks, consulta [docs/es/architecture.md](docs/es/architecture.md).
|
|
302
354
|
|
|
303
355
|
---
|
|
304
356
|
|
|
305
357
|
## Supported Stacks
|
|
306
358
|
|
|
307
|
-
12 stacks
|
|
359
|
+
12 stacks que se autodetectan a partir de los archivos del proyecto:
|
|
308
360
|
|
|
309
361
|
**Backend:** Java/Spring Boot · Kotlin/Spring Boot · Node/Express · Node/Fastify · Node/NestJS · Python/Django · Python/FastAPI · Python/Flask
|
|
310
362
|
|
|
311
363
|
**Frontend:** Node/Next.js · Node/Vite · Angular · Vue/Nuxt
|
|
312
364
|
|
|
313
|
-
Los proyectos multi-stack (
|
|
365
|
+
Los proyectos multi-stack (por ejemplo, backend Spring Boot con frontend Next.js) funcionan tal cual.
|
|
314
366
|
|
|
315
|
-
|
|
367
|
+
Las reglas de detección y lo que extrae cada scanner están en [docs/es/stacks.md](docs/es/stacks.md).
|
|
316
368
|
|
|
317
369
|
---
|
|
318
370
|
|
|
319
371
|
## Flujo diario
|
|
320
372
|
|
|
321
|
-
|
|
373
|
+
Con tres comandos cubres aproximadamente el 95% del uso:
|
|
322
374
|
|
|
323
375
|
```bash
|
|
324
376
|
# Primera vez en un proyecto
|
|
325
377
|
npx claudeos-core init
|
|
326
378
|
|
|
327
|
-
#
|
|
379
|
+
# Tras editar manualmente standards o reglas
|
|
328
380
|
npx claudeos-core lint
|
|
329
381
|
|
|
330
|
-
# Health check (
|
|
382
|
+
# Health check (antes de hacer commit, o en CI)
|
|
331
383
|
npx claudeos-core health
|
|
332
384
|
```
|
|
333
385
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
```bash
|
|
337
|
-
# Compactar el log de failure-patterns (ejecuta periódicamente)
|
|
338
|
-
npx claudeos-core memory compact
|
|
339
|
-
|
|
340
|
-
# Promover patrones de fallos frecuentes a reglas propuestas
|
|
341
|
-
npx claudeos-core memory propose-rules
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
Para todas las opciones de cada comando, ver [docs/es/commands.md](docs/es/commands.md).
|
|
386
|
+
Las opciones completas de cada comando están en [docs/es/commands.md](docs/es/commands.md). Los comandos de la capa de memoria (`memory compact`, `memory propose-rules`) se documentan más abajo en la sección [Memory Layer](#memory-layer-opcional-para-proyectos-de-larga-duración).
|
|
345
387
|
|
|
346
388
|
---
|
|
347
389
|
|
|
348
|
-
## Qué hace diferente
|
|
390
|
+
## Qué lo hace diferente
|
|
349
391
|
|
|
350
|
-
La mayoría de
|
|
392
|
+
La mayoría de herramientas de documentación para Claude Code parten de una descripción: tú se la cuentas a la herramienta y la herramienta se la cuenta a Claude. ClaudeOS-Core, en cambio, parte del código fuente real. La herramienta lee, le entrega a Claude lo que está confirmado y Claude solo escribe lo que está confirmado.
|
|
351
393
|
|
|
352
|
-
|
|
394
|
+
Esto se traduce en tres consecuencias concretas:
|
|
353
395
|
|
|
354
|
-
1. **Detección
|
|
355
|
-
2. **Sin rutas inventadas.** El prompt de Pass 3
|
|
356
|
-
3. **
|
|
396
|
+
1. **Detección reproducible del stack.** Mismo proyecto y mismo código equivalen a la misma salida. Nada de «esta vez Claude lo ha hecho distinto».
|
|
397
|
+
2. **Sin rutas inventadas.** El prompt de Pass 3 lleva listadas todas las rutas fuente permitidas; Claude no puede citar nada que no exista.
|
|
398
|
+
3. **Consciente del multi-stack.** En la misma ejecución, los dominios de backend y de frontend usan prompts de análisis distintos.
|
|
357
399
|
|
|
358
|
-
Para una comparación lado a lado
|
|
400
|
+
Para una comparación lado a lado con otras herramientas, consulta [docs/es/comparison.md](docs/es/comparison.md). La comparación va de **qué hace cada herramienta**, no de **cuál es mejor**; en su mayoría son complementarias.
|
|
359
401
|
|
|
360
402
|
---
|
|
361
403
|
|
|
362
404
|
## Verificación (post-generación)
|
|
363
405
|
|
|
364
|
-
|
|
406
|
+
Cuando Claude termina de escribir, le toca al código revisarlo. Cinco validators independientes:
|
|
365
407
|
|
|
366
|
-
| Validator | Qué comprueba | Lo
|
|
408
|
+
| Validator | Qué comprueba | Lo lanza |
|
|
367
409
|
|---|---|---|
|
|
368
|
-
| `claude-md-validator` | Invariantes estructurales de CLAUDE.md (8 secciones,
|
|
369
|
-
| `content-validator` |
|
|
370
|
-
| `pass-json-validator` |
|
|
371
|
-
| `plan-validator` |
|
|
372
|
-
| `sync-checker` |
|
|
410
|
+
| `claude-md-validator` | Invariantes estructurales de CLAUDE.md (8 secciones, independiente del idioma) | `claudeos-core lint` |
|
|
411
|
+
| `content-validator` | Que las rutas citadas existen y que el manifest es consistente | `health` (advisory) |
|
|
412
|
+
| `pass-json-validator` | Que los JSON de Pass 1 / 2 / 3 / 4 están bien formados | `health` (warn) |
|
|
413
|
+
| `plan-validator` | Que el plan guardado coincide con lo que hay en disco | `health` (fail-on-error) |
|
|
414
|
+
| `sync-checker` | Que los archivos en disco cuadran con `sync-map.json` (detecta huérfanos y no registrados) | `health` (fail-on-error) |
|
|
373
415
|
|
|
374
|
-
|
|
416
|
+
El `health-checker` orquesta los cuatro validators de runtime con las tres severidades (fail / warn / advisory) y termina con el código de salida adecuado para CI. `claude-md-validator`, por su parte, corre por separado a través del comando `lint`, porque cualquier drift estructural es señal de que toca volver a hacer init, no un simple aviso. Se puede lanzar cuando convenga:
|
|
375
417
|
|
|
376
418
|
```bash
|
|
377
419
|
npx claudeos-core health
|
|
378
420
|
```
|
|
379
421
|
|
|
380
|
-
|
|
422
|
+
El detalle de las comprobaciones de cada validator está en [docs/es/verification.md](docs/es/verification.md).
|
|
381
423
|
|
|
382
424
|
---
|
|
383
425
|
|
|
384
426
|
## Memory Layer (opcional, para proyectos de larga duración)
|
|
385
427
|
|
|
386
|
-
|
|
428
|
+
Más allá de la pipeline de scaffolding, ClaudeOS-Core también prepara la carpeta `claudeos-core/memory/` para proyectos en los que el contexto sobrevive a una sola sesión. Es opcional: si solo interesan `CLAUDE.md` y las reglas, se puede ignorar sin problema.
|
|
387
429
|
|
|
388
|
-
|
|
389
|
-
- `failure-patterns.md` — errores recurrentes con puntuaciones de frequency/importance
|
|
390
|
-
- `compaction.md` — cómo se auto-compacta la memoria con el tiempo
|
|
391
|
-
- `auto-rule-update.md` — patrones que deberían convertirse en nuevas reglas
|
|
430
|
+
Son cuatro archivos y los escribe Pass 4:
|
|
392
431
|
|
|
393
|
-
|
|
432
|
+
- `decision-log.md`: bitácora append-only de «por qué elegimos X en lugar de Y», sembrada desde `pass2-merged.json`.
|
|
433
|
+
- `failure-patterns.md`: errores recurrentes con puntuaciones de frecuencia e importancia.
|
|
434
|
+
- `compaction.md`: cómo se compacta la memoria automáticamente con el tiempo.
|
|
435
|
+
- `auto-rule-update.md`: patrones que merecen convertirse en reglas nuevas.
|
|
394
436
|
|
|
395
|
-
|
|
437
|
+
Dos comandos mantienen viva esta capa:
|
|
438
|
+
|
|
439
|
+
```bash
|
|
440
|
+
# Compactar el log de failure-patterns (ejecuta de vez en cuando)
|
|
441
|
+
npx claudeos-core memory compact
|
|
442
|
+
|
|
443
|
+
# Promover los failure patterns frecuentes a propuestas de regla
|
|
444
|
+
npx claudeos-core memory propose-rules
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
El modelo de memoria y su ciclo de vida están en [docs/es/memory-layer.md](docs/es/memory-layer.md).
|
|
396
448
|
|
|
397
449
|
---
|
|
398
450
|
|
|
399
451
|
## FAQ
|
|
400
452
|
|
|
401
453
|
**P: ¿Necesito una API key de Claude?**
|
|
402
|
-
R: No. ClaudeOS-Core
|
|
454
|
+
R: No. ClaudeOS-Core se apoya en la instalación existente de Claude Code y manda los prompts al `claude -p` que ya tienes en la máquina. Sin cuentas extra.
|
|
403
455
|
|
|
404
|
-
**P: ¿
|
|
405
|
-
R:
|
|
456
|
+
**P: ¿Va a sobrescribir mi CLAUDE.md o mi `.claude/rules/`?**
|
|
457
|
+
R: La primera vez sobre un proyecto nuevo los crea. Si vuelves a ejecutarlo sin `--force`, se respetan las ediciones, porque detecta los marcadores de pass de la ejecución anterior y se salta esos pasos. Con `--force`, en cambio, borra y regenera todo (y sí, también desaparecen las ediciones; eso es lo que significa `--force`). Más detalle en [docs/es/safety.md](docs/es/safety.md).
|
|
406
458
|
|
|
407
|
-
**P: Mi stack no está soportado
|
|
408
|
-
R: Sí.
|
|
459
|
+
**P: Mi stack no está soportado, ¿puedo añadirlo?**
|
|
460
|
+
R: Sí. Para un stack nuevo hacen falta unos 3 prompt templates y un domain scanner. La guía en 8 pasos vive en [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
409
461
|
|
|
410
|
-
**P: ¿Cómo genero
|
|
411
|
-
R: `npx claudeos-core init --lang es`. 10 idiomas soportados: en, ko, ja, zh-CN, es, vi, hi, ru, fr, de.
|
|
462
|
+
**P: ¿Cómo genero la documentación en español (o en otro idioma)?**
|
|
463
|
+
R: Con `npx claudeos-core init --lang es`. Hay 10 idiomas soportados: en, ko, ja, zh-CN, es, vi, hi, ru, fr, de.
|
|
412
464
|
|
|
413
465
|
**P: ¿Funciona con monorepos?**
|
|
414
|
-
R:
|
|
466
|
+
R: Sí. El stack-detector reconoce Turborepo (`turbo.json`), pnpm workspaces (`pnpm-workspace.yaml`), Lerna (`lerna.json`) y los workspaces de npm/yarn (`package.json#workspaces`). Cada app se analiza por separado. Otros layouts (NX, por ejemplo) no se detectan de manera específica, aunque los scanners de cada stack siguen reconociendo los patrones genéricos `apps/*/` y `packages/*/`.
|
|
415
467
|
|
|
416
|
-
**P: ¿
|
|
417
|
-
R:
|
|
468
|
+
**P: ¿Y si Claude Code genera reglas con las que no estoy de acuerdo?**
|
|
469
|
+
R: Se editan directamente. Después, un `npx claudeos-core lint` confirma que CLAUDE.md sigue siendo estructuralmente válido. Esas ediciones sobreviven a los siguientes `init` (sin `--force`), porque el mecanismo de resume se salta los pasos cuyos marcadores ya existen.
|
|
418
470
|
|
|
419
471
|
**P: ¿Dónde reporto bugs?**
|
|
420
|
-
R: [GitHub Issues](https://github.com/claudeos-core/claudeos-core/issues). Para
|
|
472
|
+
R: En [GitHub Issues](https://github.com/claudeos-core/claudeos-core/issues). Para temas de seguridad, consulta [SECURITY.md](SECURITY.md).
|
|
473
|
+
|
|
474
|
+
---
|
|
475
|
+
|
|
476
|
+
## Si esto te ahorró tiempo
|
|
477
|
+
|
|
478
|
+
Una ⭐ en GitHub mantiene el proyecto visible y ayuda a que otra gente lo encuentre. Issues, PRs y contribuciones de templates de stack son siempre bienvenidos; los detalles están en [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
421
479
|
|
|
422
480
|
---
|
|
423
481
|
|
|
424
482
|
## Documentación
|
|
425
483
|
|
|
426
|
-
| Tema |
|
|
484
|
+
| Tema | Lectura recomendada |
|
|
427
485
|
|---|---|
|
|
428
|
-
| Cómo funciona la pipeline de 4
|
|
486
|
+
| Cómo funciona la pipeline de 4 pasos (más a fondo que el diagrama) | [docs/es/architecture.md](docs/es/architecture.md) |
|
|
429
487
|
| Diagramas visuales (Mermaid) de la arquitectura | [docs/es/diagrams.md](docs/es/diagrams.md) |
|
|
430
|
-
| Detección de stack
|
|
431
|
-
| Memory layer
|
|
432
|
-
|
|
|
433
|
-
|
|
|
488
|
+
| Detección de stack: qué busca cada scanner | [docs/es/stacks.md](docs/es/stacks.md) |
|
|
489
|
+
| Memory layer: decision logs y failure patterns | [docs/es/memory-layer.md](docs/es/memory-layer.md) |
|
|
490
|
+
| Detalle de los 5 validators | [docs/es/verification.md](docs/es/verification.md) |
|
|
491
|
+
| Todos los comandos y opciones de la CLI | [docs/es/commands.md](docs/es/commands.md) |
|
|
434
492
|
| Instalación manual (sin `npx`) | [docs/es/manual-installation.md](docs/es/manual-installation.md) |
|
|
435
|
-
| Overrides del scanner
|
|
436
|
-
| Seguridad: qué se preserva al
|
|
437
|
-
| Comparación con herramientas similares (
|
|
493
|
+
| Overrides del scanner: `.claudeos-scan.json` | [docs/es/advanced-config.md](docs/es/advanced-config.md) |
|
|
494
|
+
| Seguridad: qué se preserva al volver a hacer init | [docs/es/safety.md](docs/es/safety.md) |
|
|
495
|
+
| Comparación con herramientas similares (alcance, no calidad) | [docs/es/comparison.md](docs/es/comparison.md) |
|
|
438
496
|
| Errores y recuperación | [docs/es/troubleshooting.md](docs/es/troubleshooting.md) |
|
|
439
497
|
|
|
440
498
|
---
|
|
441
499
|
|
|
442
500
|
## Contribuir
|
|
443
501
|
|
|
444
|
-
Las contribuciones son bienvenidas
|
|
502
|
+
Las contribuciones son bienvenidas: añadir soporte de stacks, mejorar prompts, arreglar bugs. Detalles en [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
445
503
|
|
|
446
|
-
Para el
|
|
504
|
+
Para el código de conducta y la política de seguridad, consulta [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) y [SECURITY.md](SECURITY.md).
|
|
447
505
|
|
|
448
506
|
## Licencia
|
|
449
507
|
|
|
450
|
-
[ISC](LICENSE)
|
|
508
|
+
[ISC License](LICENSE). De libre uso, también comercial. © 2025–2026 ClaudeOS-Core contributors.
|
|
451
509
|
|
|
452
510
|
---
|
|
453
511
|
|
|
454
|
-
<sub>
|
|
512
|
+
<sub>Mantenido por el equipo [claudeos-core](https://github.com/claudeos-core). Issues y PRs en <https://github.com/claudeos-core/claudeos-core>.</sub>
|