milens 0.6.2 → 0.6.4

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 (123) hide show
  1. package/.agents/skills/adapters/SKILL.md +31 -0
  2. package/.agents/skills/analyzer/SKILL.md +55 -0
  3. package/.agents/skills/apps/SKILL.md +42 -0
  4. package/.agents/skills/docs/SKILL.md +46 -0
  5. package/.agents/skills/milens/SKILL.md +168 -0
  6. package/.agents/skills/milens-code-review/SKILL.md +186 -0
  7. package/.agents/skills/milens-eval/SKILL.md +221 -0
  8. package/.agents/skills/milens-plan/SKILL.md +227 -0
  9. package/.agents/skills/milens-refactor-clean/SKILL.md +209 -0
  10. package/.agents/skills/milens-security-review/SKILL.md +224 -0
  11. package/.agents/skills/milens-tdd/SKILL.md +156 -0
  12. package/.agents/skills/parser/SKILL.md +60 -0
  13. package/.agents/skills/root/SKILL.md +64 -0
  14. package/.agents/skills/scripts/SKILL.md +27 -0
  15. package/.agents/skills/security/SKILL.md +44 -0
  16. package/.agents/skills/server/SKILL.md +46 -0
  17. package/.agents/skills/store/SKILL.md +53 -0
  18. package/.agents/skills/test/SKILL.md +73 -0
  19. package/LICENSE +75 -75
  20. package/README.md +524 -305
  21. package/adapters/README.md +107 -0
  22. package/adapters/claude-code/.claude/mcp.json +9 -0
  23. package/adapters/claude-code/CLAUDE.md +58 -0
  24. package/adapters/codex/.codex/codex.md +52 -0
  25. package/adapters/copilot/.github/copilot-instructions.md +62 -0
  26. package/adapters/cursor/.cursorrules +9 -0
  27. package/adapters/gemini/.gemini/context.md +58 -0
  28. package/adapters/opencode/.opencode/config.json +9 -0
  29. package/adapters/opencode/AGENTS.md +58 -0
  30. package/adapters/zed/.zed/settings.json +8 -0
  31. package/dist/agents-md.d.ts +3 -0
  32. package/dist/agents-md.d.ts.map +1 -0
  33. package/dist/agents-md.js +112 -0
  34. package/dist/agents-md.js.map +1 -0
  35. package/dist/analyzer/engine.d.ts +1 -0
  36. package/dist/analyzer/engine.d.ts.map +1 -1
  37. package/dist/analyzer/engine.js +27 -8
  38. package/dist/analyzer/engine.js.map +1 -1
  39. package/dist/analyzer/review.d.ts +23 -0
  40. package/dist/analyzer/review.d.ts.map +1 -0
  41. package/dist/analyzer/review.js +143 -0
  42. package/dist/analyzer/review.js.map +1 -0
  43. package/dist/analyzer/testplan.d.ts +59 -0
  44. package/dist/analyzer/testplan.d.ts.map +1 -0
  45. package/dist/analyzer/testplan.js +218 -0
  46. package/dist/analyzer/testplan.js.map +1 -0
  47. package/dist/cli.js +1192 -401
  48. package/dist/cli.js.map +1 -1
  49. package/dist/metrics.d.ts +51 -0
  50. package/dist/metrics.d.ts.map +1 -0
  51. package/dist/metrics.js +64 -0
  52. package/dist/metrics.js.map +1 -0
  53. package/dist/parser/extract.d.ts +1 -0
  54. package/dist/parser/extract.d.ts.map +1 -1
  55. package/dist/parser/extract.js +8 -0
  56. package/dist/parser/extract.js.map +1 -1
  57. package/dist/parser/lang-go.d.ts.map +1 -1
  58. package/dist/parser/lang-go.js +75 -39
  59. package/dist/parser/lang-go.js.map +1 -1
  60. package/dist/parser/lang-java.d.ts.map +1 -1
  61. package/dist/parser/lang-java.js +30 -29
  62. package/dist/parser/lang-java.js.map +1 -1
  63. package/dist/parser/lang-js.js +105 -105
  64. package/dist/parser/lang-php.js +38 -38
  65. package/dist/parser/lang-py.d.ts.map +1 -1
  66. package/dist/parser/lang-py.js +53 -31
  67. package/dist/parser/lang-py.js.map +1 -1
  68. package/dist/parser/lang-ruby.d.ts.map +1 -1
  69. package/dist/parser/lang-ruby.js +15 -14
  70. package/dist/parser/lang-ruby.js.map +1 -1
  71. package/dist/parser/lang-rust.js +30 -30
  72. package/dist/parser/lang-ts.js +191 -191
  73. package/dist/security/deps.d.ts +38 -0
  74. package/dist/security/deps.d.ts.map +1 -0
  75. package/dist/security/deps.js +685 -0
  76. package/dist/security/deps.js.map +1 -0
  77. package/dist/security/rules.d.ts +42 -0
  78. package/dist/security/rules.d.ts.map +1 -0
  79. package/dist/security/rules.js +940 -0
  80. package/dist/security/rules.js.map +1 -0
  81. package/dist/server/hooks.d.ts +26 -0
  82. package/dist/server/hooks.d.ts.map +1 -0
  83. package/dist/server/hooks.js +253 -0
  84. package/dist/server/hooks.js.map +1 -0
  85. package/dist/server/mcp-prompts.d.ts +277 -0
  86. package/dist/server/mcp-prompts.d.ts.map +1 -0
  87. package/dist/server/mcp-prompts.js +627 -0
  88. package/dist/server/mcp-prompts.js.map +1 -0
  89. package/dist/server/mcp.d.ts.map +1 -1
  90. package/dist/server/mcp.js +520 -36
  91. package/dist/server/mcp.js.map +1 -1
  92. package/dist/server/test-plan.d.ts +20 -0
  93. package/dist/server/test-plan.d.ts.map +1 -0
  94. package/dist/server/test-plan.js +100 -0
  95. package/dist/server/test-plan.js.map +1 -0
  96. package/dist/skills.js +152 -120
  97. package/dist/skills.js.map +1 -1
  98. package/dist/store/annotations.d.ts +41 -0
  99. package/dist/store/annotations.d.ts.map +1 -0
  100. package/dist/store/annotations.js +192 -0
  101. package/dist/store/annotations.js.map +1 -0
  102. package/dist/store/confidence.d.ts +18 -0
  103. package/dist/store/confidence.d.ts.map +1 -0
  104. package/dist/store/confidence.js +82 -0
  105. package/dist/store/confidence.js.map +1 -0
  106. package/dist/store/db.d.ts +68 -1
  107. package/dist/store/db.d.ts.map +1 -1
  108. package/dist/store/db.js +349 -139
  109. package/dist/store/db.js.map +1 -1
  110. package/dist/store/schema.sql +128 -83
  111. package/dist/store/vectors.d.ts +65 -0
  112. package/dist/store/vectors.d.ts.map +1 -0
  113. package/dist/store/vectors.js +212 -0
  114. package/dist/store/vectors.js.map +1 -0
  115. package/dist/types.d.ts +101 -0
  116. package/dist/types.d.ts.map +1 -1
  117. package/dist/utils.d.ts +3 -0
  118. package/dist/utils.d.ts.map +1 -0
  119. package/dist/utils.js +9 -0
  120. package/dist/utils.js.map +1 -0
  121. package/docs/README.md +24 -0
  122. package/docs/diagram2.svg +1 -1
  123. package/package.json +80 -65
@@ -0,0 +1,107 @@
1
+ # Milens Adapter Packs
2
+
3
+ Ready-to-use configuration files for connecting milens MCP server to popular AI coding harnesses.
4
+
5
+ ## What is milens?
6
+
7
+ Milens is a code intelligence MCP server that provides deep symbol search, dependency graphs, blast-radius analysis, and pre-commit change detection. These adapter packs wire milens into your AI coding tool so it can answer questions like "what calls this function?" and "what breaks if I change this?"
8
+
9
+ ## Available Adapters
10
+
11
+ | Harness | Directory | What's included |
12
+ |---|---|---|
13
+ | **Claude Code** | `claude-code/` | `.claude/mcp.json` + `CLAUDE.md` |
14
+ | **OpenCode** | `opencode/` | `.opencode/config.json` + `AGENTS.md` |
15
+ | **Codex** | `codex/` | `.codex/codex.md` |
16
+ | **Cursor** | `cursor/` | `.cursorrules` |
17
+ | **GitHub Copilot** | `copilot/` | `.github/copilot-instructions.md` |
18
+ | **Gemini** | `gemini/` | `.gemini/context.md` |
19
+ | **Zed** | `zed/` | `.zed/settings.json` |
20
+
21
+ ## Installation
22
+
23
+ ### Claude Code
24
+
25
+ ```bash
26
+ cp -r adapters/claude-code/.claude .claude/
27
+ cp adapters/claude-code/CLAUDE.md CLAUDE.md
28
+ ```
29
+
30
+ ### OpenCode
31
+
32
+ ```bash
33
+ cp -r adapters/opencode/.opencode .opencode/
34
+ cp adapters/opencode/AGENTS.md AGENTS.md
35
+ ```
36
+
37
+ ### Codex
38
+
39
+ ```bash
40
+ cp -r adapters/codex/.codex .codex/
41
+ ```
42
+
43
+ ### Cursor
44
+
45
+ ```bash
46
+ cp adapters/cursor/.cursorrules .cursorrules
47
+ ```
48
+
49
+ ### GitHub Copilot
50
+
51
+ ```bash
52
+ cp -r adapters/copilot/.github .github/
53
+ ```
54
+
55
+ ### Gemini
56
+
57
+ ```bash
58
+ cp -r adapters/gemini/.gemini .gemini/
59
+ ```
60
+
61
+ ### Zed
62
+
63
+ ```bash
64
+ cp -r adapters/zed/.zed .zed/
65
+ ```
66
+
67
+ ## Verification
68
+
69
+ After installation, verify milens is connected:
70
+
71
+ 1. Start your AI harness
72
+ 2. Look for the milens MCP server in the tools list
73
+ 3. Run `mcp_milens_status` to confirm the index is healthy
74
+
75
+ ## Index Maintenance
76
+
77
+ After significant code changes, refresh the index:
78
+
79
+ ```bash
80
+ npx milens analyze -p . --force
81
+ ```
82
+
83
+ ## All Tools Available
84
+
85
+ | Tool | Purpose |
86
+ |---|---|
87
+ | `mcp_milens_overview` | Combined context + impact + grep |
88
+ | `mcp_milens_edit_check` | Pre-edit safety check |
89
+ | `mcp_milens_impact` | Blast radius analysis |
90
+ | `mcp_milens_context` | 360° caller/callee view |
91
+ | `mcp_milens_query` | Symbol definitions by name |
92
+ | `mcp_milens_grep` | Full-text search all files |
93
+ | `mcp_milens_detect_changes` | Pre-commit change detection |
94
+ | `mcp_milens_explain_relationship` | Shortest path between symbols |
95
+ | `mcp_milens_get_file_symbols` | All symbols in a file |
96
+ | `mcp_milens_get_type_hierarchy` | Class inheritance tree |
97
+ | `mcp_milens_find_dead_code` | Unused exported symbols |
98
+ | `mcp_milens_trace` | Execution flow tracing |
99
+ | `mcp_milens_status` | Index health check |
100
+
101
+ ## Safety Rules (applies to all harnesses)
102
+
103
+ - Never edit a symbol without `mcp_milens_edit_check` first
104
+ - Never delete/rename without `mcp_milens_grep` + `mcp_milens_impact`
105
+ - Never commit without `mcp_milens_detect_changes`
106
+ - Use `mcp_milens_grep` for phrases/UI text, `mcp_milens_query` for code symbols
107
+ - All milens calls require `repo` set to the absolute workspace root
@@ -0,0 +1,9 @@
1
+ {
2
+ "mcpServers": {
3
+ "milens": {
4
+ "command": "npx",
5
+ "args": ["milens", "serve"],
6
+ "env": { "MILENS_PROFILE": "standard" }
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,58 @@
1
+ # Milens — Code Intelligence for Claude Code
2
+
3
+ Milens is an MCP server that provides deep code intelligence: symbol search, dependency graphs, blast-radius analysis, and pre-commit change detection.
4
+
5
+ ## Available Tools
6
+
7
+ | Tool | Purpose |
8
+ |---|---|
9
+ | `mcp_milens_query` | Find symbol definitions by name |
10
+ | `mcp_milens_grep` | Text search across ALL project files |
11
+ | `mcp_milens_context` | 360° view: callers + callees |
12
+ | `mcp_milens_impact` | Blast radius before editing |
13
+ | `mcp_milens_detect_changes` | Pre-commit scope check |
14
+ | `mcp_milens_overview` | Combined context + impact + grep |
15
+ | `mcp_milens_edit_check` | Pre-edit safety check |
16
+ | `mcp_milens_explain_relationship` | Shortest path between two symbols |
17
+ | `mcp_milens_get_file_symbols` | All symbols in a file |
18
+ | `mcp_milens_get_type_hierarchy` | Class inheritance tree |
19
+ | `mcp_milens_find_dead_code` | Unused exported symbols |
20
+ | `mcp_milens_trace` | Trace execution flows from entrypoints |
21
+ | `mcp_milens_status` | Index health check |
22
+
23
+ All tool calls must include `repo` set to the absolute workspace root.
24
+
25
+ ## Session Workflow
26
+
27
+ 1. **Start** — The milens MCP server connects via `npx milens serve`. Verify with `mcp_milens_status`.
28
+ 2. **Recall** — When asked to work on a symbol, use `mcp_milens_overview` for a combined view of context, impact, and text references.
29
+ 3. **Code** — Make changes following the edit-safety rules below.
30
+ 4. **Verify** — Before committing, run `mcp_milens_detect_changes` to confirm only expected files changed.
31
+ 5. **Annotate** — After significant changes, run `npx milens analyze -p . --force` to keep the index fresh.
32
+
33
+ ## Edit Safety (Mandatory)
34
+
35
+ **Before editing any function, class, or method:**
36
+ 1. Call `mcp_milens_edit_check` on the target symbol to see callers and export status.
37
+ 2. If depth-1 dependents > 5, **stop and warn the user** before proceeding.
38
+ 3. Call `mcp_milens_context` to understand the full caller/callee picture.
39
+ 4. Only then make the edit.
40
+
41
+ **Before deleting or renaming:**
42
+ 1. `mcp_milens_grep` — find ALL text references (templates, configs, docs).
43
+ 2. `mcp_milens_impact` with `direction: "upstream"` — find code-level dependents.
44
+ 3. Combine both results before acting.
45
+
46
+ **Before committing:**
47
+ - Call `mcp_milens_detect_changes` — if unexpected files appear, stop and report.
48
+
49
+ ## Tool Selection
50
+
51
+ - Use `mcp_milens_query` for symbol names (camelCase, PascalCase, snake_case).
52
+ - Use `mcp_milens_grep` for multi-word phrases, UI labels, error messages, or text in templates/configs/docs.
53
+ - When in doubt, use `mcp_milens_grep` first — it searches everything.
54
+
55
+ ## Reference
56
+
57
+ See `AGENTS.md` at the repo root for project-specific context and codebase structure.
58
+ Skill files at `.agents/skills/milens/SKILL.md` provide advanced workflow guides.
@@ -0,0 +1,52 @@
1
+ # Milens — Code Intelligence for Codex
2
+
3
+ Milens provides deep code intelligence for this project via MCP. Connect it in your Codex configuration:
4
+
5
+ ```json
6
+ {
7
+ "mcpServers": {
8
+ "milens": {
9
+ "command": "npx",
10
+ "args": ["milens", "serve"],
11
+ "env": { "MILENS_PROFILE": "standard" }
12
+ }
13
+ }
14
+ }
15
+ ```
16
+
17
+ ## Core Tools (use first)
18
+
19
+ | Tool | When to use |
20
+ |---|---|
21
+ | `mcp_milens_overview` | First look at any symbol you need to understand or edit — combines context, impact, and text search |
22
+ | `mcp_milens_edit_check` | Before editing any function/class/method — shows callers and export status |
23
+ | `mcp_milens_impact` | Check blast radius — what breaks if this symbol changes |
24
+ | `mcp_milens_query` | Find code symbols by name (camelCase, PascalCase, snake_case) |
25
+ | `mcp_milens_grep` | Full-text search for phrases, UI labels, error strings, docs, configs |
26
+ | `mcp_milens_detect_changes` | Pre-commit check — verify only expected files changed |
27
+
28
+ All milens MCP calls require `repo` set to the absolute workspace root path.
29
+
30
+ ## Session Workflow
31
+
32
+ 1. **Connect** — Verify milens is running with `mcp_milens_status`.
33
+ 2. **Understand** — For any symbol the user mentions, call `mcp_milens_overview` first.
34
+ 3. **Edit safely** — Run `mcp_milens_edit_check` before touching any symbol. If dependents > 5, warn the user.
35
+ 4. **Verify** — Before committing, call `mcp_milens_detect_changes` to confirm scope.
36
+ 5. **Refresh** — After significant changes: `npx milens analyze -p . --force`.
37
+
38
+ ## Safety Rules
39
+
40
+ - Never edit without `mcp_milens_edit_check` first.
41
+ - Never delete/rename without both `mcp_milens_grep` AND `mcp_milens_impact`.
42
+ - Never commit without `mcp_milens_detect_changes`.
43
+ - Never call milens tools without the `repo` parameter.
44
+ - Use `mcp_milens_grep` (not `mcp_milens_query`) for multi-word or display-text searches.
45
+
46
+ ## Advanced Workflows
47
+
48
+ See `.agents/skills/milens/SKILL.md` for full documentation, including:
49
+ - `mcp_milens_trace` — execution flow tracing
50
+ - `mcp_milens_get_type_hierarchy` — inheritance trees
51
+ - `mcp_milens_find_dead_code` — dead code detection
52
+ - `mcp_milens_explain_relationship` — how two symbols are connected
@@ -0,0 +1,62 @@
1
+ # Milens — Code Intelligence for GitHub Copilot
2
+
3
+ This project uses [milens](https://opencode.ai) for deep code intelligence. The milens MCP server provides symbol search, dependency graphs, blast-radius analysis, and pre-commit safety checks.
4
+
5
+ ## MCP Configuration
6
+
7
+ Add to your Copilot MCP settings:
8
+
9
+ ```json
10
+ {
11
+ "mcpServers": {
12
+ "milens": {
13
+ "command": "npx",
14
+ "args": ["milens", "serve"],
15
+ "env": { "MILENS_PROFILE": "standard" }
16
+ }
17
+ }
18
+ }
19
+ ```
20
+
21
+ All tool calls must include `repo` set to the absolute workspace root.
22
+
23
+ ## Key Tools
24
+
25
+ | Tool | Purpose |
26
+ |---|---|
27
+ | `mcp_milens_overview` | Combined context + impact + grep in one call |
28
+ | `mcp_milens_edit_check` | Pre-edit safety: callers, export status, warnings |
29
+ | `mcp_milens_impact` | Blast radius — what depends on this symbol |
30
+ | `mcp_milens_context` | 360° view of incoming refs + outgoing deps |
31
+ | `mcp_milens_query` | Symbol lookup by name |
32
+ | `mcp_milens_grep` | Full-text search across all files |
33
+ | `mcp_milens_detect_changes` | Git diff → affected symbols |
34
+ | `mcp_milens_status` | Index health check |
35
+
36
+ ## Session Workflow
37
+
38
+ 1. **Start** — Verify milens is connected: `mcp_milens_status`.
39
+ 2. **Recall** — For any symbol, use `mcp_milens_overview` for a comprehensive first look.
40
+ 3. **Code** — Edit only after running `mcp_milens_edit_check` on the target.
41
+ 4. **Verify** — Before commit: `mcp_milens_detect_changes`.
42
+ 5. **Refresh** — After big changes: `npx milens analyze -p . --force`.
43
+
44
+ ## Safety: Always Check Before Editing
45
+
46
+ - **Before modifying any function/class/method** → `mcp_milens_edit_check`
47
+ - If depth-1 dependents > 5, warn the user and present alternatives.
48
+ - **Before deleting/renaming any symbol** → `mcp_milens_grep` + `mcp_milens_impact`
49
+ - Grep catches text/string references; impact catches code references.
50
+ - **Before committing** → `mcp_milens_detect_changes`
51
+ - Stop and report if unexpected files are in the diff.
52
+
53
+ ## Tool Selection
54
+
55
+ - Symbol names (camelCase, PascalCase, snake_case) → `mcp_milens_query`
56
+ - Multi-word phrases, UI strings, error messages → `mcp_milens_grep`
57
+ - In doubt → `mcp_milens_grep` first
58
+
59
+ ## Reference
60
+
61
+ - Full documentation: `.agents/skills/milens/SKILL.md`
62
+ - Project context: `AGENTS.md`
@@ -0,0 +1,9 @@
1
+ {
2
+ "mcpServers": {
3
+ "milens": {
4
+ "command": "npx",
5
+ "args": ["milens", "serve"],
6
+ "env": { "MILENS_PROFILE": "standard" }
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,58 @@
1
+ # Milens — Code Intelligence
2
+
3
+ This project is indexed by **milens**, an MCP server that provides deep code intelligence (symbol search, dependency graphs, blast-radius analysis, change detection). The index covers 616 symbols, 843 links, across 59 files.
4
+
5
+ ## MCP Connection
6
+
7
+ ```json
8
+ {
9
+ "mcpServers": {
10
+ "milens": {
11
+ "command": "npx",
12
+ "args": ["milens", "serve"],
13
+ "env": { "MILENS_PROFILE": "standard" }
14
+ }
15
+ }
16
+ }
17
+ ```
18
+
19
+ All milens MCP calls require the `repo` parameter set to the absolute workspace root.
20
+
21
+ ## Essential Tools
22
+
23
+ | Tool | Description |
24
+ |---|---|
25
+ | `mcp_milens_overview` | First-stop: context + impact + grep combined |
26
+ | `mcp_milens_edit_check` | Pre-edit safety: callers, exports, warnings |
27
+ | `mcp_milens_impact` | Upstream/downstream blast radius |
28
+ | `mcp_milens_context` | Full incoming + outgoing dependency view |
29
+ | `mcp_milens_query` | Symbol search by name |
30
+ | `mcp_milens_grep` | Text search everywhere (templates, configs, docs) |
31
+ | `mcp_milens_detect_changes` | Git-aware change detection |
32
+ | `mcp_milens_trace` | Execution flow from entrypoints |
33
+ | `mcp_milens_find_dead_code` | Unused exported symbols |
34
+ | `mcp_milens_status` | Index health |
35
+
36
+ ## Workflow
37
+
38
+ **Every session follows this pattern:**
39
+
40
+ 1. **Start** — `mcp_milens_status` to verify the index is healthy.
41
+ 2. **Understand** — `mcp_milens_overview({name, repo})` for any symbol mentioned.
42
+ 3. **Edit safely** — `mcp_milens_edit_check` before touching hub/shared code. Halt if dependents > 5.
43
+ 4. **Verify** — `mcp_milens_detect_changes` before committing. Report unexpected changes.
44
+ 5. **Refresh** — `npx milens analyze -p . --force` after significant edits.
45
+
46
+ ## Mandatory Safety Rules
47
+
48
+ - **Never edit** a symbol without `mcp_milens_edit_check` first.
49
+ - **Never delete/rename** without `mcp_milens_grep` AND `mcp_milens_impact`.
50
+ - **Never commit** without `mcp_milens_detect_changes`.
51
+ - **Never omit** the `repo` parameter from milens calls.
52
+ - **Use `mcp_milens_grep`** (not `mcp_milens_query`) for phrases, UI text, config strings.
53
+
54
+ ## Codebase Structure
55
+
56
+ - `.agents/skills/milens/SKILL.md` — full milens documentation
57
+ - `.agents/skills/` — area-specific skill files (analyzer, parser, server, store, etc.)
58
+ - `AGENTS.md` — project-level instructions and conventions
@@ -0,0 +1,9 @@
1
+ {
2
+ "mcp": {
3
+ "milens": {
4
+ "command": "npx",
5
+ "args": ["milens", "serve"],
6
+ "env": { "MILENS_PROFILE": "standard" }
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,58 @@
1
+ # Milens — Code Intelligence for OpenCode
2
+
3
+ Milens is an MCP server that provides deep code intelligence: symbol search, dependency graphs, blast-radius analysis, and pre-commit change detection. This file configures OpenCode to use milens automatically.
4
+
5
+ ## Available Tools
6
+
7
+ | Tool | Purpose |
8
+ |---|---|
9
+ | `mcp_milens_query` | Find symbol definitions by name |
10
+ | `mcp_milens_grep` | Text search across ALL project files |
11
+ | `mcp_milens_context` | 360° view: callers + callees |
12
+ | `mcp_milens_impact` | Blast radius before editing |
13
+ | `mcp_milens_detect_changes` | Pre-commit scope check |
14
+ | `mcp_milens_overview` | Combined context + impact + grep |
15
+ | `mcp_milens_edit_check` | Pre-edit safety check |
16
+ | `mcp_milens_explain_relationship` | Shortest path between two symbols |
17
+ | `mcp_milens_get_file_symbols` | All symbols in a file |
18
+ | `mcp_milens_get_type_hierarchy` | Class inheritance tree |
19
+ | `mcp_milens_find_dead_code` | Unused exported symbols |
20
+ | `mcp_milens_trace` | Trace execution flows from entrypoints |
21
+ | `mcp_milens_status` | Index health check |
22
+
23
+ All tool calls must include `repo` set to the absolute workspace root.
24
+
25
+ ## Session Workflow
26
+
27
+ 1. **Start** — The milens MCP server connects via the `.opencode/config.json` entry. Verify with `mcp_milens_status`.
28
+ 2. **Recall** — When asked to work on a symbol, use `mcp_milens_overview` for a combined view of context, impact, and text references.
29
+ 3. **Code** — Make changes following the edit-safety rules below.
30
+ 4. **Verify** — Before committing, run `mcp_milens_detect_changes` to confirm only expected files changed.
31
+ 5. **Annotate** — After significant changes, run `npx milens analyze -p . --force` to keep the index fresh.
32
+
33
+ ## Edit Safety (Mandatory)
34
+
35
+ **Before editing any function, class, or method:**
36
+ 1. Call `mcp_milens_edit_check` on the target symbol to see callers and export status.
37
+ 2. If depth-1 dependents > 5, **stop and warn the user** before proceeding.
38
+ 3. Call `mcp_milens_context` to understand the full caller/callee picture.
39
+ 4. Only then make the edit.
40
+
41
+ **Before deleting or renaming:**
42
+ 1. `mcp_milens_grep` — find ALL text references (templates, configs, docs).
43
+ 2. `mcp_milens_impact` with `direction: "upstream"` — find code-level dependents.
44
+ 3. Combine both results before acting.
45
+
46
+ **Before committing:**
47
+ - Call `mcp_milens_detect_changes` — if unexpected files appear, stop and report.
48
+
49
+ ## Tool Selection
50
+
51
+ - Use `mcp_milens_query` for symbol names (camelCase, PascalCase, snake_case).
52
+ - Use `mcp_milens_grep` for multi-word phrases, UI labels, error messages, or text in templates/configs/docs.
53
+ - When in doubt, use `mcp_milens_grep` first — it searches everything.
54
+
55
+ ## Reference
56
+
57
+ Skill files at `.agents/skills/milens/SKILL.md` provide advanced workflow guides.
58
+ See the project `AGENTS.md` for codebase-specific context.
@@ -0,0 +1,8 @@
1
+ {
2
+ "context_servers": {
3
+ "milens": {
4
+ "command": "npx milens serve",
5
+ "env": { "MILENS_PROFILE": "minimal" }
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,3 @@
1
+ import { Database } from './store/db.js';
2
+ export declare function generateAgentsMd(db: Database, rootPath: string): string;
3
+ //# sourceMappingURL=agents-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md.d.ts","sourceRoot":"","sources":["../src/agents-md.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AA0CzC,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA+EvE"}
@@ -0,0 +1,112 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join, relative, basename, dirname } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ function readMilensVersion() {
6
+ const candidates = [
7
+ join(__dirname, '..', 'package.json'),
8
+ join(__dirname, '..', '..', 'package.json'),
9
+ ];
10
+ for (const p of candidates) {
11
+ try {
12
+ const pkg = JSON.parse(readFileSync(p, 'utf-8'));
13
+ if (pkg.version)
14
+ return pkg.version;
15
+ }
16
+ catch { }
17
+ }
18
+ return 'unknown';
19
+ }
20
+ function countDependents(db, symbolId) {
21
+ const links = db.getIncomingLinks(symbolId);
22
+ const uniqueFrom = new Set();
23
+ for (const l of links) {
24
+ if (l.type !== 'contains')
25
+ uniqueFrom.add(l.fromId);
26
+ }
27
+ return uniqueFrom.size;
28
+ }
29
+ function relativeFilePath(filePath, rootPath) {
30
+ const rel = relative(rootPath, filePath);
31
+ return rel.replace(/\\/g, '/');
32
+ }
33
+ function findRouteSymbols(db) {
34
+ const all = db.getAllSymbols();
35
+ const routePatterns = /[\/\\]route\.[jt]sx?$|[\/\\]router[\/\\]|[\/\\]routes[\/\\]|[\/\\]api[\/\\]/;
36
+ return all.filter(s => routePatterns.test(s.filePath) && s.exported && (s.kind === 'function' || s.kind === 'method' || s.kind === 'class'));
37
+ }
38
+ export function generateAgentsMd(db, rootPath) {
39
+ const version = readMilensVersion();
40
+ const date = new Date().toISOString().split('T')[0];
41
+ const repoName = basename(rootPath);
42
+ const summary = db.getCodebaseSummary();
43
+ const lines = [];
44
+ lines.push(`# Project: ${repoName}`);
45
+ lines.push('');
46
+ lines.push(`> Auto-generated by milens ${version} on ${date}`);
47
+ lines.push('');
48
+ lines.push('## Codebase Summary');
49
+ lines.push(`- Symbols: ${summary.symbols} | Links: ${summary.links} | Files: ${summary.files}`);
50
+ lines.push(`- Test coverage: ${summary.coveragePct}%`);
51
+ lines.push('');
52
+ lines.push('## Domain Map');
53
+ lines.push('| Domain | Files | Symbols | Description |');
54
+ lines.push('|---|---|---|---|');
55
+ if (summary.domains.length > 0) {
56
+ for (const d of summary.domains) {
57
+ lines.push(`| ${d.domain} | ${d.files} | ${d.symbols} | |`);
58
+ }
59
+ }
60
+ else {
61
+ lines.push('| (none) | 0 | 0 | No domain clusters detected |');
62
+ }
63
+ lines.push('');
64
+ lines.push('## Critical Symbols (Top Hubs — DO NOT modify without impact check)');
65
+ lines.push('| Symbol | Kind | File | Heat | Dependents | Risk |');
66
+ lines.push('|---|---|---|---|---|---|');
67
+ const hubs = summary.topHubs.filter(h => (h.heat ?? 0) > 0);
68
+ if (hubs.length > 0) {
69
+ for (const hub of hubs) {
70
+ const heat = hub.heat ?? 0;
71
+ const dependents = countDependents(db, hub.id);
72
+ const file = relativeFilePath(hub.filePath, rootPath);
73
+ const risk = heat >= 10 ? 'HIGH' : heat >= 5 ? 'MEDIUM' : 'LOW';
74
+ lines.push(`| ${hub.name} | ${hub.kind} | ${file}:${hub.startLine} | ${heat} | ${dependents} | ${risk} |`);
75
+ }
76
+ }
77
+ else {
78
+ lines.push('| (none) | — | — | — | — | — |');
79
+ }
80
+ lines.push('');
81
+ const routes = findRouteSymbols(db);
82
+ lines.push('## API Endpoints');
83
+ if (routes.length > 0) {
84
+ lines.push('| Method | Path | Handler | File |');
85
+ lines.push('|---|---|---|---|');
86
+ for (const sym of routes.slice(0, 30)) {
87
+ const file = relativeFilePath(sym.filePath, rootPath);
88
+ const name = sym.signature ?? sym.name;
89
+ lines.push(`| — | — | ${name} | ${file}:${sym.startLine} |`);
90
+ }
91
+ }
92
+ else {
93
+ lines.push('');
94
+ lines.push('No routes detected.');
95
+ }
96
+ lines.push('');
97
+ lines.push('## Milens Workflows Available');
98
+ lines.push('- `/milens:plan "feature"` — generate implementation plan');
99
+ lines.push('- `/milens:review` — review current changes');
100
+ lines.push('- `/milens:tdd <symbol>` — write tests with coverage analysis');
101
+ lines.push('- `/milens:security` — security audit');
102
+ lines.push('- `/milens:refactor <symbol>` — safe refactor with blast radius check');
103
+ lines.push('');
104
+ lines.push('## Session Startup');
105
+ lines.push('When starting work, call:');
106
+ lines.push('1. session_start({agent: "your-agent-name"})');
107
+ lines.push('2. recall({}) — retrieve past annotations');
108
+ lines.push('3. codebase_summary({}) — refresh context');
109
+ lines.push('');
110
+ return lines.join('\n');
111
+ }
112
+ //# sourceMappingURL=agents-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../src/agents-md.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ interface EngineOptions {
5
5
  verbose?: boolean;
6
6
  force?: boolean;
7
7
  aliases?: Record<string, string>;
8
+ embeddings?: boolean;
8
9
  }
9
10
  export declare function analyze(opts: EngineOptions): Promise<AnalysisStats>;
10
11
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/analyzer/engine.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAyJ,aAAa,EAAE,MAAM,aAAa,CAAC;AAgExM,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAmBD,wBAAsB,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAwRzE"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/analyzer/engine.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAyJ,aAAa,EAAE,MAAM,aAAa,CAAC;AAgExM,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAmBD,wBAAsB,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAkTzE"}
@@ -10,7 +10,9 @@ import { extractHtmlScripts, extractHtmlRefs } from '../parser/lang-html.js';
10
10
  import { extractMarkdown } from '../parser/lang-md.js';
11
11
  import { resolveLinksWithStats } from './resolver.js';
12
12
  import { enrichMetadata } from './enrich.js';
13
+ import { isTestFile } from '../utils.js';
13
14
  import { Database } from '../store/db.js';
15
+ import { TfIdfProvider, EmbeddingStore, buildEmbeddingText } from '../store/vectors.js';
14
16
  // ── Async batch file reader ──
15
17
  // Reads multiple files concurrently with concurrency limit to avoid fd exhaustion
16
18
  const READ_CONCURRENCY = 32;
@@ -327,6 +329,31 @@ export async function analyze(opts) {
327
329
  db.setMeta('exported_production_symbols', String(exportedProduction.length));
328
330
  db.rebuildSearch();
329
331
  });
332
+ // Phase 8: Generate embeddings (optional)
333
+ if (opts.embeddings) {
334
+ const provider = new TfIdfProvider();
335
+ const texts = allSymbols.map(s => buildEmbeddingText({
336
+ name: s.name, kind: s.kind, filePath: s.filePath, signature: s.signature,
337
+ }));
338
+ provider.trainIdf(texts);
339
+ await provider.init();
340
+ const store = new EmbeddingStore(db.connection, provider.dimensions);
341
+ const EMBED_BATCH = 200;
342
+ let embedded = 0;
343
+ for (let i = 0; i < allSymbols.length; i += EMBED_BATCH) {
344
+ const batch = allSymbols.slice(i, i + EMBED_BATCH);
345
+ const batchTexts = texts.slice(i, i + EMBED_BATCH);
346
+ const vecs = await provider.embedBatch(batchTexts);
347
+ db.transaction(() => {
348
+ for (let j = 0; j < batch.length; j++) {
349
+ store.store(batch[j].id, vecs[j], provider.name);
350
+ }
351
+ });
352
+ embedded += batch.length;
353
+ }
354
+ if (opts.verbose)
355
+ console.log(`[embed] Generated ${embedded} embeddings (${provider.name})`);
356
+ }
330
357
  const stats = {
331
358
  filesScanned: files.length,
332
359
  filesParsed,
@@ -488,12 +515,4 @@ function parseDocFile(source, filePath, spec) {
488
515
  }
489
516
  return null;
490
517
  }
491
- /** Check if a file path looks like a test/spec file */
492
- function isTestFile(filePath) {
493
- return /\.(test|spec)\.[jt]sx?$/.test(filePath) ||
494
- /^tests?[/\\]/.test(filePath) ||
495
- /__tests__[/\\]/.test(filePath) ||
496
- /_test\.(go|py|rb|rs|java|php)$/.test(filePath) ||
497
- /^test_.*\.py$/.test(filePath.split('/').pop() ?? '');
498
- }
499
518
  //# sourceMappingURL=engine.js.map