minder-cli 0.4.6__tar.gz → 0.4.9__tar.gz

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 (155) hide show
  1. {minder_cli-0.4.6 → minder_cli-0.4.9}/.gitignore +9 -3
  2. {minder_cli-0.4.6 → minder_cli-0.4.9}/PKG-INFO +1 -1
  3. {minder_cli-0.4.6 → minder_cli-0.4.9}/pyproject.toml +1 -1
  4. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/cli/commands/mcp.py +54 -31
  5. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/cli/main.py +1 -1
  6. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/tools/memory.py +13 -2
  7. {minder_cli-0.4.6 → minder_cli-0.4.9}/LICENSE +0 -0
  8. {minder_cli-0.4.6 → minder_cli-0.4.9}/README-pypi.md +0 -0
  9. {minder_cli-0.4.6 → minder_cli-0.4.9}/README.md +0 -0
  10. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/__init__.py +0 -0
  11. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/api/routers/prompts.py +0 -0
  12. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/application/__init__.py +0 -0
  13. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/application/admin/__init__.py +0 -0
  14. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/application/admin/dto.py +0 -0
  15. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/application/admin/jobs.py +0 -0
  16. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/application/admin/use_cases.py +0 -0
  17. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/auth/__init__.py +0 -0
  18. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/auth/context.py +0 -0
  19. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/auth/middleware.py +0 -0
  20. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/auth/principal.py +0 -0
  21. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/auth/rate_limiter.py +0 -0
  22. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/auth/rbac.py +0 -0
  23. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/auth/service.py +0 -0
  24. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/bootstrap/__init__.py +0 -0
  25. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/bootstrap/providers.py +0 -0
  26. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/bootstrap/transport.py +0 -0
  27. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/cache/__init__.py +0 -0
  28. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/cache/providers.py +0 -0
  29. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/chunking/__init__.py +0 -0
  30. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/chunking/code_splitter.py +0 -0
  31. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/chunking/splitter.py +0 -0
  32. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/cli.py +0 -0
  33. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/config.py +0 -0
  34. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/context_compactor.py +0 -0
  35. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/continuity.py +0 -0
  36. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/dev.py +0 -0
  37. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/embedding/__init__.py +0 -0
  38. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/embedding/base.py +0 -0
  39. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/embedding/local.py +0 -0
  40. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/embedding/openai.py +0 -0
  41. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/__init__.py +0 -0
  42. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/edges.py +0 -0
  43. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/executor.py +0 -0
  44. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/graph.py +0 -0
  45. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/nodes/__init__.py +0 -0
  46. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/nodes/clarification.py +0 -0
  47. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/nodes/evaluator.py +0 -0
  48. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/nodes/guard.py +0 -0
  49. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/nodes/llm.py +0 -0
  50. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/nodes/planning.py +0 -0
  51. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/nodes/reasoning.py +0 -0
  52. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/nodes/reflection.py +0 -0
  53. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/nodes/reranker.py +0 -0
  54. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/nodes/retriever.py +0 -0
  55. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/nodes/verification.py +0 -0
  56. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/nodes/workflow_planner.py +0 -0
  57. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/runtime.py +0 -0
  58. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/graph/state.py +0 -0
  59. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/learning/__init__.py +0 -0
  60. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/learning/error_learner.py +0 -0
  61. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/learning/pattern_extractor.py +0 -0
  62. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/learning/quality_optimizer.py +0 -0
  63. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/learning/skill_synthesizer.py +0 -0
  64. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/llm/__init__.py +0 -0
  65. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/llm/base.py +0 -0
  66. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/llm/factory.py +0 -0
  67. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/llm/litert.py +0 -0
  68. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/llm/openai.py +0 -0
  69. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/__init__.py +0 -0
  70. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/base.py +0 -0
  71. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/client.py +0 -0
  72. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/document.py +0 -0
  73. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/error.py +0 -0
  74. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/graph.py +0 -0
  75. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/history.py +0 -0
  76. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/job.py +0 -0
  77. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/prompt.py +0 -0
  78. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/repository.py +0 -0
  79. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/rule.py +0 -0
  80. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/session.py +0 -0
  81. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/skill.py +0 -0
  82. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/user.py +0 -0
  83. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/models/workflow.py +0 -0
  84. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/observability/__init__.py +0 -0
  85. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/observability/audit.py +0 -0
  86. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/observability/logging.py +0 -0
  87. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/observability/metrics.py +0 -0
  88. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/observability/tracing.py +0 -0
  89. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/__init__.py +0 -0
  90. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/cli/__init__.py +0 -0
  91. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/cli/commands/agent.py +0 -0
  92. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/cli/commands/auth.py +0 -0
  93. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/cli/commands/ide.py +0 -0
  94. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/cli/commands/sync.py +0 -0
  95. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/cli/commands/update.py +0 -0
  96. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/cli/utils/common.py +0 -0
  97. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/cli/utils/config.py +0 -0
  98. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/cli/utils/git.py +0 -0
  99. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/cli/utils/version.py +0 -0
  100. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/http/__init__.py +0 -0
  101. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/http/admin/__init__.py +0 -0
  102. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/http/admin/api.py +0 -0
  103. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/http/admin/context.py +0 -0
  104. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/http/admin/dashboard.py +0 -0
  105. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/http/admin/jobs.py +0 -0
  106. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/http/admin/memories.py +0 -0
  107. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/http/admin/prompts.py +0 -0
  108. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/http/admin/routes.py +0 -0
  109. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/http/admin/runtime.py +0 -0
  110. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/http/admin/search.py +0 -0
  111. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/presentation/http/admin/skills.py +0 -0
  112. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/prompts/__init__.py +0 -0
  113. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/prompts/formatter.py +0 -0
  114. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/resources/__init__.py +0 -0
  115. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/retrieval/__init__.py +0 -0
  116. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/retrieval/hybrid.py +0 -0
  117. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/retrieval/mmr.py +0 -0
  118. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/retrieval/multi_hop.py +0 -0
  119. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/runtime.py +0 -0
  120. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/server.py +0 -0
  121. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/__init__.py +0 -0
  122. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/document.py +0 -0
  123. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/error.py +0 -0
  124. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/feedback.py +0 -0
  125. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/graph.py +0 -0
  126. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/history.py +0 -0
  127. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/interfaces.py +0 -0
  128. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/milvus/__init__.py +0 -0
  129. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/milvus/client.py +0 -0
  130. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/milvus/collections.py +0 -0
  131. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/milvus/vector_store.py +0 -0
  132. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/mongodb/__init__.py +0 -0
  133. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/mongodb/client.py +0 -0
  134. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/mongodb/graph_store.py +0 -0
  135. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/mongodb/indexes.py +0 -0
  136. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/mongodb/operational_store.py +0 -0
  137. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/relational.py +0 -0
  138. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/repo_state.py +0 -0
  139. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/rule.py +0 -0
  140. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/store/vector.py +0 -0
  141. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/tools/__init__.py +0 -0
  142. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/tools/auth.py +0 -0
  143. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/tools/graph.py +0 -0
  144. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/tools/ingest.py +0 -0
  145. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/tools/query.py +0 -0
  146. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/tools/registry.py +0 -0
  147. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/tools/repo_scanner.py +0 -0
  148. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/tools/search.py +0 -0
  149. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/tools/session.py +0 -0
  150. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/tools/skills.py +0 -0
  151. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/tools/workflow.py +0 -0
  152. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/transport/__init__.py +0 -0
  153. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/transport/base.py +0 -0
  154. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/transport/sse.py +0 -0
  155. {minder_cli-0.4.6 → minder_cli-0.4.9}/src/minder/transport/stdio.py +0 -0
@@ -7,8 +7,14 @@ __pycache__
7
7
  .ruff_cache
8
8
  .uv-cache
9
9
  ref
10
- .mcp.json
11
- .vscode/mcp.json
10
+
12
11
  default.profraw
13
12
  node_modules
14
- .astro
13
+ .astro
14
+
15
+ .cursor
16
+ .codex
17
+ .claude
18
+ .minder
19
+ .mcp.json
20
+ .vscode
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: minder-cli
3
- Version: 0.4.6
3
+ Version: 0.4.9
4
4
  Summary: Minder CLI is the command-line interface for the Minder self-hosted MCP platform.
5
5
  Project-URL: Homepage, https://github.com/hiimtrung/minder
6
6
  Project-URL: Repository, https://github.com/hiimtrung/minder
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "minder-cli"
7
- version = "0.4.6"
7
+ version = "0.4.9"
8
8
  description = "Minder CLI is the command-line interface for the Minder self-hosted MCP platform."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.14"
@@ -38,11 +38,8 @@ def _global_target_path(target: str) -> Path:
38
38
  return appdata_dir() / "Cursor" / "User" / "globalStorage" / "mcp-servers.json"
39
39
  return Path.home() / ".config" / "Cursor" / "User" / "globalStorage" / "mcp-servers.json"
40
40
  if target == "claude-code":
41
- if system == "Darwin":
42
- return Path.home() / "Library" / "Application Support" / "Claude" / "claude_desktop_config.json"
43
- if system == "Windows":
44
- return appdata_dir() / "Claude" / "claude_desktop_config.json"
45
- return Path.home() / ".config" / "Claude" / "claude_desktop_config.json"
41
+ # User scope: ~/.claude.json stores cross-project MCP servers under top-level mcpServers key
42
+ return Path.home() / ".claude.json"
46
43
  if target == "antigravity":
47
44
  return Path.home() / ".gemini" / "antigravity" / "mcp_config.json"
48
45
  if target == "codex":
@@ -94,7 +91,8 @@ def local_target_path(target: str, cwd: Path) -> Path:
94
91
  if target == "cursor":
95
92
  return cwd / ".cursor" / "mcp.json"
96
93
  if target == "claude-code":
97
- return cwd / ".claude" / "mcp.json"
94
+ # Project scope: .mcp.json at project root, shared via version control
95
+ return cwd / ".mcp.json"
98
96
  if target == "antigravity":
99
97
  del cwd
100
98
  return Path.home() / ".gemini" / "antigravity" / "mcp_config.json"
@@ -107,27 +105,39 @@ def _target_root_key(target: str) -> str:
107
105
  return "mcpServers"
108
106
 
109
107
 
108
+ def _ensure_gitignored(cwd: Path, filename: str) -> None:
109
+ gitignore = cwd / ".gitignore"
110
+ existing = gitignore.read_text(encoding="utf-8") if gitignore.is_file() else ""
111
+ for line in existing.splitlines():
112
+ if line.strip() in (filename, f"/{filename}"):
113
+ return
114
+ sep = "" if not existing or existing.endswith("\n") else "\n"
115
+ gitignore.write_text(existing + sep + filename + "\n", encoding="utf-8")
116
+ print(f" Added '{filename}' to .gitignore")
117
+
118
+
119
+ def _remove_gitignored(cwd: Path, filename: str) -> None:
120
+ gitignore = cwd / ".gitignore"
121
+ if not gitignore.is_file():
122
+ return
123
+ lines = gitignore.read_text(encoding="utf-8").splitlines(keepends=True)
124
+ filtered = [line for line in lines if line.strip() not in (filename, f"/{filename}")]
125
+ if len(filtered) < len(lines):
126
+ gitignore.write_text("".join(filtered), encoding="utf-8")
127
+
128
+
129
+ def _remote_url(protocol: str, server_url: str) -> str:
130
+ return sse_url(server_url) if protocol == "sse" else mcp_url(server_url)
131
+
132
+
110
133
  def _target_entry(
111
134
  target: str,
112
135
  protocol: str,
113
136
  client_key: str,
114
137
  server_url: str | None,
115
138
  ) -> dict[str, Any]:
116
- if target == "antigravity" and protocol != "stdio":
117
- return {
118
- "serverUrl": mcp_url(server_url or ""),
119
- "headers": {"X-Minder-Client-Key": client_key},
120
- }
121
-
122
- if target == "vscode" and protocol != "stdio":
123
- return {
124
- "type": "sse",
125
- "url": sse_url(server_url or ""),
126
- "headers": {"X-Minder-Client-Key": client_key},
127
- }
128
-
129
139
  if protocol == "stdio":
130
- entry = {
140
+ entry: dict[str, Any] = {
131
141
  "command": "uv",
132
142
  "args": ["run", "python", "-m", "minder.server"],
133
143
  "env": {
@@ -138,10 +148,21 @@ def _target_entry(
138
148
  if target == "vscode":
139
149
  entry["type"] = "stdio"
140
150
  return entry
141
- # sse
142
- if target == "claude-code":
143
- return {"url": sse_url(server_url or ""), "headers": {"Authorization": f"Bearer {client_key}"}}
144
- return {"url": mcp_url(server_url or ""), "headers": {"Authorization": f"Bearer {client_key}"}}
151
+
152
+ # Remote transport: URL and auth header are uniform across all targets.
153
+ # Only format differences below (key name, type field) per IDE spec.
154
+ url = _remote_url(protocol, server_url or "")
155
+ headers = {"X-Minder-Client-Key": client_key}
156
+
157
+ if target == "antigravity":
158
+ # Gemini CLI expects "serverUrl" instead of "url"
159
+ return {"serverUrl": url, "headers": headers}
160
+ if target in ("vscode", "claude-code"):
161
+ # VSCode and Claude Code require an explicit "type" field
162
+ return {"type": protocol, "url": url, "headers": headers}
163
+
164
+ # Standard format: cursor and all future targets
165
+ return {"url": url, "headers": headers}
145
166
 
146
167
 
147
168
  def install_mcp_command(args: argparse.Namespace) -> int:
@@ -167,25 +188,24 @@ def install_mcp_command(args: argparse.Namespace) -> int:
167
188
  continue
168
189
 
169
190
  try:
170
- if args.global_install:
171
- path = _global_target_path(target)
172
- else:
173
- path = local_target_path(target, cwd)
174
-
191
+ path = _global_target_path(target) if args.global_install else local_target_path(target, cwd)
175
192
  payload = load_json(path)
176
193
  root_key = _target_root_key(target)
177
194
  if root_key not in payload:
178
195
  payload[root_key] = {}
179
-
196
+
180
197
  payload[root_key]["minder"] = _target_entry(
181
198
  target,
182
199
  settings["protocol"],
183
200
  settings["client_api_key"],
184
201
  settings.get("server_url"),
185
202
  )
186
-
203
+
187
204
  write_json(path, payload)
188
205
  print(f"Installed Minder MCP config for {target} at {path}")
206
+
207
+ if not args.global_install and target == "claude-code":
208
+ _ensure_gitignored(cwd, ".mcp.json")
189
209
  except Exception as e:
190
210
  print(f"Failed to install MCP for {target}: {e}")
191
211
 
@@ -229,6 +249,9 @@ def uninstall_mcp_command(args: argparse.Namespace) -> int:
229
249
  else:
230
250
  write_json(path, payload)
231
251
  print(f"Removed Minder MCP config for {target} from {path}")
252
+
253
+ if not args.global_install and target == "claude-code":
254
+ _remove_gitignored(cwd, ".mcp.json")
232
255
  except Exception as e:
233
256
  print(f"Failed to uninstall MCP for {target}: {e}")
234
257
 
@@ -48,7 +48,7 @@ def build_parser() -> argparse.ArgumentParser:
48
48
  f" --global: {_global_target_path('vscode')}\n"
49
49
  f" cursor per-repo: {_cwd_placeholder}/.cursor/mcp.json\n"
50
50
  f" --global: {_global_target_path('cursor')}\n"
51
- f" claude-code per-repo: {_cwd_placeholder}/.claude/mcp.json\n"
51
+ f" claude-code per-repo: {_cwd_placeholder}/.mcp.json\n"
52
52
  f" --global: {_global_target_path('claude-code')}\n"
53
53
  f" antigravity always: {_global_target_path('antigravity')} [--global has no effect]\n"
54
54
  f" codex always: {_global_target_path('codex')} [--global has no effect]\n"
@@ -52,12 +52,23 @@ class MemoryTools:
52
52
  tags: list[str],
53
53
  language: str,
54
54
  ) -> dict[str, Any]:
55
+ # Normalize the language to a memory-eligible value so that
56
+ # is_memory_record() always identifies this entry as a memory.
57
+ # Callers sometimes pass a programming language like "typescript"
58
+ # which is NOT in MEMORY_LANGUAGES and would cause the entry
59
+ # to silently vanish from memory_list / memory_recall results.
60
+ store_language = language if language in MEMORY_LANGUAGES else "markdown"
61
+ normalized_tags = list(tags)
62
+ if language and language != store_language:
63
+ lang_tag = f"lang:{language}"
64
+ if lang_tag not in normalized_tags:
65
+ normalized_tags.append(lang_tag)
55
66
  skill = await self._store.create_skill(
56
67
  id=uuid.uuid4(),
57
68
  title=title,
58
69
  content=content,
59
- language=language,
60
- tags=tags,
70
+ language=store_language,
71
+ tags=normalized_tags,
61
72
  embedding=self._embedder.embed(f"{title}\n{content}"),
62
73
  usage_count=0,
63
74
  quality_score=0.0,
File without changes
File without changes
File without changes
File without changes
File without changes