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.
Files changed (50) hide show
  1. package/.cursor/rules/architector-onboarding.mdc +56 -0
  2. package/.github/workflows/publish.yml +3 -3
  3. package/README.md +31 -3
  4. package/README_RU.md +20 -0
  5. package/dist/entry-coverage.d.ts +9 -0
  6. package/dist/entry-coverage.d.ts.map +1 -1
  7. package/dist/entry-coverage.js +43 -4
  8. package/dist/entry-coverage.js.map +1 -1
  9. package/dist/entry-coverage.test.js.map +1 -1
  10. package/dist/entry-search.d.ts +14 -0
  11. package/dist/entry-search.d.ts.map +1 -0
  12. package/dist/entry-search.js +144 -0
  13. package/dist/entry-search.js.map +1 -0
  14. package/dist/entry-search.test.d.ts +2 -0
  15. package/dist/entry-search.test.d.ts.map +1 -0
  16. package/dist/entry-search.test.js.map +1 -0
  17. package/dist/index.js +25 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/project-validate.d.ts +4 -0
  20. package/dist/project-validate.d.ts.map +1 -1
  21. package/dist/project-validate.js +39 -1
  22. package/dist/project-validate.js.map +1 -1
  23. package/dist/project-validate.test.js.map +1 -1
  24. package/dist/slice-coverage.d.ts +9 -0
  25. package/dist/slice-coverage.d.ts.map +1 -0
  26. package/dist/slice-coverage.js +58 -0
  27. package/dist/slice-coverage.js.map +1 -0
  28. package/dist/slice-coverage.test.d.ts +2 -0
  29. package/dist/slice-coverage.test.d.ts.map +1 -0
  30. package/dist/slice-coverage.test.js.map +1 -0
  31. package/dist/tools-entries-slices.d.ts +4 -4
  32. package/dist/tools-entries-slices.d.ts.map +1 -1
  33. package/dist/tools-entries-slices.js +58 -18
  34. package/dist/tools-entries-slices.js.map +1 -1
  35. package/dist/types.d.ts +28 -0
  36. package/dist/types.d.ts.map +1 -1
  37. package/package.json +3 -3
  38. package/scripts/test-all-api.sh +17 -0
  39. package/server.json +2 -2
  40. package/src/entry-coverage.test.ts +47 -1
  41. package/src/entry-coverage.ts +63 -6
  42. package/src/entry-search.test.ts +116 -0
  43. package/src/entry-search.ts +190 -0
  44. package/src/index.ts +29 -1
  45. package/src/project-validate.test.ts +167 -0
  46. package/src/project-validate.ts +52 -2
  47. package/src/slice-coverage.test.ts +67 -0
  48. package/src/slice-coverage.ts +68 -0
  49. package/src/tools-entries-slices.ts +60 -20
  50. 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@v4
16
+ - uses: actions/checkout@v6
17
17
 
18
- - uses: actions/setup-node@v4
18
+ - uses: actions/setup-node@v6
19
19
  with:
20
- node-version: "20"
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` | Text search in title, summary, kind, tags |
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
 
@@ -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,CA2E/D"}
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"}
@@ -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
- export function validateEntryCoverage(architecture, entries, moduleDetailsMap) {
14
- const issues = [];
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":"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"}
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":"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"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=entry-search.test.d.ts.map
@@ -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));