mcp-architector 1.5.0 → 1.6.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 (58) hide show
  1. package/README.md +86 -15
  2. package/README_RU.md +56 -11
  3. package/dist/agent-hints.d.ts +10 -0
  4. package/dist/agent-hints.d.ts.map +1 -0
  5. package/dist/agent-hints.js +42 -0
  6. package/dist/agent-hints.js.map +1 -0
  7. package/dist/data-flow.d.ts +22 -0
  8. package/dist/data-flow.d.ts.map +1 -0
  9. package/dist/data-flow.js +232 -0
  10. package/dist/data-flow.js.map +1 -0
  11. package/dist/data-flow.test.d.ts +2 -0
  12. package/dist/data-flow.test.d.ts.map +1 -0
  13. package/dist/data-flow.test.js.map +1 -0
  14. package/dist/entry-coverage.d.ts +6 -0
  15. package/dist/entry-coverage.d.ts.map +1 -0
  16. package/dist/entry-coverage.js +81 -0
  17. package/dist/entry-coverage.js.map +1 -0
  18. package/dist/entry-coverage.test.d.ts +2 -0
  19. package/dist/entry-coverage.test.d.ts.map +1 -0
  20. package/dist/entry-coverage.test.js.map +1 -0
  21. package/dist/entry-sync.d.ts +4 -0
  22. package/dist/entry-sync.d.ts.map +1 -0
  23. package/dist/entry-sync.js +42 -0
  24. package/dist/entry-sync.js.map +1 -0
  25. package/dist/index.js +373 -36
  26. package/dist/index.js.map +1 -1
  27. package/dist/project-validate.d.ts +10 -0
  28. package/dist/project-validate.d.ts.map +1 -0
  29. package/dist/project-validate.js +189 -0
  30. package/dist/project-validate.js.map +1 -0
  31. package/dist/project-validate.test.d.ts +2 -0
  32. package/dist/project-validate.test.d.ts.map +1 -0
  33. package/dist/project-validate.test.js.map +1 -0
  34. package/dist/slices.d.ts +1 -0
  35. package/dist/slices.d.ts.map +1 -1
  36. package/dist/slices.js +15 -1
  37. package/dist/slices.js.map +1 -1
  38. package/dist/tools-entries-slices.d.ts +38 -0
  39. package/dist/tools-entries-slices.d.ts.map +1 -1
  40. package/dist/tools-entries-slices.js +128 -36
  41. package/dist/tools-entries-slices.js.map +1 -1
  42. package/dist/types.d.ts +49 -0
  43. package/dist/types.d.ts.map +1 -1
  44. package/package.json +3 -2
  45. package/scripts/test-all-api.sh +14 -4
  46. package/server.json +2 -2
  47. package/src/agent-hints.ts +59 -0
  48. package/src/data-flow.test.ts +178 -0
  49. package/src/data-flow.ts +288 -0
  50. package/src/entry-coverage.test.ts +90 -0
  51. package/src/entry-coverage.ts +104 -0
  52. package/src/entry-sync.ts +54 -0
  53. package/src/index.ts +456 -35
  54. package/src/project-validate.test.ts +107 -0
  55. package/src/project-validate.ts +250 -0
  56. package/src/slices.ts +16 -1
  57. package/src/tools-entries-slices.ts +155 -37
  58. package/src/types.ts +56 -0
package/README.md CHANGED
@@ -66,21 +66,38 @@ Store and manage project architecture, modules, scripts, data flow, and usage ex
66
66
 
67
67
  | Layer | Purpose | Tools |
68
68
  |-------|---------|-------|
69
- | **Modules** | Vertical structure: components, dependencies, dataFlow | `set-project-architecture`, `set-module-details`, |
70
- | **Entries** | Single source of truth for horizontal facts (one fact = one file) | `set-entry`, `get-entry`, `list-entries` |
69
+ | **Modules** | Vertical structure: components, dependencies, dataFlow | `set-project-architecture`, `set-module-details`, `set-module-data-flow`, `rebuild-data-flow`, `validate-architecture` |
70
+ | **Entries** | Single source of truth for horizontal facts (one fact = one file) | `set-entry`, `set-entries`, `get-entry`, `list-entries` |
71
71
  | **Slices** | Read-only views over entries (built-in or custom filters) | `list-slices`, `get-slice` |
72
72
 
73
73
  **Anti-patterns (no duplication):** Do not copy `module.description` into `entry.summary`. Link with `refs.moduleName`. Slices never store item copies—only filters in `slices/*.json`.
74
74
 
75
+ **Do not edit `~/.mcp-architector` directly** — always use MCP tools so timestamps, merge semantics, and dataFlow inverse sync stay consistent.
76
+
75
77
  ## Agent workflow
76
78
 
77
79
  1. `list-projects` — confirm `projectId` if data looks empty or wrong.
78
- 2. **Structure task** → `get-project-architecture` / `set-module-details`.
79
- 3. **Discover a fact** (endpoint, table, term) `set-entry` once.
80
- 4. **Need a category** (all APIs, all domain terms) → `list-slices` → `get-slice` with `format=compact` or `table`.
81
- 5. **Find by name** `search-entries` → `get-entry` for full payload.
82
-
83
- Example: `set-entry` with `kind=http-endpoint`, `title=POST /orders`, then `get-slice` `sliceId=api` `format=table`.
80
+ 2. **Structure task** → `get-project-architecture` / `set-project-architecture`.
81
+ 3. **Each module** → `set-module-details` with `files` + **`facts[]`** (endpoints, entities, glossary) in the same call, or `set-entries` / `set-entry` with `refs.moduleName`.
82
+ 4. **Single module graph edge** → `set-module-data-flow`.
83
+ 5. **Bulk rebuild flow (many modules)** → `rebuild-data-flow`.
84
+ 6. **After edits, verify everything** → `validate` (summary + `issues[]`; no full project load).
85
+ 7. **Need a category** (all APIs, all domain terms) → `list-slices` `get-slice` with `format=compact` or `table`; use `offset` when `hasMore` is true.
86
+ 8. **Find by name** → `search-entries` → `get-entry` for full payload.
87
+
88
+ | Scenario | Tool |
89
+ |----------|------|
90
+ | Update one module + its APIs/facts | `set-module-details` with `facts[]` |
91
+ | Bulk facts for a domain | `set-entries` with `moduleName` |
92
+ | Patch dataFlow for one module | `set-module-data-flow` |
93
+ | Rebuild all module edges | `rebuild-data-flow` |
94
+ | Diagnose graph + empty slices | `validate` (or `validate-architecture`) |
95
+ | Index out of sync | `rebuild-entry-index` |
96
+ | Create project from scratch | `set-project-architecture` with `replaceModules: true` |
97
+
98
+ **Full project picture:** modules alone do not populate slices — without `http-endpoint` (and other kinds) entries, slice `api` stays empty. New module → add `facts` or entries in the same step.
99
+
100
+ Example: `set-module-details` with `facts: [{ kind: "http-endpoint", title: "POST /orders", ... }]`, then `get-slice` `sliceId=api` `format=table`.
84
101
 
85
102
  ## Quick Start
86
103
 
@@ -241,7 +258,7 @@ When calling tools, you can:
241
258
 
242
259
  ### set-project-architecture
243
260
 
244
- Creates or updates the overall architecture for a project.
261
+ Creates or updates the overall architecture for a project. **By default merges** modules and dataFlow by name; omit `dataFlow` to preserve existing flow. `dependsOn` is canonical; `providesTo` is recomputed on save.
245
262
 
246
263
  **Input:**
247
264
  - `projectId` (optional): Project ID (defaults to "default-project")
@@ -251,12 +268,14 @@ Creates or updates the overall architecture for a project.
251
268
  - `description`: Brief description of the module
252
269
  - `inputs` (optional): What this module requires to work
253
270
  - `outputs` (optional): What this module produces or generates
254
- - `dataFlow` (optional): Object describing data flow between modules:
271
+ - `dataFlow` (optional): Object describing data flow between modules (omit to keep existing):
255
272
  - Key: module name
256
273
  - Value: object with:
257
274
  - `dependsOn` (optional): Array of module names this module depends on
258
- - `providesTo` (optional): Array of module names that receive data from this module
275
+ - `providesTo` (optional): Derived on save from all `dependsOn` edges
259
276
  - `dataTransformation` (optional): How data is transformed between modules
277
+ - `replaceModules` (optional): Replace entire modules list (default `false` = merge by name)
278
+ - `replaceDataFlow` (optional): Replace entire dataFlow (default `false` = merge by module name)
260
279
 
261
280
  **Output:**
262
281
  - Project ID and success message
@@ -285,15 +304,17 @@ Lists all projects in local storage (`~/.mcp-architector`). Use when the workspa
285
304
 
286
305
  | Tool | Purpose |
287
306
  |------|---------|
288
- | `set-entry` | Upsert one fact (`kind`, `title`, `summary`, optional `payload`, `refs`, `tags`) |
307
+ | `set-entry` | Upsert one fact; response may include `reminder` if modules missing or unlinked |
308
+ | `set-entries` | Bulk upsert (max 200); optional `moduleName` sets `refs.moduleName` on all |
289
309
  | `get-entry` | Full entry by `id` |
290
310
  | `delete-entry` | Remove entry |
291
311
  | `list-entries` | Catalog without payload; filter by `kind`, `tags`, `query` |
292
312
  | `search-entries` | Text search in title, summary, kind, tags |
293
313
  | `list-slices` | Built-in + custom slices with entry counts |
294
- | `get-slice` | Filtered view: `sliceId`, `format` (`compact`/`detail`/`table`), `query`, `limit` |
314
+ | `get-slice` | Filtered view: `sliceId`, `format`, `query`, `limit`, `offset`, `hasMore` |
295
315
  | `set-slice` | Save custom filter (`kinds`, `tags`) — no items |
296
316
  | `delete-slice` | Remove custom slice |
317
+ | `rebuild-entry-index` | Rebuild `entries/index.json` from entry files |
297
318
 
298
319
  **Built-in `sliceId` values:** `api`, `persistence`, `events`, `domain`, `flows`, `integrations`, `config`, `runtime`, `decisions`, `scripts`.
299
320
 
@@ -308,7 +329,7 @@ Lists all projects in local storage (`~/.mcp-architector`). Use when the workspa
308
329
 
309
330
  ### set-module-details
310
331
 
311
- Creates or updates detailed information about a module.
332
+ Creates or updates detailed information about a module. **Slices read entries, not module text** — pass `facts[]` to create linked entries in one call.
312
333
 
313
334
  **Input:**
314
335
  - `projectId` (optional): Project ID
@@ -316,8 +337,9 @@ Creates or updates detailed information about a module.
316
337
  - `description`: Detailed description of the module
317
338
  - `inputs`: What the module accepts as input
318
339
  - `outputs`: What the module produces as output
319
- - `dependencies` (optional): List of module dependencies
340
+ - `dependencies` (optional): List of module dependencies (syncs to `dataFlow.dependsOn` when provided)
320
341
  - `files` (optional): List of files belonging to this module
342
+ - `facts` (optional): Array of horizontal facts (`kind`, `title`, `summary`, …) — each upserted as entry with `refs.moduleName` = module name
321
343
  - `usageExamples` (optional): Array of usage examples with fields:
322
344
  - `title`: Example title
323
345
  - `description` (optional): Description of the example
@@ -330,6 +352,55 @@ Creates or updates detailed information about a module.
330
352
  **Output:**
331
353
  - Module ID and success message
332
354
 
355
+ ### set-module-data-flow
356
+
357
+ Patches `dataFlow` for a single module without sending the full architecture.
358
+
359
+ **Input:**
360
+ - `projectId` (optional): Project ID
361
+ - `moduleName`: Module name
362
+ - `dependsOn` (optional): Modules this module depends on (canonical)
363
+ - `dataTransformation` (optional): How data is transformed
364
+ - `syncInverse` (optional): Recompute `providesTo` (default `true`)
365
+
366
+ **Output:**
367
+ - Module name and success message
368
+
369
+ ### rebuild-data-flow
370
+
371
+ Rebuilds `dataFlow` for all modules from module file `dependencies` or existing `dependsOn` edges. Replaces bulk manual edits to `architecture.json`.
372
+
373
+ **Input:**
374
+ - `projectId` (optional): Project ID
375
+ - `source` (optional): `module-dependencies` (default) or `dataFlow-dependsOn`
376
+ - `syncInverse` (optional): Recompute `providesTo` (default `true`)
377
+ - `pruneOrphans` (optional): Remove invalid module references (default `true`)
378
+
379
+ **Output:**
380
+ - `edgesAdded`, `edgesRemoved`, `modulesUpdated`, message
381
+
382
+ ### validate
383
+
384
+ **Primary post-edit check.** Read-only validation with a compact agent-friendly report. Does not modify data.
385
+
386
+ **Checks (only rules we can verify from stored JSON):**
387
+ - dataFlow: inverse drift, dangling `dependsOn`/`providesTo`, orphan flow keys
388
+ - `module.dependencies` vs `dataFlow.dependsOn`
389
+ - entries: `entries-without-modules`, `entry-unlinked`, `orphan-entry-module`, `module-no-entries`, `module-missing-api` / `module-missing-persistence`
390
+ - storage: missing `modules/{id}.json`, orphan module files, entry index drift
391
+ - slices: empty built-in `api` / `domain` / `persistence` when modules exist
392
+
393
+ **Input:** `projectId`, `checkInverse`, `checkModuleDeps`, `checkEntryCoverage`, `checkStorage`, `checkEmptySlices` (all default `true`)
394
+
395
+ **Output:** `valid`, `issueCount`, `summary`, `stats`, `issuesByKind`, `issues[]`, `coverage`, `checksRun`
396
+
397
+ ### validate-architecture
398
+
399
+ Same as `validate` (legacy alias). Prefer `validate` after edits.
400
+
401
+ **Output:**
402
+ - `valid` (boolean), `issues` array
403
+
333
404
  ### get-module-details
334
405
 
335
406
  Retrieves detailed information about a specific module.
package/README_RU.md CHANGED
@@ -66,19 +66,36 @@
66
66
 
67
67
  | Слой | Назначение | Инструменты |
68
68
  |------|------------|-------------|
69
- | **Модули** | Вертикальная структура: компоненты, dataFlow | `set-project-architecture`, `set-module-details`, |
70
- | **Entries** | Единственный источник фактов (один факт = один файл) | `set-entry`, `get-entry`, `list-entries` |
69
+ | **Модули** | Вертикальная структура: компоненты, dataFlow | `set-project-architecture`, `set-module-details`, `set-module-data-flow`, `rebuild-data-flow`, `validate-architecture` |
70
+ | **Entries** | Единственный источник фактов (один факт = один файл) | `set-entry`, `set-entries`, `get-entry`, `list-entries` |
71
71
  | **Slices** | Представления над entries (встроенные или свои фильтры) | `list-slices`, `get-slice` |
72
72
 
73
73
  **Анти-паттерны:** не копировать `module.description` в `entry.summary`; связь через `refs.moduleName`. Срезы не хранят копии items.
74
74
 
75
+ **Не редактируйте `~/.mcp-architector` напрямую** — используйте MCP tools, чтобы сохранялись timestamps, merge-семантика и синхронизация inverse для dataFlow.
76
+
75
77
  ## Сценарий для агента
76
78
 
77
79
  1. `list-projects` — проверить `projectId`.
78
- 2. Задача по структуре → `get-project-architecture` / `set-module-details`.
79
- 3. Обнаружен факт → `set-entry`.
80
- 4. Нужна категория (все API, домен) → `list-slices` → `get-slice`.
81
- 5. Поиск по имени → `search-entries` → `get-entry`.
80
+ 2. Структура → `get-project-architecture` / `set-project-architecture`.
81
+ 3. **Каждый модуль** → `set-module-details` с `files` + **`facts[]`** (API, entity, glossary) в одном вызове, или `set-entries` / `set-entry` с `refs.moduleName`.
82
+ 4. Граф одного модуля → `set-module-data-flow`.
83
+ 5. Массовый пересчёт flow → `rebuild-data-flow`.
84
+ 6. После правок → `validate` (краткий отчёт и `issues[]`, без загрузки всего проекта).
85
+ 7. Категория (все API, домен) → `list-slices` → `get-slice`; при `hasMore` — `offset`.
86
+ 8. Поиск по имени → `search-entries` → `get-entry`.
87
+
88
+ | Сценарий | Tool |
89
+ |----------|------|
90
+ | Модуль + его факты | `set-module-details` с `facts[]` |
91
+ | Массовые факты | `set-entries` с `moduleName` |
92
+ | Patch dataFlow одного модуля | `set-module-data-flow` |
93
+ | Пересчитать все рёбра | `rebuild-data-flow` |
94
+ | Проверка после правок | `validate` |
95
+ | Рассинхрон index | `rebuild-entry-index` |
96
+ | Проект с нуля | `set-project-architecture` с `replaceModules: true` |
97
+
98
+ **Полная картина проекта:** одних модулей недостаточно для slices — без entries с `http-endpoint` срез `api` пуст. Новый модуль → `facts` или entries в том же шаге.
82
99
 
83
100
  ## Быстрый старт
84
101
 
@@ -238,13 +255,15 @@ npm run inspector
238
255
 
239
256
  ### set-project-architecture
240
257
 
241
- Создаёт или обновляет общую архитектуру проекта.
258
+ Создаёт или обновляет общую архитектуру проекта. **По умолчанию merge** modules и dataFlow по имени; omit `dataFlow` сохраняет существующий flow. `dependsOn` — канон; `providesTo` пересчитывается при сохранении.
242
259
 
243
260
  **Вход:**
244
261
  - `projectId` (опц.): ID проекта (по умолчанию "default-project")
245
262
  - `description`: Описание проекта
246
263
  - `modules`: Массив модулей с полями `name`, `description`, `inputs`, `outputs`
247
- - `dataFlow` (опц.): Поток данных между модулями
264
+ - `dataFlow` (опц.): Поток данных между модулями (omit — сохранить существующий)
265
+ - `replaceModules` (опц.): Полная замена списка модулей (default `false` = merge)
266
+ - `replaceDataFlow` (опц.): Полная замена dataFlow (default `false` = merge)
248
267
 
249
268
  **Выход:** ID проекта и сообщение об успехе
250
269
 
@@ -266,14 +285,16 @@ npm run inspector
266
285
 
267
286
  | Tool | Назначение |
268
287
  |------|------------|
269
- | `set-entry` | Upsert факта: `kind`, `title`, `summary`, `payload`, `refs`, `tags` |
288
+ | `set-entry` | Upsert факта; в ответе `reminder`, если нет модулей или нет `refs.moduleName` |
289
+ | `set-entries` | Массовый upsert (до 200); `moduleName` проставляет `refs.moduleName` |
270
290
  | `get-entry` | Полная entry по `id` |
271
291
  | `delete-entry` | Удаление |
272
292
  | `list-entries` | Каталог без payload |
273
293
  | `search-entries` | Поиск по тексту |
274
294
  | `list-slices` | Встроенные и custom срезы |
275
- | `get-slice` | Срез: `sliceId`, `format`, `query`, `limit` |
295
+ | `get-slice` | Срез: `sliceId`, `format`, `query`, `limit`, `offset`, `hasMore` |
276
296
  | `set-slice` / `delete-slice` | Custom фильтр (без items) |
297
+ | `rebuild-entry-index` | Пересборка `entries/index.json` |
277
298
 
278
299
  **Встроенные sliceId:** `api`, `persistence`, `events`, `domain`, `flows`, `integrations`, `config`, `runtime`, `decisions`, `scripts`.
279
300
 
@@ -281,7 +302,31 @@ npm run inspector
281
302
 
282
303
  ### set-module-details
283
304
 
284
- Создаёт или обновляет детали модуля.
305
+ Создаёт или обновляет детали модуля. Срезы читают **entries**, не текст модуля — передавайте `facts[]` для API/домена в том же вызове. При `dependencies` синхронизирует `dataFlow.dependsOn`.
306
+
307
+ ### set-module-data-flow
308
+
309
+ Patch `dataFlow` одного модуля: `moduleName`, `dependsOn`, `dataTransformation`, `syncInverse`.
310
+
311
+ ### rebuild-data-flow
312
+
313
+ Пересборка `dataFlow` для всех модулей из `dependencies` в module files или из `dependsOn`. Замена массовой правки `architecture.json`.
314
+
315
+ **Вход:** `source` (`module-dependencies` | `dataFlow-dependsOn`), `syncInverse`, `pruneOrphans`.
316
+
317
+ **Выход:** `edgesAdded`, `edgesRemoved`, `modulesUpdated`.
318
+
319
+ ### validate
320
+
321
+ **Главная проверка после правок.** Read-only отчёт для агента: `summary`, `stats`, `issuesByKind`, `issues[]` — не нужно тянуть весь проект.
322
+
323
+ **Проверяет:** dataFlow, связь модуль↔entry, файлы модулей, рассинхрон index, пустые срезы api/domain/persistence.
324
+
325
+ **Выход:** `valid`, `issueCount`, `summary`, `coverage`, `checksRun`.
326
+
327
+ ### validate-architecture
328
+
329
+ То же, что `validate` (алиас). Предпочтительно вызывать `validate`.
285
330
 
286
331
  ### get-module-details
287
332
 
@@ -0,0 +1,10 @@
1
+ export declare const MODULE_ENTRIES_REMINDER: string;
2
+ export declare const ENTRIES_MODULE_REMINDER: string;
3
+ export declare function suggestKindsFromFiles(files: string[]): string[];
4
+ export interface EntryLinkHints {
5
+ reminder?: string;
6
+ warning?: string;
7
+ suggestedModuleNames?: string[];
8
+ }
9
+ export declare function buildEntryLinkHints(moduleNames: string[], refsModuleName?: string): EntryLinkHints;
10
+ //# sourceMappingURL=agent-hints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-hints.d.ts","sourceRoot":"","sources":["../src/agent-hints.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,QAIgC,CAAC;AAErE,eAAO,MAAM,uBAAuB,QAG0D,CAAC;AAE/F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAgB/D;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EAAE,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,cAAc,CAoBhB"}
@@ -0,0 +1,42 @@
1
+ export const MODULE_ENTRIES_REMINDER = 'After saving a module, add horizontal facts as entries (or pass facts[] here): ' +
2
+ 'http-endpoint for controllers, entity/repository for persistence, glossary for domain. ' +
3
+ 'Slices (api, domain, persistence) read entries only—modules alone leave slices empty. ' +
4
+ 'Link via refs.moduleName; use list-slices for recommended kinds.';
5
+ export const ENTRIES_MODULE_REMINDER = 'Entries need vertical structure: create modules via set-project-architecture / set-module-details ' +
6
+ 'before or when adding entries. Set refs.moduleName to an existing module name from list-modules. ' +
7
+ 'Run validate after edits to find entries-without-modules, entry-unlinked, or empty slices.';
8
+ export function suggestKindsFromFiles(files) {
9
+ const kinds = new Set();
10
+ for (const file of files) {
11
+ const lower = file.toLowerCase();
12
+ const base = file.split('/').pop() ?? file;
13
+ if (/controller/i.test(base) || lower.endsWith('.http')) {
14
+ kinds.add('http-endpoint');
15
+ }
16
+ if (/repository/i.test(base)) {
17
+ kinds.add('repository');
18
+ }
19
+ if (/entity/i.test(base) && !/repository/i.test(base)) {
20
+ kinds.add('entity');
21
+ }
22
+ }
23
+ return [...kinds];
24
+ }
25
+ export function buildEntryLinkHints(moduleNames, refsModuleName) {
26
+ const hints = {};
27
+ if (moduleNames.length === 0) {
28
+ hints.reminder = ENTRIES_MODULE_REMINDER;
29
+ return hints;
30
+ }
31
+ if (!refsModuleName?.trim()) {
32
+ hints.reminder = ENTRIES_MODULE_REMINDER;
33
+ hints.suggestedModuleNames = moduleNames;
34
+ return hints;
35
+ }
36
+ if (!moduleNames.includes(refsModuleName)) {
37
+ hints.warning = `refs.moduleName '${refsModuleName}' does not match any module (orphan-entry-module).`;
38
+ hints.suggestedModuleNames = moduleNames;
39
+ }
40
+ return hints;
41
+ }
42
+ //# sourceMappingURL=agent-hints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-hints.js","sourceRoot":"","sources":["../src/agent-hints.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAClC,iFAAiF;IACjF,yFAAyF;IACzF,wFAAwF;IACxF,kEAAkE,CAAC;AAErE,MAAM,CAAC,MAAM,uBAAuB,GAClC,oGAAoG;IACpG,mGAAmG;IACnG,4FAA4F,CAAC;AAE/F,MAAM,UAAU,qBAAqB,CAAC,KAAe;IACnD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;QAC3C,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACxD,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAQD,MAAM,UAAU,mBAAmB,CACjC,WAAqB,EACrB,cAAuB;IAEvB,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,QAAQ,GAAG,uBAAuB,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5B,KAAK,CAAC,QAAQ,GAAG,uBAAuB,CAAC;QACzC,KAAK,CAAC,oBAAoB,GAAG,WAAW,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,OAAO,GAAG,oBAAoB,cAAc,oDAAoD,CAAC;QACvG,KAAK,CAAC,oBAAoB,GAAG,WAAW,CAAC;IAC3C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { DataFlow, ModuleDetails, ModuleSummary, ProjectArchitecture, ValidationIssue } from "./types.js";
2
+ export declare function recomputeProvidesTo(dataFlow: DataFlow, moduleNames: string[]): DataFlow;
3
+ export declare function syncModuleDependsOn(dataFlow: DataFlow, moduleName: string, dependsOn: string[], moduleNames: string[]): DataFlow;
4
+ export declare function buildDataFlowFromModules(modules: ModuleSummary[], moduleDetailsMap: Map<string, ModuleDetails>): DataFlow;
5
+ export declare function buildDataFlowFromDependsOn(dataFlow: DataFlow, moduleNames: string[]): DataFlow;
6
+ export declare function pruneDataFlow(dataFlow: DataFlow, validNames: string[]): DataFlow;
7
+ export declare function removeModuleFromDataFlow(dataFlow: DataFlow | undefined, moduleName: string): DataFlow | undefined;
8
+ export declare function mergeModules(existing: ModuleSummary[] | undefined, incoming: ModuleSummary[], options: {
9
+ replace: boolean;
10
+ }): ModuleSummary[];
11
+ export declare function mergeDataFlow(existing: DataFlow | undefined, incoming: DataFlow | undefined, options: {
12
+ replace: boolean;
13
+ }): DataFlow | undefined;
14
+ export declare function validateDataFlow(architecture: ProjectArchitecture, moduleDetailsMap: Map<string, ModuleDetails>, options?: {
15
+ checkInverse?: boolean;
16
+ checkModuleDeps?: boolean;
17
+ }): ValidationIssue[];
18
+ export declare function diffFlowEdges(before: DataFlow | undefined, after: DataFlow | undefined): {
19
+ edgesAdded: number;
20
+ edgesRemoved: number;
21
+ };
22
+ //# sourceMappingURL=data-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-flow.d.ts","sourceRoot":"","sources":["../src/data-flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,eAAe,EAChB,MAAM,YAAY,CAAC;AAmBpB,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,QAAQ,CAqCvF;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,QAAQ,CAOV;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,aAAa,EAAE,EACxB,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAC3C,QAAQ,CASV;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,QAAQ,CAY9F;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,QAAQ,CAuBhF;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,UAAU,EAAE,MAAM,GACjB,QAAQ,GAAG,SAAS,CAwBtB;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,aAAa,EAAE,GAAG,SAAS,EACrC,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAC5B,aAAa,EAAE,CASjB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAC5B,QAAQ,GAAG,SAAS,CAetB;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,mBAAmB,EACjC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC5C,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAClE,eAAe,EAAE,CAkEnB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,KAAK,EAAE,QAAQ,GAAG,SAAS,GAC1B;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAgB9C"}
@@ -0,0 +1,232 @@
1
+ function uniqueSorted(arr) {
2
+ return [...new Set(arr)].sort();
3
+ }
4
+ function edgeSet(flow) {
5
+ const set = new Set();
6
+ if (!flow) {
7
+ return set;
8
+ }
9
+ for (const [from, entry] of Object.entries(flow)) {
10
+ for (const to of entry.dependsOn ?? []) {
11
+ set.add(`${from}->${to}`);
12
+ }
13
+ }
14
+ return set;
15
+ }
16
+ export function recomputeProvidesTo(dataFlow, moduleNames) {
17
+ const names = new Set(moduleNames);
18
+ const result = {};
19
+ for (const name of moduleNames) {
20
+ const existing = dataFlow[name];
21
+ result[name] = {
22
+ dependsOn: existing?.dependsOn?.length ? [...existing.dependsOn] : undefined,
23
+ dataTransformation: existing?.dataTransformation,
24
+ };
25
+ }
26
+ for (const name of moduleNames) {
27
+ for (const dep of result[name]?.dependsOn ?? []) {
28
+ if (!names.has(dep)) {
29
+ continue;
30
+ }
31
+ if (!result[dep]) {
32
+ result[dep] = {};
33
+ }
34
+ const list = result[dep].providesTo ?? [];
35
+ if (!list.includes(name)) {
36
+ result[dep].providesTo = [...list, name];
37
+ }
38
+ }
39
+ }
40
+ for (const name of moduleNames) {
41
+ const providesTo = result[name]?.providesTo;
42
+ if (providesTo?.length) {
43
+ result[name].providesTo = uniqueSorted(providesTo);
44
+ }
45
+ else if (result[name]) {
46
+ delete result[name].providesTo;
47
+ }
48
+ }
49
+ return result;
50
+ }
51
+ export function syncModuleDependsOn(dataFlow, moduleName, dependsOn, moduleNames) {
52
+ const updated = { ...dataFlow };
53
+ updated[moduleName] = {
54
+ ...(updated[moduleName] ?? {}),
55
+ dependsOn: uniqueSorted(dependsOn),
56
+ };
57
+ return recomputeProvidesTo(updated, moduleNames);
58
+ }
59
+ export function buildDataFlowFromModules(modules, moduleDetailsMap) {
60
+ const dataFlow = {};
61
+ for (const mod of modules) {
62
+ const deps = moduleDetailsMap.get(mod.name)?.dependencies ?? [];
63
+ if (deps.length > 0) {
64
+ dataFlow[mod.name] = { dependsOn: uniqueSorted(deps) };
65
+ }
66
+ }
67
+ return recomputeProvidesTo(dataFlow, modules.map((m) => m.name));
68
+ }
69
+ export function buildDataFlowFromDependsOn(dataFlow, moduleNames) {
70
+ const flow = {};
71
+ for (const name of moduleNames) {
72
+ const dependsOn = dataFlow[name]?.dependsOn;
73
+ if (dependsOn?.length || dataFlow[name]?.dataTransformation) {
74
+ flow[name] = {
75
+ dependsOn: dependsOn?.length ? [...dependsOn] : undefined,
76
+ dataTransformation: dataFlow[name]?.dataTransformation,
77
+ };
78
+ }
79
+ }
80
+ return recomputeProvidesTo(flow, moduleNames);
81
+ }
82
+ export function pruneDataFlow(dataFlow, validNames) {
83
+ const names = new Set(validNames);
84
+ const pruned = {};
85
+ for (const name of validNames) {
86
+ const flow = dataFlow[name];
87
+ if (!flow) {
88
+ continue;
89
+ }
90
+ const entry = {};
91
+ if (flow.dataTransformation) {
92
+ entry.dataTransformation = flow.dataTransformation;
93
+ }
94
+ const dependsOn = (flow.dependsOn ?? []).filter((d) => names.has(d));
95
+ if (dependsOn.length) {
96
+ entry.dependsOn = dependsOn;
97
+ }
98
+ if (Object.keys(entry).length > 0) {
99
+ pruned[name] = entry;
100
+ }
101
+ }
102
+ return recomputeProvidesTo(pruned, validNames);
103
+ }
104
+ export function removeModuleFromDataFlow(dataFlow, moduleName) {
105
+ if (!dataFlow) {
106
+ return undefined;
107
+ }
108
+ const updated = { ...dataFlow };
109
+ delete updated[moduleName];
110
+ for (const flow of Object.values(updated)) {
111
+ if (flow.dependsOn) {
112
+ flow.dependsOn = flow.dependsOn.filter((d) => d !== moduleName);
113
+ if (flow.dependsOn.length === 0) {
114
+ delete flow.dependsOn;
115
+ }
116
+ }
117
+ if (flow.providesTo) {
118
+ flow.providesTo = flow.providesTo.filter((p) => p !== moduleName);
119
+ if (flow.providesTo.length === 0) {
120
+ delete flow.providesTo;
121
+ }
122
+ }
123
+ }
124
+ return Object.keys(updated).length > 0 ? updated : undefined;
125
+ }
126
+ export function mergeModules(existing, incoming, options) {
127
+ if (options.replace || !existing) {
128
+ return incoming;
129
+ }
130
+ const byName = new Map(existing.map((m) => [m.name, m]));
131
+ for (const mod of incoming) {
132
+ byName.set(mod.name, mod);
133
+ }
134
+ return [...byName.values()];
135
+ }
136
+ export function mergeDataFlow(existing, incoming, options) {
137
+ if (options.replace) {
138
+ return incoming;
139
+ }
140
+ if (!incoming) {
141
+ return existing;
142
+ }
143
+ if (!existing) {
144
+ return { ...incoming };
145
+ }
146
+ const merged = { ...existing };
147
+ for (const [name, flow] of Object.entries(incoming)) {
148
+ merged[name] = { ...(merged[name] ?? {}), ...flow };
149
+ }
150
+ return merged;
151
+ }
152
+ export function validateDataFlow(architecture, moduleDetailsMap, options = {}) {
153
+ const checkInverse = options.checkInverse ?? true;
154
+ const checkModuleDeps = options.checkModuleDeps ?? true;
155
+ const issues = [];
156
+ const moduleNames = new Set(architecture.modules.map((m) => m.name));
157
+ const dataFlow = architecture.dataFlow ?? {};
158
+ for (const [moduleName, flow] of Object.entries(dataFlow)) {
159
+ if (!moduleNames.has(moduleName)) {
160
+ issues.push({
161
+ kind: "orphan-flow-key",
162
+ module: moduleName,
163
+ detail: "dataFlow entry for non-existent module",
164
+ });
165
+ }
166
+ for (const dep of flow.dependsOn ?? []) {
167
+ if (!moduleNames.has(dep)) {
168
+ issues.push({
169
+ kind: "dangling-depends-on",
170
+ module: moduleName,
171
+ detail: `depends on missing module '${dep}'`,
172
+ });
173
+ }
174
+ }
175
+ for (const target of flow.providesTo ?? []) {
176
+ if (!moduleNames.has(target)) {
177
+ issues.push({
178
+ kind: "dangling-provides-to",
179
+ module: moduleName,
180
+ detail: `provides to missing module '${target}'`,
181
+ });
182
+ }
183
+ }
184
+ }
185
+ if (checkInverse) {
186
+ const expected = recomputeProvidesTo(dataFlow, [...moduleNames]);
187
+ for (const name of moduleNames) {
188
+ const actual = uniqueSorted(dataFlow[name]?.providesTo ?? []);
189
+ const exp = uniqueSorted(expected[name]?.providesTo ?? []);
190
+ if (actual.join(",") !== exp.join(",")) {
191
+ issues.push({
192
+ kind: "inverse-drift",
193
+ module: name,
194
+ detail: `providesTo [${actual.join(", ")}] != expected [${exp.join(", ")}]`,
195
+ });
196
+ }
197
+ }
198
+ }
199
+ if (checkModuleDeps) {
200
+ for (const mod of architecture.modules) {
201
+ const details = moduleDetailsMap.get(mod.name);
202
+ const flowDeps = uniqueSorted(dataFlow[mod.name]?.dependsOn ?? []);
203
+ const fileDeps = uniqueSorted(details?.dependencies ?? []);
204
+ if (flowDeps.join(",") !== fileDeps.join(",")) {
205
+ issues.push({
206
+ kind: "deps-mismatch",
207
+ module: mod.name,
208
+ detail: `dataFlow.dependsOn [${flowDeps.join(", ")}] != module.dependencies [${fileDeps.join(", ")}]`,
209
+ });
210
+ }
211
+ }
212
+ }
213
+ return issues;
214
+ }
215
+ export function diffFlowEdges(before, after) {
216
+ const beforeSet = edgeSet(before);
217
+ const afterSet = edgeSet(after);
218
+ let edgesAdded = 0;
219
+ let edgesRemoved = 0;
220
+ for (const edge of afterSet) {
221
+ if (!beforeSet.has(edge)) {
222
+ edgesAdded++;
223
+ }
224
+ }
225
+ for (const edge of beforeSet) {
226
+ if (!afterSet.has(edge)) {
227
+ edgesRemoved++;
228
+ }
229
+ }
230
+ return { edgesAdded, edgesRemoved };
231
+ }
232
+ //# sourceMappingURL=data-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-flow.js","sourceRoot":"","sources":["../src/data-flow.ts"],"names":[],"mappings":"AAQA,SAAS,YAAY,CAAC,GAAa;IACjC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,OAAO,CAAC,IAA0B;IACzC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;YACvC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAkB,EAAE,WAAqB;IAC3E,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;YAC5E,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB;SACjD,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACnB,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;QAC5C,IAAI,UAAU,EAAE,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAkB,EAClB,UAAkB,EAClB,SAAmB,EACnB,WAAqB;IAErB,MAAM,OAAO,GAAa,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,GAAG;QACpB,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC9B,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC;KACnC,CAAC;IACF,OAAO,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,OAAwB,EACxB,gBAA4C;IAE5C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,IAAI,EAAE,CAAC;QAChE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IACD,OAAO,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAkB,EAAE,WAAqB;IAClF,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;QAC5C,IAAI,SAAS,EAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB,EAAE,CAAC;YAC5D,IAAI,CAAC,IAAI,CAAC,GAAG;gBACX,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;gBACzD,kBAAkB,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB;aACvD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAkB,EAAE,UAAoB;IACpE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAqB,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACrD,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAA8B,EAC9B,UAAkB;IAElB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC1C,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;YAChE,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC,SAAS,CAAC;YACxB,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;YAClE,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC,UAAU,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAqC,EACrC,QAAyB,EACzB,OAA6B;IAE7B,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,QAA8B,EAC9B,QAA8B,EAC9B,OAA6B;IAE7B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IACzB,CAAC;IACD,MAAM,MAAM,GAAa,EAAE,GAAG,QAAQ,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;IACtD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,YAAiC,EACjC,gBAA4C,EAC5C,UAAiE,EAAE;IAEnE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;IAClD,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;IACxD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,IAAI,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,iBAAiB;gBACvB,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,wCAAwC;aACjD,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,qBAAqB;oBAC3B,MAAM,EAAE,UAAU;oBAClB,MAAM,EAAE,8BAA8B,GAAG,GAAG;iBAC7C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,sBAAsB;oBAC5B,MAAM,EAAE,UAAU;oBAClB,MAAM,EAAE,+BAA+B,MAAM,GAAG;iBACjD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;QACjE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;YAC9D,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;YAC3D,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,eAAe;oBACrB,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,eAAe,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;iBAC5E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;YACnE,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC;YAC3D,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,eAAe;oBACrB,MAAM,EAAE,GAAG,CAAC,IAAI;oBAChB,MAAM,EAAE,uBAAuB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;iBACtG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAA4B,EAC5B,KAA2B;IAE3B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data-flow.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-flow.test.d.ts","sourceRoot":"","sources":["../src/data-flow.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-flow.test.js","sourceRoot":"","sources":["../src/data-flow.test.ts"],"names":[],"mappings":"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"}