mcp-architector 1.5.0 → 1.6.1
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/README.md +86 -15
- package/README_RU.md +56 -11
- package/dist/agent-hints.d.ts +10 -0
- package/dist/agent-hints.d.ts.map +1 -0
- package/dist/agent-hints.js +42 -0
- package/dist/agent-hints.js.map +1 -0
- package/dist/data-flow.d.ts +22 -0
- package/dist/data-flow.d.ts.map +1 -0
- package/dist/data-flow.js +232 -0
- package/dist/data-flow.js.map +1 -0
- package/dist/data-flow.test.d.ts +2 -0
- package/dist/data-flow.test.d.ts.map +1 -0
- package/dist/data-flow.test.js.map +1 -0
- package/dist/entry-coverage.d.ts +6 -0
- package/dist/entry-coverage.d.ts.map +1 -0
- package/dist/entry-coverage.js +81 -0
- package/dist/entry-coverage.js.map +1 -0
- package/dist/entry-coverage.test.d.ts +2 -0
- package/dist/entry-coverage.test.d.ts.map +1 -0
- package/dist/entry-coverage.test.js.map +1 -0
- package/dist/entry-sync.d.ts +4 -0
- package/dist/entry-sync.d.ts.map +1 -0
- package/dist/entry-sync.js +42 -0
- package/dist/entry-sync.js.map +1 -0
- package/dist/index.js +374 -36
- package/dist/index.js.map +1 -1
- package/dist/project-validate.d.ts +10 -0
- package/dist/project-validate.d.ts.map +1 -0
- package/dist/project-validate.js +189 -0
- package/dist/project-validate.js.map +1 -0
- package/dist/project-validate.test.d.ts +2 -0
- package/dist/project-validate.test.d.ts.map +1 -0
- package/dist/project-validate.test.js.map +1 -0
- package/dist/slices.d.ts +1 -0
- package/dist/slices.d.ts.map +1 -1
- package/dist/slices.js +15 -1
- package/dist/slices.js.map +1 -1
- package/dist/tools-entries-slices.d.ts +38 -0
- package/dist/tools-entries-slices.d.ts.map +1 -1
- package/dist/tools-entries-slices.js +128 -36
- package/dist/tools-entries-slices.js.map +1 -1
- package/dist/types.d.ts +49 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/scripts/test-all-api.sh +14 -4
- package/server.json +2 -2
- package/src/agent-hints.ts +59 -0
- package/src/data-flow.test.ts +178 -0
- package/src/data-flow.ts +288 -0
- package/src/entry-coverage.test.ts +90 -0
- package/src/entry-coverage.ts +104 -0
- package/src/entry-sync.ts +54 -0
- package/src/index.ts +457 -35
- package/src/project-validate.test.ts +107 -0
- package/src/project-validate.ts +250 -0
- package/src/slices.ts +16 -1
- package/src/tools-entries-slices.ts +155 -37
- 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-
|
|
79
|
-
3. **
|
|
80
|
-
4. **
|
|
81
|
-
5. **
|
|
82
|
-
|
|
83
|
-
|
|
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):
|
|
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
|
|
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`
|
|
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.
|
|
79
|
-
3.
|
|
80
|
-
4.
|
|
81
|
-
5.
|
|
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
|
|
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":"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"}
|
|
@@ -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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"}
|