mcp-architector 1.6.0 → 1.7.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/.cursor/rules/architector-onboarding.mdc +56 -0
- package/.github/workflows/publish.yml +3 -3
- package/README.md +31 -3
- package/README_RU.md +20 -0
- package/dist/entry-coverage.d.ts +9 -0
- package/dist/entry-coverage.d.ts.map +1 -1
- package/dist/entry-coverage.js +43 -4
- package/dist/entry-coverage.js.map +1 -1
- package/dist/entry-coverage.test.js.map +1 -1
- package/dist/entry-search.d.ts +14 -0
- package/dist/entry-search.d.ts.map +1 -0
- package/dist/entry-search.js +144 -0
- package/dist/entry-search.js.map +1 -0
- package/dist/entry-search.test.d.ts +2 -0
- package/dist/entry-search.test.d.ts.map +1 -0
- package/dist/entry-search.test.js.map +1 -0
- package/dist/index.js +25 -1
- package/dist/index.js.map +1 -1
- package/dist/project-validate.d.ts +4 -0
- package/dist/project-validate.d.ts.map +1 -1
- package/dist/project-validate.js +39 -1
- package/dist/project-validate.js.map +1 -1
- package/dist/project-validate.test.js.map +1 -1
- package/dist/slice-coverage.d.ts +9 -0
- package/dist/slice-coverage.d.ts.map +1 -0
- package/dist/slice-coverage.js +58 -0
- package/dist/slice-coverage.js.map +1 -0
- package/dist/slice-coverage.test.d.ts +2 -0
- package/dist/slice-coverage.test.d.ts.map +1 -0
- package/dist/slice-coverage.test.js.map +1 -0
- package/dist/tools-entries-slices.d.ts +4 -4
- package/dist/tools-entries-slices.d.ts.map +1 -1
- package/dist/tools-entries-slices.js +58 -18
- package/dist/tools-entries-slices.js.map +1 -1
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/scripts/test-all-api.sh +17 -0
- package/server.json +2 -2
- package/src/entry-coverage.test.ts +47 -1
- package/src/entry-coverage.ts +63 -6
- package/src/entry-search.test.ts +116 -0
- package/src/entry-search.ts +190 -0
- package/src/index.ts +29 -1
- package/src/project-validate.test.ts +167 -0
- package/src/project-validate.ts +52 -2
- package/src/slice-coverage.test.ts +67 -0
- package/src/slice-coverage.ts +68 -0
- package/src/tools-entries-slices.ts +60 -20
- package/src/types.ts +32 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Onboard or sync a codebase into MCP Architector (phased, context-safe). Use when importing a new repo, documenting architecture, or refreshing architector data.
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# MCP Architector — onboarding
|
|
7
|
+
|
|
8
|
+
Do **not** import the whole repo in one step. Architector stores data in `~/.mcp-architector/{projectId}/`; the repo is analyzed by you (Read/Grep), not by the MCP server.
|
|
9
|
+
|
|
10
|
+
## Before writing
|
|
11
|
+
|
|
12
|
+
1. `list-projects` — confirm `projectId` matches this workspace (`MCP_PROJECT_ID`).
|
|
13
|
+
2. `get-project-architecture` — see what is already documented; resume instead of restarting blindly.
|
|
14
|
+
|
|
15
|
+
## Phases (one phase per user-visible step unless asked to continue)
|
|
16
|
+
|
|
17
|
+
### Phase 0 — Plan (no bulk writes)
|
|
18
|
+
|
|
19
|
+
- Infer vertical modules from top-level packages/dirs and dependency edges.
|
|
20
|
+
- Propose module list + order; **wait for confirmation** before Phase 1 on large repos.
|
|
21
|
+
|
|
22
|
+
### Phase 1 — Structure only
|
|
23
|
+
|
|
24
|
+
- `set-project-architecture` with `replaceModules: true` only for greenfield; otherwise merge.
|
|
25
|
+
- Modules: name, description, dependencies — **no** long text, **no** facts yet.
|
|
26
|
+
- `rebuild-data-flow` if many modules.
|
|
27
|
+
- `validate` — fix structure issues; report summary to user.
|
|
28
|
+
|
|
29
|
+
### Phase 2 — One module at a time
|
|
30
|
+
|
|
31
|
+
For each module:
|
|
32
|
+
|
|
33
|
+
- `set-module-details` with `files[]` + `facts[]` (http-endpoint, entity, glossary, script, …).
|
|
34
|
+
- Max **200** facts per call (`set-entries` / `facts[]`); batch if needed.
|
|
35
|
+
- Link every fact: `refs.moduleName` = module name. Do not paste module description into entry summaries.
|
|
36
|
+
- `validate` after each module (compact report only — do not reload full project).
|
|
37
|
+
|
|
38
|
+
### Phase 3 — Done check
|
|
39
|
+
|
|
40
|
+
- `validate` — target: no `entry-unlinked`, no empty `api`/`domain`/`persistence` if those areas exist in code.
|
|
41
|
+
- `list-slices` → spot-check `get-slice` with `format=compact`, `limit=10`.
|
|
42
|
+
|
|
43
|
+
## Context rules
|
|
44
|
+
|
|
45
|
+
- Prefer `validate`, `search-entries`, `get-slice` (paginated) over loading all entries.
|
|
46
|
+
- Use `search-entries` → `get-entry` for a single fact; not `get-entry` for every file in repo.
|
|
47
|
+
- Never edit `~/.mcp-architector` directly.
|
|
48
|
+
- After code changes to architector itself, update architecture via MCP architector tools.
|
|
49
|
+
|
|
50
|
+
## User prompts that trigger this rule
|
|
51
|
+
|
|
52
|
+
- "Import this project into architector"
|
|
53
|
+
- "Document architecture in architector"
|
|
54
|
+
- "Onboard repo to MCP architector"
|
|
55
|
+
|
|
56
|
+
Replace one-shot requests with: structure first → confirm → module-by-module → validate.
|
|
@@ -13,11 +13,11 @@ jobs:
|
|
|
13
13
|
contents: read
|
|
14
14
|
id-token: write # Required for npm provenance and MCP Registry OIDC
|
|
15
15
|
steps:
|
|
16
|
-
- uses: actions/checkout@
|
|
16
|
+
- uses: actions/checkout@v6
|
|
17
17
|
|
|
18
|
-
- uses: actions/setup-node@
|
|
18
|
+
- uses: actions/setup-node@v6
|
|
19
19
|
with:
|
|
20
|
-
node-version: "
|
|
20
|
+
node-version: "24"
|
|
21
21
|
registry-url: "https://registry.npmjs.org"
|
|
22
22
|
cache: "npm"
|
|
23
23
|
|
package/README.md
CHANGED
|
@@ -35,6 +35,25 @@ Add the server to your MCP config. Example for **claude_desktop_config.json**:
|
|
|
35
35
|
|
|
36
36
|
For **Cursor IDE**: Settings → Features → Model Context Protocol → Edit Config, then add the same block inside `mcpServers`. See the [Integration](#integration) section for more options.
|
|
37
37
|
|
|
38
|
+
## Cursor rule (recommended)
|
|
39
|
+
|
|
40
|
+
For **Cursor IDE** and **Cursor Cloud Agents**, use a phased onboarding rule so the agent does not dump the whole repo into context in one shot.
|
|
41
|
+
|
|
42
|
+
1. Copy [`.cursor/rules/architector-onboarding.mdc`](.cursor/rules/architector-onboarding.mdc) into **your project** (the repo you are documenting):
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
mkdir -p /path/to/your-app/.cursor/rules
|
|
46
|
+
cp /path/to/mcp-architector/.cursor/rules/architector-onboarding.mdc /path/to/your-app/.cursor/rules/
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
2. Ensure MCP Architector is configured with `MCP_PROJECT_ID` pointing at that workspace (see [How to connect](#how-to-connect-to-claude-desktop--ide)).
|
|
50
|
+
|
|
51
|
+
3. Ask in chat, for example: *"Onboard this repo into architector — phase 0 plan first"* or *"Import architecture module by module"*.
|
|
52
|
+
|
|
53
|
+
The rule is **`alwaysApply: false`** — Cursor attaches it when the task matches architecture import/onboarding. It enforces: structure → one module per step → `validate` after each step → compact tools only.
|
|
54
|
+
|
|
55
|
+
If you develop **this** server repo, keep the same file here so contributors and Cloud Agents follow the same workflow when updating `~/.mcp-architector/_qs_mcp-architector/`.
|
|
56
|
+
|
|
38
57
|
## Overview
|
|
39
58
|
|
|
40
59
|
Store and manage project architecture, modules, scripts, data flow, and usage examples - all locally with complete privacy.
|
|
@@ -94,6 +113,7 @@ Store and manage project architecture, modules, scripts, data flow, and usage ex
|
|
|
94
113
|
| Diagnose graph + empty slices | `validate` (or `validate-architecture`) |
|
|
95
114
|
| Index out of sync | `rebuild-entry-index` |
|
|
96
115
|
| Create project from scratch | `set-project-architecture` with `replaceModules: true` |
|
|
116
|
+
| Onboard a fresh git clone (phased) | Copy [`.cursor/rules/architector-onboarding.mdc`](.cursor/rules/architector-onboarding.mdc) → ask agent to onboard phase by phase |
|
|
97
117
|
|
|
98
118
|
**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
119
|
|
|
@@ -309,7 +329,7 @@ Lists all projects in local storage (`~/.mcp-architector`). Use when the workspa
|
|
|
309
329
|
| `get-entry` | Full entry by `id` |
|
|
310
330
|
| `delete-entry` | Remove entry |
|
|
311
331
|
| `list-entries` | Catalog without payload; filter by `kind`, `tags`, `query` |
|
|
312
|
-
| `search-entries` |
|
|
332
|
+
| `search-entries` | Compact text search with `snippet`, `slices`, `moduleName`, pagination; filters: `moduleName`, `kind`, `tags` |
|
|
313
333
|
| `list-slices` | Built-in + custom slices with entry counts |
|
|
314
334
|
| `get-slice` | Filtered view: `sliceId`, `format`, `query`, `limit`, `offset`, `hasMore` |
|
|
315
335
|
| `set-slice` | Save custom filter (`kinds`, `tags`) — no items |
|
|
@@ -318,6 +338,14 @@ Lists all projects in local storage (`~/.mcp-architector`). Use when the workspa
|
|
|
318
338
|
|
|
319
339
|
**Built-in `sliceId` values:** `api`, `persistence`, `events`, `domain`, `flows`, `integrations`, `config`, `runtime`, `decisions`, `scripts`.
|
|
320
340
|
|
|
341
|
+
### search-entries
|
|
342
|
+
|
|
343
|
+
Compact navigation search—returns enough context to pick a hit, then call `get-entry` for full payload.
|
|
344
|
+
|
|
345
|
+
**Input:** `query` (required), `moduleName`, `kind`, `tags`, `limit` (default 10, max 50), `offset` (default 0)
|
|
346
|
+
|
|
347
|
+
**Output:** `summary`, `total`, `returned`, `offset`, `hasMore`, `results[]` with `snippet`, `matchedIn`, `slices`, `moduleName` plus legacy `summary`, `tags`, `refs`
|
|
348
|
+
|
|
321
349
|
**Recommended `kind` examples (any string allowed):**
|
|
322
350
|
|
|
323
351
|
| sliceId | kinds |
|
|
@@ -386,11 +414,11 @@ Rebuilds `dataFlow` for all modules from module file `dependencies` or existing
|
|
|
386
414
|
**Checks (only rules we can verify from stored JSON):**
|
|
387
415
|
- dataFlow: inverse drift, dangling `dependsOn`/`providesTo`, orphan flow keys
|
|
388
416
|
- `module.dependencies` vs `dataFlow.dependsOn`
|
|
389
|
-
- entries: `entries-without-modules`, `entry-unlinked`, `orphan-entry-module`, `module-no-entries`, `module-missing-api` / `module-missing-persistence`
|
|
417
|
+
- entries: `entries-without-modules`, `entry-unlinked`, `orphan-entry-module`, `module-no-entries`, `module-missing-api` / `module-missing-persistence`, `entry-slice-orphan`, `module-too-many-entries`, `module-too-few-entries`
|
|
390
418
|
- storage: missing `modules/{id}.json`, orphan module files, entry index drift
|
|
391
419
|
- slices: empty built-in `api` / `domain` / `persistence` when modules exist
|
|
392
420
|
|
|
393
|
-
**Input:** `projectId`, `checkInverse`, `checkModuleDeps`, `checkEntryCoverage`, `checkStorage`, `checkEmptySlices` (all default `true`
|
|
421
|
+
**Input:** `projectId`, `checkInverse`, `checkModuleDeps`, `checkEntryCoverage`, `checkStorage`, `checkEmptySlices`, `checkSliceCoverage`, `checkModuleEntryCounts`, `moduleEntryMax` (default `50`), `moduleEntryMin` (optional; omit to disable min check) — all boolean flags default `true` unless noted
|
|
394
422
|
|
|
395
423
|
**Output:** `valid`, `issueCount`, `summary`, `stats`, `issuesByKind`, `issues[]`, `coverage`, `checksRun`
|
|
396
424
|
|
package/README_RU.md
CHANGED
|
@@ -35,6 +35,25 @@
|
|
|
35
35
|
|
|
36
36
|
Для **Cursor IDE**: Settings → Features → Model Context Protocol → Edit Config, затем добавьте тот же блок в `mcpServers`. Подробнее в разделе [Интеграция](#интеграция).
|
|
37
37
|
|
|
38
|
+
## Cursor rule (рекомендуется)
|
|
39
|
+
|
|
40
|
+
Для **Cursor IDE** и **Cursor Cloud Agents** используйте пошаговое правило onboarding — чтобы агент не пытался перенести весь репозиторий в architector одним ответом.
|
|
41
|
+
|
|
42
|
+
1. Скопируйте [`.cursor/rules/architector-onboarding.mdc`](.cursor/rules/architector-onboarding.mdc) в **ваш проект** (репозиторий, который документируете):
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
mkdir -p /path/to/your-app/.cursor/rules
|
|
46
|
+
cp /path/to/mcp-architector/.cursor/rules/architector-onboarding.mdc /path/to/your-app/.cursor/rules/
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
2. Убедитесь, что MCP Architector настроен с `MCP_PROJECT_ID`, указывающим на этот workspace (см. [Как подключить](#как-подключить-к-claude-desktop--ide)).
|
|
50
|
+
|
|
51
|
+
3. В чате, например: *«Onboard this repo into architector — phase 0 plan first»* или *«Импортируй архитектуру в architector по модулям»*.
|
|
52
|
+
|
|
53
|
+
Правило с **`alwaysApply: false`** — Cursor подключает его, когда задача про import/onboarding архитектуры. Оно задаёт порядок: структура → один модуль за шаг → `validate` после каждого шага → только компактные tools.
|
|
54
|
+
|
|
55
|
+
Если вы разрабатываете **этот** репозиторий сервера, файл уже лежит здесь — contributors и Cloud Agents используют тот же workflow при обновлении `~/.mcp-architector/_qs_mcp-architector/`.
|
|
56
|
+
|
|
38
57
|
## Обзор
|
|
39
58
|
|
|
40
59
|
Хранение и управление архитектурой проекта, модулями, скриптами, потоками данных и примерами использования — всё локально с полной приватностью.
|
|
@@ -94,6 +113,7 @@
|
|
|
94
113
|
| Проверка после правок | `validate` |
|
|
95
114
|
| Рассинхрон index | `rebuild-entry-index` |
|
|
96
115
|
| Проект с нуля | `set-project-architecture` с `replaceModules: true` |
|
|
116
|
+
| Onboarding свежего git clone (по фазам) | Скопировать [`.cursor/rules/architector-onboarding.mdc`](.cursor/rules/architector-onboarding.mdc) → попросить агента onboard по шагам |
|
|
97
117
|
|
|
98
118
|
**Полная картина проекта:** одних модулей недостаточно для slices — без entries с `http-endpoint` срез `api` пуст. Новый модуль → `facts` или entries в том же шаге.
|
|
99
119
|
|
package/dist/entry-coverage.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { Entry, EntryCoverageSummary, ModuleDetails, ProjectArchitecture, ValidationIssue } from './types.js';
|
|
2
|
+
export interface ModuleEntryCountOptions {
|
|
3
|
+
moduleEntryMax?: number;
|
|
4
|
+
moduleEntryMin?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function validateModuleEntryCounts(architecture: ProjectArchitecture | null, entries: Entry[], options?: ModuleEntryCountOptions): {
|
|
7
|
+
issues: ValidationIssue[];
|
|
8
|
+
modulesTooManyEntries: number;
|
|
9
|
+
modulesTooFewEntries: number;
|
|
10
|
+
};
|
|
2
11
|
export declare function validateEntryCoverage(architecture: ProjectArchitecture | null, entries: Entry[], moduleDetailsMap: Map<string, ModuleDetails>): {
|
|
3
12
|
issues: ValidationIssue[];
|
|
4
13
|
coverage: EntryCoverageSummary;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry-coverage.d.ts","sourceRoot":"","sources":["../src/entry-coverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,eAAe,EAChB,MAAM,YAAY,CAAC;AAkBpB,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,mBAAmB,GAAG,IAAI,EACxC,OAAO,EAAE,KAAK,EAAE,EAChB,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAC3C;IAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,oBAAoB,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"entry-coverage.d.ts","sourceRoot":"","sources":["../src/entry-coverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,eAAe,EAChB,MAAM,YAAY,CAAC;AAkBpB,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAcD,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,mBAAmB,GAAG,IAAI,EACxC,OAAO,EAAE,KAAK,EAAE,EAChB,OAAO,GAAE,uBAA4B,GACpC;IAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,qBAAqB,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAA;CAAE,CAuC5F;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,mBAAmB,GAAG,IAAI,EACxC,OAAO,EAAE,KAAK,EAAE,EAChB,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAC3C;IAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,oBAAoB,CAAA;CAAE,CAsE/D"}
|
package/dist/entry-coverage.js
CHANGED
|
@@ -10,15 +10,54 @@ function fileMatches(file, pattern) {
|
|
|
10
10
|
const base = file.split('/').pop() ?? file;
|
|
11
11
|
return pattern.test(base) || pattern.test(file);
|
|
12
12
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const moduleNames = new Set(architecture?.modules.map((m) => m.name) ?? []);
|
|
16
|
-
const coverage = {
|
|
13
|
+
function emptyEntryCoverage() {
|
|
14
|
+
return {
|
|
17
15
|
modulesWithoutEntries: 0,
|
|
18
16
|
entriesUnlinked: 0,
|
|
19
17
|
entriesOrphanModule: 0,
|
|
20
18
|
entriesWithoutModules: 0,
|
|
19
|
+
entriesSliceOrphan: 0,
|
|
20
|
+
modulesTooManyEntries: 0,
|
|
21
|
+
modulesTooFewEntries: 0,
|
|
21
22
|
};
|
|
23
|
+
}
|
|
24
|
+
export function validateModuleEntryCounts(architecture, entries, options = {}) {
|
|
25
|
+
const issues = [];
|
|
26
|
+
let modulesTooManyEntries = 0;
|
|
27
|
+
let modulesTooFewEntries = 0;
|
|
28
|
+
const moduleEntryMax = options.moduleEntryMax ?? 50;
|
|
29
|
+
const moduleEntryMin = options.moduleEntryMin;
|
|
30
|
+
if (!architecture) {
|
|
31
|
+
return { issues, modulesTooManyEntries, modulesTooFewEntries };
|
|
32
|
+
}
|
|
33
|
+
for (const mod of architecture.modules) {
|
|
34
|
+
const count = entriesForModule(entries, mod.name).length;
|
|
35
|
+
if (count > moduleEntryMax) {
|
|
36
|
+
modulesTooManyEntries += 1;
|
|
37
|
+
issues.push({
|
|
38
|
+
kind: 'module-too-many-entries',
|
|
39
|
+
module: mod.name,
|
|
40
|
+
detail: `Module '${mod.name}' has ${count} entries (max ${moduleEntryMax})—consider splitting the module`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (moduleEntryMin !== undefined &&
|
|
44
|
+
moduleEntryMin > 1 &&
|
|
45
|
+
count > 0 &&
|
|
46
|
+
count < moduleEntryMin) {
|
|
47
|
+
modulesTooFewEntries += 1;
|
|
48
|
+
issues.push({
|
|
49
|
+
kind: 'module-too-few-entries',
|
|
50
|
+
module: mod.name,
|
|
51
|
+
detail: `Module '${mod.name}' has ${count} entries (min ${moduleEntryMin})—consider adding facts or merging modules`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return { issues, modulesTooManyEntries, modulesTooFewEntries };
|
|
56
|
+
}
|
|
57
|
+
export function validateEntryCoverage(architecture, entries, moduleDetailsMap) {
|
|
58
|
+
const issues = [];
|
|
59
|
+
const moduleNames = new Set(architecture?.modules.map((m) => m.name) ?? []);
|
|
60
|
+
const coverage = emptyEntryCoverage();
|
|
22
61
|
if (entries.length > 0 && (!architecture || architecture.modules.length === 0)) {
|
|
23
62
|
coverage.entriesWithoutModules = entries.length;
|
|
24
63
|
issues.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry-coverage.js","sourceRoot":"","sources":["../src/entry-coverage.ts"],"names":[],"mappings":"AAQA,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAChG,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;AAErF,SAAS,gBAAgB,CAAC,OAAgB,EAAE,UAAkB;IAC5D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,KAAK,UAAU,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,OAAO,CAAC,OAAgB,EAAE,KAAkB;IACnD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,OAAe;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"entry-coverage.js","sourceRoot":"","sources":["../src/entry-coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry-coverage.test.js","sourceRoot":"","sources":["../src/entry-coverage.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"entry-coverage.test.js","sourceRoot":"","sources":["../src/entry-coverage.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Entry, SearchEntriesResponse, SliceDefinition } from './types.js';
|
|
2
|
+
export declare const SEARCH_DEFAULT_LIMIT = 10;
|
|
3
|
+
export declare const SEARCH_MAX_LIMIT = 50;
|
|
4
|
+
export declare const SNIPPET_MAX_LEN = 120;
|
|
5
|
+
export interface SearchEntriesOptions {
|
|
6
|
+
query: string;
|
|
7
|
+
moduleName?: string;
|
|
8
|
+
kind?: string;
|
|
9
|
+
tags?: string[];
|
|
10
|
+
limit?: number;
|
|
11
|
+
offset?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function searchEntries(entries: Entry[], customSlices: SliceDefinition[], options: SearchEntriesOptions): SearchEntriesResponse;
|
|
14
|
+
//# sourceMappingURL=entry-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-search.d.ts","sourceRoot":"","sources":["../src/entry-search.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,KAAK,EACL,qBAAqB,EAGrB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4HD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,KAAK,EAAE,EAChB,YAAY,EAAE,eAAe,EAAE,EAC/B,OAAO,EAAE,oBAAoB,GAC5B,qBAAqB,CAwCvB"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { clampOffset } from './slices.js';
|
|
2
|
+
import { buildSliceFilterRefs, sliceIdsForEntry } from './slice-coverage.js';
|
|
3
|
+
export const SEARCH_DEFAULT_LIMIT = 10;
|
|
4
|
+
export const SEARCH_MAX_LIMIT = 50;
|
|
5
|
+
export const SNIPPET_MAX_LEN = 120;
|
|
6
|
+
function clampSearchLimit(limit) {
|
|
7
|
+
if (limit === undefined || limit < 1) {
|
|
8
|
+
return SEARCH_DEFAULT_LIMIT;
|
|
9
|
+
}
|
|
10
|
+
return Math.min(limit, SEARCH_MAX_LIMIT);
|
|
11
|
+
}
|
|
12
|
+
function matchesTags(entry, tags) {
|
|
13
|
+
if (!tags?.length) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
const entryTags = entry.tags ?? [];
|
|
17
|
+
return tags.some((tag) => entryTags.includes(tag));
|
|
18
|
+
}
|
|
19
|
+
function matchesKind(entry, kind) {
|
|
20
|
+
if (!kind?.trim()) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
return entry.kind === kind;
|
|
24
|
+
}
|
|
25
|
+
function matchesModule(entry, moduleName) {
|
|
26
|
+
if (!moduleName?.trim()) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
return entry.refs?.moduleName === moduleName;
|
|
30
|
+
}
|
|
31
|
+
function findMatchedIn(entry, query) {
|
|
32
|
+
const matched = [];
|
|
33
|
+
if (entry.title.toLowerCase().includes(query)) {
|
|
34
|
+
matched.push('title');
|
|
35
|
+
}
|
|
36
|
+
if (entry.summary.toLowerCase().includes(query)) {
|
|
37
|
+
matched.push('summary');
|
|
38
|
+
}
|
|
39
|
+
if (entry.kind.toLowerCase().includes(query)) {
|
|
40
|
+
matched.push('kind');
|
|
41
|
+
}
|
|
42
|
+
if ((entry.tags ?? []).some((tag) => tag.toLowerCase().includes(query))) {
|
|
43
|
+
matched.push('tags');
|
|
44
|
+
}
|
|
45
|
+
return matched;
|
|
46
|
+
}
|
|
47
|
+
function excerptAroundMatch(text, query, maxLen) {
|
|
48
|
+
const lower = text.toLowerCase();
|
|
49
|
+
const index = lower.indexOf(query);
|
|
50
|
+
if (index < 0) {
|
|
51
|
+
return truncateText(text, maxLen);
|
|
52
|
+
}
|
|
53
|
+
const half = Math.floor((maxLen - query.length - 3) / 2);
|
|
54
|
+
const start = Math.max(0, index - half);
|
|
55
|
+
const end = Math.min(text.length, index + query.length + half);
|
|
56
|
+
let excerpt = text.slice(start, end);
|
|
57
|
+
if (start > 0) {
|
|
58
|
+
excerpt = `…${excerpt}`;
|
|
59
|
+
}
|
|
60
|
+
if (end < text.length) {
|
|
61
|
+
excerpt = `${excerpt}…`;
|
|
62
|
+
}
|
|
63
|
+
return excerpt;
|
|
64
|
+
}
|
|
65
|
+
function truncateText(text, maxLen) {
|
|
66
|
+
if (text.length <= maxLen) {
|
|
67
|
+
return text;
|
|
68
|
+
}
|
|
69
|
+
return `${text.slice(0, maxLen - 1)}…`;
|
|
70
|
+
}
|
|
71
|
+
function buildSnippet(entry, query, matchedIn) {
|
|
72
|
+
if (matchedIn.includes('summary')) {
|
|
73
|
+
return excerptAroundMatch(entry.summary, query, SNIPPET_MAX_LEN);
|
|
74
|
+
}
|
|
75
|
+
return truncateText(entry.summary, SNIPPET_MAX_LEN);
|
|
76
|
+
}
|
|
77
|
+
function sortRank(entry, query) {
|
|
78
|
+
if (entry.title.toLowerCase().includes(query)) {
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
if (entry.summary.toLowerCase().includes(query)) {
|
|
82
|
+
return 1;
|
|
83
|
+
}
|
|
84
|
+
return 2;
|
|
85
|
+
}
|
|
86
|
+
function toSearchResult(entry, query, matchedIn, sliceRefs) {
|
|
87
|
+
return {
|
|
88
|
+
id: entry.id,
|
|
89
|
+
kind: entry.kind,
|
|
90
|
+
title: entry.title,
|
|
91
|
+
summary: entry.summary,
|
|
92
|
+
tags: entry.tags,
|
|
93
|
+
refs: entry.refs,
|
|
94
|
+
snippet: buildSnippet(entry, query, matchedIn),
|
|
95
|
+
matchedIn,
|
|
96
|
+
slices: sliceIdsForEntry(entry, sliceRefs),
|
|
97
|
+
moduleName: entry.refs?.moduleName ?? '',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function buildResponseSummary(query, results, total) {
|
|
101
|
+
const sliceSet = new Set();
|
|
102
|
+
for (const result of results) {
|
|
103
|
+
for (const sliceId of result.slices) {
|
|
104
|
+
sliceSet.add(sliceId);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const sliceList = [...sliceSet].slice(0, 5);
|
|
108
|
+
const slicePart = sliceList.length ? ` (slices: ${sliceList.join(', ')})` : '';
|
|
109
|
+
return `${total} match${total === 1 ? '' : 'es'} for "${query}"${slicePart}`;
|
|
110
|
+
}
|
|
111
|
+
export function searchEntries(entries, customSlices, options) {
|
|
112
|
+
const query = options.query.trim().toLowerCase();
|
|
113
|
+
const limit = clampSearchLimit(options.limit);
|
|
114
|
+
const offset = clampOffset(options.offset);
|
|
115
|
+
const sliceRefs = buildSliceFilterRefs(customSlices);
|
|
116
|
+
const matched = entries
|
|
117
|
+
.filter((entry) => matchesKind(entry, options.kind) &&
|
|
118
|
+
matchesTags(entry, options.tags) &&
|
|
119
|
+
matchesModule(entry, options.moduleName))
|
|
120
|
+
.map((entry) => ({
|
|
121
|
+
entry,
|
|
122
|
+
matchedIn: findMatchedIn(entry, query),
|
|
123
|
+
}))
|
|
124
|
+
.filter(({ matchedIn }) => matchedIn.length > 0)
|
|
125
|
+
.sort((a, b) => {
|
|
126
|
+
const rankDiff = sortRank(a.entry, query) - sortRank(b.entry, query);
|
|
127
|
+
if (rankDiff !== 0) {
|
|
128
|
+
return rankDiff;
|
|
129
|
+
}
|
|
130
|
+
return new Date(b.entry.updatedAt).getTime() - new Date(a.entry.updatedAt).getTime();
|
|
131
|
+
});
|
|
132
|
+
const total = matched.length;
|
|
133
|
+
const page = matched.slice(offset, offset + limit);
|
|
134
|
+
const results = page.map(({ entry, matchedIn }) => toSearchResult(entry, query, matchedIn, sliceRefs));
|
|
135
|
+
return {
|
|
136
|
+
summary: buildResponseSummary(options.query.trim(), results, total),
|
|
137
|
+
total,
|
|
138
|
+
returned: results.length,
|
|
139
|
+
offset,
|
|
140
|
+
hasMore: offset + results.length < total,
|
|
141
|
+
results,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=entry-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-search.js","sourceRoot":"","sources":["../src/entry-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-search.test.d.ts","sourceRoot":"","sources":["../src/entry-search.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-search.test.js","sourceRoot":"","sources":["../src/entry-search.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -591,6 +591,7 @@ const validationIssueSchema = z.object({
|
|
|
591
591
|
detail: z.string(),
|
|
592
592
|
});
|
|
593
593
|
const validationOutputSchema = {
|
|
594
|
+
projectId: z.string(),
|
|
594
595
|
valid: z.boolean(),
|
|
595
596
|
issueCount: z.number(),
|
|
596
597
|
summary: z.string(),
|
|
@@ -608,6 +609,9 @@ const validationOutputSchema = {
|
|
|
608
609
|
entriesUnlinked: z.number(),
|
|
609
610
|
entriesOrphanModule: z.number(),
|
|
610
611
|
entriesWithoutModules: z.number(),
|
|
612
|
+
entriesSliceOrphan: z.number(),
|
|
613
|
+
modulesTooManyEntries: z.number(),
|
|
614
|
+
modulesTooFewEntries: z.number(),
|
|
611
615
|
})
|
|
612
616
|
.optional(),
|
|
613
617
|
checksRun: z.array(z.string()),
|
|
@@ -625,6 +629,22 @@ const validationInputSchema = {
|
|
|
625
629
|
.boolean()
|
|
626
630
|
.optional()
|
|
627
631
|
.describe("Warn when api/domain/persistence slices have zero entries but modules exist (default true)"),
|
|
632
|
+
checkSliceCoverage: z
|
|
633
|
+
.boolean()
|
|
634
|
+
.optional()
|
|
635
|
+
.describe("Check entries match at least one built-in or custom slice (default true)"),
|
|
636
|
+
checkModuleEntryCounts: z
|
|
637
|
+
.boolean()
|
|
638
|
+
.optional()
|
|
639
|
+
.describe("Check module entry count thresholds (default true)"),
|
|
640
|
+
moduleEntryMax: z
|
|
641
|
+
.number()
|
|
642
|
+
.optional()
|
|
643
|
+
.describe("Max entries per module before module-too-many-entries (default 50)"),
|
|
644
|
+
moduleEntryMin: z
|
|
645
|
+
.number()
|
|
646
|
+
.optional()
|
|
647
|
+
.describe("Min entries per module when count > 0; omit to disable module-too-few-entries"),
|
|
628
648
|
};
|
|
629
649
|
async function runValidationTool(params) {
|
|
630
650
|
const projectId = resolveProjectId(params.projectId);
|
|
@@ -634,6 +654,10 @@ async function runValidationTool(params) {
|
|
|
634
654
|
checkEntryCoverage: params.checkEntryCoverage,
|
|
635
655
|
checkStorage: params.checkStorage,
|
|
636
656
|
checkEmptySlices: params.checkEmptySlices,
|
|
657
|
+
checkSliceCoverage: params.checkSliceCoverage,
|
|
658
|
+
checkModuleEntryCounts: params.checkModuleEntryCounts,
|
|
659
|
+
moduleEntryMax: params.moduleEntryMax,
|
|
660
|
+
moduleEntryMin: params.moduleEntryMin,
|
|
637
661
|
});
|
|
638
662
|
const text = `${result.summary}\n\n${JSON.stringify(result, null, 2)}`;
|
|
639
663
|
return {
|
|
@@ -643,7 +667,7 @@ async function runValidationTool(params) {
|
|
|
643
667
|
}
|
|
644
668
|
server.registerTool("validate", {
|
|
645
669
|
title: "Validate Project",
|
|
646
|
-
description: "Run after set-project-architecture, set-module-details, set-entry, or set-entries. Returns a compact report (summary, stats, issues by kind)—no need to load the full project in the agent. Checks only known rules: dataFlow consistency, module↔entry links, module detail files, entry index drift, empty api/domain/persistence slices. Fix issues[] then call validate again.",
|
|
670
|
+
description: "Run after set-project-architecture, set-module-details, set-entry, or set-entries. Returns a compact report (summary, stats, issues by kind)—no need to load the full project in the agent. Checks only known rules: dataFlow consistency, module↔entry links, module detail files, entry index drift, empty api/domain/persistence slices, entry slice coverage, module entry count thresholds. Fix issues[] then call validate again.",
|
|
647
671
|
inputSchema: validationInputSchema,
|
|
648
672
|
outputSchema: validationOutputSchema,
|
|
649
673
|
}, async (params) => runValidationTool(params));
|