oficina-opencode 0.0.0-stage → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DESIGN.md +145 -0
- package/LICENSE +21 -0
- package/README.md +670 -2
- package/agents/oficina-architect.md +72 -0
- package/agents/oficina-commander.md +108 -0
- package/agents/oficina-critico.md +148 -0
- package/agents/oficina-director.md +160 -0
- package/agents/oficina-guardian.md +128 -0
- package/agents/oficina-integrator.md +98 -0
- package/agents/oficina-verificador.md +88 -0
- package/commands/oficina.md +36 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +394 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/briefing.d.ts +115 -0
- package/dist/core/briefing.d.ts.map +1 -0
- package/dist/core/briefing.js +410 -0
- package/dist/core/briefing.js.map +1 -0
- package/dist/core/bus.d.ts +132 -0
- package/dist/core/bus.d.ts.map +1 -0
- package/dist/core/bus.js +250 -0
- package/dist/core/bus.js.map +1 -0
- package/dist/core/catalog.d.ts +303 -0
- package/dist/core/catalog.d.ts.map +1 -0
- package/dist/core/catalog.js +816 -0
- package/dist/core/catalog.js.map +1 -0
- package/dist/core/dispatch.d.ts +110 -0
- package/dist/core/dispatch.d.ts.map +1 -0
- package/dist/core/dispatch.js +301 -0
- package/dist/core/dispatch.js.map +1 -0
- package/dist/core/factory.d.ts +74 -0
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +243 -0
- package/dist/core/factory.js.map +1 -0
- package/dist/core/fsx.d.ts +39 -0
- package/dist/core/fsx.d.ts.map +1 -0
- package/dist/core/fsx.js +113 -0
- package/dist/core/fsx.js.map +1 -0
- package/dist/core/gates.d.ts +97 -0
- package/dist/core/gates.d.ts.map +1 -0
- package/dist/core/gates.js +467 -0
- package/dist/core/gates.js.map +1 -0
- package/dist/core/leases.d.ts +46 -0
- package/dist/core/leases.d.ts.map +1 -0
- package/dist/core/leases.js +94 -0
- package/dist/core/leases.js.map +1 -0
- package/dist/core/log.d.ts +30 -0
- package/dist/core/log.d.ts.map +1 -0
- package/dist/core/log.js +43 -0
- package/dist/core/log.js.map +1 -0
- package/dist/core/mesa.d.ts +82 -0
- package/dist/core/mesa.d.ts.map +1 -0
- package/dist/core/mesa.js +178 -0
- package/dist/core/mesa.js.map +1 -0
- package/dist/core/office.d.ts +208 -0
- package/dist/core/office.d.ts.map +1 -0
- package/dist/core/office.js +618 -0
- package/dist/core/office.js.map +1 -0
- package/dist/core/paths.d.ts +67 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +136 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/retry.d.ts +41 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/core/retry.js +86 -0
- package/dist/core/retry.js.map +1 -0
- package/dist/core/roster.d.ts +47 -0
- package/dist/core/roster.d.ts.map +1 -0
- package/dist/core/roster.js +146 -0
- package/dist/core/roster.js.map +1 -0
- package/dist/core/router.d.ts +67 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +186 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/state.d.ts +89 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +303 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/types.d.ts +333 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +27 -0
- package/dist/core/types.js.map +1 -0
- package/dist/hooks/compacting.d.ts +18 -0
- package/dist/hooks/compacting.d.ts.map +1 -0
- package/dist/hooks/compacting.js +72 -0
- package/dist/hooks/compacting.js.map +1 -0
- package/dist/hooks/scopeGuard.d.ts +39 -0
- package/dist/hooks/scopeGuard.d.ts.map +1 -0
- package/dist/hooks/scopeGuard.js +114 -0
- package/dist/hooks/scopeGuard.js.map +1 -0
- package/dist/hooks/sessionIdle.d.ts +35 -0
- package/dist/hooks/sessionIdle.d.ts.map +1 -0
- package/dist/hooks/sessionIdle.js +110 -0
- package/dist/hooks/sessionIdle.js.map +1 -0
- package/dist/hooks/systemTransform.d.ts +18 -0
- package/dist/hooks/systemTransform.d.ts.map +1 -0
- package/dist/hooks/systemTransform.js +63 -0
- package/dist/hooks/systemTransform.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/index.d.ts +22 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +854 -0
- package/dist/tools/index.js.map +1 -0
- package/docs/ARCHITECTURE.md +258 -0
- package/docs/QUE-ES.md +337 -0
- package/examples/opencode.json +7 -0
- package/package.json +81 -4
- package/skills/oficina/README.md +120 -0
- package/skills/oficina/SKILL.md +251 -0
- package/skills/oficina/reference/mesh.md +345 -0
- package/skills/oficina/reference/protocol.md +342 -0
- package/skills/oficina/reference/roles.md +171 -0
- package/skills/oficina/reference/templates.md +278 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catálogo: resolución de roles desde agency-agents.
|
|
3
|
+
*
|
|
4
|
+
* ## Por qué esto no es un `grep` de descripciones
|
|
5
|
+
*
|
|
6
|
+
* El repo de agency-agents tiene 306 agentes en 25 divisiones. Cada uno trae
|
|
7
|
+
* un *briefing* de 10 secciones, y la especialidad real NO está en el
|
|
8
|
+
* `description` del frontmatter: está en el cuerpo.
|
|
9
|
+
*
|
|
10
|
+
* Un agente de statistics, por ejemplo, declara:
|
|
11
|
+
* - description: "Expert in quantitative research methodology..."
|
|
12
|
+
* - Core Mission → "Pressure-Test Quantitative Claims", "Design Sound Studies"
|
|
13
|
+
* - Technical Deliverables → "Claim Interrogation Framework", "Effect Size Report"
|
|
14
|
+
* - Advanced Capabilities → "Causal Inference", "Experimental Design"
|
|
15
|
+
*
|
|
16
|
+
* La `description` dice "de qué se ocupa". El cuerpo dice **en qué es
|
|
17
|
+
* exactamente bueno**. Un matcher que solo mira la description no puede
|
|
18
|
+
* distinguir a un metodólogo de un analista de datos, aunque uno de los dos
|
|
19
|
+
* sea exactamente lo que la card necesita.
|
|
20
|
+
*
|
|
21
|
+
* Por eso el parser extrae las secciones del cuerpo y el matching pondera
|
|
22
|
+
* cada campo por lo que aporta.
|
|
23
|
+
*/
|
|
24
|
+
import type { CatalogAgent, CatalogMatch } from "./types.js";
|
|
25
|
+
/** Parsea frontmatter YAML simple (clave: valor, sin anidación). */
|
|
26
|
+
export declare function parseFrontmatter(content: string): {
|
|
27
|
+
data: Record<string, string>;
|
|
28
|
+
body: string;
|
|
29
|
+
};
|
|
30
|
+
/** Limpia un encabezado de sección de los emoji y espacios que agency-agents usa. */
|
|
31
|
+
export declare function normalizeHeading(raw: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Divide el cuerpo en secciones H2.
|
|
34
|
+
*
|
|
35
|
+
* Los encabezados de agency-agents vienen con emoji (`## 🎯 Your Identity &
|
|
36
|
+
* Memory`) o lisos (`## Core Mission`). Se normalizan para que el matching
|
|
37
|
+
* sea estable.
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseSections(body: string): Record<string, string>;
|
|
40
|
+
/**
|
|
41
|
+
* Busca una sección por cualquiera de sus nombres posibles.
|
|
42
|
+
*
|
|
43
|
+
* La estructura de agency-agents tiene variantes con y sin el "Your", y
|
|
44
|
+
* con y sin emoji. En vez de hardcodear 20 nombres, se busca por coincidencia
|
|
45
|
+
* de palabra clave.
|
|
46
|
+
*/
|
|
47
|
+
export declare function findSection(sections: Record<string, string>, ...keywords: string[]): string | undefined;
|
|
48
|
+
/** Extrae los subtítulos H3 de un bloque de texto. */
|
|
49
|
+
export declare function extractSubheadings(block: string | undefined): string[];
|
|
50
|
+
/**
|
|
51
|
+
* Extrae las etiquetas de una sección "Core Mission".
|
|
52
|
+
*
|
|
53
|
+
* La sección viene en dos formatos y ambos son válidos en el repo real:
|
|
54
|
+
*
|
|
55
|
+
* 1. **Subtítulos H3** — `### Pressure-Test Quantitative Claims`
|
|
56
|
+
* 2. **Lista de bullets** — `- **Subvert Default Biases**: Ensure generated...`
|
|
57
|
+
*
|
|
58
|
+
* Se intentan los H3 primero. Si no hay, se cae a los bullets, y de cada
|
|
59
|
+
* bullet se extrae la etiqueta: la parte en negrita si la hay, o las
|
|
60
|
+
* primeras palabras antes del primer `:`.
|
|
61
|
+
*
|
|
62
|
+
* Sin este fallback, la mitad del catálogo queda sin misión declarada y el
|
|
63
|
+
* matching pierde la señal más fuerte que tiene.
|
|
64
|
+
*/
|
|
65
|
+
export declare function extractMissionLabels(block: string | undefined): string[];
|
|
66
|
+
/** Extrae los items numerados o con guion de un bloque de texto. */
|
|
67
|
+
export declare function extractListItems(block: string | undefined): string[];
|
|
68
|
+
/**
|
|
69
|
+
* Mapa de tokens a dominios.
|
|
70
|
+
*
|
|
71
|
+
* Solo se usa para el fallback por tokens (cuando no hay match estructural).
|
|
72
|
+
* El matching principal es por secciones.
|
|
73
|
+
*/
|
|
74
|
+
export declare const CAPABILITY_TAXONOMY: Record<string, string[]>;
|
|
75
|
+
/**
|
|
76
|
+
* Afinidad de división.
|
|
77
|
+
*
|
|
78
|
+
* Si la card pide capacidades de un dominio, la división homónima del
|
|
79
|
+
* catálogo es una señal fuerte. "gis" → división `gis`. "game" →
|
|
80
|
+
* `game-development`. Es una señal barata y muy precisa.
|
|
81
|
+
*/
|
|
82
|
+
export declare const DIVISION_AFFINITY: Record<string, string[]>;
|
|
83
|
+
/**
|
|
84
|
+
* Convierte una frase en un conjunto de tokens con señal.
|
|
85
|
+
*
|
|
86
|
+
* Se filtran stopwords y tokens de menos de 3 caracteres. Los tokens de
|
|
87
|
+
* más de 3 caracteres se consideran "concepts" para el matching.
|
|
88
|
+
*/
|
|
89
|
+
export declare function capabilityTokens(phrase: string): Set<string>;
|
|
90
|
+
/**
|
|
91
|
+
* Infiere capabilities de un agente.
|
|
92
|
+
*
|
|
93
|
+
* Tres fuentes, en orden de valor:
|
|
94
|
+
* 1. Los subtítulos de "Core Mission" — **la** especialidad del agente.
|
|
95
|
+
* 2. Los subtítulos de "Advanced Capabilities" — lo que maneja mejor.
|
|
96
|
+
* 3. Los subtítulos de "Technical Deliverables" — lo que produce.
|
|
97
|
+
*
|
|
98
|
+
* Más los tokens de la descripción y del nombre, como respaldo.
|
|
99
|
+
*/
|
|
100
|
+
export declare function extractCapabilities(agent: {
|
|
101
|
+
displayName: string;
|
|
102
|
+
description: string;
|
|
103
|
+
missions: string[];
|
|
104
|
+
deliverables: string[];
|
|
105
|
+
advanced: string[];
|
|
106
|
+
}): string[];
|
|
107
|
+
/**
|
|
108
|
+
* Convierte los subtítulos de misión en etiquetas legibles.
|
|
109
|
+
*
|
|
110
|
+
* "Pressure-Test Quantitative Claims" → "pressure-test quantitative claims".
|
|
111
|
+
* Se usan como capabilitiesdirectly comparables con lo que pide la card.
|
|
112
|
+
*/
|
|
113
|
+
export declare function missionTags(missions: string[]): string[];
|
|
114
|
+
export interface CatalogScanOptions {
|
|
115
|
+
/** Raíz del repo agency-agents. */
|
|
116
|
+
root: string;
|
|
117
|
+
/** Divisiones a considerar. Vacío = todas. */
|
|
118
|
+
divisions?: string[];
|
|
119
|
+
/** Si es true, ignora las divisiones sin agentes de código. */
|
|
120
|
+
codeOnly?: boolean;
|
|
121
|
+
}
|
|
122
|
+
export declare function scanCatalog(options: CatalogScanOptions): Promise<CatalogAgent[]>;
|
|
123
|
+
/** "frontend-developer" → "Frontend Developer". */
|
|
124
|
+
export declare function titleize(slug: string): string;
|
|
125
|
+
/**
|
|
126
|
+
* Pesos de cada señal en el score.
|
|
127
|
+
*
|
|
128
|
+
* El orden reflects dónde está la información real:
|
|
129
|
+
*
|
|
130
|
+
* 1. **El nombre del rol** (`engineering-frontend-developer`) es la etiqueta
|
|
131
|
+
* más literal de la especialidad que existe. ElCommander también pide
|
|
132
|
+
* roles por nombre, así que es la señal más alineada entre las dos
|
|
133
|
+
* listas.
|
|
134
|
+
*
|
|
135
|
+
* 2. **La misión declarada** ("Create Modern Web Applications") es lo que el
|
|
136
|
+
* agente dice que sabe hacer. El overlap literal es preciso; el
|
|
137
|
+
* conceptual (con taxonomía) bridgea sinónimos.
|
|
138
|
+
*
|
|
139
|
+
* 3. **El cuerpo completo** es un pajaro: 300 líneas donde cualquier
|
|
140
|
+
* palabra genérica ("review", "design", "audit") aparece en todos. Por
|
|
141
|
+
* eso casi no pesa. Con peso alto, un "Legal Document Review" ganaba el
|
|
142
|
+
* match de "revisar la seguridad de una API" por la palabra "review".
|
|
143
|
+
*/
|
|
144
|
+
export declare const MATCH_WEIGHTS: {
|
|
145
|
+
/** El nombre del rol y su display name. */
|
|
146
|
+
readonly name: 0.35;
|
|
147
|
+
/** La misión, overlap literal. */
|
|
148
|
+
readonly missionLiteral: 0.28;
|
|
149
|
+
/** La misión, overlap conceptual (taxonomía + lematización). */
|
|
150
|
+
readonly missionConcept: 0.18;
|
|
151
|
+
/** Capabilities inferidas del cuerpo. */
|
|
152
|
+
readonly capabilities: 0.05;
|
|
153
|
+
/** Lo que el agente sabe producir. */
|
|
154
|
+
readonly deliverables: 0.03;
|
|
155
|
+
/**
|
|
156
|
+
* La división: contexto, no especialidad — pero señal fuerte. Una card de
|
|
157
|
+
* e2e testing tiene que ir a la división `testing`, no a `engineering`.
|
|
158
|
+
*/
|
|
159
|
+
readonly division: 0.1;
|
|
160
|
+
/** El texto completo: ruido puro. */
|
|
161
|
+
readonly text: 0.01;
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* Convierte una frase en un conjunto de tokens **y conceptos**.
|
|
165
|
+
*
|
|
166
|
+
* ## Por qué se conservan los tokens crudos
|
|
167
|
+
*
|
|
168
|
+
* La primera versión de esta función reemplazaba cada token por su grupo
|
|
169
|
+
* completo de alias. El efecto fue contraproducente: el objetivo
|
|
170
|
+
* `{playwright, e2e, testing, checkout, browser}` colapsaba a un solo
|
|
171
|
+
* concepto `testing`, y cualquier agente que mencionara "Testing" una vez
|
|
172
|
+
* (un code reviewer, por ejemplo)得分 100% de cobertura conceptual.
|
|
173
|
+
*
|
|
174
|
+
* La granularidad se pierde al colapsar. Por eso los tokens crudos se
|
|
175
|
+
* **conservan** y el concepto se **agrega**:
|
|
176
|
+
*
|
|
177
|
+
* - "web" → {web, react} (puentea con "frontend" y "react")
|
|
178
|
+
* - "Testing"→ {testing} (no colapsa a sus 13 alias)
|
|
179
|
+
*
|
|
180
|
+
* Ahora un agente tiene que coincidir en **varias** de las cosas pedidas,
|
|
181
|
+
* no en una sola.
|
|
182
|
+
*/
|
|
183
|
+
export declare function canonicalConcepts(phrase: string): Set<string>;
|
|
184
|
+
/**
|
|
185
|
+
* Sinónimos **por capability**.
|
|
186
|
+
*
|
|
187
|
+
* ## Por qué no alcanza con la taxonomía
|
|
188
|
+
*
|
|
189
|
+
* La taxonomía agrupa por *concepto*: "e2e" y "testing" caen en el mismo
|
|
190
|
+
* grupo. Con eso, un agente que dice "testing" matcheaba "e2e", y un PDF
|
|
191
|
+
* engine que menciona "Playwright" le ganaba a un Test Automation Engineer
|
|
192
|
+
* que decía "end-to-end" — que es la misma palabra escrita larga.
|
|
193
|
+
*
|
|
194
|
+
* Los sinónimos van **por capability**: "e2e" es "end-to-end", pero
|
|
195
|
+
* "e2e" NO es "playwright". Esa distinción es la que separa a un
|
|
196
|
+
* especialista de un generalista que menciona la tool de pasada.
|
|
197
|
+
*/
|
|
198
|
+
export declare const CAPABILITY_SYNONYMS: Record<string, string[]>;
|
|
199
|
+
/**
|
|
200
|
+
* Sinónimos de una capability.
|
|
201
|
+
*
|
|
202
|
+
* Si la capability no está en la tabla, sus sinónimos son ella misma: el
|
|
203
|
+
* match es literal o lematizado.
|
|
204
|
+
*/
|
|
205
|
+
export declare function synonymsOf(capability: string): Set<string>;
|
|
206
|
+
/**
|
|
207
|
+
* ¿El agente menciona esta capability, por sinonimia o lematización?
|
|
208
|
+
*
|
|
209
|
+
* La capability puede ser una **frase** ("react components"), no un token
|
|
210
|
+
* suelto: se tokeniza y se busca cualquiera de sus partes. Un token solo
|
|
211
|
+
* ("react") se busca como synonym group.
|
|
212
|
+
*/
|
|
213
|
+
export declare function mentionsCapability(agentTokens: Set<string>, capability: string): boolean;
|
|
214
|
+
/**
|
|
215
|
+
* Fracción de las capabilities objetivo que el agente menciona.
|
|
216
|
+
*
|
|
217
|
+
* Una capability puede ser una **frase** ("react component accessibility").
|
|
218
|
+
* En ese caso cuenta como varias: cada palabra se evalúa por separado. Si no,
|
|
219
|
+
* "react component accessibility" valdría lo mismo que "react", y un agente
|
|
220
|
+
* que solo menciona accesibilidad ganaría una card de frontend.
|
|
221
|
+
*/
|
|
222
|
+
export declare function capabilityCoverage(agentTokens: Set<string>, target: string[]): number;
|
|
223
|
+
/**
|
|
224
|
+
* Lematiza un token: "testing" → "test", "validation" → "validat".
|
|
225
|
+
*
|
|
226
|
+
* ## Por qué hace falta
|
|
227
|
+
*
|
|
228
|
+
* El Commander pide capabilities en sus palabras ("testing", "validation") y
|
|
229
|
+
* los agentes de agency-agents usan las suyas ("test", "validate"). Sin
|
|
230
|
+
* lematizar, dos palabras que significan lo mismo no se ven nunca.
|
|
231
|
+
*
|
|
232
|
+
* Es la diferencia entre un matcher de palabras y uno de conceptos.
|
|
233
|
+
*/
|
|
234
|
+
export declare function stem(token: string): string;
|
|
235
|
+
/** Afinidad de la división con las capabilities pedidas. */
|
|
236
|
+
export declare function divisionAffinity(division: string, target: string[]): number;
|
|
237
|
+
/**
|
|
238
|
+
* Matchea un objetivo de capabilities contra el catálogo.
|
|
239
|
+
*
|
|
240
|
+
* El score es ponderado por campo, no una bolsa de tokens. Un agente cuyo
|
|
241
|
+
* "Core Mission" menciona literalmente lo que la card necesita gana sobre
|
|
242
|
+
* uno que menciona la palabra de pasada en el cuerpo.
|
|
243
|
+
*/
|
|
244
|
+
export declare function matchCapabilities(catalog: CatalogAgent[], target: string[], options?: {
|
|
245
|
+
division?: string;
|
|
246
|
+
minCoverage?: number;
|
|
247
|
+
}): CatalogMatch | undefined;
|
|
248
|
+
/**
|
|
249
|
+
* Resuelve un rol: catálogo primero, factory si la cobertura es baja.
|
|
250
|
+
*
|
|
251
|
+
* ## La cobertura es sobre el PANEL, no sobre el primario
|
|
252
|
+
*
|
|
253
|
+
* Un objetivo casi nunca es de un solo dominio. Si el primario cubre la
|
|
254
|
+
* mitad y un complemento cubre la otra mitad, el objetivo **está cubierto**
|
|
255
|
+
* y no hace falta fabricar un rol.
|
|
256
|
+
*
|
|
257
|
+
* La cobertura se mide como:Concepts cubiertos por el panel / concepts
|
|
258
|
+
* pedidos. El umbral de 0.6 significa "el equipo cubre el 60% de lo que
|
|
259
|
+
* la card pide". Por debajo, se fabrica el rol.
|
|
260
|
+
*/
|
|
261
|
+
export declare function resolveRole(catalog: CatalogAgent[], target: string[], minCoverage: number): {
|
|
262
|
+
match: CatalogMatch | undefined;
|
|
263
|
+
needsFactory: boolean;
|
|
264
|
+
panel?: RolePanel;
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* Devuelve los mejores N agentes para un objetivo, ordenados por cobertura.
|
|
268
|
+
*
|
|
269
|
+
* Útil para que el Comandante vea alternativas: "este es el mejor, pero
|
|
270
|
+
* estos dos también sirven y podrían repartir la carga".
|
|
271
|
+
*/
|
|
272
|
+
export declare function rankCandidates(catalog: CatalogAgent[], target: string[], limit?: number): CatalogMatch[];
|
|
273
|
+
/**
|
|
274
|
+
* Construye un **panel de roles**: un primario más los complementos.
|
|
275
|
+
*
|
|
276
|
+
* ## Por qué un panel y no un solo agente
|
|
277
|
+
*
|
|
278
|
+
* Un objetivo casi nunca es de un solo dominio. "Formulario de login en
|
|
279
|
+
* React con validación y accesibilidad" necesita un frontend (que no sabe
|
|
280
|
+
* de ARIA) y un especialista en accesibilidad (que no sabe de React).
|
|
281
|
+
*
|
|
282
|
+
* Si el sistema elige uno solo, deja huecos. Si elige varios sin criterio,
|
|
283
|
+
* duplica capacidad.
|
|
284
|
+
*
|
|
285
|
+
* El panel resuelve las dos cosas:
|
|
286
|
+
* - **Primario**: el mejor match global. Se lleva la card.
|
|
287
|
+
* - **Complementos**: los agentes que cubren lo que el primario NO cubre.
|
|
288
|
+
* Cada uno entra con un rol distinto y sin pisar al primario.
|
|
289
|
+
*
|
|
290
|
+
* Es la misma lógica del equipo real: nadie hace de frontend y de
|
|
291
|
+
* especialista en accesibilidad a la vez, pero los dos están en la oficina.
|
|
292
|
+
*/
|
|
293
|
+
export interface RolePanel {
|
|
294
|
+
primary: CatalogMatch | null;
|
|
295
|
+
complements: CatalogMatch[];
|
|
296
|
+
/** Capabilities que nadie del panel cubre. */
|
|
297
|
+
uncovered: string[];
|
|
298
|
+
}
|
|
299
|
+
export declare function buildPanel(catalog: CatalogAgent[], target: string[], options?: {
|
|
300
|
+
maxComplements?: number;
|
|
301
|
+
minComplementCoverage?: number;
|
|
302
|
+
}): RolePanel;
|
|
303
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/core/catalog.ts"],"names":[],"mappings":"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"}
|