memgit 0.1.1__tar.gz → 0.1.2__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 (26) hide show
  1. {memgit-0.1.1 → memgit-0.1.2}/PKG-INFO +8 -4
  2. {memgit-0.1.1 → memgit-0.1.2}/README.md +7 -3
  3. {memgit-0.1.1 → memgit-0.1.2}/memgit/cli.py +103 -10
  4. {memgit-0.1.1 → memgit-0.1.2}/memgit.egg-info/PKG-INFO +8 -4
  5. {memgit-0.1.1 → memgit-0.1.2}/pyproject.toml +1 -1
  6. {memgit-0.1.1 → memgit-0.1.2}/LICENSE +0 -0
  7. {memgit-0.1.1 → memgit-0.1.2}/memgit/__init__.py +0 -0
  8. {memgit-0.1.1 → memgit-0.1.2}/memgit/graph.py +0 -0
  9. {memgit-0.1.1 → memgit-0.1.2}/memgit/http_server.py +0 -0
  10. {memgit-0.1.1 → memgit-0.1.2}/memgit/importer.py +0 -0
  11. {memgit-0.1.1 → memgit-0.1.2}/memgit/mcp_server.py +0 -0
  12. {memgit-0.1.1 → memgit-0.1.2}/memgit/models.py +0 -0
  13. {memgit-0.1.1 → memgit-0.1.2}/memgit/repo.py +0 -0
  14. {memgit-0.1.1 → memgit-0.1.2}/memgit/scorer.py +0 -0
  15. {memgit-0.1.1 → memgit-0.1.2}/memgit/store.py +0 -0
  16. {memgit-0.1.1 → memgit-0.1.2}/memgit/tokens.py +0 -0
  17. {memgit-0.1.1 → memgit-0.1.2}/memgit/toon.py +0 -0
  18. {memgit-0.1.1 → memgit-0.1.2}/memgit.egg-info/SOURCES.txt +0 -0
  19. {memgit-0.1.1 → memgit-0.1.2}/memgit.egg-info/dependency_links.txt +0 -0
  20. {memgit-0.1.1 → memgit-0.1.2}/memgit.egg-info/entry_points.txt +0 -0
  21. {memgit-0.1.1 → memgit-0.1.2}/memgit.egg-info/requires.txt +0 -0
  22. {memgit-0.1.1 → memgit-0.1.2}/memgit.egg-info/top_level.txt +0 -0
  23. {memgit-0.1.1 → memgit-0.1.2}/setup.cfg +0 -0
  24. {memgit-0.1.1 → memgit-0.1.2}/tests/test_advanced.py +0 -0
  25. {memgit-0.1.1 → memgit-0.1.2}/tests/test_store_repo.py +0 -0
  26. {memgit-0.1.1 → memgit-0.1.2}/tests/test_toon.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memgit
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: Git for AI memory — version-controlled context persistence across Claude, GPT, Gemini, Cursor, Windsurf, and more
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://memgit.dev
@@ -27,14 +27,18 @@ Requires-Dist: pytest>=8.0; extra == "dev"
27
27
  Requires-Dist: pytest-anyio>=0.0.0; extra == "dev"
28
28
  Dynamic: license-file
29
29
 
30
+ <p align="center">
31
+ <img src="assets/logo.png" alt="memgit logo" width="120" />
32
+ </p>
33
+
30
34
  # memgit — git for AI memory
31
35
 
32
36
  **Version-controlled, cross-AI context that persists, diffs, rolls back, and syncs like code.**
33
37
 
34
38
  ```bash
35
39
  pip install memgit
36
- memgit init ~/.claude/memgit-store
37
- memgit setup all # registers with every AI tool detected on your machine
40
+ memgit init # auto-detects best location for your setup
41
+ memgit setup # step-by-step: pick which AI tools to register
38
42
  memgit stats # see your token savings vs claude.md / other plugins
39
43
  ```
40
44
 
@@ -441,7 +445,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md).
441
445
  - [x] Flat `memories/` directory — grep/diff/blame your memories
442
446
  - [x] D3.js graph visualization of memory relationships
443
447
  - [x] Multi-platform distribution (PyPI, Homebrew, npm, Chocolatey, winget)
444
- - [ ] PyPI publish (v0.1.0)
448
+ - [x] PyPI published (v0.1.1)
445
449
  - [ ] VS Code extension (Phase 3)
446
450
  - [ ] JetBrains plugin (Phase 3)
447
451
  - [ ] Semantic search via embeddings (Phase 4)
@@ -1,11 +1,15 @@
1
+ <p align="center">
2
+ <img src="assets/logo.png" alt="memgit logo" width="120" />
3
+ </p>
4
+
1
5
  # memgit — git for AI memory
2
6
 
3
7
  **Version-controlled, cross-AI context that persists, diffs, rolls back, and syncs like code.**
4
8
 
5
9
  ```bash
6
10
  pip install memgit
7
- memgit init ~/.claude/memgit-store
8
- memgit setup all # registers with every AI tool detected on your machine
11
+ memgit init # auto-detects best location for your setup
12
+ memgit setup # step-by-step: pick which AI tools to register
9
13
  memgit stats # see your token savings vs claude.md / other plugins
10
14
  ```
11
15
 
@@ -412,7 +416,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md).
412
416
  - [x] Flat `memories/` directory — grep/diff/blame your memories
413
417
  - [x] D3.js graph visualization of memory relationships
414
418
  - [x] Multi-platform distribution (PyPI, Homebrew, npm, Chocolatey, winget)
415
- - [ ] PyPI publish (v0.1.0)
419
+ - [x] PyPI published (v0.1.1)
416
420
  - [ ] VS Code extension (Phase 3)
417
421
  - [ ] JetBrains plugin (Phase 3)
418
422
  - [ ] Semantic search via embeddings (Phase 4)
@@ -29,8 +29,15 @@ def _require_repo() -> Repository:
29
29
 
30
30
  # ── Root group ────────────────────────────────────────────────────────────────
31
31
 
32
+ try:
33
+ from importlib.metadata import version as _pkg_version
34
+ _version = _pkg_version('memgit')
35
+ except Exception:
36
+ _version = '0.1.2'
37
+
38
+
32
39
  @click.group()
33
- @click.version_option('0.1.0', prog_name='memgit')
40
+ @click.version_option(_version, prog_name='memgit')
34
41
  def cli():
35
42
  """memgit — git for AI memory.
36
43
 
@@ -41,16 +48,41 @@ def cli():
41
48
 
42
49
  # ── init ──────────────────────────────────────────────────────────────────────
43
50
 
51
+ def _default_store_path() -> Path:
52
+ """Pick the best default store location based on what's installed."""
53
+ home = Path.home()
54
+ if (home / '.claude').exists():
55
+ return home / '.claude' / 'memgit-store'
56
+ if (home / '.cursor').exists():
57
+ return home / '.cursor' / 'memgit-store'
58
+ if (home / '.windsurf').exists():
59
+ return home / '.windsurf' / 'memgit-store'
60
+ return home / '.memgit-store'
61
+
62
+
44
63
  @cli.command()
45
- @click.argument('directory', default='.', type=click.Path())
64
+ @click.argument('directory', default=None, required=False, type=click.Path())
46
65
  def init(directory):
47
- """Initialize a memgit repository."""
48
- path = Path(directory).resolve()
66
+ """Initialize a memgit store.
67
+
68
+ If no path is given, picks the best location automatically:
69
+ · ~/.claude/memgit-store (if Claude Code is installed)
70
+ · ~/.cursor/memgit-store (if Cursor is installed)
71
+ · ~/.windsurf/memgit-store (if Windsurf is installed)
72
+ · ~/.memgit-store (fallback)
73
+ """
74
+ if directory is None:
75
+ path = _default_store_path()
76
+ console.print(f'[dim]Using[/dim] [cyan]{path}[/cyan] [dim](auto-detected)[/dim]')
77
+ else:
78
+ path = Path(directory).resolve()
79
+
49
80
  if (path / '.memgit').exists():
50
81
  console.print(f'[yellow]Already initialized:[/yellow] {path / ".memgit"}')
51
82
  return
52
83
  repo = Repository.init(path)
53
- console.print(f'[green]Initialized[/green] memgit repository in [cyan]{repo.path}[/cyan]')
84
+ console.print(f'[green]Initialized[/green] memgit store in [cyan]{repo.path}[/cyan]')
85
+ console.print(f'[dim]Run [bold]memgit setup[/bold] to register with your AI tools.[/dim]')
54
86
 
55
87
 
56
88
  # ── add ───────────────────────────────────────────────────────────────────────
@@ -1134,14 +1166,75 @@ def _all_targets():
1134
1166
  ]
1135
1167
 
1136
1168
 
1137
- @cli.group()
1138
- def setup():
1169
+ def _setup_wizard() -> None:
1170
+ """Interactive step-by-step tool picker for `memgit setup` (bare)."""
1171
+ targets = _all_targets()
1172
+
1173
+ detected, missing = [], []
1174
+ for label, config_path, patch_fn in targets:
1175
+ (detected if config_path.exists() or config_path.parent.exists() else missing).append(
1176
+ (label, config_path, patch_fn)
1177
+ )
1178
+
1179
+ console.print('[bold]memgit setup[/bold] — interactive tool registration\n')
1180
+
1181
+ if not detected:
1182
+ console.print('[yellow]No AI tools detected on this machine.[/yellow]')
1183
+ console.print('Install Claude Code, Cursor, Windsurf, Cline, or Continue.dev first,')
1184
+ console.print('then run [bold]memgit setup all[/bold] or [bold]memgit setup <tool>[/bold].')
1185
+ return
1186
+
1187
+ console.print('[green]Detected on this machine:[/green]')
1188
+ for i, (label, config_path, _) in enumerate(detected, 1):
1189
+ note = 'config exists' if config_path.exists() else 'dir exists'
1190
+ console.print(f' [bold]{i}[/bold]. {label} [dim]({note})[/dim]')
1191
+
1192
+ if missing:
1193
+ console.print('\n[dim]Not detected (will be skipped):[/dim]')
1194
+ for label, _, _ in missing:
1195
+ console.print(f' [dim]· {label}[/dim]')
1196
+
1197
+ console.print()
1198
+ choice = click.prompt('Register which tools? (all / 1,2,3 / none)', default='all')
1199
+ choice = choice.strip().lower()
1200
+
1201
+ if choice in ('none', 'n', 'q'):
1202
+ console.print('[dim]Cancelled.[/dim]')
1203
+ return
1204
+
1205
+ if choice == 'all':
1206
+ selected = detected
1207
+ else:
1208
+ try:
1209
+ indices = [int(x.strip()) - 1 for x in choice.split(',')]
1210
+ selected = [detected[i] for i in indices if 0 <= i < len(detected)]
1211
+ except ValueError:
1212
+ console.print('[red]Invalid selection — enter "all", "none", or numbers like 1,2[/red]')
1213
+ return
1214
+
1215
+ console.print()
1216
+ for label, config_path, patch_fn in selected:
1217
+ _run_target(label, config_path, patch_fn, dry_run=False)
1218
+
1219
+ if selected:
1220
+ console.print('[dim]\nRestart each AI tool for changes to take effect.[/dim]')
1221
+
1222
+
1223
+ @cli.group(invoke_without_command=True)
1224
+ @click.pass_context
1225
+ def setup(ctx):
1139
1226
  """Register memgit with AI coding tools (MCP).
1140
1227
 
1141
- Writes the memgit MCP server entry into each tool's config file.
1142
- Safe to run multiple times — only updates what's missing.
1228
+ Run bare for an interactive picker, or use a subcommand:
1229
+
1230
+ memgit setup # step-by-step: pick which tools to register
1231
+ memgit setup all # auto-register every detected tool
1232
+ memgit setup claude-code # register one specific tool
1233
+
1234
+ Safe to re-run — only updates what's missing.
1143
1235
  """
1144
- pass
1236
+ if ctx.invoked_subcommand is None:
1237
+ _setup_wizard()
1145
1238
 
1146
1239
 
1147
1240
  def _run_target(label: str, config_path: Path, patch_fn, dry_run: bool) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memgit
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: Git for AI memory — version-controlled context persistence across Claude, GPT, Gemini, Cursor, Windsurf, and more
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://memgit.dev
@@ -27,14 +27,18 @@ Requires-Dist: pytest>=8.0; extra == "dev"
27
27
  Requires-Dist: pytest-anyio>=0.0.0; extra == "dev"
28
28
  Dynamic: license-file
29
29
 
30
+ <p align="center">
31
+ <img src="assets/logo.png" alt="memgit logo" width="120" />
32
+ </p>
33
+
30
34
  # memgit — git for AI memory
31
35
 
32
36
  **Version-controlled, cross-AI context that persists, diffs, rolls back, and syncs like code.**
33
37
 
34
38
  ```bash
35
39
  pip install memgit
36
- memgit init ~/.claude/memgit-store
37
- memgit setup all # registers with every AI tool detected on your machine
40
+ memgit init # auto-detects best location for your setup
41
+ memgit setup # step-by-step: pick which AI tools to register
38
42
  memgit stats # see your token savings vs claude.md / other plugins
39
43
  ```
40
44
 
@@ -441,7 +445,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md).
441
445
  - [x] Flat `memories/` directory — grep/diff/blame your memories
442
446
  - [x] D3.js graph visualization of memory relationships
443
447
  - [x] Multi-platform distribution (PyPI, Homebrew, npm, Chocolatey, winget)
444
- - [ ] PyPI publish (v0.1.0)
448
+ - [x] PyPI published (v0.1.1)
445
449
  - [ ] VS Code extension (Phase 3)
446
450
  - [ ] JetBrains plugin (Phase 3)
447
451
  - [ ] Semantic search via embeddings (Phase 4)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "memgit"
7
- version = "0.1.1"
7
+ version = "0.1.2"
8
8
  description = "Git for AI memory — version-controlled context persistence across Claude, GPT, Gemini, Cursor, Windsurf, and more"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes