deja-cli 0.1.3__tar.gz → 0.2.1__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 (67) hide show
  1. deja_cli-0.2.1/.github/workflows/ci.yml +29 -0
  2. {deja_cli-0.1.3 → deja_cli-0.2.1}/PKG-INFO +4 -1
  3. {deja_cli-0.1.3 → deja_cli-0.2.1}/README.pypi.md +3 -0
  4. {deja_cli-0.1.3 → deja_cli-0.2.1}/config/default.yaml +8 -1
  5. deja_cli-0.2.1/deja/__init__.py +11 -0
  6. deja_cli-0.2.1/deja/cloud.py +644 -0
  7. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/config.py +10 -0
  8. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/core/extractor.py +54 -16
  9. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/core/reflection.py +162 -27
  10. deja_cli-0.2.1/deja/core/store/__init__.py +634 -0
  11. deja_cli-0.2.1/deja/core/store/_helpers.py +196 -0
  12. deja_cli-0.2.1/deja/core/store/_schema.py +504 -0
  13. deja_cli-0.2.1/deja/core/store/connection.py +222 -0
  14. deja_cli-0.2.1/deja/core/store/model.py +225 -0
  15. deja_cli-0.2.1/deja/core/store/policy.py +129 -0
  16. deja_cli-0.2.1/deja/core/store/queries.py +87 -0
  17. deja_cli-0.2.1/deja/core/store/repos/__init__.py +21 -0
  18. deja_cli-0.2.1/deja/core/store/repos/memories.py +688 -0
  19. deja_cli-0.2.1/deja/core/store/repos/observations.py +118 -0
  20. deja_cli-0.2.1/deja/core/store/repos/reflection.py +66 -0
  21. deja_cli-0.2.1/deja/core/store/services/__init__.py +46 -0
  22. deja_cli-0.2.1/deja/core/store/services/load.py +168 -0
  23. deja_cli-0.2.1/deja/core/store/services/maintenance.py +309 -0
  24. deja_cli-0.2.1/deja/core/store/services/ranking.py +171 -0
  25. deja_cli-0.2.1/deja/core/store/services/save.py +256 -0
  26. deja_cli-0.2.1/deja/core/store/services/search.py +246 -0
  27. deja_cli-0.2.1/deja/ingest/watchers/base.py +493 -0
  28. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/ingest/watchers/claude_code.py +4 -5
  29. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/ingest/watchers/codex_cli.py +4 -5
  30. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/ingest/watchers/gemini_cli.py +4 -5
  31. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/interfaces/cli/_helpers.py +10 -7
  32. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/interfaces/cli/backfill.py +23 -3
  33. deja_cli-0.2.1/deja/interfaces/cli/cloud.py +326 -0
  34. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/interfaces/cli/maintenance.py +6 -0
  35. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/interfaces/cli/memory.py +80 -24
  36. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/interfaces/cli/session.py +20 -4
  37. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/interfaces/cli/setup.py +27 -9
  38. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/interfaces/cli/watch.py +52 -1
  39. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/interfaces/mcp_server.py +63 -24
  40. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/interfaces/web.py +8 -0
  41. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/llm/embedding.py +18 -7
  42. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/llm/factory.py +11 -9
  43. deja_cli-0.2.1/deja/llm/providers/ollama.py +41 -0
  44. {deja_cli-0.1.3 → deja_cli-0.2.1}/pyproject.toml +1 -1
  45. deja_cli-0.1.3/deja/cloud.py +0 -212
  46. deja_cli-0.1.3/deja/core/store.py +0 -1483
  47. deja_cli-0.1.3/deja/ingest/watchers/base.py +0 -143
  48. deja_cli-0.1.3/deja/interfaces/cli/cloud.py +0 -151
  49. deja_cli-0.1.3/deja/llm/providers/__init__.py +0 -0
  50. deja_cli-0.1.3/deja/llm/providers/ollama.py +0 -30
  51. {deja_cli-0.1.3 → deja_cli-0.2.1}/.gitignore +0 -0
  52. {deja_cli-0.1.3 → deja_cli-0.2.1}/LICENSE +0 -0
  53. {deja_cli-0.1.3/deja → deja_cli-0.2.1/deja/core}/__init__.py +0 -0
  54. {deja_cli-0.1.3/deja/core → deja_cli-0.2.1/deja/ingest}/__init__.py +0 -0
  55. {deja_cli-0.1.3/deja/ingest → deja_cli-0.2.1/deja/ingest/watchers}/__init__.py +0 -0
  56. {deja_cli-0.1.3/deja/ingest/watchers → deja_cli-0.2.1/deja/interfaces}/__init__.py +0 -0
  57. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/interfaces/cli/__init__.py +0 -0
  58. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/interfaces/cli/transfer.py +0 -0
  59. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/interfaces/web_ui/index.html +0 -0
  60. {deja_cli-0.1.3/deja/interfaces → deja_cli-0.2.1/deja/llm}/__init__.py +0 -0
  61. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/llm/base.py +0 -0
  62. {deja_cli-0.1.3/deja/llm → deja_cli-0.2.1/deja/llm/providers}/__init__.py +0 -0
  63. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/llm/providers/anthropic.py +0 -0
  64. {deja_cli-0.1.3 → deja_cli-0.2.1}/deja/main.py +0 -0
  65. {deja_cli-0.1.3 → deja_cli-0.2.1}/hooks/deja-post-fail.sh +0 -0
  66. {deja_cli-0.1.3 → deja_cli-0.2.1}/hooks/deja-precompact.sh +0 -0
  67. {deja_cli-0.1.3 → deja_cli-0.2.1}/hooks/deja-recall.sh +0 -0
@@ -0,0 +1,29 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: ["3.12", "3.13"]
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Install uv
20
+ uses: astral-sh/setup-uv@v4
21
+
22
+ - name: Set up Python ${{ matrix.python-version }}
23
+ run: uv python install ${{ matrix.python-version }}
24
+
25
+ - name: Install dependencies
26
+ run: uv sync --dev
27
+
28
+ - name: Run tests
29
+ run: uv run pytest tests/ -v
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deja-cli
3
- Version: 0.1.3
3
+ Version: 0.2.1
4
4
  Summary: Local-first persistent memory CLI for coding agents
5
5
  Author-email: Mike <mike@bigtreeproduction.com>
6
6
  License: MIT
@@ -56,6 +56,8 @@ deja save "Auth tokens stored in localStorage, not cookies" --type decision --pr
56
56
  deja save "Prisma migrations fail silently if DB_URL has wrong port" --type gotcha --project myapp
57
57
  ```
58
58
 
59
+ > Each memory is one piece of info — max 2000 chars. If your save is longer, split it into 2+ memories, each one specific fact.
60
+
59
61
  **Load at session start:**
60
62
  ```bash
61
63
  deja load --project myapp --context "what you're working on"
@@ -89,6 +91,7 @@ deja setup claude-code # Claude Code — global config + recall hooks
89
91
  deja setup gemini-cli # Gemini CLI
90
92
  deja setup codex # Codex CLI
91
93
  deja setup cursor # Cursor
94
+ deja setup windsurf # Windsurf
92
95
  ```
93
96
 
94
97
  ## MCP Server
@@ -24,6 +24,8 @@ deja save "Auth tokens stored in localStorage, not cookies" --type decision --pr
24
24
  deja save "Prisma migrations fail silently if DB_URL has wrong port" --type gotcha --project myapp
25
25
  ```
26
26
 
27
+ > Each memory is one piece of info — max 2000 chars. If your save is longer, split it into 2+ memories, each one specific fact.
28
+
27
29
  **Load at session start:**
28
30
  ```bash
29
31
  deja load --project myapp --context "what you're working on"
@@ -57,6 +59,7 @@ deja setup claude-code # Claude Code — global config + recall hooks
57
59
  deja setup gemini-cli # Gemini CLI
58
60
  deja setup codex # Codex CLI
59
61
  deja setup cursor # Cursor
62
+ deja setup windsurf # Windsurf
60
63
  ```
61
64
 
62
65
  ## MCP Server
@@ -65,4 +65,11 @@ cloud:
65
65
  enabled: false # set to true after deja login
66
66
  endpoint: https://api.deja.sh
67
67
  web_url: https://www.deja.sh # browser login opens this — must be www, not apex (apex forwarding drops query params)
68
- sync_on_save: false # push to cloud on every deja save (async, non-blocking)
68
+ sync_on_save: false # push to cloud synchronously on every deja save (blocks until HTTP completes)
69
+ # Pull cloud changes opportunistically on every `deja load`. Off by default
70
+ # (contract change 2026-04-19) — reads are local-only unless you opt in.
71
+ # Cross-machine workflow (recommended): leave this off and run
72
+ # `deja sync --pull` on session start (Cursor/Claude Desktop plugin hook,
73
+ # shell rc, or cron). One-off: `deja load --pull` for a single pull.
74
+ # Restore pre-2026-04-19 auto-pull-on-every-load: set this to true.
75
+ pull_on_load: false
@@ -0,0 +1,11 @@
1
+ import logging
2
+
3
+ # Package-level logger. All deja modules use logging.getLogger(__name__) which
4
+ # inherits from this root "deja" logger. Default handler writes to stderr with
5
+ # the same "[deja] ..." format the codebase used previously via print().
6
+ _logger = logging.getLogger("deja")
7
+ if not _logger.handlers:
8
+ _handler = logging.StreamHandler() # stderr by default
9
+ _handler.setFormatter(logging.Formatter("[deja] %(message)s"))
10
+ _logger.addHandler(_handler)
11
+ _logger.setLevel(logging.INFO)