nodebench-mcp 2.14.2 → 2.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NODEBENCH_AGENTS.md +3 -3
- package/README.md +9 -9
- package/dist/__tests__/architectComplex.test.d.ts +1 -0
- package/dist/__tests__/architectComplex.test.js +375 -0
- package/dist/__tests__/architectComplex.test.js.map +1 -0
- package/dist/__tests__/architectSmoke.test.d.ts +1 -0
- package/dist/__tests__/architectSmoke.test.js +92 -0
- package/dist/__tests__/architectSmoke.test.js.map +1 -0
- package/dist/__tests__/critterCalibrationEval.d.ts +8 -0
- package/dist/__tests__/critterCalibrationEval.js +370 -0
- package/dist/__tests__/critterCalibrationEval.js.map +1 -0
- package/dist/__tests__/embeddingProvider.test.d.ts +1 -0
- package/dist/__tests__/embeddingProvider.test.js +86 -0
- package/dist/__tests__/embeddingProvider.test.js.map +1 -0
- package/dist/__tests__/evalHarness.test.js +6 -1
- package/dist/__tests__/evalHarness.test.js.map +1 -1
- package/dist/__tests__/gaiaCapabilityAudioEval.test.js +1 -1
- package/dist/__tests__/gaiaCapabilityAudioEval.test.js.map +1 -1
- package/dist/__tests__/gaiaCapabilityEval.test.js +759 -28
- package/dist/__tests__/gaiaCapabilityEval.test.js.map +1 -1
- package/dist/__tests__/gaiaCapabilityFilesEval.test.js +1 -1
- package/dist/__tests__/gaiaCapabilityFilesEval.test.js.map +1 -1
- package/dist/__tests__/gaiaCapabilityMediaEval.test.js +558 -4
- package/dist/__tests__/gaiaCapabilityMediaEval.test.js.map +1 -1
- package/dist/__tests__/presetRealWorldBench.test.js +2 -2
- package/dist/__tests__/presetRealWorldBench.test.js.map +1 -1
- package/dist/__tests__/tools.test.js +1016 -8
- package/dist/__tests__/tools.test.js.map +1 -1
- package/dist/__tests__/toolsetGatingEval.test.js +3 -3
- package/dist/__tests__/toolsetGatingEval.test.js.map +1 -1
- package/dist/db.js +64 -0
- package/dist/db.js.map +1 -1
- package/dist/index.js +76 -9
- package/dist/index.js.map +1 -1
- package/dist/tools/architectTools.d.ts +15 -0
- package/dist/tools/architectTools.js +304 -0
- package/dist/tools/architectTools.js.map +1 -0
- package/dist/tools/critterTools.d.ts +21 -0
- package/dist/tools/critterTools.js +230 -0
- package/dist/tools/critterTools.js.map +1 -0
- package/dist/tools/emailTools.d.ts +15 -0
- package/dist/tools/emailTools.js +664 -0
- package/dist/tools/emailTools.js.map +1 -0
- package/dist/tools/embeddingProvider.d.ts +67 -0
- package/dist/tools/embeddingProvider.js +299 -0
- package/dist/tools/embeddingProvider.js.map +1 -0
- package/dist/tools/metaTools.js +660 -0
- package/dist/tools/metaTools.js.map +1 -1
- package/dist/tools/progressiveDiscoveryTools.js +24 -7
- package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
- package/dist/tools/reconTools.js +83 -33
- package/dist/tools/reconTools.js.map +1 -1
- package/dist/tools/rssTools.d.ts +8 -0
- package/dist/tools/rssTools.js +833 -0
- package/dist/tools/rssTools.js.map +1 -0
- package/dist/tools/toolRegistry.d.ts +30 -2
- package/dist/tools/toolRegistry.js +424 -25
- package/dist/tools/toolRegistry.js.map +1 -1
- package/package.json +14 -3
package/NODEBENCH_AGENTS.md
CHANGED
|
@@ -21,7 +21,7 @@ Add to `~/.claude/settings.json`:
|
|
|
21
21
|
}
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
Restart Claude Code.
|
|
24
|
+
Restart Claude Code. 163 tools available immediately.
|
|
25
25
|
|
|
26
26
|
### Preset Selection
|
|
27
27
|
|
|
@@ -303,8 +303,8 @@ NodeBench MCP supports 4 presets that control which domain toolsets are loaded a
|
|
|
303
303
|
|--------|----------------|-------------|----------------------------|----------|
|
|
304
304
|
| **meta** | 0 | 0 | 5 | Discovery-only front door. Agents start here and self-escalate. |
|
|
305
305
|
| **lite** | 8 | 38 | 43 | Lightweight verification-focused workflows. CI bots, quick checks. |
|
|
306
|
-
| **core** |
|
|
307
|
-
| **full** |
|
|
306
|
+
| **core** | 23 | 105 | 110 | Full development workflow. Most agent sessions. |
|
|
307
|
+
| **full** | 31 | 158 | 163 | Everything enabled. Benchmarking, exploration, advanced use. |
|
|
308
308
|
|
|
309
309
|
### Usage
|
|
310
310
|
|
package/README.md
CHANGED
|
@@ -39,7 +39,7 @@ Every additional tool call produces a concrete artifact — an issue found, a ri
|
|
|
39
39
|
|
|
40
40
|
**QA engineer** — Transitioned a manual QA workflow website into an AI agent-driven app for a pet care messaging platform. Uses NodeBench's quality gates, verification cycles, and eval runs to ensure the AI agent handles edge cases that manual QA caught but bare AI agents miss.
|
|
41
41
|
|
|
42
|
-
Both found different subsets of the
|
|
42
|
+
Both found different subsets of the 163 tools useful — which is why NodeBench ships with 4 `--preset` levels to load only what you need.
|
|
43
43
|
|
|
44
44
|
---
|
|
45
45
|
|
|
@@ -77,7 +77,7 @@ Tasks 1-3 start with zero prior knowledge. By task 9, the agent finds 2+ relevan
|
|
|
77
77
|
### Install (30 seconds)
|
|
78
78
|
|
|
79
79
|
```bash
|
|
80
|
-
# Claude Code CLI — all
|
|
80
|
+
# Claude Code CLI — all 163 tools (TOON encoding on by default for ~40% token savings)
|
|
81
81
|
claude mcp add nodebench -- npx -y nodebench-mcp
|
|
82
82
|
|
|
83
83
|
# Or start with discovery only — 5 tools, agents self-escalate to what they need
|
|
@@ -189,7 +189,7 @@ Notes:
|
|
|
189
189
|
|
|
190
190
|
## Progressive Discovery
|
|
191
191
|
|
|
192
|
-
|
|
192
|
+
163 tools is a lot. The progressive disclosure system helps agents find exactly what they need:
|
|
193
193
|
|
|
194
194
|
### Multi-modal search engine
|
|
195
195
|
|
|
@@ -197,7 +197,7 @@ Notes:
|
|
|
197
197
|
> discover_tools("verify my implementation")
|
|
198
198
|
```
|
|
199
199
|
|
|
200
|
-
The `discover_tools` search engine scores tools using **
|
|
200
|
+
The `discover_tools` search engine scores tools using **14 parallel strategies** (including Agent-as-a-Graph bipartite embedding search):
|
|
201
201
|
|
|
202
202
|
| Strategy | What it does | Example |
|
|
203
203
|
|---|---|---|
|
|
@@ -317,7 +317,7 @@ Based on Anthropic's ["Building a C Compiler with Parallel Claudes"](https://www
|
|
|
317
317
|
|
|
318
318
|
## Toolset Gating
|
|
319
319
|
|
|
320
|
-
|
|
320
|
+
163 tools means tens of thousands of tokens of schema per API call. If you only need core methodology, gate the toolset:
|
|
321
321
|
|
|
322
322
|
### Presets
|
|
323
323
|
|
|
@@ -325,8 +325,8 @@ Based on Anthropic's ["Building a C Compiler with Parallel Claudes"](https://www
|
|
|
325
325
|
|---|---|---|---|
|
|
326
326
|
| `meta` | 5 | 0 | Discovery-only front door — agents start here and self-escalate via `discover_tools` |
|
|
327
327
|
| `lite` | 43 | 8 | Core methodology — verification, eval, flywheel, learning, recon, security, boilerplate |
|
|
328
|
-
| `core` |
|
|
329
|
-
| `full` |
|
|
328
|
+
| `core` | 110 | 23 | Full workflow — adds bootstrap, self-eval, llm, platform, research_writing, flicker_detection, figma_flow, benchmark, session_memory, toon, pattern, git_workflow, seo, voice_bridge, critter |
|
|
329
|
+
| `full` | 163 | 31 | Everything — adds vision, UI capture, web, GitHub, docs, parallel, local files, GAIA solvers |
|
|
330
330
|
|
|
331
331
|
```bash
|
|
332
332
|
# Meta — 5 tools (discovery-only: findTools, getMethodology, discover_tools, get_tool_quick_ref, get_workflow_chain)
|
|
@@ -336,10 +336,10 @@ claude mcp add nodebench -- npx -y nodebench-mcp --preset meta
|
|
|
336
336
|
# Lite — 43 tools (verification, eval, flywheel, learning, recon, security, boilerplate + meta + discovery)
|
|
337
337
|
claude mcp add nodebench -- npx -y nodebench-mcp --preset lite
|
|
338
338
|
|
|
339
|
-
# Core —
|
|
339
|
+
# Core — 110 tools (adds bootstrap, self-eval, llm, platform, research_writing, flicker_detection, figma_flow, benchmark, session_memory, toon, pattern, git_workflow, seo, voice_bridge, critter + meta + discovery)
|
|
340
340
|
claude mcp add nodebench -- npx -y nodebench-mcp --preset core
|
|
341
341
|
|
|
342
|
-
# Full — all
|
|
342
|
+
# Full — all 163 tools (default, TOON encoding on by default)
|
|
343
343
|
claude mcp add nodebench -- npx -y nodebench-mcp
|
|
344
344
|
```
|
|
345
345
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complex end-to-end tests for architect tools — exercises all 3 tools against
|
|
3
|
+
* real files in the monorepo with diverse patterns (React components, backend
|
|
4
|
+
* servers, MCP tool files) to verify accuracy at scale.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect } from "vitest";
|
|
7
|
+
import { architectTools } from "../tools/architectTools.js";
|
|
8
|
+
import { resolve } from "node:path";
|
|
9
|
+
const callTool = async (name, args) => {
|
|
10
|
+
const tool = architectTools.find((t) => t.name === name);
|
|
11
|
+
if (!tool)
|
|
12
|
+
throw new Error(`Tool not found: ${name}`);
|
|
13
|
+
return tool.handler(args);
|
|
14
|
+
};
|
|
15
|
+
// ── Real files in the monorepo ──────────────────────────────────────────────
|
|
16
|
+
/** React component with useState, useEffect, useRef, useCallback, framer-motion, lazy loading */
|
|
17
|
+
const MAIN_LAYOUT = resolve(import.meta.dirname, "../../../../src/components/MainLayout.tsx");
|
|
18
|
+
/** React component with useState, useEffect, useRef, useMemo, framer-motion, keyboard input */
|
|
19
|
+
const COMMAND_PALETTE = resolve(import.meta.dirname, "../../../../src/components/CommandPalette.tsx");
|
|
20
|
+
/** HTTP server with routes, middleware-like patterns, auth token check */
|
|
21
|
+
const HTTP_SERVER = resolve(import.meta.dirname, "../../../../mcp_tools/gateway_server/httpServer.ts");
|
|
22
|
+
/** MCP tool file — pure Node.js, SQLite, McpTool pattern, no React */
|
|
23
|
+
const SEO_TOOLS = resolve(import.meta.dirname, "../tools/seoTools.ts");
|
|
24
|
+
/** Progressive discovery — hybrid search, complex logic, no React */
|
|
25
|
+
const DISCOVERY_TOOLS = resolve(import.meta.dirname, "../tools/progressiveDiscoveryTools.ts");
|
|
26
|
+
// ── 1. scan_capabilities — React component (MainLayout) ────────────────────
|
|
27
|
+
describe("Architect Tools — Complex E2E: scan_capabilities", () => {
|
|
28
|
+
it("detects React hooks in MainLayout.tsx", async () => {
|
|
29
|
+
const r = (await callTool("scan_capabilities", {
|
|
30
|
+
file_path: MAIN_LAYOUT,
|
|
31
|
+
}));
|
|
32
|
+
// MainLayout imports useState, useEffect, useCallback
|
|
33
|
+
// Note: useRef regex requires `useRef<` (with generic) — MainLayout uses useRef() without generic
|
|
34
|
+
expect(r.state_management.effects).toBeGreaterThan(0); // has useEffect
|
|
35
|
+
expect(r.state_management.callbacks).toBeGreaterThan(0); // has useCallback
|
|
36
|
+
// imports
|
|
37
|
+
expect(r.imports.has_react).toBe(true);
|
|
38
|
+
expect(r.imports.count).toBeGreaterThan(5); // many imports
|
|
39
|
+
// framer-motion = animation
|
|
40
|
+
expect(r.interaction_patterns.animation).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
it("detects keyboard shortcuts in CommandPalette.tsx", async () => {
|
|
43
|
+
const r = (await callTool("scan_capabilities", {
|
|
44
|
+
file_path: COMMAND_PALETTE,
|
|
45
|
+
}));
|
|
46
|
+
// CommandPalette uses useState, useEffect, useRef, useMemo
|
|
47
|
+
expect(r.state_management.effects).toBeGreaterThan(0);
|
|
48
|
+
expect(r.state_management.memos).toBeGreaterThan(0);
|
|
49
|
+
expect(r.imports.has_react).toBe(true);
|
|
50
|
+
// framer-motion
|
|
51
|
+
expect(r.interaction_patterns.animation).toBe(true);
|
|
52
|
+
// dynamic lists (.map(() => ...))
|
|
53
|
+
expect(r.rendering_capabilities.dynamic_lists).toBeGreaterThan(0);
|
|
54
|
+
});
|
|
55
|
+
it("detects backend patterns in httpServer.ts", async () => {
|
|
56
|
+
const r = (await callTool("scan_capabilities", {
|
|
57
|
+
file_path: HTTP_SERVER,
|
|
58
|
+
}));
|
|
59
|
+
// No React
|
|
60
|
+
expect(r.imports.has_react).toBe(false);
|
|
61
|
+
expect(r.state_management.boolean_flags).toBe(0);
|
|
62
|
+
expect(r.state_management.effects).toBe(0);
|
|
63
|
+
// Has imports and exports
|
|
64
|
+
expect(r.imports.count).toBeGreaterThan(0);
|
|
65
|
+
// backend file characteristics
|
|
66
|
+
expect(r.file.lines).toBeGreaterThan(50);
|
|
67
|
+
});
|
|
68
|
+
it("detects MCP tool patterns in seoTools.ts", async () => {
|
|
69
|
+
const r = (await callTool("scan_capabilities", {
|
|
70
|
+
file_path: SEO_TOOLS,
|
|
71
|
+
}));
|
|
72
|
+
// No React — pure Node.js tool file
|
|
73
|
+
expect(r.imports.has_react).toBe(false);
|
|
74
|
+
expect(r.state_management.effects).toBe(0);
|
|
75
|
+
// Has named exports (the tools array)
|
|
76
|
+
expect(r.exports.named_exports).toBeGreaterThan(0);
|
|
77
|
+
// Has imports
|
|
78
|
+
expect(r.imports.count).toBeGreaterThan(0);
|
|
79
|
+
// dynamic lists (likely .map calls in the tool logic)
|
|
80
|
+
expect(r.rendering_capabilities.dynamic_lists).toBeGreaterThanOrEqual(0);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
// ── 2. verify_concept_support — concept verification at scale ───────────────
|
|
84
|
+
describe("Architect Tools — Complex E2E: verify_concept_support", () => {
|
|
85
|
+
it("verifies 'React SPA with Routing' against MainLayout → Fully Implemented", async () => {
|
|
86
|
+
const r = (await callTool("verify_concept_support", {
|
|
87
|
+
file_path: MAIN_LAYOUT,
|
|
88
|
+
concept_name: "React SPA with Routing",
|
|
89
|
+
required_signatures: [
|
|
90
|
+
"useState",
|
|
91
|
+
"useEffect",
|
|
92
|
+
"useCallback",
|
|
93
|
+
"useRef",
|
|
94
|
+
"from.*react",
|
|
95
|
+
],
|
|
96
|
+
}));
|
|
97
|
+
expect(r.status).toBe("Fully Implemented");
|
|
98
|
+
expect(r.match_score).toBe("100%");
|
|
99
|
+
expect(r.gap_analysis).toHaveLength(0);
|
|
100
|
+
expect(r.id).toMatch(/^cv_/);
|
|
101
|
+
});
|
|
102
|
+
it("verifies 'Animation System' against MainLayout → detects framer-motion", async () => {
|
|
103
|
+
const r = (await callTool("verify_concept_support", {
|
|
104
|
+
file_path: MAIN_LAYOUT,
|
|
105
|
+
concept_name: "Animation System",
|
|
106
|
+
required_signatures: [
|
|
107
|
+
"framer-motion",
|
|
108
|
+
"AnimatePresence",
|
|
109
|
+
"motion",
|
|
110
|
+
],
|
|
111
|
+
}));
|
|
112
|
+
expect(r.status).toBe("Fully Implemented");
|
|
113
|
+
expect(r.match_score).toBe("100%");
|
|
114
|
+
expect(r.evidence_found).toContain("framer-motion");
|
|
115
|
+
expect(r.evidence_found).toContain("AnimatePresence");
|
|
116
|
+
});
|
|
117
|
+
it("verifies 'WebSocket Support' against MainLayout → Not Implemented", async () => {
|
|
118
|
+
const r = (await callTool("verify_concept_support", {
|
|
119
|
+
file_path: MAIN_LAYOUT,
|
|
120
|
+
concept_name: "WebSocket Support",
|
|
121
|
+
required_signatures: [
|
|
122
|
+
"WebSocket",
|
|
123
|
+
"wss://",
|
|
124
|
+
"socket\\.on",
|
|
125
|
+
"onmessage",
|
|
126
|
+
],
|
|
127
|
+
}));
|
|
128
|
+
expect(r.status).toBe("Not Implemented");
|
|
129
|
+
expect(r.match_score).toBe("0%");
|
|
130
|
+
expect(r.gap_analysis).toHaveLength(4);
|
|
131
|
+
});
|
|
132
|
+
it("verifies 'MCP Tool Pattern' against seoTools → Fully Implemented", async () => {
|
|
133
|
+
const r = (await callTool("verify_concept_support", {
|
|
134
|
+
file_path: SEO_TOOLS,
|
|
135
|
+
concept_name: "MCP Tool Pattern",
|
|
136
|
+
required_signatures: [
|
|
137
|
+
"McpTool",
|
|
138
|
+
"name:",
|
|
139
|
+
"description:",
|
|
140
|
+
"inputSchema",
|
|
141
|
+
"handler",
|
|
142
|
+
],
|
|
143
|
+
}));
|
|
144
|
+
expect(r.status).toBe("Fully Implemented");
|
|
145
|
+
expect(r.match_score).toBe("100%");
|
|
146
|
+
expect(r.evidence_found).toHaveLength(5);
|
|
147
|
+
});
|
|
148
|
+
it("verifies 'Hybrid Search' against progressiveDiscoveryTools → detects search patterns", async () => {
|
|
149
|
+
const r = (await callTool("verify_concept_support", {
|
|
150
|
+
file_path: DISCOVERY_TOOLS,
|
|
151
|
+
concept_name: "Hybrid Search System",
|
|
152
|
+
required_signatures: [
|
|
153
|
+
"hybridSearch",
|
|
154
|
+
"score",
|
|
155
|
+
"keyword|fuzzy|prefix|semantic",
|
|
156
|
+
"WORKFLOW_CHAINS",
|
|
157
|
+
],
|
|
158
|
+
}));
|
|
159
|
+
expect(r.status).toBe("Fully Implemented");
|
|
160
|
+
expect(r.match_score).toBe("100%");
|
|
161
|
+
});
|
|
162
|
+
it("verifies 'GraphQL API' against httpServer → Not Implemented", async () => {
|
|
163
|
+
const r = (await callTool("verify_concept_support", {
|
|
164
|
+
file_path: HTTP_SERVER,
|
|
165
|
+
concept_name: "GraphQL API",
|
|
166
|
+
required_signatures: [
|
|
167
|
+
"typeDefs",
|
|
168
|
+
"resolvers",
|
|
169
|
+
"gql`",
|
|
170
|
+
"graphqlHTTP",
|
|
171
|
+
],
|
|
172
|
+
}));
|
|
173
|
+
expect(r.status).toBe("Not Implemented");
|
|
174
|
+
expect(r.match_score).toBe("0%");
|
|
175
|
+
expect(r.gap_analysis).toHaveLength(4);
|
|
176
|
+
});
|
|
177
|
+
it("handles partial implementation correctly (50-99%)", async () => {
|
|
178
|
+
// CommandPalette has useState, useEffect, useMemo but NOT useReducer or useContext
|
|
179
|
+
const r = (await callTool("verify_concept_support", {
|
|
180
|
+
file_path: COMMAND_PALETTE,
|
|
181
|
+
concept_name: "Advanced State Management",
|
|
182
|
+
required_signatures: [
|
|
183
|
+
"useState",
|
|
184
|
+
"useEffect",
|
|
185
|
+
"useMemo",
|
|
186
|
+
"useReducer",
|
|
187
|
+
"useContext",
|
|
188
|
+
],
|
|
189
|
+
}));
|
|
190
|
+
expect(r.status).toBe("Partially Implemented");
|
|
191
|
+
expect(parseInt(r.match_score)).toBe(60); // 3/5 = 60%
|
|
192
|
+
expect(r.evidence_found).toContain("useState");
|
|
193
|
+
expect(r.evidence_found).toContain("useEffect");
|
|
194
|
+
expect(r.evidence_found).toContain("useMemo");
|
|
195
|
+
expect(r.gap_analysis).toContain("useReducer");
|
|
196
|
+
expect(r.gap_analysis).toContain("useContext");
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
// ── 3. Full self-discovery loop: scan → verify → plan ───────────────────────
|
|
200
|
+
describe("Architect Tools — Complex E2E: Full Self-Discovery Loop", () => {
|
|
201
|
+
it("scan → verify → plan for 'Real-time Collaboration' on MainLayout", async () => {
|
|
202
|
+
// Step 1: Scan the file
|
|
203
|
+
const scan = (await callTool("scan_capabilities", {
|
|
204
|
+
file_path: MAIN_LAYOUT,
|
|
205
|
+
}));
|
|
206
|
+
expect(scan.file.lines).toBeGreaterThan(100);
|
|
207
|
+
// Step 2: Verify the concept
|
|
208
|
+
const verify = (await callTool("verify_concept_support", {
|
|
209
|
+
file_path: MAIN_LAYOUT,
|
|
210
|
+
concept_name: "Real-time Collaboration",
|
|
211
|
+
required_signatures: [
|
|
212
|
+
"WebSocket|socket\\.io",
|
|
213
|
+
"cursor.*position|presence",
|
|
214
|
+
"conflict.*resolution|CRDT",
|
|
215
|
+
"broadcast|emit",
|
|
216
|
+
],
|
|
217
|
+
}));
|
|
218
|
+
expect(verify.status).toBe("Not Implemented");
|
|
219
|
+
expect(verify.gap_analysis.length).toBeGreaterThan(0);
|
|
220
|
+
// Step 3: Generate implementation plan from the gaps
|
|
221
|
+
const plan = (await callTool("generate_implementation_plan", {
|
|
222
|
+
concept_name: "Real-time Collaboration",
|
|
223
|
+
missing_signatures: verify.gap_analysis,
|
|
224
|
+
current_context: JSON.stringify({
|
|
225
|
+
has_react: scan.imports.has_react,
|
|
226
|
+
has_effects: scan.state_management.effects > 0,
|
|
227
|
+
has_refs: scan.state_management.refs > 0,
|
|
228
|
+
has_animation: scan.interaction_patterns.animation,
|
|
229
|
+
}),
|
|
230
|
+
target_file: MAIN_LAYOUT,
|
|
231
|
+
}));
|
|
232
|
+
expect(plan.concept).toBe("Real-time Collaboration");
|
|
233
|
+
expect(plan.total_steps).toBe(verify.gap_analysis.length);
|
|
234
|
+
expect(plan.context_provided).toBe(true);
|
|
235
|
+
expect(plan.steps.length).toBe(verify.gap_analysis.length);
|
|
236
|
+
// Each step should have a strategy
|
|
237
|
+
for (const step of plan.steps) {
|
|
238
|
+
expect(step.strategy).toBeTruthy();
|
|
239
|
+
expect(step.requirement).toBeTruthy();
|
|
240
|
+
expect(step.conflicts).toContain("Review current context");
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
it("scan → verify → plan for 'Canvas Artifacts' on CommandPalette", async () => {
|
|
244
|
+
// Step 1: Scan
|
|
245
|
+
const scan = (await callTool("scan_capabilities", {
|
|
246
|
+
file_path: COMMAND_PALETTE,
|
|
247
|
+
}));
|
|
248
|
+
// Step 2: Verify
|
|
249
|
+
const verify = (await callTool("verify_concept_support", {
|
|
250
|
+
file_path: COMMAND_PALETTE,
|
|
251
|
+
concept_name: "Canvas Artifacts",
|
|
252
|
+
required_signatures: [
|
|
253
|
+
"canvas|Canvas",
|
|
254
|
+
"getContext\\(['\"]2d",
|
|
255
|
+
"drawImage|fillRect",
|
|
256
|
+
"useRef.*canvas",
|
|
257
|
+
"onMouseDown|onPointerDown",
|
|
258
|
+
],
|
|
259
|
+
}));
|
|
260
|
+
expect(verify.status).toBe("Not Implemented");
|
|
261
|
+
// Step 3: Plan
|
|
262
|
+
const plan = (await callTool("generate_implementation_plan", {
|
|
263
|
+
concept_name: "Canvas Artifacts",
|
|
264
|
+
missing_signatures: verify.gap_analysis,
|
|
265
|
+
current_context: `React component with ${scan.state_management.effects} effects, ${scan.state_management.memos} memos, animation: ${scan.interaction_patterns.animation}`,
|
|
266
|
+
target_file: COMMAND_PALETTE,
|
|
267
|
+
}));
|
|
268
|
+
expect(plan.total_steps).toBe(5);
|
|
269
|
+
expect(plan.estimated_complexity).toBe("medium"); // 5 steps = medium
|
|
270
|
+
expect(plan.workflow).toHaveLength(4);
|
|
271
|
+
});
|
|
272
|
+
it("scan → verify → plan for 'REST API with Auth' on httpServer", async () => {
|
|
273
|
+
// Step 1: Scan
|
|
274
|
+
const scan = (await callTool("scan_capabilities", {
|
|
275
|
+
file_path: HTTP_SERVER,
|
|
276
|
+
}));
|
|
277
|
+
// Step 2: Verify REST API with auth
|
|
278
|
+
const verify = (await callTool("verify_concept_support", {
|
|
279
|
+
file_path: HTTP_SERVER,
|
|
280
|
+
concept_name: "REST API with Authentication",
|
|
281
|
+
required_signatures: [
|
|
282
|
+
"http|express",
|
|
283
|
+
"createServer|listen",
|
|
284
|
+
"JSON\\.parse|json\\(",
|
|
285
|
+
"token|auth|bearer",
|
|
286
|
+
],
|
|
287
|
+
}));
|
|
288
|
+
// httpServer.ts should have most of these
|
|
289
|
+
expect(parseInt(verify.match_score)).toBeGreaterThanOrEqual(75);
|
|
290
|
+
// Step 3: Plan for any gaps
|
|
291
|
+
if (verify.gap_analysis.length > 0) {
|
|
292
|
+
const plan = (await callTool("generate_implementation_plan", {
|
|
293
|
+
concept_name: "REST API with Authentication",
|
|
294
|
+
missing_signatures: verify.gap_analysis,
|
|
295
|
+
current_context: JSON.stringify(scan.backend_patterns),
|
|
296
|
+
target_file: HTTP_SERVER,
|
|
297
|
+
}));
|
|
298
|
+
expect(plan.total_steps).toBe(verify.gap_analysis.length);
|
|
299
|
+
expect(plan.context_provided).toBe(true);
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
it("handles zero-gap scenario gracefully (plan with 0 steps)", async () => {
|
|
303
|
+
// Verify something that fully exists
|
|
304
|
+
const verify = (await callTool("verify_concept_support", {
|
|
305
|
+
file_path: SEO_TOOLS,
|
|
306
|
+
concept_name: "MCP Tool Pattern",
|
|
307
|
+
required_signatures: ["McpTool", "handler", "inputSchema"],
|
|
308
|
+
}));
|
|
309
|
+
expect(verify.status).toBe("Fully Implemented");
|
|
310
|
+
expect(verify.gap_analysis).toHaveLength(0);
|
|
311
|
+
// Plan with empty missing_signatures
|
|
312
|
+
const plan = (await callTool("generate_implementation_plan", {
|
|
313
|
+
concept_name: "MCP Tool Pattern",
|
|
314
|
+
missing_signatures: [],
|
|
315
|
+
target_file: SEO_TOOLS,
|
|
316
|
+
}));
|
|
317
|
+
expect(plan.total_steps).toBe(0);
|
|
318
|
+
expect(plan.steps).toHaveLength(0);
|
|
319
|
+
expect(plan.estimated_complexity).toBe("low");
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
// ── 4. Edge cases and stress tests ──────────────────────────────────────────
|
|
323
|
+
describe("Architect Tools — Complex E2E: Edge Cases", () => {
|
|
324
|
+
it("scan_capabilities handles large files (progressiveDiscoveryTools)", async () => {
|
|
325
|
+
const r = (await callTool("scan_capabilities", {
|
|
326
|
+
file_path: DISCOVERY_TOOLS,
|
|
327
|
+
}));
|
|
328
|
+
// Large file
|
|
329
|
+
expect(r.file.lines).toBeGreaterThan(200);
|
|
330
|
+
expect(r.file.sizeBytes).toBeGreaterThan(5000);
|
|
331
|
+
// Has exports
|
|
332
|
+
expect(r.exports.named_exports).toBeGreaterThan(0);
|
|
333
|
+
});
|
|
334
|
+
it("verify_concept_support handles regex-heavy signatures", async () => {
|
|
335
|
+
const r = (await callTool("verify_concept_support", {
|
|
336
|
+
file_path: DISCOVERY_TOOLS,
|
|
337
|
+
concept_name: "Search Engine Internals",
|
|
338
|
+
required_signatures: [
|
|
339
|
+
"toLowerCase\\(\\)",
|
|
340
|
+
"for \\(",
|
|
341
|
+
"hybridSearch",
|
|
342
|
+
"WORKFLOW_CHAINS",
|
|
343
|
+
],
|
|
344
|
+
}));
|
|
345
|
+
// Progressive discovery uses toLowerCase, for loops, hybridSearch function, WORKFLOW_CHAINS
|
|
346
|
+
expect(parseInt(r.match_score)).toBe(100);
|
|
347
|
+
});
|
|
348
|
+
it("generate_implementation_plan infers correct strategies for diverse patterns", async () => {
|
|
349
|
+
const r = (await callTool("generate_implementation_plan", {
|
|
350
|
+
concept_name: "Full Stack Feature",
|
|
351
|
+
missing_signatures: [
|
|
352
|
+
"useState",
|
|
353
|
+
"app.post(",
|
|
354
|
+
"db.prepare(",
|
|
355
|
+
"verifyToken",
|
|
356
|
+
"WebSocket",
|
|
357
|
+
"onKeyDown",
|
|
358
|
+
"navigator.clipboard",
|
|
359
|
+
],
|
|
360
|
+
current_context: "Empty file, starting from scratch",
|
|
361
|
+
}));
|
|
362
|
+
expect(r.total_steps).toBe(7);
|
|
363
|
+
expect(r.estimated_complexity).toBe("high"); // 7 steps > 5
|
|
364
|
+
// Verify each strategy maps to the correct category
|
|
365
|
+
const strategies = r.steps.map((s) => s.strategy);
|
|
366
|
+
expect(strategies[0]).toContain("React hook"); // useState
|
|
367
|
+
expect(strategies[1]).toContain("route"); // app.post
|
|
368
|
+
expect(strategies[2]).toContain("database"); // db.prepare
|
|
369
|
+
expect(strategies[3]).toContain("auth"); // verifyToken
|
|
370
|
+
expect(strategies[4]).toContain("WebSocket"); // WebSocket
|
|
371
|
+
expect(strategies[5]).toContain("keyboard"); // onKeyDown
|
|
372
|
+
expect(strategies[6]).toContain("clipboard"); // navigator.clipboard
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
//# sourceMappingURL=architectComplex.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architectComplex.test.js","sourceRoot":"","sources":["../../src/__tests__/architectComplex.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAY,EAAE,IAAS,EAAE,EAAE;IACjD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,+EAA+E;AAE/E,iGAAiG;AACjG,MAAM,WAAW,GAAG,OAAO,CACzB,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,2CAA2C,CAC5C,CAAC;AAEF,+FAA+F;AAC/F,MAAM,eAAe,GAAG,OAAO,CAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,+CAA+C,CAChD,CAAC;AAEF,0EAA0E;AAC1E,MAAM,WAAW,GAAG,OAAO,CACzB,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,oDAAoD,CACrD,CAAC;AAEF,sEAAsE;AACtE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;AAEvE,qEAAqE;AACrE,MAAM,eAAe,GAAG,OAAO,CAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,uCAAuC,CACxC,CAAC;AAEF,8EAA8E;AAE9E,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,mBAAmB,EAAE;YAC7C,SAAS,EAAE,WAAW;SACvB,CAAC,CAAQ,CAAC;QAEX,sDAAsD;QACtD,kGAAkG;QAClG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB;QACvE,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB;QAE3E,UAAU;QACV,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;QAE3D,4BAA4B;QAC5B,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,mBAAmB,EAAE;YAC7C,SAAS,EAAE,eAAe;SAC3B,CAAC,CAAQ,CAAC;QAEX,2DAA2D;QAC3D,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvC,gBAAgB;QAChB,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpD,kCAAkC;QAClC,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,mBAAmB,EAAE;YAC7C,SAAS,EAAE,WAAW;SACvB,CAAC,CAAQ,CAAC;QAEX,WAAW;QACX,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3C,0BAA0B;QAC1B,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAE3C,+BAA+B;QAC/B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,mBAAmB,EAAE;YAC7C,SAAS,EAAE,SAAS;SACrB,CAAC,CAAQ,CAAC;QAEX,oCAAoC;QACpC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3C,sCAAsC;QACtC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEnD,cAAc;QACd,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAE3C,sDAAsD;QACtD,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAE/E,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACrE,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YAClD,SAAS,EAAE,WAAW;YACtB,YAAY,EAAE,wBAAwB;YACtC,mBAAmB,EAAE;gBACnB,UAAU;gBACV,WAAW;gBACX,aAAa;gBACb,QAAQ;gBACR,aAAa;aACd;SACF,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC3C,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YAClD,SAAS,EAAE,WAAW;YACtB,YAAY,EAAE,kBAAkB;YAChC,mBAAmB,EAAE;gBACnB,eAAe;gBACf,iBAAiB;gBACjB,QAAQ;aACT;SACF,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC3C,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YAClD,SAAS,EAAE,WAAW;YACtB,YAAY,EAAE,mBAAmB;YACjC,mBAAmB,EAAE;gBACnB,WAAW;gBACX,QAAQ;gBACR,aAAa;gBACb,WAAW;aACZ;SACF,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YAClD,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,kBAAkB;YAChC,mBAAmB,EAAE;gBACnB,SAAS;gBACT,OAAO;gBACP,cAAc;gBACd,aAAa;gBACb,SAAS;aACV;SACF,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC3C,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;QACpG,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YAClD,SAAS,EAAE,eAAe;YAC1B,YAAY,EAAE,sBAAsB;YACpC,mBAAmB,EAAE;gBACnB,cAAc;gBACd,OAAO;gBACP,+BAA+B;gBAC/B,iBAAiB;aAClB;SACF,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC3C,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YAClD,SAAS,EAAE,WAAW;YACtB,YAAY,EAAE,aAAa;YAC3B,mBAAmB,EAAE;gBACnB,UAAU;gBACV,WAAW;gBACX,MAAM;gBACN,aAAa;aACd;SACF,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,mFAAmF;QACnF,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YAClD,SAAS,EAAE,eAAe;YAC1B,YAAY,EAAE,2BAA2B;YACzC,mBAAmB,EAAE;gBACnB,UAAU;gBACV,WAAW;gBACX,SAAS;gBACT,YAAY;gBACZ,YAAY;aACb;SACF,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY;QACtD,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAE/E,QAAQ,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACvE,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,wBAAwB;QACxB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,mBAAmB,EAAE;YAChD,SAAS,EAAE,WAAW;SACvB,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAE7C,6BAA6B;QAC7B,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YACvD,SAAS,EAAE,WAAW;YACtB,YAAY,EAAE,yBAAyB;YACvC,mBAAmB,EAAE;gBACnB,uBAAuB;gBACvB,2BAA2B;gBAC3B,2BAA2B;gBAC3B,gBAAgB;aACjB;SACF,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEtD,qDAAqD;QACrD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,8BAA8B,EAAE;YAC3D,YAAY,EAAE,yBAAyB;YACvC,kBAAkB,EAAE,MAAM,CAAC,YAAY;YACvC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC;gBAC9B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;gBACjC,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,GAAG,CAAC;gBAC9C,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC;gBACxC,aAAa,EAAE,IAAI,CAAC,oBAAoB,CAAC,SAAS;aACnD,CAAC;YACF,WAAW,EAAE,WAAW;SACzB,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAE3D,mCAAmC;QACnC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,eAAe;QACf,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,mBAAmB,EAAE;YAChD,SAAS,EAAE,eAAe;SAC3B,CAAC,CAAQ,CAAC;QAEX,iBAAiB;QACjB,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YACvD,SAAS,EAAE,eAAe;YAC1B,YAAY,EAAE,kBAAkB;YAChC,mBAAmB,EAAE;gBACnB,eAAe;gBACf,sBAAsB;gBACtB,oBAAoB;gBACpB,gBAAgB;gBAChB,2BAA2B;aAC5B;SACF,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE9C,eAAe;QACf,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,8BAA8B,EAAE;YAC3D,YAAY,EAAE,kBAAkB;YAChC,kBAAkB,EAAE,MAAM,CAAC,YAAY;YACvC,eAAe,EAAE,wBAAwB,IAAI,CAAC,gBAAgB,CAAC,OAAO,aAAa,IAAI,CAAC,gBAAgB,CAAC,KAAK,sBAAsB,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE;YACzK,WAAW,EAAE,eAAe;SAC7B,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB;QACrE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,eAAe;QACf,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,mBAAmB,EAAE;YAChD,SAAS,EAAE,WAAW;SACvB,CAAC,CAAQ,CAAC;QAEX,oCAAoC;QACpC,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YACvD,SAAS,EAAE,WAAW;YACtB,YAAY,EAAE,8BAA8B;YAC5C,mBAAmB,EAAE;gBACnB,cAAc;gBACd,qBAAqB;gBACrB,sBAAsB;gBACtB,mBAAmB;aACpB;SACF,CAAC,CAAQ,CAAC;QAEX,0CAA0C;QAC1C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAEhE,4BAA4B;QAC5B,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,8BAA8B,EAAE;gBAC3D,YAAY,EAAE,8BAA8B;gBAC5C,kBAAkB,EAAE,MAAM,CAAC,YAAY;gBACvC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC;gBACtD,WAAW,EAAE,WAAW;aACzB,CAAC,CAAQ,CAAC;YAEX,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,qCAAqC;QACrC,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YACvD,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,kBAAkB;YAChC,mBAAmB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC;SAC3D,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE5C,qCAAqC;QACrC,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,8BAA8B,EAAE;YAC3D,YAAY,EAAE,kBAAkB;YAChC,kBAAkB,EAAE,EAAE;YACtB,WAAW,EAAE,SAAS;SACvB,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAE/E,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,mBAAmB,EAAE;YAC7C,SAAS,EAAE,eAAe;SAC3B,CAAC,CAAQ,CAAC;QAEX,aAAa;QACb,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,cAAc;QACd,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YAClD,SAAS,EAAE,eAAe;YAC1B,YAAY,EAAE,yBAAyB;YACvC,mBAAmB,EAAE;gBACnB,mBAAmB;gBACnB,SAAS;gBACT,cAAc;gBACd,iBAAiB;aAClB;SACF,CAAC,CAAQ,CAAC;QAEX,4FAA4F;QAC5F,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,8BAA8B,EAAE;YACxD,YAAY,EAAE,oBAAoB;YAClC,kBAAkB,EAAE;gBAClB,UAAU;gBACV,WAAW;gBACX,aAAa;gBACb,aAAa;gBACb,WAAW;gBACX,WAAW;gBACX,qBAAqB;aACtB;YACD,eAAe,EAAE,mCAAmC;SACrD,CAAC,CAAQ,CAAC;QAEX,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc;QAE3D,oDAAoD;QACpD,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW;QAC1D,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW;QACrD,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa;QAC1D,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc;QACvD,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;QAC1D,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY;QACzD,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,sBAAsB;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smoke test for architect tools — runs all 3 tools against real files.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
5
|
+
import { architectTools } from "../tools/architectTools.js";
|
|
6
|
+
import { resolve } from "node:path";
|
|
7
|
+
const callTool = async (name, args) => {
|
|
8
|
+
const tool = architectTools.find((t) => t.name === name);
|
|
9
|
+
if (!tool)
|
|
10
|
+
throw new Error(`Tool not found: ${name}`);
|
|
11
|
+
return tool.handler(args);
|
|
12
|
+
};
|
|
13
|
+
// Use a known file in the repo
|
|
14
|
+
const FIXTURE_PATH = resolve(import.meta.dirname, "../tools/critterTools.ts");
|
|
15
|
+
describe("Architect Tools — Smoke Tests", () => {
|
|
16
|
+
it("scan_capabilities returns structured capability report", async () => {
|
|
17
|
+
const result = (await callTool("scan_capabilities", {
|
|
18
|
+
file_path: FIXTURE_PATH,
|
|
19
|
+
}));
|
|
20
|
+
console.log("scan_capabilities result:", JSON.stringify(result, null, 2));
|
|
21
|
+
// Should have all top-level sections
|
|
22
|
+
expect(result.file).toBeDefined();
|
|
23
|
+
expect(result.file.path).toBe(FIXTURE_PATH);
|
|
24
|
+
expect(result.file.lines).toBeGreaterThan(0);
|
|
25
|
+
expect(result.state_management).toBeDefined();
|
|
26
|
+
expect(result.layout_structure).toBeDefined();
|
|
27
|
+
expect(result.interaction_patterns).toBeDefined();
|
|
28
|
+
expect(result.rendering_capabilities).toBeDefined();
|
|
29
|
+
expect(result.backend_patterns).toBeDefined();
|
|
30
|
+
expect(result.imports).toBeDefined();
|
|
31
|
+
expect(result.exports).toBeDefined();
|
|
32
|
+
// critterTools.ts should have some imports and exports
|
|
33
|
+
expect(result.imports.count).toBeGreaterThan(0);
|
|
34
|
+
expect(result.exports.named_exports).toBeGreaterThan(0);
|
|
35
|
+
});
|
|
36
|
+
it("verify_concept_support detects patterns and persists to SQLite", async () => {
|
|
37
|
+
const result = (await callTool("verify_concept_support", {
|
|
38
|
+
file_path: FIXTURE_PATH,
|
|
39
|
+
concept_name: "SQLite Persistence",
|
|
40
|
+
required_signatures: [
|
|
41
|
+
"getDb",
|
|
42
|
+
"CREATE TABLE",
|
|
43
|
+
"db\\.prepare",
|
|
44
|
+
"McpTool",
|
|
45
|
+
],
|
|
46
|
+
}));
|
|
47
|
+
console.log("verify_concept_support result:", JSON.stringify(result, null, 2));
|
|
48
|
+
expect(result.concept).toBe("SQLite Persistence");
|
|
49
|
+
expect(result.status).toBe("Fully Implemented");
|
|
50
|
+
expect(result.match_score).toBe("100%");
|
|
51
|
+
expect(result.evidence_found).toHaveLength(4);
|
|
52
|
+
expect(result.gap_analysis).toHaveLength(0);
|
|
53
|
+
expect(result.id).toMatch(/^cv_/);
|
|
54
|
+
});
|
|
55
|
+
it("verify_concept_support reports gaps correctly", async () => {
|
|
56
|
+
const result = (await callTool("verify_concept_support", {
|
|
57
|
+
file_path: FIXTURE_PATH,
|
|
58
|
+
concept_name: "React UI Component",
|
|
59
|
+
required_signatures: [
|
|
60
|
+
"useState",
|
|
61
|
+
"useEffect",
|
|
62
|
+
"return.*<div",
|
|
63
|
+
"export default",
|
|
64
|
+
],
|
|
65
|
+
}));
|
|
66
|
+
console.log("verify_concept_support (gaps) result:", JSON.stringify(result, null, 2));
|
|
67
|
+
expect(result.status).toBe("Not Implemented");
|
|
68
|
+
expect(result.gap_analysis.length).toBeGreaterThan(0);
|
|
69
|
+
expect(parseInt(result.match_score)).toBeLessThan(50);
|
|
70
|
+
});
|
|
71
|
+
it("generate_implementation_plan builds structured plan", async () => {
|
|
72
|
+
const result = (await callTool("generate_implementation_plan", {
|
|
73
|
+
concept_name: "Dark Mode Toggle",
|
|
74
|
+
missing_signatures: [
|
|
75
|
+
"prefers-color-scheme",
|
|
76
|
+
"theme.*dark",
|
|
77
|
+
"useEffect",
|
|
78
|
+
],
|
|
79
|
+
current_context: "File has getDb import, McpTool exports, no React hooks",
|
|
80
|
+
target_file: FIXTURE_PATH,
|
|
81
|
+
}));
|
|
82
|
+
console.log("generate_implementation_plan result:", JSON.stringify(result, null, 2));
|
|
83
|
+
expect(result.concept).toBe("Dark Mode Toggle");
|
|
84
|
+
expect(result.total_steps).toBe(3);
|
|
85
|
+
expect(result.steps).toHaveLength(3);
|
|
86
|
+
expect(result.steps[0].requirement).toBe("prefers-color-scheme");
|
|
87
|
+
expect(result.steps[0].strategy).toBeTruthy();
|
|
88
|
+
expect(result.workflow).toHaveLength(4);
|
|
89
|
+
expect(result.context_provided).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=architectSmoke.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architectSmoke.test.js","sourceRoot":"","sources":["../../src/__tests__/architectSmoke.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAY,EAAE,IAAS,EAAE,EAAE;IACjD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,+BAA+B;AAC/B,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;AAE9E,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,mBAAmB,EAAE;YAClD,SAAS,EAAE,YAAY;SACxB,CAAC,CAAQ,CAAC;QAEX,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE1E,qCAAqC;QACrC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,WAAW,EAAE,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAErC,uDAAuD;QACvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YACvD,SAAS,EAAE,YAAY;YACvB,YAAY,EAAE,oBAAoB;YAClC,mBAAmB,EAAE;gBACnB,OAAO;gBACP,cAAc;gBACd,cAAc;gBACd,SAAS;aACV;SACF,CAAC,CAAQ,CAAC;QAEX,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,wBAAwB,EAAE;YACvD,SAAS,EAAE,YAAY;YACvB,YAAY,EAAE,oBAAoB;YAClC,mBAAmB,EAAE;gBACnB,UAAU;gBACV,WAAW;gBACX,cAAc;gBACd,gBAAgB;aACjB;SACF,CAAC,CAAQ,CAAC;QAEX,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEtF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,8BAA8B,EAAE;YAC7D,YAAY,EAAE,kBAAkB;YAChC,kBAAkB,EAAE;gBAClB,sBAAsB;gBACtB,aAAa;gBACb,WAAW;aACZ;YACD,eAAe,EAAE,wDAAwD;YACzE,WAAW,EAAE,YAAY;SAC1B,CAAC,CAAQ,CAAC;QAEX,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAErF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|