agmem 0.1.1__py3-none-any.whl → 0.1.3__py3-none-any.whl

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 (100) hide show
  1. {agmem-0.1.1.dist-info → agmem-0.1.3.dist-info}/METADATA +157 -16
  2. agmem-0.1.3.dist-info/RECORD +105 -0
  3. memvcs/__init__.py +1 -1
  4. memvcs/cli.py +45 -31
  5. memvcs/commands/__init__.py +9 -9
  6. memvcs/commands/add.py +83 -76
  7. memvcs/commands/audit.py +59 -0
  8. memvcs/commands/blame.py +46 -53
  9. memvcs/commands/branch.py +13 -33
  10. memvcs/commands/checkout.py +27 -32
  11. memvcs/commands/clean.py +18 -23
  12. memvcs/commands/clone.py +11 -1
  13. memvcs/commands/commit.py +40 -39
  14. memvcs/commands/daemon.py +109 -76
  15. memvcs/commands/decay.py +77 -0
  16. memvcs/commands/diff.py +56 -57
  17. memvcs/commands/distill.py +90 -0
  18. memvcs/commands/federated.py +53 -0
  19. memvcs/commands/fsck.py +86 -61
  20. memvcs/commands/garden.py +40 -35
  21. memvcs/commands/gc.py +51 -0
  22. memvcs/commands/graph.py +41 -48
  23. memvcs/commands/init.py +16 -24
  24. memvcs/commands/log.py +25 -40
  25. memvcs/commands/merge.py +69 -27
  26. memvcs/commands/pack.py +129 -0
  27. memvcs/commands/prove.py +66 -0
  28. memvcs/commands/pull.py +31 -1
  29. memvcs/commands/push.py +4 -2
  30. memvcs/commands/recall.py +145 -0
  31. memvcs/commands/reflog.py +13 -22
  32. memvcs/commands/remote.py +1 -0
  33. memvcs/commands/repair.py +66 -0
  34. memvcs/commands/reset.py +23 -33
  35. memvcs/commands/resolve.py +130 -0
  36. memvcs/commands/resurrect.py +82 -0
  37. memvcs/commands/search.py +3 -4
  38. memvcs/commands/serve.py +2 -1
  39. memvcs/commands/show.py +66 -36
  40. memvcs/commands/stash.py +34 -34
  41. memvcs/commands/status.py +27 -35
  42. memvcs/commands/tag.py +23 -47
  43. memvcs/commands/test.py +30 -44
  44. memvcs/commands/timeline.py +111 -0
  45. memvcs/commands/tree.py +26 -27
  46. memvcs/commands/verify.py +110 -0
  47. memvcs/commands/when.py +115 -0
  48. memvcs/core/access_index.py +167 -0
  49. memvcs/core/audit.py +124 -0
  50. memvcs/core/config_loader.py +3 -1
  51. memvcs/core/consistency.py +214 -0
  52. memvcs/core/crypto_verify.py +280 -0
  53. memvcs/core/decay.py +185 -0
  54. memvcs/core/diff.py +158 -143
  55. memvcs/core/distiller.py +277 -0
  56. memvcs/core/encryption.py +169 -0
  57. memvcs/core/federated.py +86 -0
  58. memvcs/core/gardener.py +176 -145
  59. memvcs/core/hooks.py +48 -14
  60. memvcs/core/ipfs_remote.py +39 -0
  61. memvcs/core/knowledge_graph.py +135 -138
  62. memvcs/core/llm/__init__.py +10 -0
  63. memvcs/core/llm/anthropic_provider.py +50 -0
  64. memvcs/core/llm/base.py +27 -0
  65. memvcs/core/llm/factory.py +30 -0
  66. memvcs/core/llm/openai_provider.py +36 -0
  67. memvcs/core/merge.py +260 -170
  68. memvcs/core/objects.py +110 -101
  69. memvcs/core/pack.py +92 -0
  70. memvcs/core/pii_scanner.py +147 -146
  71. memvcs/core/privacy_budget.py +63 -0
  72. memvcs/core/refs.py +132 -115
  73. memvcs/core/remote.py +38 -0
  74. memvcs/core/repository.py +254 -164
  75. memvcs/core/schema.py +155 -113
  76. memvcs/core/staging.py +60 -65
  77. memvcs/core/storage/__init__.py +20 -18
  78. memvcs/core/storage/base.py +74 -70
  79. memvcs/core/storage/gcs.py +70 -68
  80. memvcs/core/storage/local.py +42 -40
  81. memvcs/core/storage/s3.py +105 -110
  82. memvcs/core/temporal_index.py +121 -0
  83. memvcs/core/test_runner.py +101 -93
  84. memvcs/core/trust.py +103 -0
  85. memvcs/core/vector_store.py +56 -36
  86. memvcs/core/zk_proofs.py +26 -0
  87. memvcs/integrations/mcp_server.py +1 -3
  88. memvcs/integrations/web_ui/server.py +25 -26
  89. memvcs/retrieval/__init__.py +22 -0
  90. memvcs/retrieval/base.py +54 -0
  91. memvcs/retrieval/pack.py +128 -0
  92. memvcs/retrieval/recaller.py +105 -0
  93. memvcs/retrieval/strategies.py +314 -0
  94. memvcs/utils/__init__.py +3 -3
  95. memvcs/utils/helpers.py +52 -52
  96. agmem-0.1.1.dist-info/RECORD +0 -67
  97. {agmem-0.1.1.dist-info → agmem-0.1.3.dist-info}/WHEEL +0 -0
  98. {agmem-0.1.1.dist-info → agmem-0.1.3.dist-info}/entry_points.txt +0 -0
  99. {agmem-0.1.1.dist-info → agmem-0.1.3.dist-info}/licenses/LICENSE +0 -0
  100. {agmem-0.1.1.dist-info → agmem-0.1.3.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agmem
3
- Version: 0.1.1
3
+ Version: 0.1.3
4
4
  Summary: Agentic Memory Version Control System - Git for AI agent memories
5
5
  Home-page: https://github.com/vivek-tiwari-vt/agmem
6
6
  Author: agmem Team
@@ -10,19 +10,19 @@ Project-URL: Homepage, https://github.com/vivek-tiwari-vt/agmem
10
10
  Project-URL: Documentation, https://github.com/vivek-tiwari-vt/agmem#readme
11
11
  Project-URL: Repository, https://github.com/vivek-tiwari-vt/agmem
12
12
  Project-URL: Bug Tracker, https://github.com/vivek-tiwari-vt/agmem/issues
13
- Keywords: ai,agent,memory,version-control,git,vcs,llm
13
+ Keywords: ai,agent,memory,version-control,git,vcs,llm,merkle,audit,encryption,differential-privacy,trust,multi-agent
14
14
  Classifier: Development Status :: 3 - Alpha
15
15
  Classifier: Intended Audience :: Developers
16
16
  Classifier: License :: OSI Approved :: MIT License
17
17
  Classifier: Operating System :: OS Independent
18
18
  Classifier: Programming Language :: Python :: 3
19
- Classifier: Programming Language :: Python :: 3.8
20
19
  Classifier: Programming Language :: Python :: 3.9
21
20
  Classifier: Programming Language :: Python :: 3.10
22
21
  Classifier: Programming Language :: Python :: 3.11
23
22
  Classifier: Programming Language :: Python :: 3.12
24
23
  Classifier: Topic :: Software Development :: Version Control
25
24
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
25
+ Classifier: Topic :: Security :: Cryptography
26
26
  Requires-Python: >=3.8
27
27
  Description-Content-Type: text/markdown
28
28
  License-File: LICENSE
@@ -30,9 +30,12 @@ Requires-Dist: PyYAML>=6.0.0
30
30
  Provides-Extra: dev
31
31
  Requires-Dist: pytest>=7.0.0; extra == "dev"
32
32
  Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
33
- Requires-Dist: black>=22.0.0; extra == "dev"
33
+ Requires-Dist: black==24.10.0; extra == "dev"
34
34
  Requires-Dist: flake8>=5.0.0; extra == "dev"
35
35
  Requires-Dist: mypy>=1.0.0; extra == "dev"
36
+ Provides-Extra: llm
37
+ Requires-Dist: openai>=1.0.0; extra == "llm"
38
+ Requires-Dist: anthropic>=0.18.0; extra == "llm"
36
39
  Provides-Extra: mcp
37
40
  Requires-Dist: mcp>=1.0.0; extra == "mcp"
38
41
  Provides-Extra: vector
@@ -47,14 +50,27 @@ Requires-Dist: google-cloud-storage>=2.0.0; extra == "cloud"
47
50
  Provides-Extra: gardener
48
51
  Requires-Dist: scikit-learn>=1.3.0; extra == "gardener"
49
52
  Requires-Dist: openai>=1.0.0; extra == "gardener"
53
+ Provides-Extra: anthropic
54
+ Requires-Dist: anthropic>=0.18.0; extra == "anthropic"
50
55
  Provides-Extra: pii
51
56
  Requires-Dist: presidio-analyzer>=2.2.0; extra == "pii"
52
57
  Provides-Extra: daemon
53
58
  Requires-Dist: watchdog>=3.0.0; extra == "daemon"
54
59
  Provides-Extra: graph
55
60
  Requires-Dist: networkx>=3.0; extra == "graph"
61
+ Provides-Extra: pack
62
+ Requires-Dist: tiktoken>=0.5.0; extra == "pack"
63
+ Provides-Extra: distill
64
+ Requires-Dist: openai>=1.0.0; extra == "distill"
65
+ Provides-Extra: verify
66
+ Requires-Dist: openai>=1.0.0; extra == "verify"
67
+ Provides-Extra: crypto
68
+ Requires-Dist: cryptography>=41.0.0; extra == "crypto"
69
+ Provides-Extra: ipfs
70
+ Requires-Dist: requests>=2.28.0; extra == "ipfs"
56
71
  Provides-Extra: all
57
72
  Requires-Dist: mcp>=1.0.0; extra == "all"
73
+ Requires-Dist: cryptography>=41.0.0; extra == "all"
58
74
  Requires-Dist: sqlite-vec>=0.1.0; extra == "all"
59
75
  Requires-Dist: sentence-transformers>=2.0.0; extra == "all"
60
76
  Requires-Dist: fastapi>=0.100.0; extra == "all"
@@ -63,8 +79,12 @@ Requires-Dist: boto3>=1.34.0; extra == "all"
63
79
  Requires-Dist: google-cloud-storage>=2.0.0; extra == "all"
64
80
  Requires-Dist: scikit-learn>=1.3.0; extra == "all"
65
81
  Requires-Dist: openai>=1.0.0; extra == "all"
82
+ Requires-Dist: anthropic>=0.18.0; extra == "all"
66
83
  Requires-Dist: watchdog>=3.0.0; extra == "all"
67
84
  Requires-Dist: networkx>=3.0; extra == "all"
85
+ Requires-Dist: tiktoken>=0.5.0; extra == "all"
86
+ Requires-Dist: presidio-analyzer>=2.2.0; extra == "all"
87
+ Requires-Dist: requests>=2.28.0; extra == "all"
68
88
  Dynamic: author
69
89
  Dynamic: home-page
70
90
  Dynamic: license-file
@@ -72,6 +92,7 @@ Dynamic: requires-python
72
92
 
73
93
  # agmem - Agentic Memory Version Control System
74
94
 
95
+ [![PyPI version](https://img.shields.io/pypi/v/agmem.svg)](https://pypi.org/project/agmem/)
75
96
  [![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
76
97
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
77
98
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
@@ -99,16 +120,31 @@ agmem solves all of these problems with a familiar Git-like interface.
99
120
  - ✅ **Branch/tag names with `/`** — Git-style refs: `feature/test`, `releases/v1` (path-validated)
100
121
  - ✅ **Content-addressable storage** — SHA-256 deduplication like Git
101
122
  - ✅ **Memory-type-aware merging** — Episodic append, semantic consolidate, procedural prefer-new
102
- - ✅ **Remote (file://)** — `clone`, `push`, `pull`, `remote`; pull merges into current branch
123
+ - ✅ **Remote (file://)** — `clone`, `push`, `pull`, `remote`; pull merges into current branch; push conflict detection (non–fast-forward reject)
103
124
  - ✅ **Search** — Semantic with `agmem[vector]`, or plain text over `current/` when vector deps missing
104
125
  - ✅ **Knowledge graph** — `agmem graph` from wikilinks/tags; `--no-similarity`, `--format d3`, `--serve` (optional `agmem[web]`)
105
- - ✅ **Integrity** — `agmem fsck`; path/ref/hash validation throughout (no path traversal)
126
+ - ✅ **Integrity** — `agmem fsck` (objects, refs, vector store, Merkle/signature); `agmem verify --crypto`; path/ref/hash validation (no path traversal)
127
+ - ✅ **Cryptographic commit verification** — Merkle tree over blobs; Ed25519 signing of root; verify on checkout, pull, `verify`, `fsck`; Merkle proofs for single-blob verification
128
+ - ✅ **Encryption at rest** — Optional AES-256-GCM with Argon2id key derivation; hash-then-encrypt preserves deduplication
129
+ - ✅ **Tamper-evident audit trail** — Append-only hash-chained log (init, add, commit, checkout, merge, push, pull, config); `agmem audit` and `agmem audit --verify`
130
+ - ✅ **Multi-agent trust** — Trust store (full / conditional / untrusted) per public key; applied on pull/merge; clone copies remote keys
131
+ - ✅ **Conflict resolution** — `agmem resolve` with ours/theirs/both; conflicts persisted in `.mem/merge/`; path-safe
132
+ - ✅ **Differential privacy** — Epsilon/delta budget in `.mem/privacy_budget.json`; `--private` on `agmem distill` and `agmem garden` when enabled
133
+ - ✅ **Pack files & GC** — `agmem gc` (reachable from refs, prune loose, optional repack); pack format and index in core
134
+ - ✅ **Multi-provider LLM** — OpenAI and Anthropic via `memvcs.core.llm`; config/repo or env; used by gardener, distiller, consistency, merge
135
+ - ✅ **Temporal querying** — Point-in-time and range queries in temporal index; frontmatter timestamps
136
+ - ✅ **Federated collaboration** — `agmem federated push|pull` (stub) for coordinator-based summary sharing
137
+ - ✅ **Zero-knowledge proofs** — `agmem prove` (stub) for keyword containment and memory freshness
138
+ - ✅ **Daemon health** — Periodic Merkle verification in daemon loop; safe auto-remediation hooks
139
+ - ✅ **GPU acceleration** — Vector store detects GPU for embedding model when available
106
140
  - ✅ **Optional** — `serve`, `daemon` (watch + auto-commit), `garden` (episode archival), MCP server; install extras as needed
107
141
 
108
142
  ## Quick Start
109
143
 
110
144
  ### Installation
111
145
 
146
+ **From PyPI** ([pypi.org/project/agmem](https://pypi.org/project/agmem/)):
147
+
112
148
  ```bash
113
149
  pip install agmem
114
150
  ```
@@ -219,12 +255,18 @@ All commands are listed below. Highlights: **`agmem blame <file>`** (who changed
219
255
 
220
256
  | Command | Description |
221
257
  |---------|-------------|
222
- | `agmem clone <url> [dir]` | Clone repo (file:// URLs); path-validated |
258
+ | `agmem clone <url> [dir]` | Clone repo (file:// URLs); path-validated; copies remote public keys |
223
259
  | `agmem remote add <name> <url>` | Add remote |
224
260
  | `agmem remote show` | List remotes |
225
- | `agmem push <remote> <branch>` | Push branch (refs validated) |
226
- | `agmem pull [--remote <name>] [--branch <b>]` | Fetch and merge into current branch |
227
- | `agmem fsck` | Check objects, refs, optional vector store |
261
+ | `agmem push <remote> <branch>` | Push branch (refs validated); rejects non–fast-forward |
262
+ | `agmem pull [--remote <name>] [--branch <b>]` | Fetch and merge into current branch; optional crypto/trust checks |
263
+ | `agmem fsck` | Check objects, refs, optional vector store, Merkle roots and signatures |
264
+ | `agmem verify [ref]` | Belief consistency (contradictions); use `--crypto` to verify commit Merkle/signature |
265
+ | `agmem audit [--verify] [--max n]` | Show tamper-evident audit log; `--verify` checks hash chain |
266
+ | `agmem resolve [path]` | Resolve merge conflicts (ours/theirs/both); path under `current/` |
267
+ | `agmem gc [--dry-run] [--prune-days n]` | Garbage collection: delete unreachable loose objects; optional repack |
268
+ | `agmem prove --memory <path> --property keyword\|freshness --value <v> [-o out]` | Generate ZK proofs (stub) |
269
+ | `agmem federated push\|pull` | Federated collaboration (stub; requires coordinator in config) |
228
270
 
229
271
  ### Optional (install extras)
230
272
 
@@ -293,7 +335,81 @@ Configure in `.mem/config.json` (e.g. `archive_dir`, consolidation thresholds).
293
335
  agmem fsck
294
336
  ```
295
337
 
296
- Verifies objects, refs, and (if installed) the vector store. Run after cloning or if something looks wrong.
338
+ Verifies objects, refs, and (if installed) the vector store. When commit metadata includes `merkle_root` and optionally `signature`, fsck also runs cryptographic verification. Run after cloning or if something looks wrong.
339
+
340
+ ---
341
+
342
+ ## Security, trust & advanced features
343
+
344
+ The following 18 capabilities are implemented (or stubbed) per the agmem features implementation plan. They are grouped by tier.
345
+
346
+ ### Tier 1 — Security and trust
347
+
348
+ | # | Feature | Description |
349
+ |---|---------|-------------|
350
+ | **1** | **Cryptographic commit verification** | Merkle tree over commit blobs; Ed25519 signing of Merkle root; verification on checkout, pull, `agmem verify --crypto`, and `agmem fsck`. Merkle proofs for single-blob verification. Keys: `.mem/keys/`; private key from env `AGMEM_SIGNING_PRIVATE_KEY` or `AGMEM_SIGNING_PRIVATE_KEY_FILE`. Old commits without `merkle_root` are unverified. |
351
+ | **2** | **Encryption at rest** | Optional AES-256-GCM for object contents; key from passphrase via Argon2id; hash-then-encrypt preserves deduplication. Config in `.mem/encryption.json` or repo config; opt-in. |
352
+ | **3** | **Tamper-evident audit trail** | Append-only, hash-chained log in `.mem/audit/` for init, add, commit, checkout, merge, push, pull, config. **Commands:** `agmem audit` (show entries), `agmem audit --verify` (verify chain). |
353
+
354
+ ### Tier 2 — Multi-agent collaboration
355
+
356
+ | # | Feature | Description |
357
+ |---|---------|-------------|
358
+ | **4** | **Multi-agent trust and identity** | Trust store (full / conditional / untrusted) per public key; applied on pull and merge. Clone copies remote public keys; user adds them to trust store. Identity = keypair (same as commit signing). |
359
+ | **5** | **Federated memory collaboration** | Agents share summaries or aggregated updates via a coordinator. **Command:** `agmem federated push` / `agmem federated pull` (stub). Config: `federated.enabled`, `coordinator_url`. |
360
+ | **6** | **Conflict resolution interface** | Structured resolution: ours / theirs / both per path. **Command:** `agmem resolve [path]`. Conflicts persisted in `.mem/merge/conflicts.json`; path traversal protected. |
361
+
362
+ ### Tier 3 — Privacy
363
+
364
+ | # | Feature | Description |
365
+ |---|---------|-------------|
366
+ | **7** | **Differential privacy** | Epsilon/delta budget per repo in `.mem/privacy_budget.json`. **Usage:** `agmem distill --private`, `agmem garden --private`; blocks when budget exceeded. Config: `differential_privacy.max_epsilon`, `delta`. |
367
+ | **8** | **Zero-knowledge proofs** | zk-SNARK-style proofs for keyword containment and memory freshness. **Command:** `agmem prove --memory <path> --property keyword|freshness --value <v> [-o out]` (stub). |
368
+
369
+ ### Tier 4 — Storage and distribution
370
+
371
+ | # | Feature | Description |
372
+ |---|---------|-------------|
373
+ | **9** | **Decentralized storage (IPFS)** | Push/pull via IPFS CIDs; pinning and gateway fallback. Stub in `memvcs.core.ipfs_remote`; optional dependency. |
374
+ | **10** | **Pack files and garbage collection** | Pack loose objects into pack file + index; GC deletes unreachable objects. **Command:** `agmem gc [--dry-run] [--prune-days n]`. Config: `gc_prune_days` (default 90). |
375
+ | **11** | **Enhanced cloud remote operations** | Push conflict detection: non–fast-forward push rejected with a clear message. S3/GCS remotes and distributed locking in storage layer. |
376
+
377
+ ### Tier 5 — Intelligence and retrieval
378
+
379
+ | # | Feature | Description |
380
+ |---|---------|-------------|
381
+ | **12** | **Multi-provider LLM** | `memvcs.core.llm`: OpenAI and Anthropic; factory by config or env. Used by gardener, distiller, consistency checker, merge. Credentials via env (e.g. `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`). |
382
+ | **13** | **Enhanced semantic compression** | Multi-stage pipeline (chunk → fact extraction → dedup → embed → tiered storage); hybrid retrieval. Docstrings and design in distiller/vector store. |
383
+ | **14** | **Temporal querying and time-travel** | Point-in-time and range queries in `memvcs.core.temporal_index`; frontmatter timestamps; “state at T” resolution. |
384
+ | **15** | **Cross-memory relationship graph** | Knowledge graph extended with co-occurrence, semantic similarity, causal and entity edges; incremental updates. Docstrings in `knowledge_graph.py`. |
385
+
386
+ ### Tier 6 — Operations and maintenance
387
+
388
+ | # | Feature | Description |
389
+ |---|---------|-------------|
390
+ | **16** | **Automated memory health monitoring** | Daemon runs periodic Merkle verification; safe auto-remediation hooks; unsafe actions alert only. |
391
+ | **17** | **GPU-accelerated operations** | Vector store detects GPU for embedding model (e.g. sentence-transformers with CUDA/Metal); transparent CPU fallback. |
392
+ | **18** | **Test suite and quality** | Broad tests: object store, merge, crypto (Merkle, proofs, verify), trust, privacy budget, pack/GC, resolve helpers, encryption, LLM provider; CI with coverage. |
393
+
394
+ ### New files and config (summary)
395
+
396
+ | Addition | Purpose |
397
+ |----------|---------|
398
+ | `memvcs/core/crypto_verify.py` | Merkle build/verify, Ed25519 sign/verify, Merkle proofs |
399
+ | `memvcs/core/audit.py` | Tamper-evident audit append and verify |
400
+ | `memvcs/core/trust.py` | Trust store (key → level) |
401
+ | `memvcs/core/privacy_budget.py` | Epsilon/delta budget for DP |
402
+ | `memvcs/core/pack.py` | Pack format, index, GC |
403
+ | `memvcs/core/encryption.py` | AES-256-GCM, Argon2id, config |
404
+ | `memvcs/core/llm/` | LLM provider interface and OpenAI/Anthropic |
405
+ | `memvcs/core/zk_proofs.py` | ZK proof stubs |
406
+ | `memvcs/core/federated.py` | Federated push/pull stubs |
407
+ | `.mem/audit/` | Audit log |
408
+ | `.mem/keys/` | Public (and optional private) keys |
409
+ | `.mem/trust/` or config | Trust store |
410
+ | `.mem/privacy_budget.json` | DP budget state |
411
+ | `.mem/merge/conflicts.json` | Unresolved merge conflicts |
412
+ | Commit `metadata` | `merkle_root`, `signature` |
297
413
 
298
414
  ---
299
415
 
@@ -442,10 +558,20 @@ Repository configuration is stored in `.mem/config.json`:
442
558
  "summarizer_model": "default",
443
559
  "max_episode_size": 1048576,
444
560
  "consolidation_threshold": 100
561
+ },
562
+ "differential_privacy": {
563
+ "max_epsilon": 1.0,
564
+ "delta": 1e-5
565
+ },
566
+ "federated": {
567
+ "enabled": false,
568
+ "coordinator_url": ""
445
569
  }
446
570
  }
447
571
  ```
448
572
 
573
+ Optional sections: **`differential_privacy`** (for `--private` on distill/garden); **`federated`** (for `agmem federated`); **`signing`** (public key for commit verification); trust store under `.mem/trust/` or config; encryption in `.mem/encryption.json` when enabled.
574
+
449
575
  ### agmem config (cloud and PII)
450
576
 
451
577
  Optional user/repo config for S3/GCS and PII hooks:
@@ -507,13 +633,17 @@ mypy memvcs/
507
633
  - [x] Basic commands (init, add, commit, status, log, diff, show, reset, tag, stash, reflog, blame, tree, clean)
508
634
  - [x] HEAD~n resolution; branch/tag names with `/` (Git-style)
509
635
  - [x] Branching and checkout; merging with memory-type-aware strategies
510
- - [x] Remote operations (clone, push, pull, remote) — file:// URLs; pull merges into current branch
636
+ - [x] Remote operations (clone, push, pull, remote) — file:// URLs; pull merges into current branch; push conflict detection
511
637
  - [x] Search — semantic with `agmem[vector]`, plain text fallback
512
638
  - [x] Knowledge graph (`agmem graph`) — wikilinks, tags, optional similarity; `--no-similarity`, `--serve`
513
- - [x] Integrity (`agmem fsck`); path/ref/hash validation (security)
639
+ - [x] Integrity (`agmem fsck`); path/ref/hash validation; Merkle/signature verification
514
640
  - [x] Web UI (`agmem serve`); MCP server (`agmem mcp`); daemon (`agmem daemon`); garden (`agmem garden`)
515
- - [ ] Garbage collection
516
- - [ ] Pack files for efficiency
641
+ - [x] Cryptographic commit verification (Merkle tree, Ed25519 signing, verify on checkout/pull/fsck)
642
+ - [x] Tamper-evident audit trail (`agmem audit`); multi-agent trust store; conflict resolution (`agmem resolve`)
643
+ - [x] Encryption at rest (optional AES-256-GCM); differential privacy budget (`--private` on distill/garden)
644
+ - [x] Pack files and garbage collection (`agmem gc`); ZK proofs and federated stubs (`agmem prove`, `agmem federated`)
645
+ - [x] Multi-provider LLM (OpenAI, Anthropic); temporal range queries; daemon health checks; GPU detection; test suite and CI
646
+ - [ ] IPFS remote (stub in place); full ZK circuits and federated coordinator
517
647
 
518
648
  ## Integrations
519
649
 
@@ -606,8 +736,10 @@ agmem graph --serve # Serve knowledge graph UI (same extra)
606
736
 
607
737
  - **Full history:** `agmem log`, `agmem reflog`
608
738
  - **Line-level attribution:** `agmem blame <file>` — see which commit and author last changed each line (e.g. `agmem blame current/semantic/user-preferences.md`)
739
+ - **Tamper-evident audit:** `agmem audit` and `agmem audit --verify` for hash-chained operation log
740
+ - **Cryptographic verification:** `agmem verify --crypto` and `agmem fsck` for Merkle roots and Ed25519 signatures
609
741
  - **Visual audit:** `agmem serve` for browser-based history and diff viewer
610
- - **Integrity:** `agmem fsck` to verify objects and refs
742
+ - **Integrity:** `agmem fsck` to verify objects, refs, and commit signatures
611
743
 
612
744
  ## Ecosystem Plugin Patterns
613
745
 
@@ -639,6 +771,15 @@ Or connect via MCP and call `memory_add` from your agent.
639
771
  3. Write via `agmem add` + `agmem commit` or MCP `memory_add`
640
772
  4. Optional: Use `agmem search` for semantic retrieval
641
773
 
774
+ ## Links
775
+
776
+ - **PyPI:** [pypi.org/project/agmem](https://pypi.org/project/agmem/) — `pip install agmem`
777
+
778
+ **GitHub repo (About):** Use this description and topics in your repo’s **About** (gear → Description & topics):
779
+
780
+ - **Description:** Git for AI agent memories. Version control for episodic logs, semantic knowledge, and procedural workflows.
781
+ - **Topics:** `ai` `agent` `memory` `version-control` `git` `vcs` `llm` `python`
782
+
642
783
  ## Contributing
643
784
 
644
785
  Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) for details.
@@ -0,0 +1,105 @@
1
+ agmem-0.1.3.dist-info/licenses/LICENSE,sha256=X_S6RBErW-F0IDbM3FAEoDB-zxExFnl2m8640rTXphM,1067
2
+ memvcs/__init__.py,sha256=mXwHTSlUPWo4ERqJLGJnxmxtGQQHPSbXb4IpO61l04M,193
3
+ memvcs/cli.py,sha256=YF06oMNjKWUmiNahILmfjrIXgoXzU-5BJFmbunSb8Sc,6075
4
+ memvcs/commands/__init__.py,sha256=A2D6xWaO6epU7iV4QSvqvF5TspnwRyDN7NojmGatPrE,510
5
+ memvcs/commands/add.py,sha256=k9eM7qf2NFvneiJkFQNiAYFB2GgKmyPw_NXmkCxblQE,8736
6
+ memvcs/commands/audit.py,sha256=E6m54B726tqDQR3rrgRXWrjE-seu2UocqrFxN1aHkY4,1680
7
+ memvcs/commands/base.py,sha256=yWvIYuofRxbHXvChlSd_DL_hJMaQdbZwa2XBDWj5Bio,634
8
+ memvcs/commands/blame.py,sha256=2tEXyXpAebm_zQFAyw-6d3K09Lnh1GVLYGp6htlEmI0,5605
9
+ memvcs/commands/branch.py,sha256=ghsK4tnGe7XApxQSgou7V0BASBC8PL8nQs_yBt0notQ,3150
10
+ memvcs/commands/checkout.py,sha256=xaYZSbCQ-MyLWPtwA2FdH6WqGMI3oF3R2JmCufGBVFg,3182
11
+ memvcs/commands/clean.py,sha256=e0OhSQdHfFnOPTRbyKbM8IcX4yJD5n_kaBKjIeoaRBo,1973
12
+ memvcs/commands/clone.py,sha256=aB0LcugIWJE9IEez6y70KlpZu4eIF2EdXZxE24jXyac,3260
13
+ memvcs/commands/commit.py,sha256=W4ulVZuEETJh1SHpscaQfNjyQMqeIE0AYZIbMbTrsq4,6801
14
+ memvcs/commands/daemon.py,sha256=dD20IPjwebtmMCO8vE5hVQoTDzLomxPiCoDwkrST7OU,9895
15
+ memvcs/commands/decay.py,sha256=QcgOTMJZxrfw_AOz94YHA3LGoNXRMDn69TxWlUrpSw4,2421
16
+ memvcs/commands/diff.py,sha256=KcgD57_fae4uvQ8G9ZbXmLpAYYIDiWiBuVcjsDtyE1U,5480
17
+ memvcs/commands/distill.py,sha256=YbPU1_os8GBFMjznNoOsevdqJa_MtiGO8B5vFxIjE9g,2858
18
+ memvcs/commands/federated.py,sha256=D4UiRFZWnQrW7kM4KqY0s2ttAqM2t-xeJN5-b_WKSHE,1633
19
+ memvcs/commands/fsck.py,sha256=AdJBMLA2myQ0cJJcjUgsYptsE3qvX4JQc9UAwVmSHlA,7772
20
+ memvcs/commands/garden.py,sha256=vSmI6XPpxK3EkLHCVpjWRg7eJPszHHzbcH8B14csueI,3820
21
+ memvcs/commands/gc.py,sha256=fHQl99HckZ8CcF2iI-PSH46aN-RmbPk6cRrC0WEE_94,1360
22
+ memvcs/commands/graph.py,sha256=MDi6bK2w0OrpK5VOE8XXw5gQX7BuD7VzUyqJ5Ra9Bsg,4746
23
+ memvcs/commands/init.py,sha256=TsrLFLXwkDFT0opsYJTfwu0NIxLrNiiba5SpzRtxjDI,1614
24
+ memvcs/commands/log.py,sha256=eNlLs0-PS2nF0pMAMI8izKGUiEb2m3S0RB4Zh6cUQpE,2859
25
+ memvcs/commands/mcp.py,sha256=PMfwVD6uHltN58Jh7IOiS1w7oND42tg14QKRCJNudmY,1740
26
+ memvcs/commands/merge.py,sha256=s3QLZp-_I6OvhllLhL9yFZAQ8d4M4FbvxkXV7gUgw5M,4877
27
+ memvcs/commands/pack.py,sha256=rIDjMpxJG0oxrWnB3vCGHqviCITIeIbdy3nhuHVHzM8,3629
28
+ memvcs/commands/prove.py,sha256=o_RPvSK061WiaM4YfNIGlTC357s5_AfY4iOx4-hwFyE,2094
29
+ memvcs/commands/pull.py,sha256=hn9FIlNc3KUr5EUDo4_66KQSK0BSSXjOn32xaDNxf0Q,3621
30
+ memvcs/commands/push.py,sha256=0abEdHkCMfHpH_Nmlw3OaU7Hzi0-RXF-cTVHpiSPw6k,5086
31
+ memvcs/commands/recall.py,sha256=7nwC4mFYpdjKWG-Cs3cpDLr5_SgYJ6HkVSXDOkFke5A,4592
32
+ memvcs/commands/reflog.py,sha256=j8Rxw_4jZuldS1k1g3wF2EItmPxBEmogWcbccOZrGkw,1117
33
+ memvcs/commands/remote.py,sha256=4PXDZjoU4YA4IbGrn_1KbFVCSVxVB_pVdI2nIn1NSbw,1761
34
+ memvcs/commands/repair.py,sha256=OBVa30Zc9rOjUw2GoiSAC6iZrnuCZN_J8nHpCnk5BzM,2312
35
+ memvcs/commands/reset.py,sha256=3TG7qOu2k1uji-TdSyXsdZ6LV2wqc2MB8aSJ6q71IGk,2778
36
+ memvcs/commands/resolve.py,sha256=SFjCCYlcBqP9pjykWIPrDivtk_714VhsWl1Vt7gjyfM,4093
37
+ memvcs/commands/resurrect.py,sha256=zi4ErN1jWVCn8I5rV4g_Dlbg1YadGEU6Xhc7srzlwfg,2503
38
+ memvcs/commands/search.py,sha256=NOMbkQmVurQ-_d7bZVf9vjOH6OgVPeErqpLZiSxsvBA,5322
39
+ memvcs/commands/serve.py,sha256=n8DroVRIQVm5UO2-o-9JU17pQYF-HYOMIJKycdRcBMs,1408
40
+ memvcs/commands/show.py,sha256=5YiIfY0368UB9sP9KE8J5O_rB2opdr8zrJswnLHgMCA,5268
41
+ memvcs/commands/stash.py,sha256=CD3mRWehcmfVRPGGpndUBdTT_ku4LC_rmSKPvTEOTAo,3193
42
+ memvcs/commands/status.py,sha256=O6BgzTiW3UHjXx6OKwH8X4g0hP0IlYDgr7As5RmeujU,3447
43
+ memvcs/commands/tag.py,sha256=CaCnA3JifVrdr8DfX4g0bp-_oRvagJkQFcI4bJbW1uM,3004
44
+ memvcs/commands/test.py,sha256=HZrpGZQhu9HnGZLjiq8TXi8jfOZqP-wc3bW6mgpP2yk,3926
45
+ memvcs/commands/timeline.py,sha256=xdOr2jz-_ArSPY-GxwXBloiwhfBzIfz4MAi-JEhP8H0,3666
46
+ memvcs/commands/tree.py,sha256=vdULq4vIXA_4gNfMnHn_Y78BwE0sJoeTBOnFJR3WsZ4,4927
47
+ memvcs/commands/verify.py,sha256=04CVW5NYWkUlPJ5z1Kci6dfQFM6UmPTGZh9ZextFLMc,3887
48
+ memvcs/commands/when.py,sha256=MMQ15PFXFCTmjIq7dr0tC0XvGAdndMvckVnnWehc60Y,3692
49
+ memvcs/core/__init__.py,sha256=dkIC-4tS0GhwV2mZIbofEe8xR8uiFwrxslGf1aXwhYg,493
50
+ memvcs/core/access_index.py,sha256=HhacnzSUASzRV2jhDHkwRFoPS3rtqh9n9yE1VV7JXpk,5596
51
+ memvcs/core/audit.py,sha256=8APkm9Spl_-1rIdyRQz1elyxOeK3nlpwm0CLkpLlhTE,3732
52
+ memvcs/core/config_loader.py,sha256=j-jgLDp2TRzWN9ZEZebfWSfatevBNYs0FEb3ud1SIR8,8277
53
+ memvcs/core/consistency.py,sha256=YOG8xhqZLKZCLbai2rdcP0KxYPNGFv5RRMwrQ6qCeyc,7462
54
+ memvcs/core/constants.py,sha256=WUjAb50BFcF0mbFi_GNteDLCxLihmViBm9Fb-JMPmbM,220
55
+ memvcs/core/crypto_verify.py,sha256=WrOgDtIEwpjcPfDj2uqwdyg3sIM3j1hUSVPEFvptWnc,9936
56
+ memvcs/core/decay.py,sha256=ROGwnqngs7eJNkbKmwyOdij607m73vpmoJqzrIDLBzk,6581
57
+ memvcs/core/diff.py,sha256=koEHTLciIUxYKVJVuvmY0GDXMgDgGZP_qg5RayhF-iE,13226
58
+ memvcs/core/distiller.py,sha256=fsZqOHxHTro0yy7rrMW3j5oUMibsVOShlikn2UjOieQ,10440
59
+ memvcs/core/encryption.py,sha256=epny_nlW6ylllv1qxs1mAcFq-PrLIisgfot4llOoAqw,5289
60
+ memvcs/core/federated.py,sha256=H9U5-TgiY_OjQ6Adn85Pw6hV1FYtlXgjjQYMTor35EY,2828
61
+ memvcs/core/gardener.py,sha256=_io40S0OQzPz3euKpS0M6QqEApxxkaX1UXs8uYttQag,16193
62
+ memvcs/core/hooks.py,sha256=XF9z8J5sWjAcuOyWQ2nuvEzK0UV8s4ThrcltaBZttzw,5448
63
+ memvcs/core/ipfs_remote.py,sha256=985xAtSw4P9yxxw-WXtQvNSY8b2hOpFp9TNBbHpIDBk,1062
64
+ memvcs/core/knowledge_graph.py,sha256=sa2jw9AwJIaKs8obHHXdnExxHx-CebtVrgjJaa2qo14,12939
65
+ memvcs/core/merge.py,sha256=x2eSaxr4f63Eq00FCJ6DDe2TZU8H5yHQpzKzMhYsaFw,19871
66
+ memvcs/core/objects.py,sha256=I4UlqQoBPuzyPHKWboZbZP6cy5hL1Dz18IfBm6lInNk,10455
67
+ memvcs/core/pack.py,sha256=zXwsRWSzfup6KrkxX6_jIw6gwxmRbmEnFCoVvhNZXHQ,2999
68
+ memvcs/core/pii_scanner.py,sha256=T6gQ1APFrSDk980fjnv4ZMF-UztbJgmUFSwGrwWixEw,10802
69
+ memvcs/core/privacy_budget.py,sha256=fOPlxoKEAmsKtda-OJCrSaKjTyw7ekcqdN7KfRBw1CY,2113
70
+ memvcs/core/refs.py,sha256=4Nx2ZVRa_DzfUZ4O1AwzOHEjoGAEICJKqSd9GxaiD_g,16754
71
+ memvcs/core/remote.py,sha256=a-Nwr7m4fUK86K-dxG1CawMID7JX2MZ6V94RHkGjkeI,11625
72
+ memvcs/core/repository.py,sha256=NzC2UFPv6ePxi5lfiSKyZFLclH4bJpWJz88pY7tDiv4,20605
73
+ memvcs/core/schema.py,sha256=_CrEWCdArc0yDJ04GT7fyvjHqkal7gegdFSsFOjVpBc,15287
74
+ memvcs/core/staging.py,sha256=dptdGi_74lhDkcGqGVU39ZyTkb25j-Rnkz0GWi83W1k,7221
75
+ memvcs/core/temporal_index.py,sha256=81hZHlVElp2UpXjseFVCdDUwxGM45zIU-y1dDlOhFHI,4012
76
+ memvcs/core/test_runner.py,sha256=7-0jCvji63JRbVfy3LNQWIQ7VL5weulOoG7SY1-YJbw,11496
77
+ memvcs/core/trust.py,sha256=msx80Cl3bxyQTY8mFUKWY9P6l3zb1s8FafympgHwtpo,3494
78
+ memvcs/core/vector_store.py,sha256=yUAp5BlaAtjkrtsdY1I-vmAp_YIFgJykBoNlp5hcg0I,11063
79
+ memvcs/core/zk_proofs.py,sha256=xo0uB6sbufz9OcnZLJK2iH3CXtuVAMopGNp0S1ne_Wo,967
80
+ memvcs/core/llm/__init__.py,sha256=vnjtE9Xlv9a2pZV88DMT9JaINkZ30hC9VLPL5lJRlps,236
81
+ memvcs/core/llm/anthropic_provider.py,sha256=O1eaCb9r464ajLJz-Gy8lGxBie5ojRUZ_5HdgRXO5KY,1540
82
+ memvcs/core/llm/base.py,sha256=qPzg3KPAMeoyWGc_2JoVR4-plpdft5Rc2g9uO-Z4fJQ,623
83
+ memvcs/core/llm/factory.py,sha256=sRl4XiAHs1eReXjCdwYLvbjUaIxdfQZV93hiME-i8j8,912
84
+ memvcs/core/llm/openai_provider.py,sha256=hGOdEPWf96zP7PqC5FzwISXoNDvLSOXCHJjbRj2HgI8,885
85
+ memvcs/core/storage/__init__.py,sha256=yJE7bm5G7VlFLpSVFrrTkP4eOyQlWRPfBvEP9T5PW44,1901
86
+ memvcs/core/storage/base.py,sha256=IK4To8Cb-LHv5ltlaQLdB6LE-69euFK3hNqBtMCe7-g,9956
87
+ memvcs/core/storage/gcs.py,sha256=-cWuGw1jkFh-Xig-Abmwr9HGwjW5lWQJuF2xcAR1l78,10632
88
+ memvcs/core/storage/local.py,sha256=JAik9nta6RMe4mD7aMtgdFi8M4iZCeTqiP8pPisaO6U,6028
89
+ memvcs/core/storage/s3.py,sha256=tY5rfz8FfkRRNaHOPX7Wk6yXdBBBhKV0Ju2qnBtHxeU,13814
90
+ memvcs/integrations/__init__.py,sha256=hVtJoFaXt6ErAZwctcSBDZLXRHFs1CNgtltIBQiroQ0,103
91
+ memvcs/integrations/mcp_server.py,sha256=PxBYJnbzPs6bcFH6EmH5jQqbu_9Vy5eSAA8ruWTn2Q4,9061
92
+ memvcs/integrations/web_ui/__init__.py,sha256=MQIfgDKDgPctlcTUjwkwueS_MDsDssVRmIUnpECGS0k,51
93
+ memvcs/integrations/web_ui/server.py,sha256=4roJdX0xI3o-n3jZkOMnRScW4YUwpzE2dYZABDv6Iio,12751
94
+ memvcs/retrieval/__init__.py,sha256=IzzmYbE_hmkCmcwQqIUPca4vQh_tD--cB_l00i6uGxY,465
95
+ memvcs/retrieval/base.py,sha256=aCeWpb2EbSRE81Rn4maLzqPmLSKZOUrwmSSfTEFJ33U,1336
96
+ memvcs/retrieval/pack.py,sha256=4rrGP7oduPhAM9PYnW2_eNm4WpSDnleHEja-fjBtONc,4299
97
+ memvcs/retrieval/recaller.py,sha256=8KY-XjMUz5_vcKf46zI64uk1DEM__u7wM92ShukOtsY,3819
98
+ memvcs/retrieval/strategies.py,sha256=26yxQQubQfjxWQXknfVMxuzPHf2EcZxJg_B99BEdl5c,11458
99
+ memvcs/utils/__init__.py,sha256=8psUzz4Ntv2GzbRebkeVsoyC6Ck-FIwi0_lfYdj5oho,185
100
+ memvcs/utils/helpers.py,sha256=37zg_DcQ2y99b9NSLqxFkglHe13rJXKhFDpEbQ7iLhM,4121
101
+ agmem-0.1.3.dist-info/METADATA,sha256=gtN5tU3wSR8trf5kKJIBP6KgAGQrjm66dCs8NRvu_ao,36834
102
+ agmem-0.1.3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
103
+ agmem-0.1.3.dist-info/entry_points.txt,sha256=at7eWycgjqOo1wbUMECnXUsNo3gpCkJTU71OzrGLHu0,42
104
+ agmem-0.1.3.dist-info/top_level.txt,sha256=HtMMsKuwLKLOdgF1GxqQztqFM54tTJctVdJuOec6B-4,7
105
+ agmem-0.1.3.dist-info/RECORD,,
memvcs/__init__.py CHANGED
@@ -4,6 +4,6 @@ agmem - Agentic Memory Version Control System
4
4
  A Git-inspired version control system for AI agent memory artifacts.
5
5
  """
6
6
 
7
- __version__ = "0.1.1"
7
+ __version__ = "0.1.3"
8
8
  __author__ = "agmem Team"
9
9
  __license__ = "MIT"
memvcs/cli.py CHANGED
@@ -49,6 +49,20 @@ from .commands.fsck import FsckCommand
49
49
  from .commands.graph import GraphCommand
50
50
  from .commands.daemon import DaemonCommand
51
51
  from .commands.garden import GardenCommand
52
+ from .commands.recall import RecallCommand
53
+ from .commands.when import WhenCommand
54
+ from .commands.timeline import TimelineCommand
55
+ from .commands.pack import PackCommand
56
+ from .commands.distill import DistillCommand
57
+ from .commands.decay import DecayCommand
58
+ from .commands.resurrect import ResurrectCommand
59
+ from .commands.verify import VerifyCommand
60
+ from .commands.repair import RepairCommand
61
+ from .commands.audit import AuditCommand
62
+ from .commands.federated import FederatedCommand
63
+ from .commands.resolve import ResolveCommand
64
+ from .commands.prove import ProveCommand
65
+ from .commands.gc import GcCommand
52
66
 
53
67
 
54
68
  # List of available commands
@@ -82,14 +96,28 @@ COMMANDS = [
82
96
  GraphCommand,
83
97
  DaemonCommand,
84
98
  GardenCommand,
99
+ RecallCommand,
100
+ WhenCommand,
101
+ TimelineCommand,
102
+ PackCommand,
103
+ DistillCommand,
104
+ DecayCommand,
105
+ ResurrectCommand,
106
+ VerifyCommand,
107
+ RepairCommand,
108
+ AuditCommand,
109
+ FederatedCommand,
110
+ ResolveCommand,
111
+ ProveCommand,
112
+ GcCommand,
85
113
  ]
86
114
 
87
115
 
88
116
  def create_parser() -> argparse.ArgumentParser:
89
117
  """Create the main argument parser."""
90
118
  parser = argparse.ArgumentParser(
91
- prog='agmem',
92
- description='agmem - Agentic Memory Version Control System',
119
+ prog="agmem",
120
+ description="agmem - Agentic Memory Version Control System",
93
121
  formatter_class=argparse.RawDescriptionHelpFormatter,
94
122
  epilog="""
95
123
  Examples:
@@ -110,36 +138,21 @@ Examples:
110
138
  agmem tree Show directory tree visually
111
139
 
112
140
  For more information: https://github.com/vivek-tiwari-vt/agmem
113
- """
141
+ """,
114
142
  )
115
-
116
- parser.add_argument(
117
- '--version', '-v',
118
- action='version',
119
- version='%(prog)s 0.1.0'
120
- )
121
-
122
- parser.add_argument(
123
- '--verbose',
124
- action='store_true',
125
- help='Enable verbose output'
126
- )
127
-
143
+
144
+ parser.add_argument("--version", "-v", action="version", version="%(prog)s 0.1.0")
145
+
146
+ parser.add_argument("--verbose", action="store_true", help="Enable verbose output")
147
+
128
148
  # Create subparsers for commands
129
- subparsers = parser.add_subparsers(
130
- dest='command',
131
- help='Available commands',
132
- metavar='COMMAND'
133
- )
134
-
149
+ subparsers = parser.add_subparsers(dest="command", help="Available commands", metavar="COMMAND")
150
+
135
151
  # Add each command
136
152
  for cmd_class in COMMANDS:
137
- cmd_parser = subparsers.add_parser(
138
- cmd_class.name,
139
- help=cmd_class.help
140
- )
153
+ cmd_parser = subparsers.add_parser(cmd_class.name, help=cmd_class.help)
141
154
  cmd_class.add_arguments(cmd_parser)
142
-
155
+
143
156
  return parser
144
157
 
145
158
 
@@ -147,12 +160,12 @@ def main(args: List[str] = None) -> int:
147
160
  """Main entry point."""
148
161
  parser = create_parser()
149
162
  parsed_args = parser.parse_args(args)
150
-
163
+
151
164
  # No command specified
152
165
  if not parsed_args.command:
153
166
  parser.print_help()
154
167
  return 0
155
-
168
+
156
169
  # Find and execute the command
157
170
  for cmd_class in COMMANDS:
158
171
  if cmd_class.name == parsed_args.command:
@@ -164,15 +177,16 @@ def main(args: List[str] = None) -> int:
164
177
  except Exception as e:
165
178
  if parsed_args.verbose:
166
179
  import traceback
180
+
167
181
  traceback.print_exc()
168
182
  else:
169
183
  print(f"Error: {e}")
170
184
  return 1
171
-
185
+
172
186
  # Unknown command
173
187
  print(f"Unknown command: {parsed_args.command}")
174
188
  return 1
175
189
 
176
190
 
177
- if __name__ == '__main__':
191
+ if __name__ == "__main__":
178
192
  sys.exit(main())
@@ -11,13 +11,13 @@ from .merge import MergeCommand
11
11
  from .diff import DiffCommand
12
12
 
13
13
  __all__ = [
14
- 'InitCommand',
15
- 'AddCommand',
16
- 'CommitCommand',
17
- 'StatusCommand',
18
- 'LogCommand',
19
- 'BranchCommand',
20
- 'CheckoutCommand',
21
- 'MergeCommand',
22
- 'DiffCommand',
14
+ "InitCommand",
15
+ "AddCommand",
16
+ "CommitCommand",
17
+ "StatusCommand",
18
+ "LogCommand",
19
+ "BranchCommand",
20
+ "CheckoutCommand",
21
+ "MergeCommand",
22
+ "DiffCommand",
23
23
  ]