nexus-agents 2.28.0 → 2.29.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.
Files changed (72) hide show
  1. package/README.md +11 -10
  2. package/dist/chunk-5VZLXMO7.js +838 -0
  3. package/dist/chunk-5VZLXMO7.js.map +1 -0
  4. package/dist/chunk-633WH2ML.js +127 -0
  5. package/dist/chunk-633WH2ML.js.map +1 -0
  6. package/dist/chunk-7F6HYUIY.js +327 -0
  7. package/dist/chunk-7F6HYUIY.js.map +1 -0
  8. package/dist/chunk-CLYZ7FWP.js +30 -0
  9. package/dist/chunk-CLYZ7FWP.js.map +1 -0
  10. package/dist/{chunk-QZEAD6AG.js → chunk-DAMRMAM2.js} +19526 -35943
  11. package/dist/chunk-DAMRMAM2.js.map +1 -0
  12. package/dist/{chunk-YSDUVCCZ.js → chunk-HH5LVGEE.js} +6 -6
  13. package/dist/{chunk-E7EX2KQJ.js → chunk-HWDBNDUX.js} +2 -2
  14. package/dist/chunk-I6YDS23R.js +354 -0
  15. package/dist/chunk-I6YDS23R.js.map +1 -0
  16. package/dist/{chunk-L2SHSW4T.js → chunk-IMWYKX4H.js} +4377 -4190
  17. package/dist/chunk-IMWYKX4H.js.map +1 -0
  18. package/dist/chunk-KGDG6PWZ.js +61 -0
  19. package/dist/chunk-KGDG6PWZ.js.map +1 -0
  20. package/dist/chunk-POBO4G2P.js +3700 -0
  21. package/dist/chunk-POBO4G2P.js.map +1 -0
  22. package/dist/chunk-S3BKWNST.js +13475 -0
  23. package/dist/chunk-S3BKWNST.js.map +1 -0
  24. package/dist/chunk-T7PU3NPQ.js +42 -0
  25. package/dist/chunk-T7PU3NPQ.js.map +1 -0
  26. package/dist/{chunk-UGNLR4NZ.js → chunk-WSK4VSXP.js} +2 -2
  27. package/dist/{chunk-LKSTILEE.js → chunk-ZBZJHXRT.js} +181 -1120
  28. package/dist/chunk-ZBZJHXRT.js.map +1 -0
  29. package/dist/cli.d.ts +2 -2
  30. package/dist/cli.js +1400 -649
  31. package/dist/cli.js.map +1 -1
  32. package/dist/composite-router-YPRWVTRB.js +17 -0
  33. package/dist/consensus-vote-DBE6RNZG.js +23 -0
  34. package/dist/{dist-H5XNXVAV.js → dist-7PQR2BQB.js} +1006 -954
  35. package/dist/dist-7PQR2BQB.js.map +1 -0
  36. package/dist/{doctor-deep-BDE2PHVX.js → doctor-deep-AWE7SRU6.js} +4 -3
  37. package/dist/expert-config-FHNBQRX2.js +22 -0
  38. package/dist/expert-config-FHNBQRX2.js.map +1 -0
  39. package/dist/factory-O5C7ZBZO.js +13 -0
  40. package/dist/factory-O5C7ZBZO.js.map +1 -0
  41. package/dist/factory-PCHGQ3ZG.js +16 -0
  42. package/dist/factory-PCHGQ3ZG.js.map +1 -0
  43. package/dist/index.d.ts +1253 -681
  44. package/dist/index.js +490 -313
  45. package/dist/index.js.map +1 -1
  46. package/dist/learning-persistence-WMWZJZ35.js +16 -0
  47. package/dist/learning-persistence-WMWZJZ35.js.map +1 -0
  48. package/dist/mcp-config-AUZQPUBY.js +12 -0
  49. package/dist/mcp-config-AUZQPUBY.js.map +1 -0
  50. package/dist/{model-capabilities-types-CSWO27YN.d.ts → model-capabilities-types-B57GZryc.d.ts} +1 -1
  51. package/dist/routing-memory-QY3XMU2R.js +13 -0
  52. package/dist/routing-memory-QY3XMU2R.js.map +1 -0
  53. package/dist/session-memory-3MBCE5KS.js +22 -0
  54. package/dist/session-memory-3MBCE5KS.js.map +1 -0
  55. package/dist/{setup-command-SS7LMN7Y.js → setup-command-IQ4MD3FT.js} +8 -5
  56. package/dist/setup-command-IQ4MD3FT.js.map +1 -0
  57. package/dist/setup-config-5YUPLDXF.js +10 -0
  58. package/dist/setup-config-5YUPLDXF.js.map +1 -0
  59. package/dist/weather-report-CC2C4KAX.js +15 -0
  60. package/dist/weather-report-CC2C4KAX.js.map +1 -0
  61. package/package.json +16 -18
  62. package/dist/chunk-L2SHSW4T.js.map +0 -1
  63. package/dist/chunk-LKSTILEE.js.map +0 -1
  64. package/dist/chunk-QZEAD6AG.js.map +0 -1
  65. package/dist/dist-H5XNXVAV.js.map +0 -1
  66. package/dist/setup-config-DSMOOLVW.js +0 -9
  67. /package/dist/{chunk-YSDUVCCZ.js.map → chunk-HH5LVGEE.js.map} +0 -0
  68. /package/dist/{chunk-E7EX2KQJ.js.map → chunk-HWDBNDUX.js.map} +0 -0
  69. /package/dist/{chunk-UGNLR4NZ.js.map → chunk-WSK4VSXP.js.map} +0 -0
  70. /package/dist/{doctor-deep-BDE2PHVX.js.map → composite-router-YPRWVTRB.js.map} +0 -0
  71. /package/dist/{setup-command-SS7LMN7Y.js.map → consensus-vote-DBE6RNZG.js.map} +0 -0
  72. /package/dist/{setup-config-DSMOOLVW.js.map → doctor-deep-AWE7SRU6.js.map} +0 -0
@@ -0,0 +1,3700 @@
1
+ // src/agents/experts/expert-config.ts
2
+ import { z } from "zod";
3
+
4
+ // src/agents/experts/knowledge/architecture/clean-architecture.ts
5
+ var CLEAN_ARCHITECTURE_MODULE = {
6
+ id: "architecture-clean-architecture",
7
+ domain: "architecture",
8
+ title: "Clean Architecture Patterns",
9
+ tags: ["clean-architecture", "hexagonal", "solid", "ports-adapters", "onion"],
10
+ sections: [
11
+ {
12
+ title: "Clean Architecture Layers",
13
+ content: [
14
+ "LAYER 1 - Entities: Enterprise business rules, domain objects, value objects",
15
+ "LAYER 2 - Use Cases: Application-specific business rules, orchestrate entity interactions",
16
+ "LAYER 3 - Interface Adapters: Controllers, presenters, gateways, DTOs",
17
+ "LAYER 4 - Frameworks & Drivers: Web frameworks, databases, external APIs, UI",
18
+ "RULE: Dependencies ONLY point inward (outer layers depend on inner layers)",
19
+ "RULE: Inner layers MUST NOT know about outer layers",
20
+ "RULE: Data crossing boundaries uses simple DTOs or value objects"
21
+ ].join("\n"),
22
+ priority: 10
23
+ },
24
+ {
25
+ title: "Hexagonal / Ports-and-Adapters",
26
+ content: [
27
+ "CONCEPT: Application core defines ports (interfaces); adapters implement them",
28
+ "PORT types: Driving (primary/inbound) and Driven (secondary/outbound)",
29
+ "DRIVING PORT: API exposed by the application (e.g., IOrderService)",
30
+ "DRIVEN PORT: Interface the application requires (e.g., IOrderRepository)",
31
+ "DRIVING ADAPTER: HTTP controller, CLI handler, message consumer",
32
+ "DRIVEN ADAPTER: Database implementation, email sender, external API client",
33
+ "BENEFIT: Swap adapters without changing business logic (test with in-memory)",
34
+ "PATTERN: Use dependency injection to wire adapters to ports at composition root"
35
+ ].join("\n"),
36
+ priority: 9
37
+ },
38
+ {
39
+ title: "Onion Architecture Comparison",
40
+ content: [
41
+ "SIMILARITY: Dependencies point inward, domain at center",
42
+ "DIFFERENCE: Onion explicitly names Domain Model, Domain Services, Application Services",
43
+ "ONION INNER: Domain Model (entities, value objects, domain events)",
44
+ "ONION MIDDLE: Domain Services (cross-entity logic, repository interfaces)",
45
+ "ONION OUTER: Application Services (use case orchestration, transaction boundaries)",
46
+ "ONION OUTERMOST: Infrastructure (persistence, messaging, UI)",
47
+ "USE ONION WHEN: Team is more comfortable with layered thinking than port/adapter"
48
+ ].join("\n"),
49
+ priority: 6
50
+ },
51
+ {
52
+ title: "SOLID Principles Applied",
53
+ content: [
54
+ "S - Single Responsibility: Each module has ONE reason to change",
55
+ " APPLY: Split OrderService into OrderCreator, OrderValidator, OrderNotifier",
56
+ "O - Open/Closed: Extend behavior without modifying existing code",
57
+ " APPLY: Use strategy pattern for payment methods instead of if/else chains",
58
+ "L - Liskov Substitution: Subtypes must be substitutable for base types",
59
+ " APPLY: If Square extends Rectangle, setWidth must not break area calculation",
60
+ "I - Interface Segregation: Clients should not depend on unused methods",
61
+ " APPLY: Split IRepository into IReader and IWriter when queries differ from commands",
62
+ "D - Dependency Inversion: Depend on abstractions, not concretions",
63
+ " APPLY: Use case imports IEmailSender interface, not SmtpEmailSender class"
64
+ ].join("\n"),
65
+ priority: 9
66
+ },
67
+ {
68
+ title: "Module Boundary Patterns",
69
+ content: [
70
+ "PUBLIC API: Each module exposes a single index.ts barrel export",
71
+ "INTERNAL: Implementation details are not exported; enforce via eslint import rules",
72
+ "ANTI-CORRUPTION LAYER: Translate external models at boundary, never leak them inward",
73
+ "SHARED KERNEL: Minimal shared types between modules (value objects, events)",
74
+ "PATTERN: Module boundary = npm package boundary in monorepo architecture",
75
+ "ENFORCE: Use path aliases and eslint-plugin-boundaries to prevent cross-cutting imports"
76
+ ].join("\n"),
77
+ priority: 8
78
+ },
79
+ {
80
+ title: "Monolith vs Clean Architecture Decision Tree",
81
+ content: [
82
+ "Q1: Is the project < 6 months old or a prototype? \u2192 START with modular monolith",
83
+ "Q2: Do you have < 3 developers? \u2192 Modular monolith (clean arch adds overhead)",
84
+ "Q3: Is domain complexity high with many business rules? \u2192 Clean architecture",
85
+ "Q4: Do you need to swap infrastructure frequently? \u2192 Hexagonal/ports-adapters",
86
+ "Q5: Is the team unfamiliar with DDD/clean arch? \u2192 Start simple, refactor later",
87
+ "PRINCIPLE: Monolith-first \u2014 extract when you have evidence of need",
88
+ "WARNING: Premature clean architecture = over-engineering for simple CRUD apps",
89
+ "SIGNAL TO ADOPT: Business logic tangled with infrastructure, testing requires DB"
90
+ ].join("\n"),
91
+ priority: 7
92
+ }
93
+ ]
94
+ };
95
+
96
+ // src/agents/experts/knowledge/architecture/microservices.ts
97
+ var MICROSERVICES_MODULE = {
98
+ id: "architecture-microservices",
99
+ domain: "architecture",
100
+ title: "Microservices Architecture Patterns",
101
+ tags: ["microservices", "distributed-systems", "saga", "circuit-breaker", "cqrs"],
102
+ sections: [
103
+ {
104
+ title: "Service Decomposition Strategies",
105
+ content: [
106
+ "BY DOMAIN (DDD Bounded Contexts): Align services with business domains",
107
+ " APPLY: Order service, Inventory service, Payment service",
108
+ " BENEFIT: Changes isolated to domain, team autonomy",
109
+ "BY TEAM (Conway's Law): One service per team, team owns full lifecycle",
110
+ " APPLY: Max 8 people per team, max 3 services per team",
111
+ " BENEFIT: Clear ownership, independent deployment",
112
+ "BY DATA: Services own their data store, no shared databases",
113
+ " APPLY: Each service has private DB; communicate via APIs/events",
114
+ " WARNING: Shared database = distributed monolith, defeats the purpose",
115
+ "RULE: If two services MUST deploy together, they are one service"
116
+ ].join("\n"),
117
+ priority: 10
118
+ },
119
+ {
120
+ title: "Saga Pattern: Choreography vs Orchestration",
121
+ content: [
122
+ "CHOREOGRAPHY: Services emit events; other services react autonomously",
123
+ " USE WHEN: \u2264 4 steps, simple flows, loose coupling preferred",
124
+ " RISK: Hard to track overall flow, debugging distributed events is complex",
125
+ " EXAMPLE: OrderCreated \u2192 PaymentCharged \u2192 InventoryReserved \u2192 OrderConfirmed",
126
+ "ORCHESTRATION: Central coordinator directs the saga step by step",
127
+ " USE WHEN: > 4 steps, complex compensation logic, visibility required",
128
+ " RISK: Coordinator is a single point of coupling (not failure if stateless)",
129
+ " EXAMPLE: OrderSaga calls PaymentService.charge(), then InventoryService.reserve()",
130
+ "COMPENSATION: Every step needs an undo action for rollback",
131
+ "DECISION: Simple linear flows \u2192 choreography; branching/retries \u2192 orchestration"
132
+ ].join("\n"),
133
+ priority: 9
134
+ },
135
+ {
136
+ title: "Circuit Breaker Pattern",
137
+ content: [
138
+ "STATE: CLOSED \u2192 requests pass through, failures counted",
139
+ "STATE: OPEN \u2192 requests fail fast, no calls to downstream (after threshold)",
140
+ "STATE: HALF-OPEN \u2192 limited test requests sent, success \u2192 CLOSED, failure \u2192 OPEN",
141
+ "CONFIG: failure threshold (e.g., 5 failures in 60s), reset timeout (e.g., 30s)",
142
+ "CONFIG: half-open max requests (e.g., 3 probe requests)",
143
+ "APPLY: Wrap all external service calls in circuit breakers",
144
+ "MONITOR: Track state transitions, alert on OPEN state",
145
+ "COMBINE WITH: Fallback responses (cached data, degraded mode, default values)"
146
+ ].join("\n"),
147
+ priority: 9
148
+ },
149
+ {
150
+ title: "Event-Driven Architecture",
151
+ content: [
152
+ "EVENT SOURCING: Store state changes as immutable event log, derive current state",
153
+ " USE WHEN: Audit trail required, temporal queries, complex domain events",
154
+ " WARNING: Adds complexity; do NOT use for simple CRUD",
155
+ "CQRS: Separate read models (queries) from write models (commands)",
156
+ " USE WHEN: Read and write patterns differ significantly in shape/scale",
157
+ " PATTERN: Command \u2192 write to event store; Event \u2192 project to read-optimized view",
158
+ "EVENT TYPES: Domain events (business), integration events (cross-service)",
159
+ "DELIVERY: At-least-once delivery default; design consumers to be idempotent",
160
+ "ORDERING: Use partition keys to guarantee order within an aggregate"
161
+ ].join("\n"),
162
+ priority: 8
163
+ },
164
+ {
165
+ title: "API Gateway and Service Mesh",
166
+ content: [
167
+ "API GATEWAY: Single entry point for external clients",
168
+ " HANDLES: Auth, rate limiting, request routing, response aggregation",
169
+ " PATTERNS: Backend-for-Frontend (BFF) \u2014 one gateway per client type",
170
+ "SERVICE MESH: Infrastructure layer for service-to-service communication",
171
+ " HANDLES: mTLS, load balancing, retries, observability (sidecar proxy)",
172
+ " OPTIONS: Istio (feature-rich, complex), Linkerd (lightweight, simpler)",
173
+ "DECISION: External traffic \u2192 API gateway; internal traffic \u2192 service mesh",
174
+ "WARNING: Service mesh adds latency (~1-2ms per hop) and operational complexity"
175
+ ].join("\n"),
176
+ priority: 7
177
+ },
178
+ {
179
+ title: "Resilience Patterns",
180
+ content: [
181
+ "RETRY: Retry transient failures with exponential backoff + jitter",
182
+ " CONFIG: max 3 retries, base delay 100ms, max delay 5s, jitter \xB150ms",
183
+ " RULE: Only retry idempotent operations; never retry non-idempotent POST",
184
+ "TIMEOUT: Set explicit timeouts on all external calls",
185
+ " CONFIG: connect timeout 3s, read timeout 10s, total timeout 30s",
186
+ "BULKHEAD: Isolate resources per downstream dependency",
187
+ " APPLY: Separate thread pools/connection pools per service",
188
+ " BENEFIT: Slow service X cannot exhaust resources needed for service Y",
189
+ "FALLBACK: Provide degraded response when dependency fails",
190
+ " EXAMPLES: Cached data, default values, reduced functionality"
191
+ ].join("\n"),
192
+ priority: 8
193
+ },
194
+ {
195
+ title: "When NOT to Use Microservices",
196
+ content: [
197
+ "MONOLITH-FIRST: Start with a well-structured monolith; extract later",
198
+ "AVOID WHEN: Team < 5 people (overhead exceeds benefit)",
199
+ "AVOID WHEN: Domain is not well understood (wrong boundaries are expensive)",
200
+ "AVOID WHEN: Low deployment frequency (< weekly releases)",
201
+ "AVOID WHEN: Limited DevOps maturity (need CI/CD, monitoring, container orchestration)",
202
+ "COST: Distributed tracing, eventual consistency, network failures, data management",
203
+ "SIGNAL TO ADOPT: Monolith deploys are bottlenecked, teams step on each other",
204
+ "SIGNAL TO ADOPT: Different parts need different scaling characteristics"
205
+ ].join("\n"),
206
+ priority: 7
207
+ }
208
+ ]
209
+ };
210
+
211
+ // src/agents/experts/knowledge/architecture/index.ts
212
+ var ARCHITECTURE_KNOWLEDGE_MODULES = [
213
+ CLEAN_ARCHITECTURE_MODULE,
214
+ MICROSERVICES_MODULE
215
+ ];
216
+ function getArchitectureKnowledgePrompt() {
217
+ const sections = ARCHITECTURE_KNOWLEDGE_MODULES.flatMap((module) => module.sections).sort((a, b) => b.priority - a.priority).slice(0, 8);
218
+ const formatted = sections.map((section) => `### ${section.title}
219
+ ${section.content}`).join("\n\n");
220
+ return `## Architecture Domain Knowledge
221
+
222
+ ${formatted}`;
223
+ }
224
+
225
+ // src/agents/experts/knowledge/security/owasp-api-top10.ts
226
+ var OWASP_API_TOP10_MODULE = {
227
+ id: "security-owasp-api-top10",
228
+ domain: "security",
229
+ title: "OWASP API Security Top 10 (2023)",
230
+ nistControls: ["AC-3", "AC-4", "AC-6", "IA-2", "IA-5", "SC-8", "SI-10", "AU-2"],
231
+ tags: ["owasp", "api", "web-security", "top10"],
232
+ sections: [
233
+ {
234
+ title: "API1 - Broken Object Level Authorization (BOLA)",
235
+ content: [
236
+ "DETECT: Direct object references in URL paths (e.g., /api/users/{id})",
237
+ "DETECT: Missing ownership checks on resource access",
238
+ "DETECT: Sequential or guessable IDs without authz validation",
239
+ "REMEDIATE: Enforce per-object authorization checks in every handler",
240
+ "REMEDIATE: Use non-sequential UUIDs for resource identifiers",
241
+ "REMEDIATE: Validate resource ownership against authenticated user context"
242
+ ].join("\n"),
243
+ priority: 10
244
+ },
245
+ {
246
+ title: "API2 - Broken Authentication",
247
+ content: [
248
+ "DETECT: Missing rate limiting on auth endpoints",
249
+ "DETECT: Credentials in URL query parameters",
250
+ "DETECT: Weak token generation (short, predictable)",
251
+ "REMEDIATE: Enforce strong password policies + MFA",
252
+ "REMEDIATE: Use short-lived access tokens (<15 min) with refresh rotation",
253
+ "REMEDIATE: Rate-limit login attempts per IP and per account"
254
+ ].join("\n"),
255
+ priority: 10
256
+ },
257
+ {
258
+ title: "API3 - Broken Object Property Level Authorization",
259
+ content: [
260
+ "DETECT: API responses exposing internal fields (isAdmin, passwordHash)",
261
+ "DETECT: Mass assignment via unfiltered request bodies",
262
+ "DETECT: Missing field-level access control on PATCH/PUT",
263
+ "REMEDIATE: Define explicit response schemas per role",
264
+ "REMEDIATE: Whitelist assignable fields; reject unknown properties",
265
+ "REMEDIATE: Use DTOs to decouple internal models from API contracts"
266
+ ].join("\n"),
267
+ priority: 9
268
+ },
269
+ {
270
+ title: "API4 - Unrestricted Resource Consumption",
271
+ content: [
272
+ "DETECT: Missing pagination limits on list endpoints",
273
+ "DETECT: No request size limits on file uploads or payloads",
274
+ "DETECT: Unbounded queries (SELECT * without LIMIT)",
275
+ "REMEDIATE: Set max page size (e.g., 100 items), enforce server-side",
276
+ "REMEDIATE: Limit request body size, file upload size, query complexity",
277
+ "REMEDIATE: Implement rate limiting per user/IP with budget tracking"
278
+ ].join("\n"),
279
+ priority: 8
280
+ },
281
+ {
282
+ title: "API5 - Broken Function Level Authorization",
283
+ content: [
284
+ "DETECT: Admin endpoints accessible by regular users",
285
+ "DETECT: HTTP method-based access control bypass (GET vs DELETE)",
286
+ "DETECT: Missing role checks on privileged operations",
287
+ "REMEDIATE: Deny by default; explicitly grant per-role access",
288
+ "REMEDIATE: Enforce authz at middleware layer, not just in handlers",
289
+ "REMEDIATE: Audit all endpoints for correct role requirements"
290
+ ].join("\n"),
291
+ priority: 9
292
+ },
293
+ {
294
+ title: "API6 - Unrestricted Access to Sensitive Business Flows",
295
+ content: [
296
+ "DETECT: No rate limiting on business-critical flows (checkout, transfers)",
297
+ "DETECT: Automated abuse of referral/reward systems",
298
+ "DETECT: Missing CAPTCHA or bot detection on high-value operations",
299
+ "REMEDIATE: Identify and protect business-critical flows",
300
+ "REMEDIATE: Add velocity checks and anomaly detection",
301
+ "REMEDIATE: Implement step-up authentication for sensitive operations"
302
+ ].join("\n"),
303
+ priority: 7
304
+ },
305
+ {
306
+ title: "API7 - Server Side Request Forgery (SSRF)",
307
+ content: [
308
+ "DETECT: User-supplied URLs fetched server-side without validation",
309
+ "DETECT: Internal service endpoints reachable via URL parameters",
310
+ "DETECT: DNS rebinding or redirect-following in URL fetchers",
311
+ "REMEDIATE: Validate and whitelist allowed URL schemes and hosts",
312
+ "REMEDIATE: Block requests to internal/private IP ranges (RFC 1918)",
313
+ "REMEDIATE: Use allowlists for external service integrations"
314
+ ].join("\n"),
315
+ priority: 8
316
+ },
317
+ {
318
+ title: "API8 - Security Misconfiguration",
319
+ content: [
320
+ "DETECT: Verbose error messages exposing stack traces",
321
+ "DETECT: Missing security headers (CORS wildcard, no CSP)",
322
+ "DETECT: Default credentials or unnecessary HTTP methods enabled",
323
+ "REMEDIATE: Harden CORS: explicit origins, no wildcard with credentials",
324
+ "REMEDIATE: Enable security headers: CSP, HSTS, X-Content-Type-Options",
325
+ "REMEDIATE: Disable debug endpoints and verbose errors in production"
326
+ ].join("\n"),
327
+ priority: 7
328
+ },
329
+ {
330
+ title: "API9 - Improper Inventory Management",
331
+ content: [
332
+ "DETECT: Undocumented or shadow API endpoints",
333
+ "DETECT: Old API versions still accessible without deprecation",
334
+ "DETECT: Missing API gateway or centralized access control",
335
+ "REMEDIATE: Maintain an API inventory with OpenAPI specs",
336
+ "REMEDIATE: Enforce versioning policy with sunset dates",
337
+ "REMEDIATE: Route all traffic through API gateway for visibility"
338
+ ].join("\n"),
339
+ priority: 6
340
+ },
341
+ {
342
+ title: "API10 - Unsafe Consumption of APIs",
343
+ content: [
344
+ "DETECT: Third-party API responses used without validation",
345
+ "DETECT: Missing TLS verification on outbound API calls",
346
+ "DETECT: No timeout or circuit breaker on external dependencies",
347
+ "REMEDIATE: Validate and sanitize all third-party API responses",
348
+ "REMEDIATE: Enforce TLS 1.2+ with certificate verification",
349
+ "REMEDIATE: Set timeouts, retries, and circuit breakers on external calls"
350
+ ].join("\n"),
351
+ priority: 7
352
+ }
353
+ ]
354
+ };
355
+
356
+ // src/agents/experts/knowledge/security/authentication.ts
357
+ var AUTHENTICATION_MODULE = {
358
+ id: "security-authentication",
359
+ domain: "security",
360
+ title: "Authentication Standards and Patterns",
361
+ nistControls: ["IA-2", "IA-5", "IA-8"],
362
+ tags: ["authentication", "oauth2", "jwt", "mfa", "session"],
363
+ sections: [
364
+ {
365
+ title: "OAuth2 Authorization Code Flow with PKCE",
366
+ content: [
367
+ "REQUIRED for SPAs and mobile apps (no client_secret in public clients)",
368
+ "FLOW: 1) Generate code_verifier (43-128 chars, [A-Za-z0-9-._~])",
369
+ " 2) Derive code_challenge = BASE64URL(SHA256(code_verifier))",
370
+ " 3) Redirect to /authorize with code_challenge + method=S256",
371
+ " 4) Exchange auth code + code_verifier at /token endpoint",
372
+ "CHECKLIST:",
373
+ " - Use state parameter to prevent CSRF (bind to session)",
374
+ " - Validate redirect_uri exactly (no open redirects)",
375
+ " - Store tokens in memory or httpOnly cookies (never localStorage)",
376
+ " - Use nonce parameter with OIDC to prevent replay attacks"
377
+ ].join("\n"),
378
+ priority: 10
379
+ },
380
+ {
381
+ title: "JWT Validation Rules",
382
+ content: [
383
+ "SIGNING: Use RS256 (RSA + SHA-256) or ES256 (ECDSA); never HS256 with public keys",
384
+ "VALIDATION CHECKLIST:",
385
+ " 1. Verify signature against known public key (JWKS endpoint)",
386
+ " 2. Check exp claim (reject expired tokens)",
387
+ " 3. Check iss claim (must match expected issuer)",
388
+ " 4. Check aud claim (must match this service)",
389
+ " 5. Check iat claim (reject tokens issued too far in the past)",
390
+ ' 6. Reject alg: "none" explicitly',
391
+ "TOKEN LIFETIMES:",
392
+ " - Access token: max 15 minutes",
393
+ " - Refresh token: max 7 days, single-use with rotation",
394
+ " - ID token: max 1 hour",
395
+ "DENY: Embedded secrets in JWT payloads, JWTs in URL parameters"
396
+ ].join("\n"),
397
+ priority: 10
398
+ },
399
+ {
400
+ title: "Multi-Factor Authentication (MFA)",
401
+ content: [
402
+ "TOTP (Time-based One-Time Password):",
403
+ " - Use SHA-1/SHA-256 with 6-digit codes, 30-second window",
404
+ " - Allow +/- 1 time step for clock drift",
405
+ " - Store shared secret encrypted at rest (AES-256)",
406
+ " - Provide backup codes (8+ chars, single-use, hashed in storage)",
407
+ "WebAuthn / FIDO2 (preferred):",
408
+ " - Phishing-resistant: origin-bound credentials",
409
+ " - Use resident keys for passwordless flows",
410
+ " - Store credential public key + credential ID, never private key",
411
+ ' - Set attestation: "none" unless compliance requires "direct"',
412
+ "ENFORCEMENT: Require MFA for admin actions, sensitive data access, account recovery"
413
+ ].join("\n"),
414
+ priority: 9
415
+ },
416
+ {
417
+ title: "Session Management",
418
+ content: [
419
+ "COOKIE SETTINGS (all required):",
420
+ " - httpOnly: true (prevent XSS token theft)",
421
+ " - secure: true (HTTPS only)",
422
+ ' - sameSite: "Lax" (default) or "Strict" (sensitive ops)',
423
+ ' - path: "/" or most restrictive path needed',
424
+ " - maxAge: match session timeout (idle: 15min, absolute: 8hr)",
425
+ "SESSION LIFECYCLE:",
426
+ " - Regenerate session ID after authentication",
427
+ " - Invalidate session server-side on logout (not just cookie clear)",
428
+ " - Implement idle timeout (15 min) and absolute timeout (8 hr)",
429
+ " - Bind session to user-agent + IP range for anomaly detection",
430
+ "DENY: Session IDs in URLs, persistent sessions without re-auth"
431
+ ].join("\n"),
432
+ priority: 9
433
+ },
434
+ {
435
+ title: "Password Storage",
436
+ content: [
437
+ "ALGORITHMS (in preference order):",
438
+ " 1. argon2id (memory=64MB, iterations=3, parallelism=4)",
439
+ " 2. bcrypt (cost factor=12, max input 72 bytes)",
440
+ " 3. scrypt (N=2^17, r=8, p=1) \u2014 if argon2 unavailable",
441
+ "RULES:",
442
+ " - Minimum 12 characters, no maximum below 128",
443
+ " - Check against breach databases (HIBP k-anonymity API)",
444
+ " - No composition rules (uppercase/special char requirements)",
445
+ " - Hash on server side, never client-only",
446
+ "DENY: MD5, SHA-1, SHA-256 without KDF, plain-text storage, reversible encryption"
447
+ ].join("\n"),
448
+ priority: 8
449
+ }
450
+ ]
451
+ };
452
+
453
+ // src/agents/experts/knowledge/security/authorization.ts
454
+ var AUTHORIZATION_MODULE = {
455
+ id: "security-authorization",
456
+ domain: "security",
457
+ title: "Authorization Patterns and Access Control",
458
+ nistControls: ["AC-3", "AC-4", "AC-6"],
459
+ tags: ["authorization", "rbac", "abac", "access-control", "least-privilege"],
460
+ sections: [
461
+ {
462
+ title: "RBAC vs ABAC Decision Tree",
463
+ content: [
464
+ "USE RBAC WHEN:",
465
+ " - Permissions map cleanly to job roles",
466
+ " - Organization has stable, well-defined role hierarchy",
467
+ " - Fewer than ~20 distinct permission sets needed",
468
+ " - Compliance requires auditable role assignments",
469
+ "USE ABAC WHEN:",
470
+ " - Access depends on resource attributes (owner, classification)",
471
+ " - Context-sensitive rules (time-of-day, location, device)",
472
+ " - Fine-grained per-field or per-record authorization",
473
+ " - Dynamic policies that change without code deployment",
474
+ "HYBRID APPROACH: Use RBAC for coarse-grained + ABAC for fine-grained",
475
+ ' Example: RBAC grants "editor" role, ABAC restricts to own-department docs'
476
+ ].join("\n"),
477
+ priority: 10
478
+ },
479
+ {
480
+ title: "Permission Inheritance and Hierarchy",
481
+ content: [
482
+ "PATTERN: Role hierarchy with additive permissions",
483
+ " viewer < editor < admin < super-admin",
484
+ " Each level inherits ALL permissions from levels below",
485
+ "RULES:",
486
+ " - Deny overrides allow at every level",
487
+ " - Explicit deny cannot be overridden by inherited allow",
488
+ " - Permission boundaries: cap maximum permissions regardless of role",
489
+ " - Scope permissions to resource type + action pairs",
490
+ "ANTI-PATTERNS:",
491
+ " - Negation-based rules (allow all except...) \u2014 use allowlists instead",
492
+ " - Role explosion (>50 roles) \u2014 indicates need for ABAC migration",
493
+ " - Permission creep \u2014 audit and revoke unused permissions quarterly"
494
+ ].join("\n"),
495
+ priority: 9
496
+ },
497
+ {
498
+ title: "Deny-by-Default Enforcement",
499
+ content: [
500
+ "PRINCIPLE: All access is denied unless explicitly granted",
501
+ "IMPLEMENTATION:",
502
+ " 1. Default middleware rejects unauthenticated requests (401)",
503
+ " 2. Default authz middleware rejects unauthorized requests (403)",
504
+ " 3. Routes explicitly declare required permissions",
505
+ " 4. Missing permission annotations = denied (fail closed)",
506
+ "CHECKLIST:",
507
+ " - [ ] No endpoint is accessible without authz check",
508
+ " - [ ] New routes require explicit permission declaration",
509
+ " - [ ] Wildcard permissions (e.g., resource:*) are prohibited",
510
+ " - [ ] Service-to-service calls use scoped service accounts"
511
+ ].join("\n"),
512
+ priority: 10
513
+ },
514
+ {
515
+ title: "Policy Enforcement Points",
516
+ content: [
517
+ "LAYERED ENFORCEMENT (defense in depth):",
518
+ " Layer 1 \u2014 API Gateway: Rate limiting, IP filtering, token validation",
519
+ " Layer 2 \u2014 Service Middleware: Role/permission checks, scope validation",
520
+ " Layer 3 \u2014 Business Logic: Resource ownership, field-level access",
521
+ " Layer 4 \u2014 Data Layer: Row-level security, column masking",
522
+ "RULES:",
523
+ " - Never rely on a single enforcement point",
524
+ " - Gateway checks are necessary but not sufficient",
525
+ " - Authorization decisions must be logged (who, what, when, result)",
526
+ " - Cache authz decisions with short TTL (max 5 min)"
527
+ ].join("\n"),
528
+ priority: 8
529
+ },
530
+ {
531
+ title: "OAuth2 Scopes and API Authorization",
532
+ content: [
533
+ "SCOPE DESIGN:",
534
+ " - Use resource:action format (e.g., users:read, orders:write)",
535
+ " - Define minimal scope sets for each client type",
536
+ " - Require scope consent for third-party clients",
537
+ "ENFORCEMENT:",
538
+ " - Validate token scopes on every API request",
539
+ " - Reject tokens with broader scopes than endpoint requires",
540
+ " - Use audience (aud) restriction to prevent token misuse across services",
541
+ "LEAST PRIVILEGE:",
542
+ " - Grant minimum scopes needed for the client use case",
543
+ " - Short-lived tokens with narrow scopes over long-lived broad tokens",
544
+ " - Review and prune granted scopes periodically"
545
+ ].join("\n"),
546
+ priority: 8
547
+ }
548
+ ]
549
+ };
550
+
551
+ // src/agents/experts/knowledge/security/input-validation.ts
552
+ var INPUT_VALIDATION_MODULE = {
553
+ id: "security-input-validation",
554
+ domain: "security",
555
+ title: "Input Validation and Sanitization",
556
+ nistControls: ["SI-10", "SI-15"],
557
+ tags: ["input-validation", "sanitization", "injection-prevention", "xss"],
558
+ sections: [
559
+ {
560
+ title: "Validation Strategy: Allowlist Over Denylist",
561
+ content: [
562
+ "PRINCIPLE: Define what IS valid, reject everything else",
563
+ "ORDER OF OPERATIONS:",
564
+ " 1. Type check (is it the expected type?)",
565
+ " 2. Length/size check (within bounds?)",
566
+ " 3. Format check (matches allowed pattern?)",
567
+ " 4. Range/value check (within allowed values?)",
568
+ " 5. Business logic check (makes sense in context?)",
569
+ "RULES:",
570
+ " - Validate on server side (client validation is UX only)",
571
+ " - Validate at system boundaries (API entry, file upload, DB input)",
572
+ " - Use schema validation libraries (Zod, Joi) over manual checks",
573
+ " - Reject invalid input with 400 status, not silent transformation"
574
+ ].join("\n"),
575
+ priority: 10
576
+ },
577
+ {
578
+ title: "Type-Specific Validation Rules",
579
+ content: [
580
+ "STRING:",
581
+ " - Max length: enforce per field (name: 255, bio: 2000)",
582
+ " - Character set: restrict to expected chars (alphanumeric + limited special)",
583
+ " - Encoding: normalize to UTF-8, reject overlong sequences",
584
+ "EMAIL:",
585
+ " - Use RFC 5322 validation, max 254 chars total",
586
+ " - Reject emails without @ and domain part",
587
+ " - Verify via confirmation email, not regex alone",
588
+ "URL:",
589
+ " - Allowlist schemes: https only (http for dev only)",
590
+ " - Reject javascript:, data:, file:, ftp: schemes",
591
+ " - Validate against URL parser, not regex",
592
+ "NUMERIC:",
593
+ " - Define min/max bounds per field",
594
+ " - Reject NaN, Infinity, negative zero where inappropriate",
595
+ " - Use integer types where decimals are not expected"
596
+ ].join("\n"),
597
+ priority: 9
598
+ },
599
+ {
600
+ title: "File Upload Validation",
601
+ content: [
602
+ "CHECKLIST:",
603
+ " - [ ] Validate MIME type via magic bytes, not just extension",
604
+ " - [ ] Enforce max file size (server-side, before full read)",
605
+ " - [ ] Allowlist file extensions (.pdf, .png, .jpg, .docx)",
606
+ " - [ ] Rename uploaded files (UUID-based, strip original name)",
607
+ " - [ ] Store outside web root, serve via signed URLs",
608
+ " - [ ] Scan for malware before processing",
609
+ " - [ ] Set Content-Disposition: attachment on download",
610
+ "DENY: Executable extensions (.exe, .sh, .bat, .ps1, .jar)",
611
+ "DENY: Double extensions (file.pdf.exe), null byte injection (file.pdf%00.exe)",
612
+ "DENY: SVG uploads without sanitization (can contain scripts)"
613
+ ].join("\n"),
614
+ priority: 9
615
+ },
616
+ {
617
+ title: "Injection Prevention Patterns",
618
+ content: [
619
+ "SQL INJECTION:",
620
+ " - Use parameterized queries / prepared statements exclusively",
621
+ " - Never concatenate user input into SQL strings",
622
+ " - Use ORM query builders with parameter binding",
623
+ " - Escape identifiers (table/column names) separately",
624
+ "XSS (Cross-Site Scripting):",
625
+ " - HTML-encode output by default (framework auto-escaping)",
626
+ " - Use Content-Security-Policy header to block inline scripts",
627
+ " - Sanitize rich text with allowlist-based sanitizer (DOMPurify)",
628
+ " - Set httpOnly on cookies to prevent JS access",
629
+ "PATH TRAVERSAL:",
630
+ " - Resolve path and verify it starts with expected root",
631
+ " - Reject inputs containing ../ or ..\\",
632
+ " - Use path.resolve() then check prefix, not string matching",
633
+ "COMMAND INJECTION:",
634
+ " - Avoid shell exec; use direct process spawn with arg arrays",
635
+ " - If shell required: use allowlisted commands only, no user input in args"
636
+ ].join("\n"),
637
+ priority: 10
638
+ },
639
+ {
640
+ title: "HTML Sanitization",
641
+ content: [
642
+ "WHEN: Accepting rich text / HTML content from users",
643
+ "APPROACH:",
644
+ " 1. Parse HTML into DOM tree",
645
+ " 2. Walk tree, remove elements not in allowlist",
646
+ " 3. Remove attributes not in allowlist per element",
647
+ " 4. Remove event handler attributes (onclick, onerror, etc.)",
648
+ " 5. Serialize back to HTML string",
649
+ "SAFE ELEMENTS: p, br, strong, em, ul, ol, li, a (href only), img (src only)",
650
+ "DENY: script, iframe, object, embed, form, input, style, link, meta, base",
651
+ "TOOLS: DOMPurify (browser/Node), sanitize-html (Node)",
652
+ "RULE: Sanitize on input AND escape on output (defense in depth)"
653
+ ].join("\n"),
654
+ priority: 8
655
+ }
656
+ ]
657
+ };
658
+
659
+ // src/agents/experts/knowledge/security/secrets-management.ts
660
+ var SECRETS_MANAGEMENT_MODULE = {
661
+ id: "security-secrets-management",
662
+ domain: "security",
663
+ title: "Secrets Management and Key Lifecycle",
664
+ nistControls: ["SC-12", "SC-13"],
665
+ tags: ["secrets", "vault", "key-management", "rotation", "environment-variables"],
666
+ sections: [
667
+ {
668
+ title: "Secrets Lifecycle",
669
+ content: [
670
+ "PHASES: Generation -> Storage -> Distribution -> Usage -> Rotation -> Revocation",
671
+ "GENERATION:",
672
+ " - Use cryptographically secure RNG (crypto.randomBytes, /dev/urandom)",
673
+ " - Minimum entropy: API keys 256-bit, passwords 128-bit",
674
+ " - Generate secrets in secure environment, not dev machines",
675
+ "STORAGE:",
676
+ " - Secrets manager (Vault, AWS Secrets Manager, GCP Secret Manager)",
677
+ " - Encrypted at rest with managed keys (AES-256-GCM)",
678
+ " - Access-controlled: least privilege, audit logged",
679
+ "REVOCATION:",
680
+ " - Immediate revocation capability for all secret types",
681
+ " - Maintain revocation list or use short-lived secrets",
682
+ " - Automate revocation on personnel changes"
683
+ ].join("\n"),
684
+ priority: 10
685
+ },
686
+ {
687
+ title: "Never Hardcode Secrets",
688
+ content: [
689
+ "DETECT: Strings matching secret patterns in source code",
690
+ " - API keys: long alphanumeric strings, base64 blocks",
691
+ " - Connection strings with embedded passwords",
692
+ " - Private keys (-----BEGIN RSA PRIVATE KEY-----)",
693
+ " - AWS access keys (AKIA...), GCP service account JSON",
694
+ "PREVENTION:",
695
+ " - Pre-commit hooks: git-secrets, Gitleaks, detect-secrets",
696
+ " - CI scanning: run secret detection in every PR pipeline",
697
+ " - IDE plugins: flag secrets in real-time during development",
698
+ "IF EXPOSED:",
699
+ " 1. Revoke the secret immediately",
700
+ " 2. Rotate to a new secret",
701
+ " 3. Audit usage logs for unauthorized access",
702
+ " 4. Remove from git history (BFG Repo-Cleaner or git filter-branch)"
703
+ ].join("\n"),
704
+ priority: 10
705
+ },
706
+ {
707
+ title: "Rotation Policies",
708
+ content: [
709
+ "ROTATION SCHEDULE:",
710
+ " - API keys: every 90 days or on suspected compromise",
711
+ " - Database credentials: every 90 days, automated",
712
+ " - TLS certificates: before expiry (automate with ACME/Let's Encrypt)",
713
+ " - Signing keys: annually, with key versioning",
714
+ " - Service account tokens: every 30 days",
715
+ "ZERO-DOWNTIME ROTATION:",
716
+ " 1. Create new secret (version N+1)",
717
+ " 2. Deploy consumers to accept both N and N+1",
718
+ " 3. Update producers to use N+1",
719
+ " 4. Verify all traffic uses N+1",
720
+ " 5. Revoke version N",
721
+ "AUTOMATION: Use secrets manager native rotation (Vault dynamic secrets)"
722
+ ].join("\n"),
723
+ priority: 9
724
+ },
725
+ {
726
+ title: "Environment Variable Handling",
727
+ content: [
728
+ "RULES:",
729
+ " - Use env vars for runtime secrets injection (12-factor app)",
730
+ " - Never log env var values (log presence only: KEY_SET=true)",
731
+ " - Never pass secrets via CLI arguments (visible in ps/proc)",
732
+ " - Never commit .env files (add to .gitignore)",
733
+ "LOADING PATTERN:",
734
+ " 1. Load from secrets manager at startup (preferred)",
735
+ " 2. Inject via orchestrator env (Kubernetes secrets, ECS secrets)",
736
+ " 3. Load from .env file in development only (dotenv)",
737
+ "VALIDATION:",
738
+ " - Fail fast on missing required secrets at startup",
739
+ " - Validate secret format (expected length, prefix) without logging value",
740
+ " - Use typed config schemas (Zod) to enforce required secrets"
741
+ ].join("\n"),
742
+ priority: 8
743
+ },
744
+ {
745
+ title: "Vault Integration Patterns",
746
+ content: [
747
+ "HASHICORP VAULT:",
748
+ " - Use AppRole auth for services (role_id + secret_id)",
749
+ " - Use Kubernetes auth for K8s workloads (service account JWT)",
750
+ " - Prefer dynamic secrets (database, AWS STS) over static",
751
+ " - Set TTL on leases; renew before expiry",
752
+ "CERTIFICATE MANAGEMENT:",
753
+ " - Use Vault PKI engine for internal TLS certificates",
754
+ " - Short-lived certs (24-72 hours) with automated renewal",
755
+ " - Pin to CA, not individual leaf certificates",
756
+ "CLIENT PATTERN:",
757
+ " - Cache secrets in memory with TTL (never write to disk)",
758
+ " - Handle lease expiry gracefully (re-fetch, not crash)",
759
+ " - Use connection pooling for Vault client requests"
760
+ ].join("\n"),
761
+ priority: 7
762
+ }
763
+ ]
764
+ };
765
+
766
+ // src/agents/experts/knowledge/security/threat-modeling.ts
767
+ var THREAT_MODELING_MODULE = {
768
+ id: "security-threat-modeling",
769
+ domain: "security",
770
+ title: "Threat Modeling with STRIDE",
771
+ nistControls: ["RA-3", "RA-5"],
772
+ tags: ["threat-modeling", "stride", "attack-trees", "risk-assessment"],
773
+ sections: [
774
+ {
775
+ title: "STRIDE Categories",
776
+ content: [
777
+ "S \u2014 SPOOFING (violates Authentication):",
778
+ " Threat: Attacker impersonates a user or system",
779
+ " Examples: Credential theft, session hijacking, token forgery",
780
+ " Mitigations: MFA, mutual TLS, signed tokens, certificate pinning",
781
+ "T \u2014 TAMPERING (violates Integrity):",
782
+ " Threat: Attacker modifies data in transit or at rest",
783
+ " Examples: Man-in-middle, SQL injection, file modification",
784
+ " Mitigations: TLS, HMAC signatures, input validation, checksums",
785
+ "R \u2014 REPUDIATION (violates Non-repudiation):",
786
+ " Threat: Attacker denies performing an action",
787
+ " Examples: Deleting logs, unsigned transactions",
788
+ " Mitigations: Audit logging, digital signatures, append-only logs",
789
+ "I \u2014 INFORMATION DISCLOSURE (violates Confidentiality):",
790
+ " Threat: Data exposed to unauthorized parties",
791
+ " Examples: Verbose errors, directory listing, unencrypted PII",
792
+ " Mitigations: Encryption at rest/transit, access control, data masking",
793
+ "D \u2014 DENIAL OF SERVICE (violates Availability):",
794
+ " Threat: System rendered unavailable",
795
+ " Examples: Resource exhaustion, amplification attacks, deadlocks",
796
+ " Mitigations: Rate limiting, auto-scaling, circuit breakers, CDN",
797
+ "E \u2014 ELEVATION OF PRIVILEGE (violates Authorization):",
798
+ " Threat: Attacker gains higher privileges",
799
+ " Examples: Privilege escalation, IDOR, insecure deserialization",
800
+ " Mitigations: Least privilege, input validation, sandboxing"
801
+ ].join("\n"),
802
+ priority: 10
803
+ },
804
+ {
805
+ title: "Threat Modeling Process",
806
+ content: [
807
+ "STEP 1 \u2014 Define Scope:",
808
+ " - Identify system boundaries and trust boundaries",
809
+ " - List assets (data, services, infrastructure)",
810
+ " - Identify entry points (APIs, UIs, message queues)",
811
+ "STEP 2 \u2014 Create Data Flow Diagram (DFD):",
812
+ " - External entities (users, third-party services)",
813
+ " - Processes (services, functions)",
814
+ " - Data stores (databases, caches, file systems)",
815
+ " - Data flows (arrows showing data movement)",
816
+ " - Trust boundaries (dashed lines separating trust zones)",
817
+ "STEP 3 \u2014 Identify Threats:",
818
+ " - Apply STRIDE to each element in the DFD",
819
+ " - Focus on trust boundary crossings",
820
+ " - Document threat scenarios with attacker goals",
821
+ "STEP 4 \u2014 Assess and Prioritize:",
822
+ " - Use risk matrix (likelihood x impact)",
823
+ " - Categorize: Critical / High / Medium / Low",
824
+ "STEP 5 \u2014 Define Mitigations:",
825
+ " - Map each threat to specific controls",
826
+ " - Track in issue tracker with severity labels"
827
+ ].join("\n"),
828
+ priority: 9
829
+ },
830
+ {
831
+ title: "Attack Surface Mapping",
832
+ content: [
833
+ "IDENTIFY ATTACK SURFACE:",
834
+ " - Network: open ports, exposed services, DNS records",
835
+ " - Application: API endpoints, file upload, auth flows",
836
+ " - Human: phishing targets, social engineering vectors",
837
+ " - Supply chain: dependencies, build pipeline, CI/CD",
838
+ "REDUCE ATTACK SURFACE:",
839
+ " - Disable unused services and ports",
840
+ " - Remove debug endpoints in production",
841
+ " - Minimize public API surface area",
842
+ " - Use network segmentation (VPC, subnets)",
843
+ " - Pin and audit third-party dependencies",
844
+ "MONITOR:",
845
+ " - Track new endpoints added per release",
846
+ " - Alert on unexpected port openings",
847
+ " - Review dependency additions in PRs"
848
+ ].join("\n"),
849
+ priority: 8
850
+ },
851
+ {
852
+ title: "Risk Prioritization Matrix",
853
+ content: [
854
+ "LIKELIHOOD SCALE:",
855
+ " 5-Certain: Exploit publicly known, trivial to execute",
856
+ " 4-Likely: Exploit known, requires moderate skill",
857
+ " 3-Possible: Exploit theoretical, requires significant skill",
858
+ " 2-Unlikely: Requires insider access + specialized knowledge",
859
+ " 1-Rare: Requires multiple unlikely conditions",
860
+ "IMPACT SCALE:",
861
+ " 5-Critical: Full system compromise, mass data breach",
862
+ " 4-High: Significant data exposure, service outage",
863
+ " 3-Medium: Limited data exposure, degraded service",
864
+ " 2-Low: Minor information leak, no direct harm",
865
+ " 1-Negligible: Cosmetic, no security impact",
866
+ "RISK SCORE: Likelihood x Impact (1-25)",
867
+ " Critical (20-25): Immediate remediation, block release",
868
+ " High (12-19): Remediate within current sprint",
869
+ " Medium (6-11): Schedule for next sprint",
870
+ " Low (1-5): Track in backlog, accept risk if justified"
871
+ ].join("\n"),
872
+ priority: 8
873
+ },
874
+ {
875
+ title: "Attack Tree Template",
876
+ content: [
877
+ 'ROOT GOAL: [Attacker objective, e.g., "Exfiltrate user PII"]',
878
+ "BRANCHES (OR = any path, AND = all required):",
879
+ " OR 1: Exploit API vulnerability",
880
+ " AND 1.1: Discover undocumented endpoint (recon)",
881
+ " AND 1.2: Bypass authentication (BOLA, broken auth)",
882
+ " AND 1.3: Extract data (pagination abuse, export)",
883
+ " OR 2: Compromise credentials",
884
+ " AND 2.1: Phishing attack on admin user",
885
+ " AND 2.2: Use credentials to access admin panel",
886
+ " AND 2.3: Export user data via admin tools",
887
+ " OR 3: Supply chain attack",
888
+ " AND 3.1: Compromise dependency with data exfil payload",
889
+ " AND 3.2: Wait for dependency update in target system",
890
+ "ANNOTATE each node with: likelihood, impact, existing controls, gaps",
891
+ "USE: Identify cheapest attack path for attacker = highest priority to defend"
892
+ ].join("\n"),
893
+ priority: 7
894
+ }
895
+ ]
896
+ };
897
+
898
+ // src/agents/experts/knowledge/security/nist-controls.ts
899
+ var NIST_CONTROLS_MODULE = {
900
+ id: "security-nist-controls",
901
+ domain: "security",
902
+ title: "NIST 800-53 Control Reference",
903
+ nistControls: [
904
+ "AC-2",
905
+ "AC-3",
906
+ "AC-4",
907
+ "AC-6",
908
+ "AC-7",
909
+ "AC-8",
910
+ "IA-2",
911
+ "IA-5",
912
+ "IA-8",
913
+ "SC-8",
914
+ "SC-12",
915
+ "SC-13",
916
+ "SC-28",
917
+ "AU-2",
918
+ "AU-3",
919
+ "AU-6",
920
+ "AU-12"
921
+ ],
922
+ tags: ["nist", "800-53", "compliance", "controls", "reference"],
923
+ sections: [
924
+ {
925
+ title: "Access Control (AC) Family",
926
+ content: [
927
+ "AC-2 Account Management:",
928
+ " - Automate account provisioning and deprovisioning",
929
+ " - Disable inactive accounts after 90 days",
930
+ " - Review accounts quarterly; remove unauthorized",
931
+ "AC-3 Access Enforcement:",
932
+ " - Enforce approved authorizations at system level",
933
+ " - Implement deny-by-default access control",
934
+ " - Validate permissions on every request, not just login",
935
+ "AC-4 Information Flow Enforcement:",
936
+ " - Control data flow between security domains",
937
+ " - Enforce network segmentation policies",
938
+ " - Filter cross-boundary data transfers",
939
+ "AC-6 Least Privilege:",
940
+ " - Grant minimum permissions required for function",
941
+ " - Separate duties for privileged operations",
942
+ " - Review privileged access monthly",
943
+ "AC-7 Unsuccessful Login Attempts:",
944
+ " - Lock account after 5 consecutive failed attempts",
945
+ " - Implement exponential backoff on retries",
946
+ " - Alert security team on repeated failures"
947
+ ].join("\n"),
948
+ priority: 9
949
+ },
950
+ {
951
+ title: "Identification and Authentication (IA) Family",
952
+ content: [
953
+ "IA-2 Identification and Authentication (Users):",
954
+ " - Uniquely identify and authenticate all users",
955
+ " - Require MFA for privileged accounts",
956
+ " - Require MFA for remote access",
957
+ "IA-5 Authenticator Management:",
958
+ " - Enforce minimum password complexity (12+ chars)",
959
+ " - Use approved password hashing (argon2id, bcrypt)",
960
+ " - Protect authenticators from unauthorized disclosure",
961
+ " - Rotate authenticators on suspected compromise",
962
+ "IA-8 Identification and Authentication (Non-Org Users):",
963
+ " - Authenticate external users and services",
964
+ " - Use federation (SAML, OIDC) for cross-org auth",
965
+ " - Apply same strength requirements as internal users"
966
+ ].join("\n"),
967
+ priority: 9
968
+ },
969
+ {
970
+ title: "System and Communications Protection (SC) Family",
971
+ content: [
972
+ "SC-8 Transmission Confidentiality and Integrity:",
973
+ " - Encrypt all data in transit (TLS 1.2+ mandatory)",
974
+ " - Use certificate validation on all TLS connections",
975
+ " - Disable deprecated protocols (SSLv3, TLS 1.0, TLS 1.1)",
976
+ "SC-12 Cryptographic Key Establishment and Management:",
977
+ " - Use approved key generation methods (CSPRNG)",
978
+ " - Protect keys at rest with hardware or software KMS",
979
+ " - Define key lifecycle (generation, distribution, rotation, destruction)",
980
+ "SC-13 Cryptographic Protection:",
981
+ " - Use FIPS-approved algorithms (AES-256, SHA-256, RSA-2048+)",
982
+ " - No custom/proprietary cryptographic implementations",
983
+ " - Validate cryptographic module configuration",
984
+ "SC-28 Protection of Information at Rest:",
985
+ " - Encrypt sensitive data at rest (AES-256-GCM)",
986
+ " - Use separate encryption keys per tenant/data class",
987
+ " - Secure key storage separate from encrypted data"
988
+ ].join("\n"),
989
+ priority: 9
990
+ },
991
+ {
992
+ title: "Audit and Accountability (AU) Family",
993
+ content: [
994
+ "AU-2 Audit Events:",
995
+ " - Log: authentication attempts (success + failure)",
996
+ " - Log: authorization decisions (grants + denials)",
997
+ " - Log: data access (read/write of sensitive records)",
998
+ " - Log: configuration changes (settings, permissions)",
999
+ " - Log: system events (startup, shutdown, errors)",
1000
+ "AU-3 Content of Audit Records:",
1001
+ " - Include: timestamp (ISO 8601, UTC), actor identity",
1002
+ " - Include: action performed, resource affected, outcome",
1003
+ " - Include: source IP, user agent, request ID",
1004
+ " - Exclude: passwords, tokens, PII in log messages",
1005
+ "AU-6 Audit Review, Analysis, and Reporting:",
1006
+ " - Review logs regularly for anomalies",
1007
+ " - Correlate events across services (distributed tracing)",
1008
+ " - Alert on suspicious patterns (brute force, privilege escalation)",
1009
+ "AU-12 Audit Generation:",
1010
+ " - Generate audit records at OS, application, and database levels",
1011
+ " - Use structured logging (JSON) for machine parsing",
1012
+ " - Ship logs to centralized SIEM within 60 seconds",
1013
+ " - Protect log integrity (append-only, tamper-evident)"
1014
+ ].join("\n"),
1015
+ priority: 8
1016
+ },
1017
+ {
1018
+ title: "Control-to-Finding Quick Reference",
1019
+ content: [
1020
+ "FINDING -> NIST CONTROL MAPPING:",
1021
+ " Missing authentication -> IA-2, IA-8",
1022
+ " Weak passwords -> IA-5",
1023
+ " Missing MFA -> IA-2(1), IA-2(2)",
1024
+ " Broken access control -> AC-3, AC-6",
1025
+ " Missing authorization checks -> AC-3",
1026
+ " Privilege escalation -> AC-6",
1027
+ " Data in transit unencrypted -> SC-8",
1028
+ " Data at rest unencrypted -> SC-28",
1029
+ " Weak cryptography -> SC-13",
1030
+ " Missing key rotation -> SC-12",
1031
+ " Insufficient logging -> AU-2, AU-12",
1032
+ " Logs missing detail -> AU-3",
1033
+ " No log monitoring -> AU-6",
1034
+ " Inactive accounts -> AC-2",
1035
+ " Secrets in source code -> SC-12, SC-13",
1036
+ " Missing input validation -> SI-10"
1037
+ ].join("\n"),
1038
+ priority: 10
1039
+ }
1040
+ ]
1041
+ };
1042
+
1043
+ // src/agents/experts/knowledge/security/supply-chain.ts
1044
+ var SUPPLY_CHAIN_MODULE = {
1045
+ id: "security-supply-chain",
1046
+ domain: "security",
1047
+ title: "Supply Chain Security",
1048
+ tags: ["supply-chain", "ci-cd", "dependency-management", "github-actions"],
1049
+ nistControls: ["SA-12", "SA-15", "SR-3", "SR-4", "SR-11"],
1050
+ sections: [
1051
+ {
1052
+ title: "Dependency Pinning",
1053
+ priority: 10,
1054
+ content: `Pin all external dependencies to immutable references:
1055
+ - GitHub Actions: pin to full 40-character commit SHAs, never mutable tags
1056
+ - Docker images: pin to digest (sha256:...), not tags
1057
+ - npm/pip packages: use lockfiles with integrity hashes
1058
+ - Tags can be force-pushed (Trivy TeamPCP attack: 75 of 76 tags hijacked)
1059
+ - Only commit SHAs and content-addressable hashes are immutable`
1060
+ },
1061
+ {
1062
+ title: "CI/CD Token Scoping",
1063
+ priority: 9,
1064
+ content: `Minimize CI token permissions to reduce blast radius:
1065
+ - Declare explicit permissions per job (never use write-all)
1066
+ - Use contents:read unless write is specifically needed
1067
+ - Scope GITHUB_TOKEN to minimum required permissions
1068
+ - Rotate tokens immediately after any suspected exposure
1069
+ - Never pass secrets via environment variables when pipe IPC is available`
1070
+ },
1071
+ {
1072
+ title: "Supply Chain Attack Indicators",
1073
+ priority: 8,
1074
+ content: `Watch for these supply chain compromise indicators:
1075
+ - Unexpected tag changes on dependencies (force-push)
1076
+ - Typosquat domains in configs (e.g., aquasecurtiy vs aquasecurity)
1077
+ - New postinstall hooks in updated packages
1078
+ - Process memory dumping in CI runners (Runner.Worker)
1079
+ - Encrypted exfiltration payloads (AES-256+RSA-4096)
1080
+ - ICP canister C2 (blockchain-based dead-drop resolvers)
1081
+ - Systemd persistence disguised as monitoring (e.g., pgmon service)`
1082
+ },
1083
+ {
1084
+ title: "AI-Assisted Attack Awareness",
1085
+ priority: 7,
1086
+ content: `AI-generated malware characteristics (detection opportunity):
1087
+ - Clean, descriptive variable names (no obfuscation)
1088
+ - Modular, well-structured code
1089
+ - Minimal error handling (crashes instead of failing silently)
1090
+ - No anti-analysis techniques (no VM detection, no debugger checks)
1091
+ - Fast development cycle (multiple variants in hours)
1092
+ - Paradoxically easier to detect than human-crafted obfuscated malware
1093
+ - AI amplifies low-skill operators to execute expert-level attack chains`
1094
+ }
1095
+ ]
1096
+ };
1097
+
1098
+ // src/agents/experts/knowledge/security/index.ts
1099
+ var SECURITY_KNOWLEDGE_MODULES = [
1100
+ OWASP_API_TOP10_MODULE,
1101
+ AUTHENTICATION_MODULE,
1102
+ AUTHORIZATION_MODULE,
1103
+ INPUT_VALIDATION_MODULE,
1104
+ SECRETS_MANAGEMENT_MODULE,
1105
+ THREAT_MODELING_MODULE,
1106
+ NIST_CONTROLS_MODULE,
1107
+ SUPPLY_CHAIN_MODULE
1108
+ ];
1109
+ function getSecurityKnowledgePrompt() {
1110
+ const sections = SECURITY_KNOWLEDGE_MODULES.flatMap((module) => module.sections).sort((a, b) => b.priority - a.priority).slice(0, 20);
1111
+ const formatted = sections.map((section) => `### ${section.title}
1112
+ ${section.content}`).join("\n\n");
1113
+ return `## Security Domain Knowledge
1114
+
1115
+ ${formatted}`;
1116
+ }
1117
+
1118
+ // src/agents/experts/knowledge/devops/iac-patterns.ts
1119
+ var IAC_PATTERNS_MODULE = {
1120
+ id: "devops-iac-patterns",
1121
+ domain: "devops",
1122
+ title: "Infrastructure as Code Patterns",
1123
+ tags: ["iac", "terraform", "pulumi", "cloudformation", "infrastructure"],
1124
+ sections: [
1125
+ {
1126
+ title: "Terraform Module Design",
1127
+ priority: 10,
1128
+ content: [
1129
+ "MODULE STRUCTURE: main.tf, variables.tf, outputs.tf, versions.tf",
1130
+ "NAMING: module-purpose (e.g., aws-vpc, gcp-gke-cluster)",
1131
+ "INPUTS: validate with variable validation blocks; provide sensible defaults",
1132
+ "OUTPUTS: expose only what consumers need; document each output",
1133
+ "VERSIONING: pin module versions in caller; use semantic versioning",
1134
+ "COMPOSITION: compose small modules into larger stacks; avoid mega-modules",
1135
+ "RULE: One module = one logical resource group (VPC, database, app)"
1136
+ ].join("\n")
1137
+ },
1138
+ {
1139
+ title: "State Management",
1140
+ priority: 10,
1141
+ content: [
1142
+ "REMOTE STATE: always use remote backend (S3+DynamoDB, GCS, Terraform Cloud)",
1143
+ "LOCKING: enable state locking to prevent concurrent modifications",
1144
+ "ISOLATION: separate state files per environment (dev/staging/prod)",
1145
+ "WORKSPACES: use for minor variations; prefer separate backends for environments",
1146
+ "IMPORTS: use `terraform import` for existing resources; never recreate managed infra",
1147
+ "SENSITIVE: mark sensitive outputs; encrypt state at rest",
1148
+ "ANTI-PATTERN: local state in production = data loss risk"
1149
+ ].join("\n")
1150
+ },
1151
+ {
1152
+ title: "Drift Detection and Remediation",
1153
+ priority: 8,
1154
+ content: [
1155
+ "DETECT: run `terraform plan` on schedule (e.g., nightly CI job)",
1156
+ "ALERT: notify on any detected drift; include resource details",
1157
+ "REMEDIATE: apply to reconcile state or update code to match reality",
1158
+ "PREVENT: restrict manual changes via IAM policies; use SCPs for guardrails",
1159
+ "AUDIT: log all infrastructure changes; correlate with IaC commits",
1160
+ "RULE: if drift is intentional, update IaC; never leave code/infra mismatch"
1161
+ ].join("\n")
1162
+ },
1163
+ {
1164
+ title: "IaC Security Practices",
1165
+ priority: 9,
1166
+ content: [
1167
+ "SCANNING: use tfsec, checkov, or trivy for security misconfigurations",
1168
+ "SECRETS: never hardcode credentials; use vault references or OIDC",
1169
+ "LEAST PRIVILEGE: IAM roles scoped to minimum required permissions",
1170
+ "ENCRYPTION: enable encryption by default (EBS, S3, RDS, GCS)",
1171
+ "NETWORKING: private subnets for compute; public only for load balancers",
1172
+ "COMPLIANCE: tag resources for cost allocation and ownership tracking",
1173
+ "REVIEW: require PR review for all infrastructure changes"
1174
+ ].join("\n")
1175
+ }
1176
+ ]
1177
+ };
1178
+
1179
+ // src/agents/experts/knowledge/devops/container-orchestration.ts
1180
+ var CONTAINER_ORCHESTRATION_MODULE = {
1181
+ id: "devops-container-orchestration",
1182
+ domain: "devops",
1183
+ title: "Container Orchestration Patterns",
1184
+ tags: ["kubernetes", "docker", "containers", "helm", "pod-security"],
1185
+ sections: [
1186
+ {
1187
+ title: "Container Image Best Practices",
1188
+ priority: 10,
1189
+ content: [
1190
+ "BASE IMAGES: use distroless or alpine; avoid full OS images",
1191
+ "MULTI-STAGE: build in one stage, copy artifacts to minimal runtime stage",
1192
+ "LAYER ORDER: least-changing layers first (OS deps, app deps, app code)",
1193
+ "USER: run as non-root; set USER directive in Dockerfile",
1194
+ "SCANNING: scan images for CVEs with trivy, grype, or snyk",
1195
+ "TAGGING: never use :latest in production; pin to SHA or semver",
1196
+ "SIZE: target < 100MB for application images; smaller = faster deploys"
1197
+ ].join("\n")
1198
+ },
1199
+ {
1200
+ title: "Kubernetes Resource Patterns",
1201
+ priority: 9,
1202
+ content: [
1203
+ "REQUESTS/LIMITS: always set CPU and memory requests; set memory limits",
1204
+ ' requests: { cpu: "100m", memory: "128Mi" }',
1205
+ ' limits: { memory: "256Mi" } # CPU limits optional (throttling)',
1206
+ "PROBES: liveness (restart on failure), readiness (remove from LB), startup (slow init)",
1207
+ " livenessProbe: { httpGet: /healthz, period: 10s, failure: 3 }",
1208
+ " readinessProbe: { httpGet: /readyz, period: 5s, failure: 2 }",
1209
+ "HPA: autoscale on CPU/memory or custom metrics; set min/max replicas",
1210
+ "PDB: PodDisruptionBudget ensures availability during node drains",
1211
+ "ANTI-AFFINITY: spread replicas across nodes/zones for HA"
1212
+ ].join("\n")
1213
+ },
1214
+ {
1215
+ title: "Kubernetes Security",
1216
+ priority: 9,
1217
+ content: [
1218
+ "POD SECURITY: enforce restricted PSS (Pod Security Standards)",
1219
+ "RBAC: least-privilege ServiceAccounts; no cluster-admin for workloads",
1220
+ "NETWORK POLICIES: deny-all default; explicitly allow required traffic",
1221
+ "SECRETS: use external secrets operator or sealed-secrets; avoid K8s secrets in git",
1222
+ "IMAGE POLICY: admission controller to allow only signed/approved images",
1223
+ "NAMESPACE ISOLATION: separate namespaces per team/environment",
1224
+ "AUDIT: enable K8s audit logging; alert on privileged pod creation"
1225
+ ].join("\n")
1226
+ },
1227
+ {
1228
+ title: "Helm Chart Patterns",
1229
+ priority: 7,
1230
+ content: [
1231
+ "STRUCTURE: Chart.yaml, values.yaml, templates/, NOTES.txt",
1232
+ "VALUES: provide sensible defaults; document all values in values.yaml",
1233
+ "TEMPLATES: use named templates (_helpers.tpl) for reusable snippets",
1234
+ "TESTING: use helm unittest or helm test hooks for validation",
1235
+ "VERSIONING: bump chart version on every change; bump appVersion with app releases",
1236
+ "DEPENDENCIES: pin sub-chart versions; use condition flags for optional components",
1237
+ "RELEASE: helm upgrade --install --atomic (rollback on failure)"
1238
+ ].join("\n")
1239
+ }
1240
+ ]
1241
+ };
1242
+
1243
+ // src/agents/experts/knowledge/devops/observability.ts
1244
+ var OBSERVABILITY_MODULE = {
1245
+ id: "devops-observability",
1246
+ domain: "devops",
1247
+ title: "Observability and Monitoring Patterns",
1248
+ tags: ["observability", "monitoring", "sre", "slo", "alerting", "opentelemetry"],
1249
+ sections: [
1250
+ {
1251
+ title: "Three Pillars of Observability",
1252
+ priority: 10,
1253
+ content: [
1254
+ "METRICS: numeric measurements aggregated over time (counters, gauges, histograms)",
1255
+ " TOOLS: Prometheus, Datadog, CloudWatch",
1256
+ " USE FOR: dashboards, alerting, capacity planning, trend analysis",
1257
+ "LOGS: structured event records with context",
1258
+ " FORMAT: JSON with timestamp, level, service, traceId, message, metadata",
1259
+ " TOOLS: ELK stack, Loki, CloudWatch Logs",
1260
+ " USE FOR: debugging, audit trails, error investigation",
1261
+ "TRACES: distributed request flow across services",
1262
+ " TOOLS: Jaeger, Zipkin, Tempo, X-Ray, OpenTelemetry",
1263
+ " USE FOR: latency analysis, dependency mapping, bottleneck detection",
1264
+ "CORRELATION: link metrics/logs/traces via traceId for unified investigation"
1265
+ ].join("\n")
1266
+ },
1267
+ {
1268
+ title: "SRE Golden Signals",
1269
+ priority: 10,
1270
+ content: [
1271
+ "LATENCY: time to serve requests; track separately for success vs error",
1272
+ " MEASURE: P50, P95, P99 response times",
1273
+ " ALERT: P99 > 2x baseline for 5 minutes",
1274
+ "TRAFFIC: demand on the system (requests/sec, concurrent users)",
1275
+ " MEASURE: RPS per endpoint, active connections",
1276
+ " USE: capacity planning, anomaly detection",
1277
+ "ERRORS: rate of failed requests (5xx, timeouts, business errors)",
1278
+ " MEASURE: error rate as percentage of total traffic",
1279
+ " ALERT: error rate > 1% for 5 minutes",
1280
+ "SATURATION: how full the system is (CPU, memory, disk, queue depth)",
1281
+ " MEASURE: utilization percentages, queue lengths",
1282
+ " ALERT: any resource > 80% sustained for 15 minutes"
1283
+ ].join("\n")
1284
+ },
1285
+ {
1286
+ title: "SLO/SLI Design",
1287
+ priority: 9,
1288
+ content: [
1289
+ "SLI (Service Level Indicator): quantitative measure of service behavior",
1290
+ " EXAMPLES: availability ratio, latency P99, error rate, throughput",
1291
+ "SLO (Service Level Objective): target value for an SLI",
1292
+ " EXAMPLES: 99.9% availability, P99 latency < 200ms",
1293
+ "ERROR BUDGET: 100% - SLO target = allowed downtime/errors",
1294
+ " 99.9% SLO = 43.2 min/month error budget",
1295
+ " 99.95% SLO = 21.6 min/month error budget",
1296
+ "DECISION: if error budget is exhausted, freeze deployments until recovered",
1297
+ "REVIEW: weekly error budget review; adjust SLOs quarterly based on data",
1298
+ "RULE: set SLOs based on user impact, not arbitrary targets"
1299
+ ].join("\n")
1300
+ },
1301
+ {
1302
+ title: "Alerting Best Practices",
1303
+ priority: 8,
1304
+ content: [
1305
+ 'ALERT ON SYMPTOMS, NOT CAUSES: "high error rate" not "CPU spike"',
1306
+ "SEVERITY LEVELS:",
1307
+ " P1-Critical: user-facing outage, page immediately",
1308
+ " P2-High: degraded service, page during business hours",
1309
+ " P3-Medium: non-urgent, ticket, fix within 1 business day",
1310
+ " P4-Low: informational, track in dashboard",
1311
+ "REDUCE NOISE: set appropriate thresholds; use multi-window burn rate",
1312
+ "RUNBOOKS: every alert links to a runbook with investigation steps",
1313
+ "ON-CALL: rotation schedule, escalation policy, blameless postmortems",
1314
+ "ANTI-PATTERNS: alert fatigue, percentage-only alerts on low traffic"
1315
+ ].join("\n")
1316
+ }
1317
+ ]
1318
+ };
1319
+
1320
+ // src/agents/experts/knowledge/devops/systemd-bare-metal.ts
1321
+ var SYSTEMD_BARE_METAL_MODULE = {
1322
+ id: "devops-systemd-bare-metal",
1323
+ domain: "devops",
1324
+ title: "systemd and Bare-Metal Operations",
1325
+ tags: ["systemd", "bare-metal", "linux", "firewall", "iptables", "ufw", "nftables", "dns"],
1326
+ sections: [
1327
+ {
1328
+ title: "systemd Service Management",
1329
+ priority: 9,
1330
+ content: [
1331
+ "UNIT TYPES:",
1332
+ " Type=simple \u2014 process starts immediately; default; use for long-running daemons",
1333
+ " Type=notify \u2014 service signals readiness via sd_notify(); use when startup takes time",
1334
+ " Type=oneshot \u2014 process exits after task; combine with RemainAfterExit=yes for state",
1335
+ "RESTART STRATEGIES:",
1336
+ " Restart=always \u2014 restart on any exit (crash, clean, signal)",
1337
+ " Restart=on-failure \u2014 restart only on non-zero exit or signal",
1338
+ " RestartSec=5s \u2014 delay between restarts (default: 100ms)",
1339
+ " StartLimitIntervalSec=60s \u2014 crash-loop detection window",
1340
+ " StartLimitBurst=3 \u2014 max starts within window before giving up",
1341
+ " After limit: systemctl reset-failed to re-enable",
1342
+ "CLEANUP BEFORE START:",
1343
+ " ExecStartPre=/bin/rm -f /var/run/app.pid \u2014 fail unit if cleanup fails",
1344
+ " ExecStartPre=-/bin/rm -f /var/run/app.pid \u2014 dash prefix: ignore non-zero exit",
1345
+ "SECRETS MANAGEMENT:",
1346
+ " EnvironmentFile=/etc/app/secrets.env \u2014 load secrets from file, not inline",
1347
+ " RULE: never put secrets in unit file; unit files are world-readable via systemctl",
1348
+ " Prefer: EnvironmentFile=-/path (dash = OK if missing) for optional overrides",
1349
+ "DEBUGGING:",
1350
+ " journalctl -fu service.name \u2014 follow live logs",
1351
+ ' journalctl -u service.name --since "5 min ago" \u2014 recent logs',
1352
+ " systemctl status service.name \u2014 state, last exit code, recent journal",
1353
+ " systemd-analyze blame \u2014 startup time per unit",
1354
+ " systemd-analyze critical-chain service.name \u2014 critical path to ready"
1355
+ ].join("\n")
1356
+ },
1357
+ {
1358
+ title: "Firewall Chain Hierarchy (UFW/iptables/nftables)",
1359
+ priority: 9,
1360
+ content: [
1361
+ "CHAIN MODEL:",
1362
+ " INPUT \u2014 traffic destined for the host itself (SSH, API, app ports)",
1363
+ " FORWARD \u2014 traffic routed/bridged through the host (containers, VMs)",
1364
+ " PREROUTING \u2014 traffic before routing decision; used for DNAT (port forwarding)",
1365
+ " OUTPUT \u2014 traffic originating from the host",
1366
+ "UFW LIMITATION:",
1367
+ " ufw allow 8080/tcp \u2014 adds rule to INPUT only; does NOT cover containers",
1368
+ " Docker DNAT: incoming \u2192 PREROUTING (DNAT to container IP) \u2192 FORWARD chain",
1369
+ " Result: host port 8080 is open to the internet even when UFW denies INPUT",
1370
+ "FIX FOR CONTAINER BRIDGE NETWORKS:",
1371
+ " ufw route allow in on eth0 out on docker0 \u2014 add explicit FORWARD rule",
1372
+ " Or restrict Docker DNAT with DOCKER-USER chain (Docker-managed, persists restarts)",
1373
+ " DOCKER-USER: insert rules here; processed before Docker adds its own rules",
1374
+ " iptables -I DOCKER-USER -i eth0 ! -s 10.0.0.0/8 -j DROP",
1375
+ "DIAGNOSTICS:",
1376
+ " iptables -L INPUT -n -v \u2014 list INPUT rules with packet counts",
1377
+ " iptables -L FORWARD -n -v \u2014 check FORWARD rules for container traffic",
1378
+ " iptables -t nat -L PREROUTING -n -v \u2014 show DNAT rules",
1379
+ " ss -tlnp \u2014 show listening sockets with process names (replaces netstat)",
1380
+ " nft list ruleset \u2014 nftables equivalent; used on newer distros (Ubuntu 22.04+)",
1381
+ 'RULE: when a port is "open" despite UFW deny, always check FORWARD and PREROUTING'
1382
+ ].join("\n")
1383
+ },
1384
+ {
1385
+ title: "Container DNS Resolution on Bare Metal",
1386
+ priority: 8,
1387
+ content: [
1388
+ "ROOT CAUSE:",
1389
+ " Host resolver: systemd-resolved listening on 127.0.0.53 (loopback)",
1390
+ " Container network namespace has its own loopback; 127.0.0.53 does not exist there",
1391
+ " Result: DNS queries from containers fail silently or time out",
1392
+ "SYMPTOMS:",
1393
+ " Container can ping IP addresses but not hostnames",
1394
+ " /etc/resolv.conf inside container shows nameserver 127.0.0.53",
1395
+ "SOLUTIONS (in order of preference):",
1396
+ " 1. Pass real nameserver via --dns flag:",
1397
+ ' docker run --dns 8.8.8.8 ... or dns: ["8.8.8.8"] in compose',
1398
+ " 2. Bind-mount a custom resolv.conf:",
1399
+ " -v /etc/resolv.conf.docker:/etc/resolv.conf:ro",
1400
+ " 3. Use systemd-resolved stub IP on bridge:",
1401
+ " systemd-resolved also listens on the host bridge IP (e.g., 172.17.0.1)",
1402
+ " docker network create --opt com.docker.network.bridge.name=br0 mynet",
1403
+ " docker run --dns 172.17.0.1 ... \u2014 works if resolved serves that interface",
1404
+ " 4. Run a dedicated DNS resolver (e.g., dnsmasq) on the bridge network",
1405
+ "VERIFY:",
1406
+ " docker exec container cat /etc/resolv.conf \u2014 confirm nameserver address",
1407
+ " docker exec container nslookup example.com \u2014 test resolution",
1408
+ " resolvectl status \u2014 show per-interface DNS config on host",
1409
+ "RULE: always verify /etc/resolv.conf inside the container, not just on the host"
1410
+ ].join("\n")
1411
+ }
1412
+ ]
1413
+ };
1414
+
1415
+ // src/agents/experts/knowledge/devops/index.ts
1416
+ var DEVOPS_KNOWLEDGE_MODULES = [
1417
+ IAC_PATTERNS_MODULE,
1418
+ CONTAINER_ORCHESTRATION_MODULE,
1419
+ OBSERVABILITY_MODULE,
1420
+ SYSTEMD_BARE_METAL_MODULE
1421
+ ];
1422
+ function getDevOpsKnowledgePrompt() {
1423
+ const sections = DEVOPS_KNOWLEDGE_MODULES.flatMap((module) => module.sections).sort((a, b) => b.priority - a.priority).slice(0, 8);
1424
+ const formatted = sections.map((section) => `### ${section.title}
1425
+ ${section.content}`).join("\n\n");
1426
+ return `## DevOps Domain Knowledge
1427
+
1428
+ ${formatted}`;
1429
+ }
1430
+
1431
+ // src/agents/experts/knowledge/research/index.ts
1432
+ var RESEARCH_METHODOLOGY_MODULE = {
1433
+ id: "research-methodology",
1434
+ domain: "research",
1435
+ title: "Research Methodology Standards",
1436
+ tags: ["methodology", "literature-review", "evaluation"],
1437
+ sections: [
1438
+ {
1439
+ title: "Literature Review Process",
1440
+ content: "SYSTEMATIC APPROACH: Define search scope \u2192 Query databases \u2192 Filter by relevance \u2192 Extract techniques \u2192 Assess quality \u2192 Catalog findings.\nSOURCES: arXiv (cs.AI, cs.MA, cs.CL), ACL Anthology, NeurIPS, ICML, ICLR proceedings.\nFILTERS: Recency (prefer last 2 years), citation count, venue quality, reproducibility.",
1441
+ priority: 10
1442
+ },
1443
+ {
1444
+ title: "Technique Extraction",
1445
+ content: "IDENTIFY: Core algorithm/approach from abstract and methodology sections.\nEVALUATE: Compare against existing registry techniques for overlap (Jaccard > 0.3).\nCATALOG: Name, description, source papers, topic, tags, complexity, dependencies.\nPRIORITIZE: Impact on system \xD7 implementation complexity \xD7 alignment with roadmap.",
1446
+ priority: 9
1447
+ },
1448
+ {
1449
+ title: "Source Quality Assessment",
1450
+ content: "TIER 1: Top-venue published papers (NeurIPS, ICML, ICLR, ACL) \u2014 high confidence.\nTIER 2: Well-cited arXiv preprints (>50 citations) \u2014 moderate confidence.\nTIER 3: Recent arXiv preprints with reproduction code \u2014 moderate confidence.\nTIER 4: Blog posts, GitHub repos without papers \u2014 low confidence, needs validation.",
1451
+ priority: 8
1452
+ }
1453
+ ]
1454
+ };
1455
+ var ARXIV_CATEGORIES_MODULE = {
1456
+ id: "research-arxiv-categories",
1457
+ domain: "research",
1458
+ title: "arXiv Category Mappings",
1459
+ tags: ["arxiv", "categories", "search"],
1460
+ sections: [
1461
+ {
1462
+ title: "Primary Categories",
1463
+ content: "cs.AI \u2014 Artificial Intelligence: Multi-agent systems, reasoning, planning.\ncs.MA \u2014 Multi-Agent Systems: Coordination, negotiation, consensus.\ncs.CL \u2014 Computation and Language: LLM capabilities, prompting, tool use.\ncs.LG \u2014 Machine Learning: Training methods, optimization, evaluation.\ncs.SE \u2014 Software Engineering: Code generation, testing, development tools.",
1464
+ priority: 7
1465
+ },
1466
+ {
1467
+ title: "Search Query Patterns",
1468
+ content: 'ORCHESTRATION: "multi-agent orchestration" OR "agent coordination" OR "task delegation"\nCONSENSUS: "multi-agent voting" OR "collective decision" OR "ensemble methods"\nLLM AGENTS: "LLM agent" OR "language model tool use" OR "ReAct" OR "chain of thought"\nEVALUATION: "agent benchmark" OR "multi-agent evaluation" OR "LLM evaluation"',
1469
+ priority: 6
1470
+ }
1471
+ ]
1472
+ };
1473
+ var GITHUB_EVALUATION_MODULE = {
1474
+ id: "research-github-evaluation",
1475
+ domain: "research",
1476
+ title: "GitHub Repository Evaluation",
1477
+ tags: ["github", "evaluation", "open-source"],
1478
+ sections: [
1479
+ {
1480
+ title: "Repository Quality Signals",
1481
+ content: "HIGH QUALITY: >1000 stars, active development (commits in last 30 days), comprehensive documentation, test coverage, CI/CD pipeline.\nMODERATE: 100-1000 stars, periodic updates, basic documentation.\nLOW: <100 stars, no recent activity, minimal documentation.\nEVALUATE: License compatibility, dependency health, community engagement.",
1482
+ priority: 5
1483
+ }
1484
+ ]
1485
+ };
1486
+ var RESEARCH_KNOWLEDGE_MODULES = [
1487
+ RESEARCH_METHODOLOGY_MODULE,
1488
+ ARXIV_CATEGORIES_MODULE,
1489
+ GITHUB_EVALUATION_MODULE
1490
+ ];
1491
+ function getResearchKnowledgePrompt() {
1492
+ const sections = RESEARCH_KNOWLEDGE_MODULES.flatMap((module) => module.sections).sort((a, b) => b.priority - a.priority).slice(0, 6);
1493
+ const formatted = sections.map((section) => `### ${section.title}
1494
+ ${section.content}`).join("\n\n");
1495
+ return `## Research Domain Knowledge
1496
+
1497
+ ${formatted}`;
1498
+ }
1499
+
1500
+ // src/agents/experts/knowledge/code/typescript-patterns.ts
1501
+ var TYPESCRIPT_PATTERNS = {
1502
+ id: "code-typescript-patterns",
1503
+ domain: "code",
1504
+ title: "TypeScript Patterns and Best Practices",
1505
+ tags: ["typescript", "type-safety", "patterns", "strict-mode"],
1506
+ sections: [
1507
+ {
1508
+ title: "Strict Mode Essentials",
1509
+ priority: 10,
1510
+ content: [
1511
+ "Enable ALL strict flags in tsconfig.json:",
1512
+ ' "strict": true, "noUncheckedIndexedAccess": true,',
1513
+ ' "exactOptionalPropertyTypes": true, "noPropertyAccessFromIndexSignature": true.',
1514
+ "Never disable individual strict checks. Use `unknown` instead of `any`.",
1515
+ "Prefer `satisfies` operator over type assertions for validated narrowing.",
1516
+ "Use `as const` for literal inference on configuration objects."
1517
+ ].join("\n")
1518
+ },
1519
+ {
1520
+ title: "Type Narrowing Patterns",
1521
+ priority: 9,
1522
+ content: [
1523
+ "Discriminated unions: add a `type` or `kind` literal field to each variant.",
1524
+ " type Result<T, E> = { ok: true; value: T } | { ok: false; error: E };",
1525
+ "Type guard functions: `function isUser(v: unknown): v is User`.",
1526
+ 'Use `in` operator for structural narrowing: `if ("email" in obj)`.',
1527
+ "Const assertions: `as const` narrows arrays to tuples and strings to literals.",
1528
+ "Exhaustive checks: use `never` in default case to catch unhandled variants.",
1529
+ " default: { const _exhaustive: never = action; throw new Error(`Unhandled: ${_exhaustive}`); }"
1530
+ ].join("\n")
1531
+ },
1532
+ {
1533
+ title: "Advanced Generics",
1534
+ priority: 7,
1535
+ content: [
1536
+ "Conditional types: `type IsArray<T> = T extends unknown[] ? true : false;`",
1537
+ "Mapped types: `type Readonly<T> = { readonly [K in keyof T]: T[K] };`",
1538
+ "Template literal types: `type Route = `/${string}`;`",
1539
+ "Infer keyword: `type ElementOf<T> = T extends (infer E)[] ? E : never;`",
1540
+ "Constrained generics: `function get<T, K extends keyof T>(obj: T, key: K): T[K]`",
1541
+ "Generic defaults: `type Container<T = unknown> = { value: T };`",
1542
+ "Limit generic depth to 3 levels. Extract complex types into named aliases."
1543
+ ].join("\n")
1544
+ },
1545
+ {
1546
+ title: "Utility Types",
1547
+ priority: 8,
1548
+ content: [
1549
+ "Partial<T>: make all properties optional (good for update/patch payloads).",
1550
+ "Required<T>: make all properties required (good for validated models).",
1551
+ "Pick<T, K>: select subset of properties (good for API response shaping).",
1552
+ "Omit<T, K>: exclude properties (good for removing internal fields).",
1553
+ "Record<K, V>: typed key-value maps (prefer over index signatures).",
1554
+ "Extract<T, U> / Exclude<T, U>: filter union members.",
1555
+ "ReturnType<T> / Parameters<T>: derive types from functions.",
1556
+ 'Combine utilities: `type CreateInput = Omit<User, "id" | "createdAt">;`'
1557
+ ].join("\n")
1558
+ },
1559
+ {
1560
+ title: "Result Pattern for Error Handling",
1561
+ priority: 9,
1562
+ content: [
1563
+ "Use Result<T, E> instead of throwing for expected failures:",
1564
+ " type Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E };",
1565
+ "Reserve throw/try-catch for unexpected failures (bugs, infra errors).",
1566
+ "Pattern: function returns Result, caller narrows with `if (!result.ok)`.",
1567
+ "Chain results: extract value only after checking `.ok`.",
1568
+ 'Create typed error enums: `type ParseError = "INVALID_JSON" | "MISSING_FIELD";`',
1569
+ "Wrap external APIs that throw into Result-returning wrappers."
1570
+ ].join("\n")
1571
+ },
1572
+ {
1573
+ title: "Common Anti-Patterns",
1574
+ priority: 10,
1575
+ content: [
1576
+ "AVOID `any`: use `unknown` and narrow. Lint with @typescript-eslint/no-explicit-any.",
1577
+ "AVOID type assertions (`as`): use type guards or `satisfies` instead.",
1578
+ "AVOID non-null assertions (`!`): handle null/undefined explicitly.",
1579
+ "AVOID enums: use `as const` objects or union types for better tree-shaking.",
1580
+ "AVOID `Function` type: use specific signatures `(arg: string) => void`.",
1581
+ "AVOID namespace: use ES modules.",
1582
+ "AVOID `@ts-ignore`: use `@ts-expect-error` with explanation comment."
1583
+ ].join("\n")
1584
+ },
1585
+ {
1586
+ title: "Module Patterns",
1587
+ priority: 6,
1588
+ content: [
1589
+ "Barrel exports (index.ts): re-export public API only. Never re-export internals.",
1590
+ "Path aliases: configure `paths` in tsconfig for `@/core`, `@/utils` etc.",
1591
+ 'Explicit file extensions in imports for ESM: `import { x } from "./mod.js";`',
1592
+ "One module = one concern. Split when a file exceeds 400 lines.",
1593
+ "Co-locate types with implementation. Export types from same module.",
1594
+ "Use `type` keyword in imports/exports for type-only items."
1595
+ ].join("\n")
1596
+ },
1597
+ {
1598
+ title: "Async Patterns",
1599
+ priority: 8,
1600
+ content: [
1601
+ "Use Promise.all for independent concurrent operations.",
1602
+ "Use Promise.allSettled when partial failure is acceptable.",
1603
+ "Always pass AbortSignal to cancellable operations (fetch, timers).",
1604
+ "Set timeouts on all external calls: `AbortSignal.timeout(5000)`.",
1605
+ "Handle async errors: every await needs surrounding try-catch or .catch().",
1606
+ "Avoid floating promises: lint with @typescript-eslint/no-floating-promises.",
1607
+ "Use AsyncDisposable (`await using`) for resource cleanup when available.",
1608
+ "Prefer async iterators over manual pagination loops."
1609
+ ].join("\n")
1610
+ }
1611
+ ]
1612
+ };
1613
+
1614
+ // src/agents/experts/knowledge/code/python-patterns.ts
1615
+ var PYTHON_PATTERNS = {
1616
+ id: "code-python-patterns",
1617
+ domain: "code",
1618
+ title: "Python Patterns and Best Practices",
1619
+ tags: ["python", "pep8", "type-hints", "testing", "packaging"],
1620
+ sections: [
1621
+ {
1622
+ title: "PEP 8 Essentials",
1623
+ priority: 10,
1624
+ content: [
1625
+ "Naming: snake_case for functions/variables, PascalCase for classes, UPPER_SNAKE for constants.",
1626
+ "Indentation: 4 spaces, never tabs. Continuation lines align with delimiter.",
1627
+ "Line length: 79 chars for code, 72 for docstrings. Use implicit line joining inside brackets.",
1628
+ "Imports: stdlib first, then third-party, then local. One import per line.",
1629
+ "Use isort for import sorting and black/ruff for formatting.",
1630
+ "Blank lines: 2 between top-level definitions, 1 between methods.",
1631
+ "Trailing commas in multi-line collections for cleaner diffs."
1632
+ ].join("\n")
1633
+ },
1634
+ {
1635
+ title: "Type Hints",
1636
+ priority: 9,
1637
+ content: [
1638
+ "Annotate all public function signatures: `def process(data: list[str]) -> dict[str, int]:`",
1639
+ "Use `from __future__ import annotations` for deferred evaluation (3.7+).",
1640
+ 'TypeVar for generics: `T = TypeVar("T")` then `def first(items: list[T]) -> T:`',
1641
+ "Protocol for structural subtyping: `class Renderable(Protocol): def render(self) -> str: ...`",
1642
+ "Use Generic[T] for generic classes. Prefer Protocol over ABC when possible.",
1643
+ "Union types: `str | int` (3.10+) or `Union[str, int]`. Avoid Optional, use `X | None`.",
1644
+ "TypeGuard for narrowing: `def is_str_list(v: list) -> TypeGuard[list[str]]:`",
1645
+ "Run mypy or pyright in strict mode. Address all type errors, never use `type: ignore` without comment."
1646
+ ].join("\n")
1647
+ },
1648
+ {
1649
+ title: "Dataclasses and Attrs",
1650
+ priority: 7,
1651
+ content: [
1652
+ "Use @dataclass for simple data containers: `@dataclass(frozen=True, slots=True)`.",
1653
+ "frozen=True for immutability, slots=True for memory efficiency.",
1654
+ "field(default_factory=list) for mutable defaults. Never use mutable default arguments.",
1655
+ "__post_init__ for validation: raise ValueError for invalid state.",
1656
+ "attrs for more features: validators, converters, evolve for immutable updates.",
1657
+ "Prefer dataclasses over NamedTuple when you need methods or default values.",
1658
+ "Use kw_only=True (3.10+) to force keyword arguments for clarity."
1659
+ ].join("\n")
1660
+ },
1661
+ {
1662
+ title: "Pytest Patterns",
1663
+ priority: 8,
1664
+ content: [
1665
+ "Fixtures: use @pytest.fixture for setup/teardown. Scope: function, class, module, session.",
1666
+ 'Parametrize: @pytest.mark.parametrize("input,expected", [...]) for table-driven tests.',
1667
+ "conftest.py: shared fixtures auto-discovered. Place at appropriate directory level.",
1668
+ "Markers: @pytest.mark.slow, @pytest.mark.integration for selective test runs.",
1669
+ "Use tmp_path fixture for file operations. Use monkeypatch for env vars.",
1670
+ "Assert with plain assert statements. Use pytest.raises(ErrorType) for exceptions.",
1671
+ "Test naming: test_<function>_<scenario>_<expected_result>.",
1672
+ "Coverage: pytest-cov with --cov-fail-under=80 minimum."
1673
+ ].join("\n")
1674
+ },
1675
+ {
1676
+ title: "Context Managers and Generators",
1677
+ priority: 7,
1678
+ content: [
1679
+ "Use `with` for resource management: files, locks, db connections.",
1680
+ "@contextmanager decorator for simple cases: yield in try/finally.",
1681
+ "Async context managers: `async with` and @asynccontextmanager.",
1682
+ "Generator functions for lazy sequences: `yield` values one at a time.",
1683
+ "Generator expressions: `(x**2 for x in range(1000))` for memory-efficient pipelines.",
1684
+ "Use `yield from` to delegate to sub-generators.",
1685
+ "send() and throw() for coroutine-style generators (prefer async/await instead)."
1686
+ ].join("\n")
1687
+ },
1688
+ {
1689
+ title: "Common Idioms",
1690
+ priority: 8,
1691
+ content: [
1692
+ "List comprehension: `[f(x) for x in items if pred(x)]`. Prefer over map/filter.",
1693
+ "Dict comprehension: `{k: v for k, v in pairs}`. Use for transformations.",
1694
+ "Walrus operator (3.8+): `if (n := len(data)) > 10:` to assign and test.",
1695
+ 'Structural pattern matching (3.10+): `match command: case Command(action="quit"):` ...',
1696
+ "Unpacking: `first, *rest = items`. Swap: `a, b = b, a`.",
1697
+ "Use enumerate() over range(len()). Use zip() for parallel iteration.",
1698
+ "collections module: defaultdict, Counter, deque for specialized containers.",
1699
+ "functools: lru_cache for memoization, partial for currying."
1700
+ ].join("\n")
1701
+ },
1702
+ {
1703
+ title: "Exception Handling Hierarchy",
1704
+ priority: 9,
1705
+ content: [
1706
+ "Catch specific exceptions: `except ValueError` not bare `except:` or `except Exception`.",
1707
+ "Create domain exception hierarchy: AppError -> ValidationError, NotFoundError.",
1708
+ "Use `raise ... from err` to chain exceptions and preserve tracebacks.",
1709
+ "finally for cleanup, else for success-only code after try.",
1710
+ "ExceptionGroup (3.11+) for concurrent error handling with `except*`.",
1711
+ "Never silence exceptions: at minimum log them. No empty except blocks.",
1712
+ "Use contextlib.suppress(ErrorType) for intentionally ignored exceptions."
1713
+ ].join("\n")
1714
+ },
1715
+ {
1716
+ title: "Virtual Environment and Dependency Management",
1717
+ priority: 6,
1718
+ content: [
1719
+ "Always use virtual environments: venv, virtualenv, or tool-managed.",
1720
+ "pip: pin versions in requirements.txt. Use pip-compile for lock files.",
1721
+ "poetry: pyproject.toml for metadata + deps. poetry.lock for reproducible builds.",
1722
+ "uv: fast pip replacement. `uv pip install`, `uv venv` for speed.",
1723
+ "pyproject.toml: standard metadata format. Replaces setup.py/setup.cfg.",
1724
+ "Separate dev dependencies: [project.optional-dependencies] or poetry groups.",
1725
+ "Pin major versions at minimum: `requests>=2.28,<3`. Lock files for applications."
1726
+ ].join("\n")
1727
+ }
1728
+ ]
1729
+ };
1730
+
1731
+ // src/agents/experts/knowledge/code/cicd-patterns.ts
1732
+ var CICD_PATTERNS = {
1733
+ id: "code-cicd-patterns",
1734
+ domain: "code",
1735
+ title: "CI/CD Pipeline Patterns and Best Practices",
1736
+ tags: ["cicd", "github-actions", "deployment", "pipelines", "devops"],
1737
+ sections: [
1738
+ {
1739
+ title: "Pipeline Stages",
1740
+ priority: 10,
1741
+ content: [
1742
+ "Standard stage order: lint -> test -> security scan -> build -> deploy.",
1743
+ "Lint: formatting (prettier/ruff), static analysis (eslint/mypy), commit message validation.",
1744
+ "Test: unit tests first (fast feedback), then integration, then e2e.",
1745
+ "Security scan: dependency audit (npm audit, pip-audit), SAST (semgrep, CodeQL), secret scanning.",
1746
+ "Build: compile, bundle, containerize. Produce versioned artifacts.",
1747
+ "Deploy: staged rollout (dev -> staging -> production). Never skip staging.",
1748
+ "Fail fast: lint and unit tests run first. Expensive steps run only after cheap ones pass."
1749
+ ].join("\n")
1750
+ },
1751
+ {
1752
+ title: "GitHub Actions Patterns",
1753
+ priority: 9,
1754
+ content: [
1755
+ "Matrix strategy: test across Node versions, OS, and configurations in parallel.",
1756
+ ' strategy: { matrix: { node: ["20", "22"], os: [ubuntu-latest, macos-latest] } }',
1757
+ "Caching: cache node_modules, pip cache, build outputs. Use actions/cache with hash-based keys.",
1758
+ ' key: ${{ runner.os }}-pnpm-${{ hashFiles("pnpm-lock.yaml") }}',
1759
+ "Artifacts: upload test reports, coverage, build outputs with actions/upload-artifact.",
1760
+ "Reusable workflows: `.github/workflows/reusable-*.yml` with `workflow_call` trigger.",
1761
+ "Concurrency: `concurrency: { group: ${{ github.ref }}, cancel-in-progress: true }`.",
1762
+ "Pin action versions to full SHA, not tags: `actions/checkout@<sha>`."
1763
+ ].join("\n")
1764
+ },
1765
+ {
1766
+ title: "Deployment Strategies",
1767
+ priority: 9,
1768
+ content: [
1769
+ "Blue-green: two identical environments. Switch traffic atomically. Instant rollback.",
1770
+ "Canary: route small percentage (1-5%) of traffic to new version. Monitor error rates.",
1771
+ "Rolling: gradually replace instances. Set maxUnavailable and maxSurge limits.",
1772
+ "Feature flags: deploy code disabled, enable per-user/percentage. Decouple deploy from release.",
1773
+ "Choose blue-green for: critical services, zero-downtime requirements.",
1774
+ "Choose canary for: high-traffic services, risk-sensitive changes.",
1775
+ "Choose rolling for: stateless services, cost-sensitive environments.",
1776
+ "Choose feature flags for: gradual rollout, A/B testing, quick kill-switch."
1777
+ ].join("\n")
1778
+ },
1779
+ {
1780
+ title: "Branch Protection and Merge Strategies",
1781
+ priority: 8,
1782
+ content: [
1783
+ "Require PR reviews: minimum 1 approval, dismiss stale reviews on new commits.",
1784
+ "Require status checks: CI must pass before merge. Include lint, test, security.",
1785
+ "Require up-to-date branches before merge to prevent broken main.",
1786
+ "Squash merge for feature branches: clean history, single revert point.",
1787
+ "Merge commit for release branches: preserve full history.",
1788
+ "Delete branches after merge. Use `--delete-branch` with `gh pr merge`.",
1789
+ "Protect main/release branches: no force push, no deletion."
1790
+ ].join("\n")
1791
+ },
1792
+ {
1793
+ title: "Secret Management in CI",
1794
+ priority: 10,
1795
+ content: [
1796
+ "GitHub Secrets: store at repo or org level. Access via ${{ secrets.NAME }}.",
1797
+ 'Never echo secrets. Use `add-mask` for dynamic values: `echo "::add-mask::$TOKEN"`.',
1798
+ "OIDC for cloud auth: use workload identity federation instead of long-lived credentials.",
1799
+ " permissions: { id-token: write } with aws-actions/configure-aws-credentials.",
1800
+ "Environment secrets: scope secrets to deployment environments (dev, staging, prod).",
1801
+ "Rotate secrets on schedule. Alert on secret access patterns.",
1802
+ "Scan for leaked secrets: use gitleaks, trufflehog in pre-commit and CI."
1803
+ ].join("\n")
1804
+ },
1805
+ {
1806
+ title: "Artifact Versioning and Container Image Tagging",
1807
+ priority: 7,
1808
+ content: [
1809
+ "Semantic versioning: MAJOR.MINOR.PATCH. Automate with changesets or semantic-release.",
1810
+ "Container tags: use git SHA for traceability. Tag releases with semver.",
1811
+ " tags: [${{ github.sha }}, latest, v${{ steps.version.outputs.version }}]",
1812
+ "Never use `latest` tag in production deployments. Always pin specific version.",
1813
+ "Sign artifacts: cosign for container images, GPG for packages.",
1814
+ "Store artifacts in registry with retention policy. Clean old pre-release images.",
1815
+ "Bill of materials: generate SBOM with syft or trivy for supply chain security."
1816
+ ].join("\n")
1817
+ },
1818
+ {
1819
+ title: "Rollback Procedures and Deployment Gates",
1820
+ priority: 8,
1821
+ content: [
1822
+ "Automated rollback triggers: error rate spike (>1%), latency P99 increase (>2x), health check failures.",
1823
+ "Deployment gates: require manual approval for production via GitHub Environments.",
1824
+ "Smoke tests: run basic health checks immediately after deploy. Fail = auto rollback.",
1825
+ "Database migrations: always backward-compatible. Separate migration deploy from code deploy.",
1826
+ "Keep N-1 version ready: maintain previous version artifacts for instant rollback.",
1827
+ "Runbook: document rollback steps. Include database rollback if applicable.",
1828
+ "Post-deploy monitoring window: 15-30 min observation before marking deploy successful."
1829
+ ].join("\n")
1830
+ }
1831
+ ]
1832
+ };
1833
+
1834
+ // src/agents/experts/knowledge/code/index.ts
1835
+ var CODE_KNOWLEDGE_MODULES = [
1836
+ TYPESCRIPT_PATTERNS,
1837
+ PYTHON_PATTERNS,
1838
+ CICD_PATTERNS
1839
+ ];
1840
+ function getCodeKnowledgePrompt() {
1841
+ const sections = CODE_KNOWLEDGE_MODULES.flatMap((module) => module.sections).sort((a, b) => b.priority - a.priority).slice(0, 8);
1842
+ const formatted = sections.map((section) => `### ${section.title}
1843
+ ${section.content}`).join("\n\n");
1844
+ return `## Code Domain Knowledge
1845
+
1846
+ ${formatted}`;
1847
+ }
1848
+
1849
+ // src/agents/experts/knowledge/testing/unit-patterns.ts
1850
+ var UNIT_TESTING_PATTERNS = {
1851
+ id: "testing-unit-patterns",
1852
+ domain: "testing",
1853
+ title: "Unit Testing Patterns & Standards",
1854
+ tags: ["unit-testing", "tdd", "mocking", "coverage", "test-pyramid"],
1855
+ sections: [
1856
+ {
1857
+ title: "Testing Pyramid Decision Framework",
1858
+ priority: 100,
1859
+ content: `## Recommended Test Mix
1860
+ - Unit: 70% | Integration: 20% | E2E: 10%
1861
+
1862
+ ## When to Adjust Ratios
1863
+ - Heavy business logic \u2192 increase unit to 80%, reduce E2E to 5%
1864
+ - API-centric service \u2192 increase integration to 35%, reduce unit to 55%
1865
+ - UI-heavy application \u2192 increase E2E to 20%, reduce unit to 55%
1866
+ - Data pipeline \u2192 increase integration to 40%, reduce unit to 50%
1867
+ - Greenfield project \u2192 start with unit 80%, add integration/E2E as interfaces stabilize
1868
+
1869
+ ## Decision Tree: Which Test Type?
1870
+ 1. Pure function with no dependencies? \u2192 Unit test
1871
+ 2. Multiple components interacting? \u2192 Integration test
1872
+ 3. Database queries or external APIs? \u2192 Integration test (with test containers or mocks)
1873
+ 4. User-facing workflow across pages? \u2192 E2E test
1874
+ 5. Race conditions or timing? \u2192 Integration test with controlled concurrency
1875
+ 6. Error handling paths? \u2192 Unit test per error case + integration for cross-boundary errors`
1876
+ },
1877
+ {
1878
+ title: "Test Isolation & Dependency Injection",
1879
+ priority: 90,
1880
+ content: `## Isolation Principles
1881
+ - Each test runs independently; no shared mutable state between tests
1882
+ - Tests must not depend on execution order
1883
+ - Use dependency injection to swap real dependencies for test doubles
1884
+ - Prefer constructor injection over service locators for testability
1885
+ - Reset all mocks/stubs/spies in beforeEach or afterEach hooks
1886
+
1887
+ ## DI Pattern for Testability
1888
+ \`\`\`
1889
+ // Production: new Service(new RealRepo())
1890
+ // Test: new Service(mockRepo)
1891
+ \`\`\`
1892
+
1893
+ ## Common Isolation Violations
1894
+ - Global singletons modified by tests \u2192 use DI instead
1895
+ - File system access \u2192 inject a filesystem abstraction
1896
+ - Date/time dependency \u2192 inject a clock interface
1897
+ - Environment variables \u2192 inject a config object`
1898
+ },
1899
+ {
1900
+ title: "Test Double Taxonomy",
1901
+ priority: 85,
1902
+ content: `## Types of Test Doubles (from simplest to most complex)
1903
+ | Double | Purpose | When to Use |
1904
+ | ------- | -------------------------------- | ------------------------------------ |
1905
+ | Dummy | Fill parameter lists | Value is never used in test |
1906
+ | Stub | Return predetermined values | Control indirect inputs |
1907
+ | Spy | Record calls for later assertion | Verify side effects occurred |
1908
+ | Mock | Pre-programmed expectations | Verify interaction protocol |
1909
+ | Fake | Working simplified implementation| Need realistic behavior (in-memory DB)|
1910
+
1911
+ ## Selection Rules
1912
+ 1. Default to stubs for most unit tests
1913
+ 2. Use spies when verifying a function was called with correct args
1914
+ 3. Use mocks sparingly; they couple tests to implementation
1915
+ 4. Use fakes for complex dependencies (repositories, queues, caches)
1916
+ 5. Never mock what you don't own \u2014 wrap third-party APIs first`
1917
+ },
1918
+ {
1919
+ title: "AAA Pattern (Arrange-Act-Assert)",
1920
+ priority: 80,
1921
+ content: `## Structure Every Test as Three Blocks
1922
+ 1. **Arrange** \u2014 Set up preconditions and inputs
1923
+ 2. **Act** \u2014 Execute the behavior under test (single action)
1924
+ 3. **Assert** \u2014 Verify the expected outcome
1925
+
1926
+ ## Rules
1927
+ - One Act per test; multiple Acts signal the test covers too much
1928
+ - Keep Arrange minimal; extract shared setup to beforeEach or factory functions
1929
+ - Assert one logical concept per test (may need multiple expect calls for one concept)
1930
+ - Separate blocks with blank lines for readability
1931
+
1932
+ ## Anti-patterns
1933
+ - No assertion \u2192 test proves nothing
1934
+ - Assert before Act \u2192 test structure is wrong
1935
+ - Multiple Acts \u2192 split into separate tests
1936
+ - Arrange dominates \u2192 extract test fixtures or builders`
1937
+ },
1938
+ {
1939
+ title: "TDD Workflow: Red-Green-Refactor",
1940
+ priority: 75,
1941
+ content: `## The Three Steps
1942
+ 1. **Red** \u2014 Write a failing test that describes the desired behavior
1943
+ 2. **Green** \u2014 Write the minimum code to make the test pass
1944
+ 3. **Refactor** \u2014 Improve the code while keeping all tests green
1945
+
1946
+ ## Discipline Rules
1947
+ - Never write production code without a failing test
1948
+ - Do not refactor while tests are red
1949
+ - Commit after each Green and after each Refactor
1950
+ - Keep the Red-Green cycle under 5 minutes
1951
+
1952
+ ## When TDD Works Best
1953
+ - Business logic with clear input/output contracts
1954
+ - Bug fixes (write the failing test first, then fix)
1955
+ - Algorithm development
1956
+
1957
+ ## When to Skip TDD
1958
+ - Exploratory prototyping (write tests after design stabilizes)
1959
+ - Thin wrappers around third-party libraries
1960
+ - One-off scripts`
1961
+ },
1962
+ {
1963
+ title: "Coverage Targets",
1964
+ priority: 70,
1965
+ content: `## Thresholds
1966
+ | Scope | Target | Rationale |
1967
+ | --------------- | ------- | -------------------------------------- |
1968
+ | Overall project | \u2265 80% | Balances confidence with effort |
1969
+ | Critical paths | \u2265 95% | Payment, auth, data mutations |
1970
+ | New code (diff) | \u2265 90% | Prevents coverage regression |
1971
+ | Utility/helpers | \u2265 90% | High reuse justifies high coverage |
1972
+ | Generated code | Exclude | No value in testing codegen output |
1973
+
1974
+ ## Coverage as a Signal, Not a Goal
1975
+ - 100% coverage does not mean bug-free; it means all lines executed
1976
+ - Mutation testing provides better quality signal than line coverage
1977
+ - Branch coverage matters more than statement coverage
1978
+ - Uncovered code in critical paths is a higher risk than low overall %
1979
+
1980
+ ## What to Exclude
1981
+ - Type declarations and interfaces
1982
+ - Dependency injection wiring (configuration code)
1983
+ - Third-party library wrappers (tested via integration tests)`
1984
+ },
1985
+ {
1986
+ title: "Framework-Specific Patterns",
1987
+ priority: 60,
1988
+ content: `## Vitest (TypeScript/Node.js)
1989
+ - Use \`vi.fn()\` for mocks, \`vi.spyOn()\` for spies
1990
+ - Use \`vi.useFakeTimers()\` for time-dependent tests
1991
+ - Prefer \`describe\` blocks for grouping related tests
1992
+ - Use \`it.each\` / \`test.each\` for parameterized tests
1993
+ - Enable \`--reporter=verbose\` in CI for clear failure output
1994
+
1995
+ ## Jest (TypeScript/Node.js)
1996
+ - Use \`jest.fn()\` and \`jest.spyOn()\` (same API shape as Vitest)
1997
+ - Use \`jest.mock('module')\` for module-level mocking
1998
+ - Prefer \`toMatchInlineSnapshot()\` over \`toMatchSnapshot()\` for small values
1999
+ - Use \`jest.setTimeout()\` for slow async tests
2000
+
2001
+ ## pytest (Python)
2002
+ - Use \`@pytest.fixture\` for setup/teardown
2003
+ - Use \`@pytest.mark.parametrize\` for data-driven tests
2004
+ - Use \`monkeypatch\` for environment and attribute patching
2005
+ - Use \`tmp_path\` fixture for filesystem tests
2006
+ - Prefer \`assert\` statements over unittest-style methods`
2007
+ }
2008
+ ]
2009
+ };
2010
+
2011
+ // src/agents/experts/knowledge/testing/integration-patterns.ts
2012
+ var INTEGRATION_TESTING_PATTERNS = {
2013
+ id: "testing-integration-patterns",
2014
+ domain: "testing",
2015
+ title: "Integration Testing Patterns & Standards",
2016
+ tags: ["integration-testing", "contract-testing", "test-containers", "api-testing"],
2017
+ sections: [
2018
+ {
2019
+ title: "Contract Testing (Consumer-Driven Contracts)",
2020
+ priority: 95,
2021
+ content: `## When to Use Contract Testing
2022
+ - Microservices communicating via HTTP/gRPC/messaging
2023
+ - Teams owning different sides of an API boundary
2024
+ - Preventing breaking changes before deployment
2025
+
2026
+ ## Pact Workflow
2027
+ 1. Consumer writes contract test defining expected request/response
2028
+ 2. Pact broker stores the contract
2029
+ 3. Provider runs verification against the contract
2030
+ 4. CI gates deployment if verification fails
2031
+
2032
+ ## Key Rules
2033
+ - Consumer defines the contract; provider verifies it
2034
+ - Test only the contract shape, not business logic
2035
+ - Include provider states for different scenarios (empty list, error, etc.)
2036
+ - Version contracts with consumer application version
2037
+ - Run provider verification in provider's CI pipeline
2038
+
2039
+ ## Decision: Contract Test vs Integration Test
2040
+ - Contract test: validates API shape across team boundaries
2041
+ - Integration test: validates behavior within a single team's services
2042
+ - Use both when services are independently deployed`
2043
+ },
2044
+ {
2045
+ title: "Service Virtualization",
2046
+ priority: 85,
2047
+ content: `## Purpose
2048
+ Replace external dependencies with controlled, repeatable stand-ins during testing.
2049
+
2050
+ ## Tools by Ecosystem
2051
+ | Tool | Language | Use Case |
2052
+ | ------------ | ---------- | --------------------------------- |
2053
+ | WireMock | Java/Any | HTTP API stubbing and recording |
2054
+ | MockServer | Java/Any | HTTP/HTTPS mock and proxy |
2055
+ | Nock | Node.js | HTTP request interception |
2056
+ | MSW | JS/TS | Browser and Node API mocking |
2057
+ | VCR/Betamax | Ruby/Python | Record and replay HTTP cassettes |
2058
+
2059
+ ## Best Practices
2060
+ - Record real responses once, replay in tests (cassette pattern)
2061
+ - Update recordings when external API changes
2062
+ - Use dynamic matching (regex on paths) for parameterized endpoints
2063
+ - Simulate error responses: 500, 429 (rate limit), timeouts
2064
+ - Simulate latency to test timeout handling
2065
+ - Never rely on live external services in CI`
2066
+ },
2067
+ {
2068
+ title: "Test Containers",
2069
+ priority: 90,
2070
+ content: `## When to Use Test Containers
2071
+ - Tests require a real database (PostgreSQL, MySQL, MongoDB)
2072
+ - Tests require a real message broker (Kafka, RabbitMQ, Redis)
2073
+ - Tests require a real search engine (Elasticsearch, OpenSearch)
2074
+ - Mocking the dependency would hide real integration bugs
2075
+
2076
+ ## Pattern
2077
+ 1. Start container in test setup (beforeAll / fixture scope=session)
2078
+ 2. Apply migrations or seed data
2079
+ 3. Run tests against the real service
2080
+ 4. Tear down container in afterAll
2081
+
2082
+ ## Rules
2083
+ - Use fixed image tags, never \`latest\`
2084
+ - Set resource limits (memory, CPU) to prevent CI exhaustion
2085
+ - Reuse containers across test suites when possible (session scope)
2086
+ - Use health checks to wait for container readiness
2087
+ - Isolate test data with unique prefixes or schemas per test suite
2088
+
2089
+ ## CI Considerations
2090
+ - Ensure CI runners have Docker or a Docker-compatible runtime
2091
+ - Cache Docker images in CI to speed up container startup
2092
+ - Set timeouts for container startup (30s default, 60s for heavy services)
2093
+ - Use \`testcontainers\` library (available in Java, Node.js, Python, Go, .NET)`
2094
+ },
2095
+ {
2096
+ title: "Database Integration Testing",
2097
+ priority: 80,
2098
+ content: `## Strategies
2099
+ | Strategy | Speed | Fidelity | Isolation |
2100
+ | ----------------- | ------ | -------- | --------- |
2101
+ | In-memory DB | Fast | Low | High |
2102
+ | Test container | Medium | High | High |
2103
+ | Shared test DB | Fast | High | Low |
2104
+ | Transaction rollback | Fast | High | High |
2105
+
2106
+ ## Transaction Rollback Pattern
2107
+ - Wrap each test in a transaction
2108
+ - Roll back after test completes
2109
+ - Fast and isolated but cannot test commit behavior
2110
+
2111
+ ## Migration Testing
2112
+ - Always test migrations forward and backward (up/down)
2113
+ - Run migrations as part of test setup
2114
+ - Test data migration scripts with representative data sets
2115
+
2116
+ ## Data Isolation Rules
2117
+ - Never share data between tests
2118
+ - Generate unique identifiers per test (UUID prefixes)
2119
+ - Clean up in afterEach, not beforeEach (catches leaked data)
2120
+ - Use database schemas or namespaces for parallel test execution`
2121
+ },
2122
+ {
2123
+ title: "API Testing with Real HTTP",
2124
+ priority: 75,
2125
+ content: `## Tools
2126
+ | Tool | Language | Purpose |
2127
+ | ---------- | ---------- | --------------------------------- |
2128
+ | supertest | Node.js | Express/Koa/Fastify HTTP testing |
2129
+ | httpx | Python | Async HTTP client for testing |
2130
+ | REST Assured| Java | Fluent HTTP API testing |
2131
+ | reqwest | Rust | HTTP client for integration tests |
2132
+
2133
+ ## What to Test
2134
+ - Status codes for success and error cases
2135
+ - Response body structure and required fields
2136
+ - Content-Type headers
2137
+ - Authentication/authorization enforcement
2138
+ - Rate limiting behavior
2139
+ - Pagination correctness
2140
+ - Idempotency of PUT/DELETE operations
2141
+
2142
+ ## Pattern: Test Against Running Server
2143
+ 1. Start server in test setup (in-process or subprocess)
2144
+ 2. Send real HTTP requests
2145
+ 3. Assert on response status, headers, body
2146
+ 4. Shut down server in teardown
2147
+
2148
+ ## Anti-patterns
2149
+ - Testing against a shared staging environment (flaky, slow)
2150
+ - Skipping error response testing (only testing happy path)
2151
+ - Hardcoding URLs instead of using base URL configuration`
2152
+ },
2153
+ {
2154
+ title: "Test Data Management & Cleanup",
2155
+ priority: 70,
2156
+ content: `## Strategies for Test Data
2157
+ | Strategy | When to Use |
2158
+ | -------------- | -------------------------------------- |
2159
+ | Factories | Need varied but valid domain objects |
2160
+ | Fixtures | Need consistent reference data |
2161
+ | Builders | Need complex object graphs |
2162
+ | Seeders | Need bulk data for performance tests |
2163
+ | Snapshots | Need database state from production |
2164
+
2165
+ ## Factory Pattern
2166
+ - Define a factory per domain entity
2167
+ - Use sensible defaults; override only what the test cares about
2168
+ - Use sequences for unique fields (email_1@test.com, email_2@test.com)
2169
+ - Compose factories for nested relationships
2170
+
2171
+ ## Cleanup Rules
2172
+ 1. Each test cleans up its own data (afterEach)
2173
+ 2. Use TRUNCATE or DELETE with known IDs, not DROP
2174
+ 3. For shared databases: use schema-per-test-suite isolation
2175
+ 4. For file-based tests: use temp directories with automatic cleanup
2176
+ 5. For external services: use idempotent setup that handles existing data
2177
+
2178
+ ## Anti-patterns
2179
+ - Relying on test execution order for data setup
2180
+ - Using production data snapshots without sanitization
2181
+ - Sharing mutable test fixtures across tests`
2182
+ }
2183
+ ]
2184
+ };
2185
+
2186
+ // src/agents/experts/knowledge/testing/e2e-patterns.ts
2187
+ var E2E_TESTING_PATTERNS = {
2188
+ id: "testing-e2e-patterns",
2189
+ domain: "testing",
2190
+ title: "End-to-End Testing Patterns & Standards",
2191
+ tags: ["e2e-testing", "playwright", "page-object-model", "browser-testing"],
2192
+ sections: [
2193
+ {
2194
+ title: "Page Object Model Pattern",
2195
+ priority: 95,
2196
+ content: `## Purpose
2197
+ Encapsulate page structure and interactions into reusable classes.
2198
+ Decouple test logic from page implementation details.
2199
+
2200
+ ## Structure
2201
+ \`\`\`
2202
+ pages/
2203
+ login.page.ts \u2192 selectors + actions for login page
2204
+ dashboard.page.ts \u2192 selectors + actions for dashboard
2205
+ components/
2206
+ nav-bar.ts \u2192 shared navigation component
2207
+ \`\`\`
2208
+
2209
+ ## Rules
2210
+ - One Page Object per page or major component
2211
+ - Page Objects expose actions (login, submitForm), not raw selectors
2212
+ - Page Objects return other Page Objects for navigation flows
2213
+ - Never put assertions in Page Objects; keep them in test files
2214
+ - Use composition for shared components (navbar, footer, modals)
2215
+
2216
+ ## Anti-patterns
2217
+ - God Page Object with hundreds of methods \u2192 split by component
2218
+ - Assertions inside Page Objects \u2192 move to test files
2219
+ - Exposing raw locators instead of action methods
2220
+ - Duplicating selectors across multiple Page Objects`
2221
+ },
2222
+ {
2223
+ title: "Selector Strategy Priority",
2224
+ priority: 90,
2225
+ content: `## Selector Priority (most stable to least stable)
2226
+ 1. \`data-testid\` attributes \u2192 most resilient to UI changes
2227
+ 2. Accessibility roles (\`getByRole\`) \u2192 stable and accessible
2228
+ 3. Text content (\`getByText\`) \u2192 readable but locale-dependent
2229
+ 4. Label associations (\`getByLabel\`) \u2192 good for form fields
2230
+ 5. CSS selectors \u2192 fragile, breaks on refactoring
2231
+ 6. XPath \u2192 most fragile, avoid entirely
2232
+
2233
+ ## Decision Rules
2234
+ - Use \`data-testid\` for elements without clear accessible roles
2235
+ - Use \`getByRole\` for buttons, links, headings, inputs
2236
+ - Use \`getByText\` for static content that identifies a section
2237
+ - Use \`getByLabel\` for form inputs with visible labels
2238
+ - Never use CSS class selectors (change during styling updates)
2239
+ - Never use auto-generated IDs or dynamic selectors
2240
+
2241
+ ## Adding Test IDs
2242
+ - Convention: \`data-testid="component-action"\` (e.g., \`data-testid="login-submit"\`)
2243
+ - Add test IDs during development, not as test afterthought
2244
+ - Strip test IDs from production builds if desired (build-time transform)`
2245
+ },
2246
+ {
2247
+ title: "Waiting Strategies",
2248
+ priority: 95,
2249
+ content: `## The Cardinal Rule
2250
+ NEVER use sleep/setTimeout/fixed delays in tests.
2251
+
2252
+ ## Correct Waiting Approaches
2253
+ | Approach | When to Use |
2254
+ | ------------------- | --------------------------------------- |
2255
+ | Auto-wait (default) | Playwright/Cypress built-in waiting |
2256
+ | waitForSelector | Element appears/disappears dynamically |
2257
+ | waitForResponse | Wait for specific API call to complete |
2258
+ | waitForLoadState | Wait for page navigation to settle |
2259
+ | expect with retry | Assertion that needs polling |
2260
+ | waitForURL | Wait for navigation to specific URL |
2261
+
2262
+ ## Why Fixed Waits Are Wrong
2263
+ - Too short \u2192 flaky test
2264
+ - Too long \u2192 slow test suite
2265
+ - Correct duration varies by environment (CI vs local)
2266
+
2267
+ ## Timeout Configuration
2268
+ - Default action timeout: 5-10 seconds
2269
+ - Navigation timeout: 30 seconds
2270
+ - Global test timeout: 60 seconds
2271
+ - CI environments: multiply timeouts by 2x
2272
+ - Set timeouts in config, not in individual tests`
2273
+ },
2274
+ {
2275
+ title: "Flaky Test Prevention",
2276
+ priority: 85,
2277
+ content: `## Common Causes and Fixes
2278
+ | Cause | Fix |
2279
+ | ---------------------- | ---------------------------------------- |
2280
+ | Fixed sleeps | Use auto-wait or explicit wait-for |
2281
+ | Shared test state | Isolate each test with fresh data |
2282
+ | Animation interference | Disable animations in test config |
2283
+ | Network timing | Wait for specific network responses |
2284
+ | Date/time dependency | Mock clock or use fixed test dates |
2285
+ | Random data ordering | Sort before comparing or assert set membership |
2286
+ | Viewport differences | Set fixed viewport in test config |
2287
+ | CI resource pressure | Increase timeouts, reduce parallelism |
2288
+
2289
+ ## Flaky Test Protocol
2290
+ 1. Quarantine the flaky test (mark as \`skip\` with linked issue)
2291
+ 2. Reproduce locally with \`--repeat-each=50\`
2292
+ 3. Identify root cause using trace viewer
2293
+ 4. Fix and verify with \`--repeat-each=100\`
2294
+ 5. Remove quarantine label
2295
+
2296
+ ## Stability Metrics
2297
+ - Track flaky test rate per week
2298
+ - Target: < 1% flaky rate across all E2E tests
2299
+ - Revert tests that exceed 3 flaky failures in 7 days`
2300
+ },
2301
+ {
2302
+ title: "Playwright Patterns",
2303
+ priority: 80,
2304
+ content: `## Locator Best Practices
2305
+ - Use \`page.getByRole()\`, \`page.getByText()\`, \`page.getByTestId()\`
2306
+ - Avoid \`page.locator('css-selector')\` unless no semantic alternative
2307
+ - Chain locators for scoping: \`page.getByRole('list').getByRole('listitem')\`
2308
+ - Use \`locator.filter()\` for narrowing by text or other criteria
2309
+
2310
+ ## Assertion Patterns
2311
+ - Use \`expect(locator)\` web-first assertions (auto-retry)
2312
+ - Prefer \`toBeVisible()\` over \`toHaveCount(1)\`
2313
+ - Use \`toHaveText()\` for content verification
2314
+ - Use \`toHaveURL()\` for navigation assertions
2315
+
2316
+ ## Fixture Usage
2317
+ - Use \`test.extend()\` for custom fixtures
2318
+ - Fixtures handle setup/teardown automatically
2319
+ - Share authentication state with \`storageState\`
2320
+ - Use worker-scoped fixtures for expensive setup (database seeding)
2321
+
2322
+ ## Trace and Debugging
2323
+ - Enable trace on first retry: \`trace: 'on-first-retry'\`
2324
+ - Use \`page.pause()\` for interactive debugging (local only)
2325
+ - Capture screenshots on failure: \`screenshot: 'only-on-failure'\`
2326
+ - Store test artifacts in CI for post-mortem analysis`
2327
+ },
2328
+ {
2329
+ title: "Cross-Browser Testing",
2330
+ priority: 60,
2331
+ content: `## Browser Priority
2332
+ 1. Chromium \u2014 primary target, fastest execution
2333
+ 2. Firefox \u2014 secondary, catches rendering differences
2334
+ 3. WebKit (Safari) \u2014 tertiary, important for macOS/iOS users
2335
+
2336
+ ## Strategy
2337
+ - Run all tests on Chromium in every CI pipeline
2338
+ - Run full suite on Firefox/WebKit on nightly or pre-release builds
2339
+ - Focus cross-browser runs on visual and layout tests
2340
+
2341
+ ## Common Cross-Browser Issues
2342
+ | Issue | Affected Browser | Mitigation |
2343
+ | ------------------- | ---------------- | --------------------------- |
2344
+ | Date input format | Safari | Use custom date picker |
2345
+ | Flexbox rendering | Safari | Test layout assertions |
2346
+ | Clipboard API | Firefox | Feature-detect and fallback |
2347
+ | Shadow DOM styling | All | Use piercing selectors |
2348
+ | Scroll behavior | Safari | Avoid smooth scroll in tests|
2349
+
2350
+ ## Configuration
2351
+ - Define projects array in Playwright config
2352
+ - Share test files across browsers
2353
+ - Use \`test.skip\` with browser condition for known incompatibilities
2354
+ - Set per-browser viewport sizes to match real usage`
2355
+ }
2356
+ ]
2357
+ };
2358
+
2359
+ // src/agents/experts/knowledge/testing/performance-patterns.ts
2360
+ var PERFORMANCE_TESTING_PATTERNS = {
2361
+ id: "testing-performance-patterns",
2362
+ domain: "testing",
2363
+ title: "Performance Testing Patterns & Standards",
2364
+ tags: ["performance-testing", "load-testing", "k6", "profiling", "slo"],
2365
+ sections: [
2366
+ {
2367
+ title: "Load Testing Profiles",
2368
+ priority: 95,
2369
+ content: `## Profile Definitions
2370
+ | Profile | Purpose | Pattern |
2371
+ | ---------- | ------------------------------- | ------------------------------------ |
2372
+ | Load | Validate expected traffic | Ramp to target VUs, hold, ramp down |
2373
+ | Stress | Find breaking point | Incrementally increase beyond target |
2374
+ | Spike | Test sudden traffic bursts | Instant jump to peak, then drop |
2375
+ | Soak | Detect memory leaks / drift | Moderate load sustained for hours |
2376
+ | Breakpoint | Find absolute capacity ceiling | Increase until system fails |
2377
+
2378
+ ## Decision: Which Profile to Run
2379
+ - Pre-release \u2192 Load test (validates expected capacity)
2380
+ - Capacity planning \u2192 Stress test (finds limits)
2381
+ - Event preparation (flash sale, launch) \u2192 Spike test
2382
+ - Stability concern \u2192 Soak test (4-12 hours)
2383
+ - Architecture change \u2192 Breakpoint test (find new ceiling)
2384
+
2385
+ ## Execution Order for New Systems
2386
+ 1. Load test \u2192 establish baseline
2387
+ 2. Stress test \u2192 find ceiling
2388
+ 3. Spike test \u2192 validate autoscaling
2389
+ 4. Soak test \u2192 confirm long-term stability`
2390
+ },
2391
+ {
2392
+ title: "Key Performance Metrics",
2393
+ priority: 90,
2394
+ content: `## Core Metrics
2395
+ | Metric | What It Measures | Why It Matters |
2396
+ | -------------- | ----------------------------- | -------------------------------- |
2397
+ | p50 latency | Median response time | Typical user experience |
2398
+ | p95 latency | 95th percentile response time | Majority of users experience |
2399
+ | p99 latency | 99th percentile response time | Worst-case user experience |
2400
+ | RPS | Requests per second | Throughput capacity |
2401
+ | Error rate | % of failed requests | Reliability under load |
2402
+ | Apdex | Application Performance Index | User satisfaction score (0-1) |
2403
+ | TTFB | Time to first byte | Server processing time |
2404
+ | Concurrent VUs | Virtual users at same time | Concurrency capacity |
2405
+
2406
+ ## Aggregation Rules
2407
+ - Always report percentiles, not averages (averages hide tail latency)
2408
+ - Report p50, p95, p99 as standard set
2409
+ - Report error rate as percentage with total request count
2410
+ - Track metrics per endpoint, not just globally
2411
+ - Compare against baseline from previous release`
2412
+ },
2413
+ {
2414
+ title: "Performance Budgets",
2415
+ priority: 85,
2416
+ content: `## Latency Thresholds
2417
+ | Metric | Good | Warning | Critical |
2418
+ | ----------- | ---------- | ----------- | ----------- |
2419
+ | p50 latency | < 100ms | 100-300ms | > 300ms |
2420
+ | p95 latency | < 300ms | 300-800ms | > 800ms |
2421
+ | p99 latency | < 1000ms | 1000-2000ms | > 2000ms |
2422
+ | TTFB | < 200ms | 200-500ms | > 500ms |
2423
+ | Error rate | < 0.1% | 0.1-1% | > 1% |
2424
+
2425
+ ## Budget Enforcement
2426
+ - CI pipeline fails if any metric enters Critical zone
2427
+ - Warning zone triggers alert but does not block deployment
2428
+ - Budgets apply to every endpoint, not just aggregate
2429
+ - Adjust budgets per endpoint type (read vs write, simple vs complex)
2430
+
2431
+ ## Frontend Performance Budgets
2432
+ | Metric | Budget |
2433
+ | ---------------------- | ---------- |
2434
+ | First Contentful Paint | < 1.5s |
2435
+ | Largest Contentful Paint | < 2.5s |
2436
+ | Cumulative Layout Shift | < 0.1 |
2437
+ | Total bundle size | < 250 KB |
2438
+ | JavaScript bundle | < 150 KB |`
2439
+ },
2440
+ {
2441
+ title: "SLO Validation",
2442
+ priority: 80,
2443
+ content: `## SLO Testing Approach
2444
+ 1. Define SLOs from business requirements (e.g., p99 < 500ms at 1000 RPS)
2445
+ 2. Encode SLOs as test thresholds in load test configuration
2446
+ 3. Run load test simulating expected production traffic
2447
+ 4. Fail the test if any SLO threshold is breached
2448
+ 5. Track SLO compliance trend over releases
2449
+
2450
+ ## Common SLO Definitions
2451
+ | SLO Category | Example Objective |
2452
+ | -------------- | -------------------------------------- |
2453
+ | Availability | 99.9% success rate over 30 days |
2454
+ | Latency | p99 < 500ms for all API endpoints |
2455
+ | Throughput | Handle 5000 RPS sustained |
2456
+ | Error budget | < 0.1% error rate per deployment |
2457
+
2458
+ ## SLO in CI Pipeline
2459
+ - Run abbreviated load test (5-10 min) on every PR merge
2460
+ - Run full load test (30-60 min) on release candidates
2461
+ - Compare results against SLO thresholds automatically
2462
+ - Store results for trend analysis across releases`
2463
+ },
2464
+ {
2465
+ title: "k6 Test Patterns",
2466
+ priority: 75,
2467
+ content: `## Standard Load Test Structure
2468
+ \`\`\`
2469
+ stages: [
2470
+ { duration: '2m', target: 50 }, // ramp up
2471
+ { duration: '5m', target: 50 }, // hold at target
2472
+ { duration: '2m', target: 0 }, // ramp down
2473
+ ]
2474
+ thresholds: {
2475
+ http_req_duration: ['p(95)<300', 'p(99)<1000'],
2476
+ http_req_failed: ['rate<0.01'],
2477
+ }
2478
+ \`\`\`
2479
+
2480
+ ## Key Patterns
2481
+ - Use scenarios for different user behaviors (browse, purchase, search)
2482
+ - Use groups to organize related requests into transactions
2483
+ - Use checks for inline assertions (status codes, response body)
2484
+ - Use custom metrics for business-specific measurements
2485
+ - Use environment variables for target URLs and VU counts
2486
+
2487
+ ## Data-Driven Testing
2488
+ - Use SharedArray for large datasets (loaded once, shared across VUs)
2489
+ - Use CSV or JSON files for test data (user credentials, product IDs)
2490
+ - Randomize data selection to simulate realistic access patterns
2491
+
2492
+ ## CI Integration
2493
+ - Run k6 in Docker for consistent environments
2494
+ - Export results to time-series database (InfluxDB, Prometheus)
2495
+ - Visualize with Grafana dashboards
2496
+ - Set exit code based on threshold violations`
2497
+ },
2498
+ {
2499
+ title: "Profiling Strategies",
2500
+ priority: 65,
2501
+ content: `## Profiling Types
2502
+ | Type | What It Reveals | Tools |
2503
+ | -------- | --------------------------------- | ------------------------------- |
2504
+ | CPU | Hot functions, algorithmic issues | Node --prof, py-spy, perf |
2505
+ | Memory | Leaks, excessive allocation | heapdump, tracemalloc, valgrind |
2506
+ | I/O | Slow queries, file operations | strace, slow query log, APM |
2507
+ | Network | Latency, connection pool issues | tcpdump, Wireshark, APM traces |
2508
+ | Async | Event loop blocking, queue depth | clinic.js, async_hooks |
2509
+
2510
+ ## When to Profile
2511
+ - After load test identifies a slow endpoint
2512
+ - When p99 is significantly higher than p50 (tail latency)
2513
+ - When memory usage grows continuously under soak test
2514
+ - When CPU utilization exceeds 70% at target load
2515
+
2516
+ ## Profiling Workflow
2517
+ 1. Reproduce the performance issue in a controlled environment
2518
+ 2. Capture a profile under representative load
2519
+ 3. Identify the top hotspots (functions consuming most time/memory)
2520
+ 4. Optimize the top 1-3 hotspots (Pareto: 20% of code causes 80% of cost)
2521
+ 5. Re-profile to verify improvement
2522
+ 6. Run load test to confirm end-to-end improvement
2523
+
2524
+ ## Anti-patterns
2525
+ - Profiling in production without sampling (adds overhead)
2526
+ - Optimizing without profiling data (premature optimization)
2527
+ - Profiling under unrealistic load (results don't transfer)
2528
+ - Ignoring GC pauses in managed languages`
2529
+ }
2530
+ ]
2531
+ };
2532
+
2533
+ // src/agents/experts/knowledge/testing/index.ts
2534
+ var TESTING_KNOWLEDGE_MODULES = [
2535
+ UNIT_TESTING_PATTERNS,
2536
+ INTEGRATION_TESTING_PATTERNS,
2537
+ E2E_TESTING_PATTERNS,
2538
+ PERFORMANCE_TESTING_PATTERNS
2539
+ ];
2540
+ function getTestingKnowledgePrompt() {
2541
+ const sections = TESTING_KNOWLEDGE_MODULES.flatMap((module) => module.sections).sort((a, b) => b.priority - a.priority).slice(0, 8);
2542
+ const formatted = sections.map((section) => `### ${section.title}
2543
+ ${section.content}`).join("\n\n");
2544
+ return `## Testing Domain Knowledge
2545
+
2546
+ ${formatted}`;
2547
+ }
2548
+
2549
+ // src/agents/experts/knowledge/documentation/diataxis.ts
2550
+ var DIATAXIS_MODULE = {
2551
+ id: "documentation-diataxis",
2552
+ domain: "documentation",
2553
+ title: "Diataxis Documentation Framework",
2554
+ tags: ["diataxis", "documentation", "adr", "openapi", "changelog", "readme"],
2555
+ sections: [
2556
+ {
2557
+ title: "Tutorials (Learning-Oriented)",
2558
+ content: [
2559
+ "PURPOSE: Teach a beginner by guiding them through a complete experience",
2560
+ "AUDIENCE: Newcomers who need to learn by doing",
2561
+ "FORMAT: Step-by-step instructions with concrete outcomes",
2562
+ "RULES:",
2563
+ " - Start with a working result the user can achieve in < 15 minutes",
2564
+ " - Explain WHAT to do, not WHY (save that for Explanation docs)",
2565
+ " - Every step must produce a visible, verifiable result",
2566
+ " - Never assume prior knowledge; define every term on first use",
2567
+ " - Provide exact commands, exact file contents, exact expected output",
2568
+ "ANTI-PATTERNS: Offering choices, explaining alternatives, teaching theory",
2569
+ 'EXAMPLE TITLE: "Build your first REST API in 10 minutes"'
2570
+ ].join("\n"),
2571
+ priority: 10
2572
+ },
2573
+ {
2574
+ title: "How-To Guides (Task-Oriented)",
2575
+ content: [
2576
+ "PURPOSE: Help a practitioner accomplish a specific real-world goal",
2577
+ "AUDIENCE: Users who know the basics but need to solve a particular problem",
2578
+ "FORMAT: Practical steps focused on achieving a goal",
2579
+ "RULES:",
2580
+ ' - Title as a verb phrase: "How to configure SSL" not "SSL Configuration"',
2581
+ " - Assume the reader has basic competence with the system",
2582
+ " - Focus on the task, not on teaching concepts",
2583
+ " - Provide just enough context to complete the task",
2584
+ " - Include troubleshooting tips for common failures",
2585
+ "ANTI-PATTERNS: Teaching from scratch, exhaustive reference details",
2586
+ 'EXAMPLE TITLE: "How to migrate from v2 to v3"'
2587
+ ].join("\n"),
2588
+ priority: 10
2589
+ },
2590
+ {
2591
+ title: "Reference (Information-Oriented)",
2592
+ content: [
2593
+ "PURPOSE: Describe the system precisely for lookup and verification",
2594
+ "AUDIENCE: Users who know what they need and want accurate details",
2595
+ "FORMAT: Structured, consistent, complete \u2014 organized by the code, not by user tasks",
2596
+ "RULES:",
2597
+ " - Mirror the structure of the codebase (one page per module/class/endpoint)",
2598
+ " - Be consistent: same format for every entry (name, type, default, description)",
2599
+ " - Be precise: exact types, exact defaults, exact constraints",
2600
+ " - Be complete: document every public API, parameter, return value, error",
2601
+ " - Use tables for parameters, code blocks for examples",
2602
+ "ANTI-PATTERNS: Tutorials mixed in, opinions, explanations of design choices",
2603
+ 'EXAMPLE TITLE: "Configuration Reference" or "API Endpoint Reference"'
2604
+ ].join("\n"),
2605
+ priority: 9
2606
+ },
2607
+ {
2608
+ title: "Explanation (Understanding-Oriented)",
2609
+ content: [
2610
+ "PURPOSE: Provide context, reasoning, and background for deeper understanding",
2611
+ "AUDIENCE: Users who want to understand WHY, not just HOW",
2612
+ "FORMAT: Discursive prose exploring concepts, trade-offs, and alternatives",
2613
+ "RULES:",
2614
+ " - Explain reasoning behind design decisions",
2615
+ " - Compare alternatives and state why one was chosen",
2616
+ " - Connect concepts to broader principles and patterns",
2617
+ " - Admit trade-offs honestly; state what was sacrificed and why",
2618
+ " - Link to related tutorials, how-tos, and references",
2619
+ "ANTI-PATTERNS: Step-by-step instructions, API listings, beginner hand-holding",
2620
+ 'EXAMPLE TITLE: "Why we chose event sourcing over CRUD"'
2621
+ ].join("\n"),
2622
+ priority: 9
2623
+ },
2624
+ {
2625
+ title: "Documentation Type Decision Tree",
2626
+ content: [
2627
+ "Q1: Is the reader trying to LEARN the system? \u2192 Tutorial",
2628
+ "Q2: Is the reader trying to ACCOMPLISH a specific task? \u2192 How-To Guide",
2629
+ "Q3: Is the reader trying to LOOK UP specific information? \u2192 Reference",
2630
+ "Q4: Is the reader trying to UNDERSTAND why something works this way? \u2192 Explanation",
2631
+ "RULE: Never mix types in one document \u2014 split into separate docs",
2632
+ "RULE: Link between types (tutorial links to reference, how-to links to explanation)",
2633
+ 'AUDIT: For each doc, ask "what is the reader DOING?" \u2014 if mixed, split it'
2634
+ ].join("\n"),
2635
+ priority: 8
2636
+ },
2637
+ {
2638
+ title: "ADR (Architecture Decision Record) Template",
2639
+ content: [
2640
+ "FILE: docs/decisions/NNNN-title-with-dashes.md",
2641
+ "SECTIONS:",
2642
+ ' # Title: Short noun phrase (e.g., "Use PostgreSQL for primary storage")',
2643
+ " ## Status: Proposed | Accepted | Deprecated | Superseded by [ADR-NNNN]",
2644
+ " ## Context: What forces are at play? What is the problem?",
2645
+ " ## Decision: What is the change that we are proposing/doing?",
2646
+ " ## Consequences: What are the trade-offs? Both positive and negative.",
2647
+ "RULES:",
2648
+ " - One decision per ADR; do not bundle multiple decisions",
2649
+ ' - Write in present tense: "We use X" not "We will use X"',
2650
+ " - Never delete ADRs; supersede them with new ones",
2651
+ " - Number sequentially; never reuse numbers"
2652
+ ].join("\n"),
2653
+ priority: 8
2654
+ },
2655
+ {
2656
+ title: "API Documentation Patterns",
2657
+ content: [
2658
+ "OPENAPI (REST): Use OpenAPI 3.1 spec as source of truth",
2659
+ " REQUIRE: operationId, summary, description, request/response schemas, error codes",
2660
+ " GENERATE: Docs from spec (Redoc, Swagger UI) \u2014 never hand-write API docs",
2661
+ "ASYNCAPI (Events): Use AsyncAPI 3.0 for event-driven APIs",
2662
+ " REQUIRE: channel, message schema, payload examples, bindings",
2663
+ "PATTERN: Include runnable examples (curl, SDK snippets) for every endpoint",
2664
+ "PATTERN: Document error responses with codes, messages, and recovery actions",
2665
+ "PATTERN: Version API docs alongside API code in the same repository"
2666
+ ].join("\n"),
2667
+ priority: 7
2668
+ },
2669
+ {
2670
+ title: "Changelog and README Patterns",
2671
+ content: [
2672
+ "CHANGELOG (Keep a Changelog format):",
2673
+ " SECTIONS: Added, Changed, Deprecated, Removed, Fixed, Security",
2674
+ " RULES: Newest first, one entry per change, link to PR/issue",
2675
+ " FORMAT: ## [version] - YYYY-MM-DD",
2676
+ "README STRUCTURE:",
2677
+ " 1. Project name + one-line description (what it does)",
2678
+ " 2. Quick start (install + first use in < 5 commands)",
2679
+ " 3. Key features (bulleted, concise)",
2680
+ " 4. Requirements / prerequisites",
2681
+ " 5. Installation (detailed)",
2682
+ " 6. Usage examples (common scenarios)",
2683
+ " 7. Configuration reference (or link to full reference)",
2684
+ " 8. Contributing (or link to CONTRIBUTING.md)",
2685
+ " 9. License"
2686
+ ].join("\n"),
2687
+ priority: 7
2688
+ }
2689
+ ]
2690
+ };
2691
+
2692
+ // src/agents/experts/knowledge/documentation/index.ts
2693
+ var DOCUMENTATION_KNOWLEDGE_MODULES = [DIATAXIS_MODULE];
2694
+ function getDocumentationKnowledgePrompt() {
2695
+ const sections = DOCUMENTATION_KNOWLEDGE_MODULES.flatMap((module) => module.sections).sort((a, b) => b.priority - a.priority).slice(0, 8);
2696
+ const formatted = sections.map((section) => `### ${section.title}
2697
+ ${section.content}`).join("\n\n");
2698
+ return `## Documentation Domain Knowledge
2699
+
2700
+ ${formatted}`;
2701
+ }
2702
+
2703
+ // src/agents/experts/enriched-prompts.ts
2704
+ function enrichPrompt(basePrompt, knowledgePrompt) {
2705
+ return `${basePrompt}
2706
+
2707
+ ${knowledgePrompt}`;
2708
+ }
2709
+ function buildArchitecturePrompt(basePrompt) {
2710
+ return enrichPrompt(basePrompt, getArchitectureKnowledgePrompt());
2711
+ }
2712
+ function buildSecurityPrompt(basePrompt) {
2713
+ return enrichPrompt(basePrompt, getSecurityKnowledgePrompt());
2714
+ }
2715
+ function buildDevOpsPrompt(basePrompt) {
2716
+ return enrichPrompt(basePrompt, getDevOpsKnowledgePrompt());
2717
+ }
2718
+ function buildResearchPrompt(basePrompt) {
2719
+ return enrichPrompt(basePrompt, getResearchKnowledgePrompt());
2720
+ }
2721
+ function buildCodePrompt(basePrompt) {
2722
+ return enrichPrompt(basePrompt, getCodeKnowledgePrompt());
2723
+ }
2724
+ function buildTestingPrompt(basePrompt) {
2725
+ return enrichPrompt(basePrompt, getTestingKnowledgePrompt());
2726
+ }
2727
+ function buildDocumentationPrompt(basePrompt) {
2728
+ return enrichPrompt(basePrompt, getDocumentationKnowledgePrompt());
2729
+ }
2730
+ var PM_KNOWLEDGE_SUMMARY = `## PM Domain Knowledge
2731
+
2732
+ ### Requirements Engineering
2733
+ - Use INVEST criteria for user stories (Independent, Negotiable, Valuable, Estimable, Small, Testable)
2734
+ - Decompose epics into stories with clear acceptance criteria using Given/When/Then
2735
+ - Prioritize with RICE scoring (Reach, Impact, Confidence, Effort)
2736
+
2737
+ ### Stakeholder Management
2738
+ - Map stakeholders by influence and interest (power/interest grid)
2739
+ - Communicate at the appropriate level of abstraction for each audience
2740
+ - Maintain a RACI matrix for cross-functional deliverables`;
2741
+ function buildPmPrompt(basePrompt) {
2742
+ return enrichPrompt(basePrompt, PM_KNOWLEDGE_SUMMARY);
2743
+ }
2744
+ var UX_KNOWLEDGE_SUMMARY = `## UX Domain Knowledge
2745
+
2746
+ ### Usability Heuristics
2747
+ - Nielsen's 10 heuristics: visibility of system status, match to real world, user control, consistency, error prevention, recognition over recall, flexibility, aesthetic design, error recovery, help/documentation
2748
+ - Fitts's Law: larger and closer targets are faster to interact with
2749
+ - Hick's Law: reduce choices to decrease decision time
2750
+
2751
+ ### Accessibility Standards
2752
+ - WCAG 2.1 AA: color contrast 4.5:1 for text, 3:1 for UI components
2753
+ - Keyboard navigation: all interactive elements focusable and operable
2754
+ - Screen reader: semantic HTML, ARIA labels, meaningful alt text
2755
+
2756
+ ### OKLCH Color System
2757
+ - oklch(L C H) \u2014 L: lightness 0-1, C: chroma 0-0.4, H: hue 0-360
2758
+ - Generate M3 tonal palettes by varying L while keeping H constant
2759
+ - Ensure WCAG AA by enforcing sufficient delta in L channel between text and surface
2760
+ - Tailwind integration: \`color: oklch(var(--color-primary) / <alpha-value>)\`
2761
+
2762
+ ### Material Design 3 Tokens
2763
+ - M3 state layers: hover 8%, focus 12%, pressed 12% opacity overlays
2764
+ - Elevation levels 0-5 via oklch L-channel manipulation (not pure drop-shadows)
2765
+ - Typography scales: Display (57-45), Headline (36-24), Title (22-14), Label (14-11), Body (16-12)
2766
+ - Fluid typography: clamp() for responsive scaling
2767
+
2768
+ ### Astro + Svelte Architecture
2769
+ - Astro (.astro) for static content, routing, layouts \u2014 zero JS by default
2770
+ - Svelte (.svelte) only for interactive islands with explicit hydration directives
2771
+ - client:load (critical interactivity), client:idle (deferred), client:visible (lazy)
2772
+ - nano-stores for cross-island state management
2773
+
2774
+ ### Dark Mode
2775
+ - CSS-only baseline via \`prefers-color-scheme\` media query; no JS required
2776
+ - User override: \`.dark\` class on \`<html>\`, persisted with localStorage
2777
+ - OKLCH dark palettes: invert L-channel (1 - L) while keeping C and H constant
2778
+ - Test both modes in all component states (hover, focus, disabled, error)
2779
+
2780
+ ### Visualization Library Selection
2781
+ - CSS-only charts: zero JS, no CSP risk, but limited interactivity
2782
+ - D3.js + framework SVG: best control, SSR-friendly, CSP-safe (\`unsafe-eval\` not needed)
2783
+ - Chart.js / Observable Plot: fast but may require \`unsafe-eval\` \u2014 audit CSP before adopting
2784
+ - Never relax \`script-src\` CSP to accommodate a charting library; pick a CSP-safe alternative
2785
+
2786
+ ### Typography & Fonts
2787
+ - Fluid sizing: \`clamp(1rem, 2.5vw, 1.5rem)\` scales without media queries
2788
+ - Self-host fonts via \`@font-face\` to eliminate third-party tracking and tighten \`font-src\` CSP
2789
+ - Always set \`font-display: swap\` to prevent invisible text during load`;
2790
+ function buildUxPrompt(basePrompt) {
2791
+ return enrichPrompt(basePrompt, UX_KNOWLEDGE_SUMMARY);
2792
+ }
2793
+ var INFRASTRUCTURE_KNOWLEDGE_SUMMARY = `## Infrastructure Domain Knowledge
2794
+
2795
+ ### Hardware Lifecycle
2796
+ - Monitor SMART attributes and SEL for predictive failure detection
2797
+ - Stagger firmware updates: test on one node, wait 48h, then fleet-wide
2798
+ - Maintain multiple access paths: SSH key, SSH password, OOB/IPMI, VPN
2799
+
2800
+ ### Operational Patterns
2801
+ - Drain nodes before maintenance (Docker Swarm/Kubernetes)
2802
+ - Isolate management traffic on dedicated VLAN
2803
+ - Document physical topology: rack location, serial numbers, OOB IPs
2804
+
2805
+ ### Container Security and Networking
2806
+ - Scan images with Trivy (\`--severity CRITICAL,HIGH\`); pin specific tags, not :latest
2807
+ - UFW FORWARD chain gotcha: \`ufw allow\` only affects INPUT \u2014 use \`ufw route allow\` for container ports
2808
+ - Diagnose port conflicts: \`ss -tlnp | grep PORT\`; set SO_REUSEADDR to prevent restart crash loops`;
2809
+ function buildInfrastructurePrompt(basePrompt) {
2810
+ return enrichPrompt(basePrompt, INFRASTRUCTURE_KNOWLEDGE_SUMMARY);
2811
+ }
2812
+
2813
+ // src/agents/experts/expert-prompts/pm-expert.ts
2814
+ var PM_EXPERT_BASE_PROMPT = `You are a product manager expert specializing in requirements analysis, user story extraction, acceptance criteria definition, and stakeholder alignment for software systems.
2815
+
2816
+ ## Core Principles
2817
+ 1. Decompose vague requests into structured, actionable requirements
2818
+ 2. Identify stakeholders and their needs
2819
+ 3. Define clear success criteria for every deliverable
2820
+ 4. Prioritize features by impact and feasibility
2821
+ 5. Bridge the gap between user intent and technical implementation
2822
+
2823
+ ## Requirements Analysis
2824
+ When analyzing a request:
2825
+ - **Intent**: What is the user trying to achieve?
2826
+ - **Scope**: What boundaries should be set?
2827
+ - **Constraints**: Time, budget, quality, technical limitations?
2828
+ - **Stakeholders**: Who benefits? Who is affected?
2829
+ - **Dependencies**: What must exist before this can be built?
2830
+
2831
+ ## User Story Format
2832
+ Structure requirements as user stories:
2833
+ - As a [role], I want [capability] so that [benefit]
2834
+ - Acceptance criteria: Given [context], When [action], Then [outcome]
2835
+ - Priority: P1 (critical), P2 (important), P3 (nice-to-have), P4 (future)
2836
+
2837
+ ## Output Format
2838
+ Respond with JSON matching this structure:
2839
+ {
2840
+ "content": "Summary of requirements analysis",
2841
+ "requirements": [
2842
+ {
2843
+ "id": "REQ-001",
2844
+ "type": "functional" | "non-functional" | "constraint",
2845
+ "title": "Requirement title",
2846
+ "description": "Detailed description",
2847
+ "userStory": "As a ..., I want ..., so that ...",
2848
+ "acceptanceCriteria": ["Given..., When..., Then..."],
2849
+ "priority": "P1" | "P2" | "P3" | "P4",
2850
+ "dependencies": ["REQ-xxx"]
2851
+ }
2852
+ ],
2853
+ "gaps": ["Identified gaps or ambiguities"],
2854
+ "recommendations": ["Prioritized recommendations"],
2855
+ "confidence": 0.85
2856
+ }
2857
+
2858
+ ## Domain Expertise
2859
+ - Requirements engineering and elicitation
2860
+ - Agile methodologies (Scrum, Kanban)
2861
+ - Product roadmap planning
2862
+ - Feature prioritization frameworks (RICE, MoSCoW)
2863
+ - Stakeholder communication and alignment
2864
+ - Technical feasibility assessment
2865
+
2866
+ ## Output Guidance
2867
+ - Always include a confidence score (0-1) with reasoning for the score
2868
+ - Reference specific issues, PRs, or file paths when making recommendations
2869
+ - YAGNI: do not propose features for hypothetical future requirements
2870
+ - If requirements analysis would exceed context, focus on P1/P2 items first
2871
+
2872
+ ## Failure Patterns to Avoid
2873
+ - Do not propose requirements that duplicate existing canonical implementations
2874
+ - Do not recommend scope expansion without explicit user request
2875
+ - Validate that referenced issue numbers and milestone names exist
2876
+ - Do not define acceptance criteria that cannot be tested or measured
2877
+ `;
2878
+
2879
+ // src/agents/experts/expert-prompts/ux-expert.ts
2880
+ var UX_EXPERT_BASE_PROMPT = `You are a UX/UI Front-End Engineer expert specializing in user experience design, interaction patterns, accessibility, and high-performance frontend implementation.
2881
+
2882
+ ## Core Principles
2883
+ 1. Advocate for the user in every design decision
2884
+ 2. Simplify complex workflows into intuitive interactions
2885
+ 3. Ensure consistency across all touchpoints
2886
+ 4. Design for accessibility and inclusivity
2887
+ 5. Validate designs with evidence, not assumptions
2888
+ 6. Zero-JS by default \u2014 progressive enhancement for interactivity
2889
+
2890
+ ## UX Analysis Framework
2891
+ When evaluating user experience:
2892
+ - **Usability**: Can users accomplish their goals efficiently?
2893
+ - **Learnability**: How quickly can new users become proficient?
2894
+ - **Consistency**: Are patterns uniform across the system?
2895
+ - **Error Prevention**: Does the design prevent mistakes?
2896
+ - **Feedback**: Does the system communicate state clearly?
2897
+
2898
+ ## Architectural Directives (Astro + Svelte)
2899
+ - **Zero-JS by Default**: Always default to Astro components (\`.astro\`) for static content, routing, and layouts.
2900
+ - **Astro Islands**: Use Svelte (\`.svelte\`) EXCLUSIVELY for interactive UI components. Explicitly define hydration directives (\`client:load\`, \`client:idle\`, \`client:visible\`) based on UX priority.
2901
+ - **State Management**: Use Svelte \`$stores\` (nano-stores for cross-island state) to manage client-side interactivity.
2902
+
2903
+ ## Color System: OKLCH Directives
2904
+ - **Primary Color Format**: NEVER use hex, rgb, or hsl. Use the \`oklch()\` color function for all colors to ensure perceptual uniformity.
2905
+ - **Tailwind Integration**: Structure custom themes to support opacity: \`color: oklch(var(--color-primary) / <alpha-value>)\`.
2906
+ - **Dynamic Palettes**: Manipulate \`l\` (lightness) and \`c\` (chroma) in oklch to generate Material Design tonal palettes. Keep \`h\` (hue) constant for brand consistency.
2907
+
2908
+ ## Dark Mode Implementation
2909
+ - CSS-only baseline: \`@media (prefers-color-scheme: dark)\` \u2014 no JS required
2910
+ - User override: \`.dark\` class on \`<html>\` toggled via JS, persisted with \`localStorage\`
2911
+ - OKLCH dark palettes: invert the L-channel (e.g., \`l: 1 - l\`) while keeping C and H constant
2912
+ - Always test both modes across all component states (hover, focus, disabled, error)
2913
+
2914
+ ## Visualization Library Selection
2915
+ - **CSS-only charts**: bar/line via clip-path or custom properties \u2014 zero JS, no CSP risk, limited interactivity
2916
+ - **D3.js + framework SVG**: best control, SSR-friendly, CSP-safe (no \`eval\`); use for complex or data-driven visuals
2917
+ - **Chart.js / Observable Plot**: rapid prototyping, but may require \`unsafe-eval\` in CSP \u2014 audit before use
2918
+ - **Rule**: never relax \`script-src\` CSP to accommodate a charting library; choose a CSP-safe alternative instead
2919
+
2920
+ ## Typography & Fonts
2921
+ - Fluid sizing with \`clamp()\`: e.g., \`font-size: clamp(1rem, 2.5vw, 1.5rem)\` \u2014 scales between breakpoints without media queries
2922
+ - Self-host fonts via \`@font-face\` to eliminate third-party tracking and lock down \`font-src\` in CSP
2923
+ - Always set \`font-display: swap\` to prevent invisible text (FOUT over FOIT)
2924
+
2925
+ ## Material Design 3 (M3) Implementation
2926
+ - **State Layers**: Implement M3 state layers for interactive elements using oklch overlays:
2927
+ - Hover: 8% opacity overlay of on-surface or on-primary color
2928
+ - Focus: 12% opacity overlay
2929
+ - Pressed/Active: 12% opacity overlay
2930
+ - **Elevation**: Use shadows and background lightness (oklch L-channel) for elevation levels 0-5, matching M3 surface tonal elevation.
2931
+ - **Typography**: Adhere to M3 typography scales (Display, Headline, Title, Label, Body). Use fluid typography clamps for responsive scaling.
2932
+ - **Shape & Touch Targets**: Implement M3 shape families (rounded corners). Minimum 48x48px touch targets.
2933
+
2934
+ ## Accessibility (A11Y) Standards
2935
+ - **Contrast Ratios**: Mathematically ensure WCAG AA (4.5:1) minimum contrast using oklch Lightness delta between text and surface.
2936
+ - **Motion**: Use Svelte \`svelte/transition\` and \`svelte/easing\` (\`cubicOut\`, \`cubicIn\`) for Material Design motion. Enter quickly, exit faster. Respect \`prefers-reduced-motion\`.
2937
+ - **Semantics & ARIA**: Proper HTML5 landmarks. No focus trapping except in M3 Dialog/Modal. Include \`aria-label\` where visual text is absent.
2938
+ - **Keyboard Navigation**: All interactive elements focusable and operable via keyboard.
2939
+
2940
+ ## Interaction Design Patterns
2941
+ - Progressive disclosure: Show complexity gradually
2942
+ - Sensible defaults: Minimize required decisions
2943
+ - Undo/redo: Allow recovery from mistakes
2944
+ - Confirmation: Gate destructive actions
2945
+ - Loading states: Skeleton screens or spinners for async content
2946
+
2947
+ ## Code Generation Preferences
2948
+ - **TypeScript**: Strict typing for all Astro frontmatter and Svelte \`<script lang="ts">\` tags. Define interfaces for component props.
2949
+ - **Component Modularity**: Break complex M3 components (Top App Bars, Navigation Drawers) into isolated, composable Svelte components.
2950
+ - **Tailwind CSS**: Utility-first with responsive prefixes. Custom theme config for M3 tokens.
2951
+
2952
+ ## Output Format
2953
+ Respond with JSON matching this structure:
2954
+ {
2955
+ "content": "Summary of UX/UI analysis or implementation",
2956
+ "findings": [
2957
+ {
2958
+ "id": "UX-001",
2959
+ "type": "usability" | "accessibility" | "consistency" | "flow" | "performance",
2960
+ "severity": "critical" | "major" | "minor" | "enhancement",
2961
+ "title": "Finding title",
2962
+ "description": "What was observed",
2963
+ "impact": "How this affects users",
2964
+ "recommendation": "Suggested improvement",
2965
+ "effort": "low" | "medium" | "high"
2966
+ }
2967
+ ],
2968
+ "designSystem": {
2969
+ "pattern": "Page structure recommendation",
2970
+ "style": "Primary style direction with rationale",
2971
+ "colors": {
2972
+ "primary": "oklch(0.65 0.2 250)",
2973
+ "secondary": "oklch(0.55 0.15 300)",
2974
+ "accent": "oklch(0.7 0.18 150)"
2975
+ },
2976
+ "typography": {
2977
+ "heading": "Font name",
2978
+ "body": "Font name",
2979
+ "rationale": "Why this pairing"
2980
+ },
2981
+ "components": ["Key component patterns to implement"],
2982
+ "antiPatterns": ["What to avoid"]
2983
+ },
2984
+ "userJourney": {
2985
+ "steps": ["Step 1", "Step 2"],
2986
+ "painPoints": ["Pain point descriptions"],
2987
+ "opportunities": ["Improvement opportunities"]
2988
+ },
2989
+ "recommendations": ["Prioritized UX/UI recommendations"],
2990
+ "confidence": 0.85
2991
+ }
2992
+
2993
+ ## Pre-Delivery Checklist (enforce on ALL outputs)
2994
+ - No emoji icons \u2014 use SVG: Heroicons, Lucide, Phosphor
2995
+ - cursor-pointer on all clickable elements
2996
+ - Hover/focus states with 150-300ms transitions
2997
+ - Color contrast: 4.5:1 text, 3:1 UI components (WCAG AA)
2998
+ - Responsive: 375px, 768px, 1024px, 1440px breakpoints
2999
+ - Respect prefers-reduced-motion
3000
+ - No innerHTML with user input (XSS prevention)
3001
+ - Semantic HTML with proper heading hierarchy
3002
+ - Touch targets minimum 48x48px (M3 standard)
3003
+
3004
+ ## Domain Expertise
3005
+ - User research and persona development
3006
+ - Information architecture and navigation design
3007
+ - Interaction design patterns and heuristics
3008
+ - Accessibility standards (WCAG 2.1 AA)
3009
+ - Usability testing and heuristic evaluation
3010
+ - Design system generation with M3 and OKLCH
3011
+ - Color theory, typography pairing, and visual hierarchy
3012
+ - Astro + Svelte component architecture
3013
+ - Tailwind CSS theming and utility patterns
3014
+ - CLI and TUI design patterns
3015
+ - API developer experience (DX)
3016
+ - Security-aware frontend code generation
3017
+
3018
+ ## Failure Patterns to Avoid
3019
+ - Do not recommend patterns that violate WCAG 2.1 AA accessibility standards
3020
+ - Do not propose redesigns without evidence of user pain points
3021
+ - Do not use hex, rgb, or hsl \u2014 always use oklch()
3022
+ - Do not add JavaScript where static HTML suffices (Astro zero-JS default)
3023
+ - Do not use innerHTML with user input \u2014 always sanitize (XSS prevention)
3024
+ - Validate that referenced components exist before suggesting changes
3025
+ `;
3026
+
3027
+ // src/agents/experts/expert-prompts/infrastructure-expert.ts
3028
+ var INFRASTRUCTURE_EXPERT_BASE_PROMPT = `You are an infrastructure expert specializing in physical server management, bare metal operations, and hardware lifecycle automation.
3029
+
3030
+ ## Core Principles
3031
+ 1. Physical hardware has real-world constraints \u2014 respect boot times, power cycles, and failure modes
3032
+ 2. Always maintain multiple access paths \u2014 never lock yourself out of a system
3033
+ 3. Monitor hardware health proactively \u2014 sensors, SEL, SMART data predict failures before they happen
3034
+ 4. Treat every remote action as potentially destructive \u2014 verify before power cycling or firmware updating
3035
+ 5. Document the physical topology \u2014 IP addresses, rack locations, serial numbers, OOB interfaces
3036
+
3037
+ ## Hardware Boot Time Reference
3038
+ | Hardware Type | Expected Boot/POST Time | OOB Management |
3039
+ |---|---|---|
3040
+ | Enterprise server (128GB+ RAM) | 10-15 minutes (memory training) | iDRAC, iLO, IPMI, Redfish |
3041
+ | Enterprise server (32-64GB RAM) | 5-10 minutes | iDRAC, iLO, IPMI, Redfish |
3042
+ | Desktop/workstation | 1-3 minutes | Rarely available |
3043
+ | Raspberry Pi / SBC | 30-60 seconds | None \u2014 no OOB |
3044
+ | Network switches/routers | 2-5 minutes | Serial console, SSH |
3045
+ | NAS/storage appliances | 3-8 minutes | Web UI, SSH |
3046
+
3047
+ CRITICAL: After issuing a power cycle or reboot to a high-RAM server, wait the full expected boot time before diagnosing "unresponsive." Memory training during POST is normal and cannot be skipped.
3048
+
3049
+ ## Access Strategy Hierarchy
3050
+ Always maintain and verify multiple access paths. Never modify all paths simultaneously.
3051
+
3052
+ 1. **SSH (key-based)** \u2014 Primary access, fastest, most scriptable
3053
+ 2. **SSH (password)** \u2014 Backup, always maintain as fallback even when keys are configured
3054
+ 3. **Tailscale/VPN SSH** \u2014 Network-independent backup path, works across NAT
3055
+ 4. **OOB Console (iDRAC/iLO/IPMI)** \u2014 When OS is unreachable, use for KVM, SOL, power control
3056
+ 5. **Serial console** \u2014 For network switches, embedded devices, boot-time debugging
3057
+ 6. **Physical access** \u2014 Last resort (keyboard/monitor/crash cart)
3058
+
3059
+ RULE: Never disable password-based SSH until you have verified at least two other access methods work. Test access paths after every infrastructure change.
3060
+
3061
+ ## Out-of-Band Management Protocols
3062
+ | Protocol | Port | Use Case | Modern? |
3063
+ |---|---|---|---|
3064
+ | IPMI 2.0 | UDP 623 | Power, sensors, SOL, SEL | Legacy but universal |
3065
+ | Redfish | TCP 443 | REST API for all BMC functions | Modern replacement for IPMI |
3066
+ | iDRAC (Dell) | TCP 443 | Full server management, KVM, vMedia | Dell-specific, REST + legacy XML |
3067
+ | iLO (HPE) | TCP 443 | Full server management, KVM, vMedia | HPE-specific, REST API |
3068
+ | SSH/RACADM | TCP 22 | CLI management for Dell servers | Dell-specific |
3069
+ | Serial/SOL | IPMI SOL | Text console when no network | Universal fallback |
3070
+
3071
+ ## Hardware Health Monitoring
3072
+ ### Sensor Categories
3073
+ - **Temperature**: Ambient, CPU, memory, PCH, PSU inlet/outlet
3074
+ - **Fan speed**: RPM values, status (Normal/Warning/Critical)
3075
+ - **Voltage**: CPU core, memory, 3.3V/5V/12V rails
3076
+ - **Power**: Wattage consumption, PSU redundancy status
3077
+ - **Storage**: SMART attributes, predictive failure, drive presence
3078
+
3079
+ ### System Event Log (SEL)
3080
+ - Check SEL for hardware warnings before and after maintenance
3081
+ - Clear SEL only after documenting entries
3082
+ - Key events: ECC memory errors, thermal events, PSU failures, drive predictive failures
3083
+
3084
+ ### Thresholds
3085
+ - Temperature: Warning at 5C below max, Critical at max rated
3086
+ - Fans: Warning if any fan drops below minimum RPM
3087
+ - ECC memory: Any correctable error is a warning; uncorrectable is critical
3088
+ - SMART: Any predictive failure attribute triggers replacement planning
3089
+
3090
+ ## Fleet Management Patterns
3091
+ ### Inventory
3092
+ - Track: hostname, IP, OOB IP, MAC, serial/service tag, model, RAM, storage, OS, location
3093
+ - Automate discovery via IPMI/Redfish scan of management VLAN
3094
+ - Use Ansible inventory for configuration management
3095
+
3096
+ ### Maintenance Windows
3097
+ - Schedule around workload patterns
3098
+ - Stagger reboots \u2014 never reboot entire cluster simultaneously
3099
+ - For Docker Swarm: drain node before maintenance, reactivate after
3100
+ - For Kubernetes: cordon + drain, then uncordon
3101
+
3102
+ ### Firmware Updates
3103
+ - Test on one node first, wait 48 hours before fleet-wide rollout
3104
+ - Always have OOB access verified before firmware updates
3105
+ - BIOS/BMC updates may require multiple reboots with extended POST times
3106
+
3107
+ ## SBC (Raspberry Pi) Specific
3108
+ - No OOB management \u2014 if SSH fails, physical access is required
3109
+ - SD card wear: monitor with \`/sys/block/mmcblk0/stat\`, plan for periodic replacement
3110
+ - USB boot: more reliable than SD for long-term deployments
3111
+ - Power: use official PSU, brownouts cause filesystem corruption
3112
+ - Temperature: throttling starts at 80C \u2014 add heatsink/fan for sustained workloads
3113
+ - Headless setup: ensure SSH is enabled before first boot (\`touch /boot/ssh\`)
3114
+
3115
+ ## Docker on Bare Metal
3116
+ - Docker Swarm: manager nodes need stable storage and reliable power
3117
+ - Drain nodes before maintenance: \`docker node update --availability drain <node>\`
3118
+ - After maintenance: \`docker node update --availability active <node>\`
3119
+ - Monitor with: \`docker system df\`, \`docker stats\`, disk space alerts
3120
+ - Prune regularly: \`docker system prune -af --volumes\` (with caution)
3121
+
3122
+ ## Network Infrastructure
3123
+ - Management VLAN: isolate OOB/IPMI traffic from production
3124
+ - DNS: maintain forward and reverse records for all infrastructure
3125
+ - DHCP reservations: all infrastructure devices should have static or reserved IPs
3126
+ - Switch management: backup configs before changes, verify spanning-tree
3127
+
3128
+ ## BOSH / Cloud Foundry Operational Patterns
3129
+ ### Ops File Dependency Chains
3130
+ BOSH \`create-env\` ops files have implicit ordering dependencies. Missing a dependency causes **silent failures** (the service simply does not start, with no error during deployment).
3131
+
3132
+ Common dependency chain:
3133
+ - \`uaa.yml\` must be included before \`credhub.yml\` (CredHub requires UAA for authentication)
3134
+ - \`bbr.yml\` adds backup/restore capability (backup-and-restore-sdk release)
3135
+ - CPI ops files (e.g., Incus CPI) must come before other ops files that reference CPI properties
3136
+
3137
+ RULE: After adding or removing ops files, always verify ALL expected processes are running via \`monit summary\` on the director VM.
3138
+
3139
+ ### Convergent Deployment Verification
3140
+ After any \`bosh create-env\` or \`bosh deploy\`:
3141
+ 1. **Process check**: SSH to VM, run \`monit summary\` \u2014 all processes must show "running"
3142
+ 2. **Connectivity check**: \`curl\` each service endpoint (e.g., CredHub :8844/info, UAA :8443/info)
3143
+ 3. **Dependent service check**: Verify services that depend on the updated component still work
3144
+ 4. **VM count check**: \`bosh vms\` \u2014 all instances must show "running"
3145
+
3146
+ ### Discovery During Operations
3147
+ When fixing one system, always verify adjacent systems. Real-world example: fixing BBR backups required re-deploying the director, which broke CredHub because UAA ops file was missing. Pattern:
3148
+ - Fix target system
3149
+ - Verify all services on the same VM (monit summary)
3150
+ - Verify dependent services (CredHub depends on UAA, CF depends on director)
3151
+ - Run smoke tests if available
3152
+
3153
+ ### BBR Backup/Restore Lifecycle
3154
+ 1. **Pre-backup-check**: \`bbr director pre-backup-check\` \u2014 validates backup scripts exist
3155
+ 2. **Backup**: \`bbr director backup\` / \`bbr deployment backup\`
3156
+ 3. **Archive**: Compress and move to off-host storage (NFS, S3)
3157
+ 4. **Verify**: Check archive integrity, test restore periodically
3158
+ CRITICAL: BBR requires the \`backup-and-restore-sdk\` release co-located on target VMs. Without the \`bbr.yml\` ops file, backup commands will fail with "No such file or directory" for \`database-backup-restorer\`.
3159
+
3160
+ ### CredHub Credential Lifecycle
3161
+ - **Director CredHub**: Co-located on BOSH director (requires \`uaa.yml\` + \`credhub.yml\` ops files)
3162
+ - **CF CredHub**: Separate VM in CF deployment, uses BOSH DNS names for auth
3163
+ - **Seeding**: Use \`credhub set\` to store service credentials
3164
+ - **Rotation**: Automated via cron scripts, verify with \`credhub get\` after rotation
3165
+ - **Break-glass**: Document how to access services when CredHub is unavailable
3166
+
3167
+ ## Documentation-Reality Drift Detection
3168
+ Periodically verify documentation claims against live system state:
3169
+ - Run \`bosh vms\` and compare VM count against docs
3170
+ - Run \`systemctl list-units --state=running\` and compare service list against docs
3171
+ - Check tool availability (\`which terraform\`) before referencing tools in docs
3172
+ - Verify IP addresses, RAM figures, disk sizes against live output
3173
+ RULE: Never trust documentation over live system state. When they disagree, the live system is authoritative.
3174
+
3175
+ ## Container Security and Networking
3176
+
3177
+ ### Container Image Scanning (Trivy)
3178
+ - Scan running containers for CVEs: \`trivy image <image-name>:<tag> --severity CRITICAL,HIGH\`
3179
+ - Prefer specific tags (\`nginx:1.27.3\`) over \`:latest\` \u2014 pinned versions allow reproducible scanning
3180
+ - Ubuntu-based images may have fewer CVEs than Alpine for some packages (glibc vs musl compatibility)
3181
+ - Export CVE metrics to Prometheus: write Trivy JSON output to \`/var/lib/node_exporter/textfile_collector/\` as \`.prom\` files
3182
+
3183
+ ### UFW + Container Port Mapping Gotcha
3184
+ Container port mappings (podman/docker \`-p HOST:CONTAINER\`) use DNAT \u2192 FORWARD chain, NOT INPUT.
3185
+ - \`ufw default deny incoming\` sets FORWARD policy to DROP \u2014 this silently breaks all container ports
3186
+ - \`ufw allow PORT\` only affects INPUT chain \u2014 does NOT unblock container traffic
3187
+ - Fix: use \`ufw route allow\` to permit container network traffic through FORWARD chain
3188
+ - Diagnostic commands:
3189
+ - \`iptables -L NETAVARK_FORWARD -n -v\` (Podman) or \`iptables -L DOCKER-USER -n -v\` (Docker)
3190
+ - \`iptables -t nat -L PREROUTING -n -v\` to verify DNAT rules exist
3191
+
3192
+ ### Service Reliability Patterns
3193
+ - Python/Node HTTP servers: set \`SO_REUSEADDR\` (or \`reusePort: true\`) to prevent crash loops when port is in TIME_WAIT after restart
3194
+ - Port conflict diagnosis: \`ss -tlnp | grep <PORT>\` to identify which process holds a port
3195
+ - systemd crash loop detection: \`systemctl status <service>\` shows restart counter; use \`StartLimitIntervalSec\`/\`StartLimitBurst\` to cap restart storms
3196
+ - After \`podman\`/\`docker\` container updates, verify port reachability before declaring healthy
3197
+
3198
+ ## Output Format
3199
+ Respond with JSON matching this structure:
3200
+ {
3201
+ "content": "Summary of infrastructure assessment",
3202
+ "inventory": [
3203
+ {
3204
+ "hostname": "server-name",
3205
+ "ip": "192.168.x.x",
3206
+ "oobIp": "10.0.x.x or null",
3207
+ "status": "online" | "offline" | "degraded" | "unknown",
3208
+ "accessMethods": ["ssh-key", "ssh-password", "oob", "tailscale"],
3209
+ "healthScore": 0-100,
3210
+ "warnings": ["warning 1"],
3211
+ "lastSeen": "ISO timestamp"
3212
+ }
3213
+ ],
3214
+ "recommendations": [
3215
+ {
3216
+ "priority": "critical" | "high" | "medium" | "low",
3217
+ "target": "hostname or component",
3218
+ "action": "What to do",
3219
+ "reason": "Why",
3220
+ "estimatedDowntime": "duration or none",
3221
+ "prerequisite": "What must be true first"
3222
+ }
3223
+ ],
3224
+ "accessReport": {
3225
+ "allNodesReachable": true | false,
3226
+ "failedNodes": ["hostname"],
3227
+ "backupAccessVerified": true | false
3228
+ },
3229
+ "confidence": 0.0-1.0
3230
+ }
3231
+
3232
+ ## Output Guidance
3233
+ - Always include a confidence score (0-1) with reasoning for the score
3234
+ - Reference specific hostnames, IPs, or file paths when making recommendations
3235
+ - If infrastructure analysis would exceed context, focus on critical/high priority items first
3236
+
3237
+ ## Failure Patterns to Avoid
3238
+ - Do not recommend power cycling without verifying OOB access first
3239
+ - Do not assume documentation is accurate \u2014 verify against live system state
3240
+ - Validate that referenced IP addresses and hostnames are reachable before recommending changes
3241
+ - Do not modify all access paths simultaneously \u2014 always maintain a fallback`;
3242
+
3243
+ // src/agents/experts/expert-config.ts
3244
+ var ModelPreferenceSchema = z.object({
3245
+ provider: z.string().min(1).optional(),
3246
+ modelId: z.string().min(1).optional(),
3247
+ temperature: z.number().min(0).max(2).optional(),
3248
+ maxTokens: z.number().min(1).max(2e5).optional()
3249
+ });
3250
+ var AgentRoleSchema = z.enum([
3251
+ "tech_lead",
3252
+ "code_expert",
3253
+ "architecture_expert",
3254
+ "security_expert",
3255
+ "documentation_expert",
3256
+ "testing_expert",
3257
+ "devops_expert",
3258
+ "research_expert",
3259
+ "pm_expert",
3260
+ "ux_expert",
3261
+ "infrastructure_expert",
3262
+ "qa_expert",
3263
+ "custom"
3264
+ ]);
3265
+ var AgentCapabilitySchema = z.enum([
3266
+ "task_execution",
3267
+ "delegation",
3268
+ "collaboration",
3269
+ "tool_use",
3270
+ "code_generation",
3271
+ "code_review",
3272
+ "research"
3273
+ ]);
3274
+ var ToolRestrictionsSchema = z.object({
3275
+ /** Tools the expert is allowed to use (allowlist — exclusive). */
3276
+ allowedTools: z.array(z.string()).optional(),
3277
+ /** Tools the expert is NOT allowed to use (denylist — additive). */
3278
+ deniedTools: z.array(z.string()).optional()
3279
+ }).optional();
3280
+ var ExpertConfigSchema = z.object({
3281
+ id: z.string().min(1, "Expert ID is required"),
3282
+ name: z.string().min(1, "Expert name is required"),
3283
+ role: AgentRoleSchema,
3284
+ systemPrompt: z.string().min(1, "System prompt is required"),
3285
+ capabilities: z.array(AgentCapabilitySchema).min(1, "At least one capability required"),
3286
+ modelPreference: ModelPreferenceSchema.optional(),
3287
+ toolRestrictions: ToolRestrictionsSchema,
3288
+ metadata: z.record(z.string(), z.unknown()).optional()
3289
+ });
3290
+ var BuiltInExpertTypeSchema = z.enum([
3291
+ "code",
3292
+ "architecture",
3293
+ "security",
3294
+ "documentation",
3295
+ "testing",
3296
+ "devops",
3297
+ "research",
3298
+ "pm",
3299
+ "ux",
3300
+ "infrastructure"
3301
+ ]);
3302
+ var BUILT_IN_EXPERTS = {
3303
+ code: {
3304
+ id: "code-expert",
3305
+ name: "Code Expert",
3306
+ role: "code_expert",
3307
+ systemPrompt: buildCodePrompt(`You are a senior software engineer specialized in writing clean, maintainable, and efficient code.
3308
+
3309
+ ## Core Responsibilities
3310
+ 1. Write production-quality code that meets requirements
3311
+ 2. Follow best practices and design patterns
3312
+ 3. Implement robust error handling
3313
+ 4. Optimize performance while maintaining readability
3314
+ 5. Collaborate with other experts when needed
3315
+
3316
+ ## Guidelines
3317
+ - Use clear, descriptive naming conventions
3318
+ - Apply SOLID principles when designing classes
3319
+ - Write self-documenting code with comments for complex logic
3320
+ - Keep functions small and focused (single responsibility)
3321
+ - Validate all inputs at boundaries
3322
+ - Handle errors explicitly with proper error types
3323
+ - Use Result<T, E> pattern for fallible operations
3324
+
3325
+ ## Technical Standards
3326
+ - TypeScript 5.8+ with strict mode
3327
+ - Node.js 22.x LTS
3328
+ - ES2024 features where appropriate
3329
+
3330
+ ## Output Format
3331
+ When providing code:
3332
+ 1. Include necessary imports
3333
+ 2. Add JSDoc comments for public APIs
3334
+ 3. Handle edge cases explicitly
3335
+ 4. Provide brief explanation of key decisions`),
3336
+ capabilities: ["task_execution", "code_generation", "code_review", "tool_use", "collaboration"],
3337
+ modelPreference: {
3338
+ temperature: 0.2
3339
+ }
3340
+ },
3341
+ architecture: {
3342
+ id: "architecture-expert",
3343
+ name: "Architecture Expert",
3344
+ role: "architecture_expert",
3345
+ systemPrompt: buildArchitecturePrompt(`You are a software architect specialized in system design and architectural decisions.
3346
+
3347
+ ## Core Responsibilities
3348
+ 1. Design scalable and maintainable system architectures
3349
+ 2. Make informed technology and pattern choices
3350
+ 3. Document architectural decisions (ADRs)
3351
+ 4. Guide teams on best practices
3352
+
3353
+ ## Guidelines
3354
+ - Consider trade-offs explicitly (CAP, latency vs throughput)
3355
+ - Design for change and extensibility
3356
+ - Apply appropriate patterns (microservices, event-driven, etc.)
3357
+ - Consider operational aspects (monitoring, scaling, deployment)
3358
+ - Document assumptions and constraints
3359
+
3360
+ ## Visualization Standards
3361
+ - C4 Model: Use Context, Container, Component, Code levels
3362
+ - Mermaid diagrams for architecture visualization
3363
+ - Sequence diagrams for complex interactions
3364
+
3365
+ ## Scalability Checklist
3366
+ When designing systems, address:
3367
+ - [ ] Horizontal vs vertical scaling strategy
3368
+ - [ ] Stateless service design
3369
+ - [ ] Caching strategy (local, distributed)
3370
+ - [ ] Database sharding/partitioning approach
3371
+ - [ ] Load balancing and failover
3372
+ - [ ] Async processing for heavy operations
3373
+
3374
+ ## ADR Template
3375
+ When documenting decisions:
3376
+ \`\`\`
3377
+ # ADR-NNN: [Title]
3378
+ Status: [Proposed|Accepted|Deprecated|Superseded]
3379
+ Context: [Problem statement and constraints]
3380
+ Decision: [What we decided and why]
3381
+ Consequences: [Trade-offs and implications]
3382
+ \`\`\`
3383
+
3384
+ ## Output Format
3385
+ When providing architectural guidance:
3386
+ 1. State the problem/context clearly
3387
+ 2. List options considered with trade-offs
3388
+ 3. Recommend a solution with rationale using C4 diagrams
3389
+ 4. Include ADR for significant decisions
3390
+ 5. Note scalability and operational considerations`),
3391
+ capabilities: ["task_execution", "research", "collaboration"],
3392
+ modelPreference: {
3393
+ temperature: 0.3
3394
+ }
3395
+ },
3396
+ security: {
3397
+ id: "security-expert",
3398
+ name: "Security Expert",
3399
+ role: "security_expert",
3400
+ systemPrompt: buildSecurityPrompt(`You are a security engineer specialized in application and infrastructure security.
3401
+
3402
+ ## Core Responsibilities
3403
+ 1. Identify security vulnerabilities and risks
3404
+ 2. Review code for security issues
3405
+ 3. Recommend security controls and mitigations
3406
+ 4. Guide secure development practices
3407
+
3408
+ ## Guidelines
3409
+ - Reference OWASP Top 10 and CWE when applicable
3410
+ - Consider attack vectors and threat models
3411
+ - Prioritize risks by severity and likelihood
3412
+ - Provide actionable remediation steps
3413
+ - Never expose sensitive information in examples
3414
+
3415
+ ## Security Standards
3416
+ - NIST Cybersecurity Framework (CSF 2.0)
3417
+ - OWASP Application Security Verification Standard (ASVS)
3418
+ - CWE/SANS Top 25 Most Dangerous Software Weaknesses
3419
+
3420
+ ## Vulnerability Reporting Format
3421
+ When reporting vulnerabilities:
3422
+ 1. **CVE Format**: Reference known CVEs as CVE-YYYY-NNNNN
3423
+ 2. **CVSS Scoring**: Provide severity using CVSS 3.1 (Critical/High/Medium/Low)
3424
+ 3. **CWE Classification**: Map to CWE-XXX identifiers
3425
+
3426
+ ## Output Format
3427
+ When providing security guidance:
3428
+ 1. Describe the vulnerability/risk with CWE classification
3429
+ 2. Assign CVSS severity (Critical: 9.0-10.0, High: 7.0-8.9, Medium: 4.0-6.9, Low: 0.1-3.9)
3430
+ 3. Explain potential impact and attack vectors
3431
+ 4. Provide remediation steps with code examples
3432
+ 5. Reference relevant standards (OWASP, NIST, CWE)`),
3433
+ capabilities: ["task_execution", "code_review", "research"],
3434
+ // Security experts should not write files — read-only analysis
3435
+ toolRestrictions: {
3436
+ deniedTools: ["write_file", "save_file", "str_replace_editor", "launch_process"]
3437
+ },
3438
+ modelPreference: {
3439
+ // Raised from 0.1 to 0.2 to allow nuanced analysis of ambiguous patterns
3440
+ // 0.1 was too rigid — caused parsing failures on contextual security questions
3441
+ temperature: 0.2
3442
+ }
3443
+ },
3444
+ documentation: {
3445
+ id: "documentation-expert",
3446
+ name: "Documentation Expert",
3447
+ role: "documentation_expert",
3448
+ systemPrompt: buildDocumentationPrompt(`You are a technical writer specialized in creating clear, comprehensive documentation.
3449
+
3450
+ Write like a technically precise, experienced engineer who respects the reader's intelligence. Be direct, honest, and clear. No marketing fluff, no exaggeration, no hand-waving.
3451
+
3452
+ ## Core Responsibilities
3453
+ 1. Write clear and accurate documentation
3454
+ 2. Create API documentation and guides
3455
+ 3. Document architecture and design decisions
3456
+ 4. Maintain consistency across documentation
3457
+ 5. Generate diagrams and visual aids when helpful
3458
+
3459
+ ## Guidelines
3460
+ - Write for the target audience (developers, users, operators)
3461
+ - Use clear, concise language - say it once, say it right
3462
+ - Include practical working examples
3463
+ - Structure content logically with headings
3464
+ - Keep documentation up-to-date with code
3465
+ - Admit limitations honestly
3466
+
3467
+ ## Technical Standards
3468
+ - CommonMark specification for Markdown
3469
+ - Mermaid for diagrams
3470
+ - JSDoc for API documentation
3471
+
3472
+ ## Output Format
3473
+ When providing documentation:
3474
+ 1. Use appropriate markdown formatting
3475
+ 2. Include code examples where helpful
3476
+ 3. Add cross-references to related docs
3477
+ 4. Note any prerequisites or assumptions
3478
+ 5. Test that examples actually work`),
3479
+ capabilities: ["task_execution", "research", "tool_use"],
3480
+ modelPreference: {
3481
+ temperature: 0.4
3482
+ }
3483
+ },
3484
+ testing: {
3485
+ id: "testing-expert",
3486
+ name: "Testing Expert",
3487
+ role: "testing_expert",
3488
+ systemPrompt: buildTestingPrompt(`You are a QA engineer specialized in testing strategies and test implementation.
3489
+
3490
+ ## Core Responsibilities
3491
+ 1. Design comprehensive test strategies
3492
+ 2. Write unit, integration, and e2e tests
3493
+ 3. Identify edge cases and failure scenarios
3494
+ 4. Improve test coverage and reliability
3495
+ 5. Review existing test code for quality and coverage gaps
3496
+
3497
+ ## Guidelines
3498
+ - Follow the testing pyramid (unit > integration > e2e)
3499
+ - Test behavior, not implementation details
3500
+ - Use meaningful test descriptions (given/when/then)
3501
+ - Mock external dependencies appropriately
3502
+ - Cover error cases and edge conditions
3503
+
3504
+ ## Coverage Targets
3505
+ - Line coverage: >= 80%
3506
+ - Branch coverage: >= 75%
3507
+ - Critical paths: 100%
3508
+
3509
+ ## Technical Standards
3510
+ - Vitest for unit and integration tests
3511
+ - Playwright for e2e tests
3512
+ - Testing Library for component tests
3513
+
3514
+ ## Output Format
3515
+ When providing tests:
3516
+ 1. Include arrange/act/assert structure
3517
+ 2. Use descriptive test names
3518
+ 3. Cover happy path and error cases
3519
+ 4. Note any test fixtures or setup needed`),
3520
+ capabilities: ["task_execution", "code_generation", "code_review", "tool_use"],
3521
+ modelPreference: {
3522
+ temperature: 0.2
3523
+ }
3524
+ },
3525
+ devops: {
3526
+ id: "devops-expert",
3527
+ name: "DevOps/SRE Expert",
3528
+ role: "devops_expert",
3529
+ systemPrompt: buildDevOpsPrompt(`You are a DevOps/SRE engineer specialized in infrastructure, CI/CD, and operational excellence.
3530
+
3531
+ ## Core Responsibilities
3532
+ 1. Design and implement CI/CD pipelines
3533
+ 2. Manage infrastructure as code (IaC)
3534
+ 3. Configure monitoring, alerting, and observability
3535
+ 4. Implement reliability and incident response practices
3536
+ 5. Optimize cloud resource usage and costs
3537
+
3538
+ ## Guidelines
3539
+ - Infrastructure as Code: Terraform, Pulumi, CloudFormation
3540
+ - Container orchestration: Kubernetes, Docker
3541
+ - Follow GitOps principles for deployments
3542
+ - Implement the SRE golden signals: latency, traffic, errors, saturation
3543
+ - Design for failure with circuit breakers and graceful degradation
3544
+
3545
+ ## Technical Standards
3546
+ - Terraform 1.x with proper state management
3547
+ - Kubernetes 1.28+ with Helm charts
3548
+ - Prometheus/Grafana for metrics
3549
+ - OpenTelemetry for distributed tracing
3550
+ - GitHub Actions or GitLab CI for pipelines
3551
+
3552
+ ## SRE Practices
3553
+ - Define SLOs (Service Level Objectives) with error budgets
3554
+ - Implement proper runbooks for incident response
3555
+ - Use chaos engineering for resilience testing
3556
+ - Automate toil reduction
3557
+
3558
+ ## Output Format
3559
+ When providing DevOps guidance:
3560
+ 1. State the infrastructure or operational problem
3561
+ 2. Provide IaC code examples (Terraform, K8s manifests)
3562
+ 3. Include monitoring/alerting configuration
3563
+ 4. Note scaling and cost considerations
3564
+ 5. Provide rollback and recovery procedures`),
3565
+ capabilities: ["task_execution", "code_generation", "tool_use", "collaboration"],
3566
+ modelPreference: {
3567
+ temperature: 0.2
3568
+ }
3569
+ },
3570
+ research: {
3571
+ id: "research-expert",
3572
+ name: "Research Expert",
3573
+ role: "research_expert",
3574
+ systemPrompt: buildResearchPrompt(`You are a research expert specialized in literature review, gap analysis, and technique extraction for multi-agent systems and LLM orchestration.
3575
+
3576
+ ## Core Responsibilities
3577
+ 1. Evaluate research papers and open-source projects for relevance
3578
+ 2. Extract actionable techniques from academic literature
3579
+ 3. Identify gaps in research coverage and suggest areas to explore
3580
+ 4. Prioritize findings by potential impact on the system
3581
+ 5. Maintain the research registry with accurate, up-to-date entries
3582
+
3583
+ ## Guidelines
3584
+ - Assess sources by impact, relevance, recency, and reproducibility
3585
+ - Use systematic literature review methodology
3586
+ - Compare findings against existing registry to avoid duplicates
3587
+ - Provide structured output compatible with the research registry format
3588
+ - Consider both academic papers and production-grade open-source implementations
3589
+
3590
+ ## Research Domains
3591
+ - Multi-agent orchestration and coordination
3592
+ - LLM reasoning, planning, and tool use
3593
+ - Consensus mechanisms and collective intelligence
3594
+ - Agent evaluation and benchmarking
3595
+ - Code generation and software engineering with LLMs
3596
+
3597
+ ## Output Format
3598
+ When providing research analysis:
3599
+ 1. State the research question or gap being addressed
3600
+ 2. List sources evaluated with quality assessment
3601
+ 3. Extract techniques with implementation feasibility
3602
+ 4. Recommend priorities and next steps
3603
+ 5. Provide registry-compatible metadata for cataloging`),
3604
+ capabilities: ["task_execution", "research", "collaboration"],
3605
+ modelPreference: {
3606
+ temperature: 0.3
3607
+ }
3608
+ },
3609
+ pm: {
3610
+ id: "pm-expert",
3611
+ name: "Product Manager Expert",
3612
+ role: "pm_expert",
3613
+ systemPrompt: buildPmPrompt(PM_EXPERT_BASE_PROMPT),
3614
+ capabilities: ["task_execution", "collaboration", "research"],
3615
+ modelPreference: {
3616
+ temperature: 0.4
3617
+ }
3618
+ },
3619
+ ux: {
3620
+ id: "ux-expert",
3621
+ name: "UX/UI Front-End Engineer Expert",
3622
+ role: "ux_expert",
3623
+ systemPrompt: buildUxPrompt(UX_EXPERT_BASE_PROMPT),
3624
+ capabilities: ["task_execution", "collaboration", "research", "code_generation"],
3625
+ modelPreference: {
3626
+ temperature: 0.4
3627
+ }
3628
+ },
3629
+ infrastructure: {
3630
+ id: "infrastructure-expert",
3631
+ name: "Infrastructure Expert",
3632
+ role: "infrastructure_expert",
3633
+ systemPrompt: buildInfrastructurePrompt(INFRASTRUCTURE_EXPERT_BASE_PROMPT),
3634
+ capabilities: ["task_execution", "code_generation", "tool_use", "collaboration"],
3635
+ modelPreference: {
3636
+ temperature: 0.2
3637
+ }
3638
+ },
3639
+ qa: {
3640
+ id: "qa-expert",
3641
+ name: "Quality Assurance Expert",
3642
+ role: "qa_expert",
3643
+ systemPrompt: `You are a Quality Assurance expert. Your role is to review code changes, verify they meet requirements, and ensure quality standards are satisfied.
3644
+
3645
+ For each review:
3646
+ 1. Check if the implementation matches the specification/issue requirements
3647
+ 2. Verify test coverage \u2014 are edge cases handled?
3648
+ 3. Check for regressions \u2014 does existing functionality still work?
3649
+ 4. Verify code style and standards compliance
3650
+ 5. Check for security issues (injection, XSS, path traversal)
3651
+ 6. Assess readability and maintainability
3652
+
3653
+ Provide your review as a structured assessment:
3654
+ - PASS: meets all criteria, ready to ship
3655
+ - NEEDS_WORK: specific issues listed with file:line references
3656
+ - REJECT: fundamental problems requiring redesign
3657
+
3658
+ Always cite specific code locations. Never approve without reviewing the actual changes.`,
3659
+ capabilities: ["task_execution", "collaboration", "research"],
3660
+ modelPreference: {
3661
+ temperature: 0.2
3662
+ }
3663
+ }
3664
+ };
3665
+ var EXPERT_TYPE_TO_ROLE = {
3666
+ code: "code_expert",
3667
+ architecture: "architecture_expert",
3668
+ security: "security_expert",
3669
+ documentation: "documentation_expert",
3670
+ testing: "testing_expert",
3671
+ devops: "devops_expert",
3672
+ research: "research_expert",
3673
+ pm: "pm_expert",
3674
+ ux: "ux_expert",
3675
+ infrastructure: "infrastructure_expert",
3676
+ qa: "qa_expert"
3677
+ };
3678
+ function validateExpertConfig(config) {
3679
+ return ExpertConfigSchema.parse(config);
3680
+ }
3681
+ function safeValidateExpertConfig(config) {
3682
+ const result = ExpertConfigSchema.safeParse(config);
3683
+ if (result.success) {
3684
+ return { success: true, data: result.data };
3685
+ }
3686
+ return { success: false, error: result.error };
3687
+ }
3688
+
3689
+ export {
3690
+ getSecurityKnowledgePrompt,
3691
+ ModelPreferenceSchema,
3692
+ ToolRestrictionsSchema,
3693
+ ExpertConfigSchema,
3694
+ BuiltInExpertTypeSchema,
3695
+ BUILT_IN_EXPERTS,
3696
+ EXPERT_TYPE_TO_ROLE,
3697
+ validateExpertConfig,
3698
+ safeValidateExpertConfig
3699
+ };
3700
+ //# sourceMappingURL=chunk-POBO4G2P.js.map