collab-runtime 0.2.9__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 (82) hide show
  1. collab/__init__.py +77 -0
  2. collab/__main__.py +11 -0
  3. collab_runtime-0.2.9.dist-info/METADATA +218 -0
  4. collab_runtime-0.2.9.dist-info/RECORD +82 -0
  5. collab_runtime-0.2.9.dist-info/WHEEL +5 -0
  6. collab_runtime-0.2.9.dist-info/entry_points.txt +3 -0
  7. collab_runtime-0.2.9.dist-info/licenses/LICENSE +21 -0
  8. collab_runtime-0.2.9.dist-info/top_level.txt +10 -0
  9. scripts/cleanup.py +395 -0
  10. scripts/collab_git_hook.py +190 -0
  11. scripts/format_code.py +594 -0
  12. scripts/generate_tests.py +560 -0
  13. scripts/validate_code.py +1397 -0
  14. src/__init__.py +4 -0
  15. src/dashboard/index.html +1131 -0
  16. src/live_locks_watcher.py +1982 -0
  17. src/lock_client.py +4268 -0
  18. src/logging_config.py +259 -0
  19. src/main.py +436 -0
  20. tests/backend/__init__.py +0 -0
  21. tests/backend/functional/__init__.py +0 -0
  22. tests/backend/functional/test_package_imports.py +43 -0
  23. tests/backend/integration/__init__.py +0 -0
  24. tests/backend/integration/test_cli_contract_parity.py +220 -0
  25. tests/backend/performance/__init__.py +0 -0
  26. tests/backend/reliability/__init__.py +0 -0
  27. tests/backend/security/__init__.py +0 -0
  28. tests/backend/unit/live_locks_watcher/__init__.py +5 -0
  29. tests/backend/unit/live_locks_watcher/_helpers.py +123 -0
  30. tests/backend/unit/live_locks_watcher/conftest.py +18 -0
  31. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_dashboard.py +188 -0
  32. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_developer.py +56 -0
  33. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_graceful_shutdown.py +459 -0
  34. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_main.py +1925 -0
  35. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_module.py +187 -0
  36. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_multi_session.py +320 -0
  37. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_notify.py +67 -0
  38. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_parsing.py +155 -0
  39. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_process_helpers.py +684 -0
  40. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_processing.py +173 -0
  41. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_prompt_abort.py +71 -0
  42. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_reconcile.py +516 -0
  43. tests/backend/unit/live_locks_watcher/test_live_locks_watcher_scan.py +296 -0
  44. tests/backend/unit/lock_client/__init__.py +1 -0
  45. tests/backend/unit/lock_client/_helpers.py +132 -0
  46. tests/backend/unit/lock_client/test_lock_client_acquire.py +214 -0
  47. tests/backend/unit/lock_client/test_lock_client_active.py +104 -0
  48. tests/backend/unit/lock_client/test_lock_client_api.py +63 -0
  49. tests/backend/unit/lock_client/test_lock_client_cli.py +682 -0
  50. tests/backend/unit/lock_client/test_lock_client_daemon.py +3730 -0
  51. tests/backend/unit/lock_client/test_lock_client_dashboard.py +438 -0
  52. tests/backend/unit/lock_client/test_lock_client_discover.py +241 -0
  53. tests/backend/unit/lock_client/test_lock_client_force_release.py +354 -0
  54. tests/backend/unit/lock_client/test_lock_client_helper_branches.py +1890 -0
  55. tests/backend/unit/lock_client/test_lock_client_history.py +301 -0
  56. tests/backend/unit/lock_client/test_lock_client_isolation.py +316 -0
  57. tests/backend/unit/lock_client/test_lock_client_pid.py +75 -0
  58. tests/backend/unit/lock_client/test_lock_client_reconcile.py +464 -0
  59. tests/backend/unit/lock_client/test_lock_client_release.py +77 -0
  60. tests/backend/unit/lock_client/test_lock_client_shutdown.py +1110 -0
  61. tests/backend/unit/lock_client/test_lock_client_utils.py +474 -0
  62. tests/backend/unit/lock_client/test_lock_client_watch.py +866 -0
  63. tests/backend/unit/scripts/__init__.py +1 -0
  64. tests/backend/unit/scripts/_helpers.py +42 -0
  65. tests/backend/unit/scripts/test_cleanup.py +285 -0
  66. tests/backend/unit/scripts/test_collab_git_hook.py +280 -0
  67. tests/backend/unit/scripts/test_collab_git_hook_ported.py +50 -0
  68. tests/backend/unit/scripts/test_format_code.py +368 -0
  69. tests/backend/unit/scripts/test_format_code_ported.py +177 -0
  70. tests/backend/unit/scripts/test_generate_tests.py +305 -0
  71. tests/backend/unit/scripts/test_hook_templates.py +357 -0
  72. tests/backend/unit/scripts/test_setup_hook_overlay.py +95 -0
  73. tests/backend/unit/scripts/test_validate_code.py +867 -0
  74. tests/backend/unit/scripts/test_validate_code_ported.py +237 -0
  75. tests/backend/unit/test_entrypoints_main_run.py +83 -0
  76. tests/backend/unit/test_logging_config.py +529 -0
  77. tests/backend/unit/test_main_watch_pid_file.py +278 -0
  78. tests/conftest.py +167 -0
  79. tests/frontend/__init__.py +0 -0
  80. tests/frontend/jest/__init__.py +0 -0
  81. tests/frontend/playwright/__init__.py +0 -0
  82. tests/packaging/test_smoke_install.py +76 -0
collab/__init__.py ADDED
@@ -0,0 +1,77 @@
1
+ """Compatibility shim package for `collab`.
2
+
3
+ This package exposes a top-level `collab` import surface while the
4
+ implementation lives under the repository `src/` package (module name
5
+ `src`). When installed from a registry you can also point the runtime at a
6
+ different implementation package using the `COLLAB_PKG_LOCAL_NAME` env var
7
+ (for staged rollouts or editable installs).
8
+
9
+ Mechanism:
10
+ - If `COLLAB_PKG_LOCAL_NAME` is set (and not `collab`), import that package
11
+ and re-export its public symbols.
12
+ - Otherwise, prepend the repository `src/` directory to this package's
13
+ `__path__` so `import collab.lock_client` resolves the `src/lock_client.py`
14
+ file but exposes it as `collab.lock_client` to callers.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import importlib
20
+ import os
21
+ from pathlib import Path
22
+ from typing import Optional
23
+
24
+
25
+ # Helper: prefer installed distribution metadata for `collab-runtime` when
26
+ # available (this is the most robust approach once the wheel is installed).
27
+ def _installed_version(dist_name: str = "collab-runtime") -> Optional[str]:
28
+ try:
29
+ try:
30
+ from importlib.metadata import version as _ver
31
+ except Exception:
32
+ # Backwards-compatible fallback to the importlib_metadata backport
33
+ from importlib_metadata import version as _ver # type: ignore
34
+
35
+ try:
36
+ return _ver(dist_name)
37
+ except Exception:
38
+ return None
39
+ except Exception:
40
+ return None
41
+
42
+
43
+ # If an explicit implementation package is requested, import and re-export it.
44
+ _override = os.environ.get("COLLAB_PKG_LOCAL_NAME")
45
+ if _override and _override != "collab":
46
+ try:
47
+ _impl = importlib.import_module(_override)
48
+ except Exception as exc: # pragma: no cover - import-time fallback
49
+ raise ImportError(f"runtime package {_override} is not installed") from exc
50
+
51
+ __all__ = getattr(_impl, "__all__", [])
52
+ for _n in __all__:
53
+ globals()[_n] = getattr(_impl, _n)
54
+
55
+ __version__ = getattr(_impl, "__version__", "0.0.0")
56
+ else:
57
+ # Map this package to the local `src/` directory so submodule imports such
58
+ # as `collab.lock_client` resolve to `src/lock_client.py` but appear under
59
+ # the `collab.*` namespace for consumers.
60
+ _this_dir = Path(__file__).resolve().parent
61
+ _repo_root = _this_dir.parent
62
+ _src_dir = _repo_root / "src"
63
+ if _src_dir.exists():
64
+ __path__.insert(0, str(_src_dir))
65
+
66
+ # Prefer the installed distribution version when available (works for
67
+ # wheels installed from a registry). Fallback to the local `src` package
68
+ # `__version__` when not installed.
69
+ _ver = _installed_version("collab-runtime")
70
+ if _ver:
71
+ __version__ = _ver
72
+ else:
73
+ try:
74
+ _impl = importlib.import_module("src")
75
+ __version__ = getattr(_impl, "__version__", "0.0.0")
76
+ except Exception: # pragma: no cover - best-effort only
77
+ __version__ = "0.0.0"
collab/__main__.py ADDED
@@ -0,0 +1,11 @@
1
+ """Entrypoint wrapper so `python -m collab` and `collab` console scripts work.
2
+
3
+ Delegates to the CLI implementation in `src/main.py` via the shimmed path.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from .main import main # resolved via the shimmed __path__ pointing at `src/`
9
+
10
+ if __name__ == "__main__":
11
+ main()
@@ -0,0 +1,218 @@
1
+ Metadata-Version: 2.4
2
+ Name: collab-runtime
3
+ Version: 0.2.9
4
+ Summary: Collaborative file locking runtime
5
+ Author-email: KirilMT <kiril.mt95@gmail.com>
6
+ License-Expression: MIT
7
+ Keywords: collaboration,file-locking,supabase,cli,developer-tools
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Topic :: Software Development :: Version Control
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: python-dotenv>=1.2.2
20
+ Requires-Dist: supabase>=2.30.0
21
+ Requires-Dist: httpx>=0.28.1
22
+ Requires-Dist: psutil>=5.9.8
23
+ Requires-Dist: plyer>=2.1.0
24
+ Dynamic: license-file
25
+
26
+ # collab-runtime — Collaborative File Locking
27
+
28
+ > Prevent merge conflicts by automatically locking files when a developer starts editing them, using **Supabase Realtime** as the backend.
29
+
30
+ [![Python](https://img.shields.io/badge/python-3.10%2B-blue)](https://www.python.org/)
31
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green)](https://github.com/KirilMT/collab/blob/main/LICENSE)
32
+ [![PyPI](https://img.shields.io/pypi/v/collab-runtime)](https://pypi.org/project/collab-runtime/)
33
+
34
+ ---
35
+
36
+ ## What It Does
37
+
38
+ `collab-runtime` provides a CLI and background daemon that coordinate file-level locking across a development team in real time.
39
+ When a developer opens a file, a lock is acquired in Supabase. Other developers are immediately notified — via desktop notifications, VS Code warnings, or the web dashboard — that the file is in use.
40
+
41
+ **Key features:**
42
+
43
+ - ⚡ **Atomic lock acquisition** — Supabase RPC prevents two developers locking the same file simultaneously
44
+ - 📡 **Real-time broadcast** — Supabase Realtime pushes lock events to all connected clients instantly
45
+ - 🖥️ **Web dashboard** — Live lock status view, force-release controls
46
+ - 🔔 **VS Code extension** — Lock warnings, status bar, output channel
47
+ - 🪝 **Git hooks** — Pre-commit and pre-push hooks block commits of locked files
48
+ - 📋 **Audit trail** — Full lock history with configurable retention
49
+
50
+ ---
51
+
52
+ ## Prerequisites
53
+
54
+ | Requirement | Version / Notes |
55
+ | ---------------- | ------------------------------------------------------ |
56
+ | Python | 3.10 or higher |
57
+ | Supabase account | [supabase.com](https://supabase.com) — free tier works |
58
+ | Node.js | Only required for the VS Code extension |
59
+
60
+ ---
61
+
62
+ ## Installation
63
+
64
+ ```bash
65
+ pip install collab-runtime
66
+ ```
67
+
68
+ For a minimum-version install (ensures you get the latest compatible release):
69
+
70
+ ```bash
71
+ pip install "collab-runtime>=0.2.2"
72
+ ```
73
+
74
+ ---
75
+
76
+ ## Quick Start
77
+
78
+ ### 1 — Create the Database Schema
79
+
80
+ In your Supabase project, open **SQL Editor** and run the contents of [`schema.sql`](https://github.com/KirilMT/collab/blob/main/schema.sql).
81
+
82
+ This creates the `file_locks` table, `file_locks_history` audit table, the atomic `acquire_lock()` RPC, Row Level Security policies, and Realtime publication.
83
+
84
+ ### 2 — Configure Environment Variables
85
+
86
+ Create a `.env` file in your project root:
87
+
88
+ ```env
89
+ SUPABASE_URL=https://your-project.supabase.co
90
+ SUPABASE_ANON_KEY=your_anon_key_here
91
+ SUPABASE_SERVICE_ROLE_KEY=your_service_role_key # Required for force-release
92
+ DEVELOPER_ID=your_name # Optional, defaults to git user.name
93
+ LOCK_STRICT=0 # 1 = block on lock errors, 0 = warn only
94
+ ```
95
+
96
+ > **Keep `SUPABASE_SERVICE_ROLE_KEY` private — never commit it to version control.**
97
+
98
+ ### 3 — Verify Connection
99
+
100
+ ```bash
101
+ collab active
102
+ ```
103
+
104
+ If connected, this lists all currently active locks (empty on a fresh setup).
105
+
106
+ ---
107
+
108
+ ## CLI Reference
109
+
110
+ ```bash
111
+ # Show all active locks across the team
112
+ collab active
113
+
114
+ # Lock a file before editing
115
+ collab acquire path/to/file.py --reason "Implementing feature X"
116
+
117
+ # Release a lock when done
118
+ collab release path/to/file.py
119
+
120
+ # Check lock status for a specific file
121
+ collab status path/to/file.py
122
+
123
+ # Release all locks held by you
124
+ collab release-all
125
+
126
+ # Force release (requires SUPABASE_SERVICE_ROLE_KEY)
127
+ collab force-release path/to/file.py
128
+ collab force-release-all
129
+
130
+ # Batch operations
131
+ collab acquire-batch path/to/a.py path/to/b.py --reason "Refactoring"
132
+ collab release-batch path/to/a.py path/to/b.py
133
+
134
+ # Reconcile local and remote lock state
135
+ collab reconcile
136
+
137
+ # Lock history and retention
138
+ collab history
139
+ collab history path/to/file.py --limit 50
140
+ collab history-prune --days 30
141
+
142
+ # Background watcher daemon
143
+ collab daemon-start
144
+ collab daemon-start --interval 10 --timeout 480
145
+ collab daemon-status
146
+ collab daemon-stop
147
+
148
+ # Foreground watcher (diagnostics)
149
+ collab watch --interval 5 --timeout 0
150
+
151
+ # Web dashboard (opens in browser)
152
+ collab dashboard
153
+
154
+ # Cleanup orphaned watcher processes
155
+ collab cleanup
156
+ ```
157
+
158
+ ---
159
+
160
+ ## VS Code Extension
161
+
162
+ The optional VS Code extension provides lock-on-open warnings, a status bar indicator, and one-click dashboard access.
163
+
164
+ **Install from source** (extension is bundled in the [GitHub repository](https://github.com/KirilMT/collab)):
165
+
166
+ 1. Press `F1` → **Developer: Install Extension from Location...**
167
+ 2. Select the `vscode-extension/collab-locks/` directory
168
+ 3. Reload VS Code
169
+
170
+ Once installed, the extension automatically starts and stops the background daemon with your VS Code window.
171
+
172
+ ---
173
+
174
+ ## How It Works
175
+
176
+ ```
177
+ Developer opens file
178
+
179
+
180
+ collab acquire (CLI or extension)
181
+
182
+
183
+ Supabase RPC: acquire_lock() ◄─── atomic, unique constraint
184
+ │ prevents double-locking
185
+
186
+ Supabase Realtime broadcast
187
+
188
+ ├─► VS Code extension → lock warning popup
189
+ ├─► Web dashboard → live status update
190
+ └─► Desktop notification (via plyer)
191
+ ```
192
+
193
+ Lock release follows the same path in reverse and writes an entry to `file_locks_history` for audit.
194
+
195
+ ---
196
+
197
+ ## Security
198
+
199
+ - Lock correctness is enforced at the database level via atomic RPC — no client-side race conditions.
200
+ - Force-release requires `SUPABASE_SERVICE_ROLE_KEY`; regular releases are scoped to the owning developer.
201
+ - Row Level Security (RLS) is configured on all tables via `schema.sql`.
202
+ - Never commit secrets; use `.env` for local configuration only.
203
+
204
+ ---
205
+
206
+ ## Links
207
+
208
+ - 📦 **PyPI:** [pypi.org/project/collab-runtime](https://pypi.org/project/collab-runtime/)
209
+ - 🐙 **GitHub:** [github.com/KirilMT/collab](https://github.com/KirilMT/collab)
210
+ - 🐛 **Issues:** [github.com/KirilMT/collab/issues](https://github.com/KirilMT/collab/issues)
211
+ - 📖 **Full docs:** [github.com/KirilMT/collab/tree/main/docs](https://github.com/KirilMT/collab/tree/main/docs)
212
+ - 🗺️ **Roadmap:** [docs/collab_roadmap.md](https://github.com/KirilMT/collab/blob/main/docs/collab_roadmap.md)
213
+
214
+ ---
215
+
216
+ ## License
217
+
218
+ MIT — see [LICENSE](https://github.com/KirilMT/collab/blob/main/LICENSE) for details.
@@ -0,0 +1,82 @@
1
+ collab/__init__.py,sha256=oACP8veHmOB1M2uDqiJr1pPCrBYfzdqb6IgSX-gZ0OI,2929
2
+ collab/__main__.py,sha256=vhPEHscwG_YKC2d2mh85eN2YtdJLRt1gYjUyxne441c,314
3
+ collab_runtime-0.2.9.dist-info/licenses/LICENSE,sha256=Q7115_UqHpiGVhm7duyhbwM2NDumDm5FER9OYGLPn3w,1064
4
+ scripts/cleanup.py,sha256=Ls42atkEiIRRXWX18Wr1Wq304nyPXp3DKWfrmnquGKs,11997
5
+ scripts/collab_git_hook.py,sha256=_1ADcP9lqPbKBmi3RalCzRnDL0kvMGE-voU6L_Ne-9g,4882
6
+ scripts/format_code.py,sha256=kac0tswD6YyLnJ-LzzjeX72-1bwSyqKO3jjNPDTJOqs,20264
7
+ scripts/generate_tests.py,sha256=2SD9iaiiXT_UJsVLHry1DxB-24mpXgTIRQOVLzgxjgg,19655
8
+ scripts/validate_code.py,sha256=XPjeHhXfd4zmv3og9iXjhLnFB95P1EkhvVBILjRTQ2M,46381
9
+ src/__init__.py,sha256=8cJg2p0AaD7KgTLsArbLiEWZl5IUkJWZtamoHuiEr04,79
10
+ src/live_locks_watcher.py,sha256=_VJ9zo28JaK06JZn1VCAeXW2MD2l0lA09G-4zn6tZVs,77407
11
+ src/lock_client.py,sha256=lbWlDnfVZht-b2bxU_3wDgMp4Z_g0IVq94hE4Wao2gw,178890
12
+ src/logging_config.py,sha256=4LK455twn7IE5VYsCcieAbzG8JcJ2V17U6u3FFb3JRU,9013
13
+ src/main.py,sha256=xUS858M5j37-79a6Eg3uSQAV4lwrViYRW2IW3lbzDJ8,15837
14
+ src/dashboard/index.html,sha256=PPdnKJW3V_mTZqU5yNlqn2jna7WX1nBw2UOuHgF82Fg,40546
15
+ tests/conftest.py,sha256=0JpAr5uLUCf28lXcy3VH_h7_QdTDVxBYYRscg5cwGiI,5395
16
+ tests/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ tests/backend/functional/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ tests/backend/functional/test_package_imports.py,sha256=FmKn02HOwi1xwt7uZOt6qqdYLOlHm3GVXI1JG7Y18vk,1374
19
+ tests/backend/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ tests/backend/integration/test_cli_contract_parity.py,sha256=sdD9Ru9aiRUwv-Hj4zjVc-9NFhPGUrytI8KTfaN0jAQ,7568
21
+ tests/backend/performance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ tests/backend/reliability/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ tests/backend/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ tests/backend/unit/test_entrypoints_main_run.py,sha256=tnJ4MvBnG45fuKi_1fRLVo4AMZje_RiR_SAIzA5o3d0,2127
25
+ tests/backend/unit/test_logging_config.py,sha256=UcxRUw_4q1q4PLCZZhZHYwd93Gvb00fLtNa-uppjy2w,19166
26
+ tests/backend/unit/test_main_watch_pid_file.py,sha256=_QpFcann2AbdrKuZsOL3RV2voqBA72_HRx-fCCUdXmQ,7893
27
+ tests/backend/unit/live_locks_watcher/__init__.py,sha256=8SlMu_Mref794WJ9aiSy4LaBma8hFROvSQZ3sy-meN8,168
28
+ tests/backend/unit/live_locks_watcher/_helpers.py,sha256=VRWpfiw4iZjZCuRsSMvAzxKtAZaH0ZlVimutJqXNQmw,4795
29
+ tests/backend/unit/live_locks_watcher/conftest.py,sha256=b4FvHTqf6LeN66HqRxlocZ9MPciyoYC3DoVu2q8WFsw,552
30
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_dashboard.py,sha256=lUkXVkNMOGrR0YE5kFrmJAVXvxeOG9gFhMyf99Vp5Z0,5958
31
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_developer.py,sha256=vOf0tfqlV7LxQi4cyZ5pd8TLsmiuW5Oqw-2p9iO3WBs,1628
32
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_graceful_shutdown.py,sha256=5qCm_0RiMKs90LqrxYXIEUunEUeJhoWk8N7pA-IjbOU,14823
33
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_main.py,sha256=DInAFKXMTtjvvl1fRwWW_a6YktKykkueOWrcg0Td89w,59245
34
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_module.py,sha256=Xlhz5CumXpphGs0kwhY9rP_BSQojIjbQcNzUr2Pdu2Y,6559
35
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_multi_session.py,sha256=D6TGcK07kKszorzQzb7m4dcPSeuze0nEKSHBF8raVcM,9194
36
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_notify.py,sha256=rTCQNhWgcSXf6Ikqw2Dgik6PIv_eJ7hs96mqNlFMfAs,2056
37
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_parsing.py,sha256=l-mFrnANbt9s2J9WJAmy9WBhJpUaMgiHmlYPZJBxygs,5398
38
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_process_helpers.py,sha256=lEnlbegTLBLKmHmRlFoQiMdesSoiDNizYOpmctOf8UI,23252
39
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_processing.py,sha256=10nya17acX0oXtJjOxEKK8qpI8lwm58MydjwPGCg-K8,4743
40
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_prompt_abort.py,sha256=OVPlke13BS80MFH1YUd2rgVHWkBwecmbNkmlvV4Qkbw,1857
41
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_reconcile.py,sha256=MxplnU9qCg6QmJ0ABbguKnP23wHtOnd1AedU0geEnsk,15862
42
+ tests/backend/unit/live_locks_watcher/test_live_locks_watcher_scan.py,sha256=JwOS5vSlQAC87aJAP757JaJPr1LJ6MEjXoPK19d44CE,8428
43
+ tests/backend/unit/lock_client/__init__.py,sha256=ddcWdWJRl_gFlLDteKUmMhGHKI_VrTguO6ouTV4ytdo,27
44
+ tests/backend/unit/lock_client/_helpers.py,sha256=-UPu54ma0mFxbkLopeBQ9WD0b_uFQXa07VcUC65A2Bg,3405
45
+ tests/backend/unit/lock_client/test_lock_client_acquire.py,sha256=LG3Ix4EHxGfLOLbd3ferfX9q-dRDXnVvgoJOe8GiNp0,7352
46
+ tests/backend/unit/lock_client/test_lock_client_active.py,sha256=LevsuEXBmUDeGrGDO6v_GTMkC3aCP7H_UHUBlHls3AM,3645
47
+ tests/backend/unit/lock_client/test_lock_client_api.py,sha256=USmu2FzdFjAaSLOJB-Lt0uKBvpn8zPHhpXV5yGzi4cE,1778
48
+ tests/backend/unit/lock_client/test_lock_client_cli.py,sha256=HGCQ3ijcae7SQVOu6vlQIuSHBta-A6Y-6z0osEV5dR0,23204
49
+ tests/backend/unit/lock_client/test_lock_client_daemon.py,sha256=pMv7HH4l2ISUyQivqdwu3ITooUn3I9i3UMbMUX58zwA,126324
50
+ tests/backend/unit/lock_client/test_lock_client_dashboard.py,sha256=k7MsenRceW1UmovnhW_k0dT8w7eq1Id9sBKDyg3AvTs,13880
51
+ tests/backend/unit/lock_client/test_lock_client_discover.py,sha256=yqwKkgq_Ew7QK607Yzscc1El4MRDEsw2gZgyG6FLpvo,7667
52
+ tests/backend/unit/lock_client/test_lock_client_force_release.py,sha256=GDDYhM4BRyo-4SGPcqIOYW7ImG-wSVo-l6D9vaF2cCU,11459
53
+ tests/backend/unit/lock_client/test_lock_client_helper_branches.py,sha256=qAtoEc4JMz2RNeM0p-I4uCAxNYeWC3o5rcs1MYOVtjg,62277
54
+ tests/backend/unit/lock_client/test_lock_client_history.py,sha256=m1PhS98Ef-tYn3Qi_ON5wuOfZ2b6nU4JbIzUiwG-A7I,9333
55
+ tests/backend/unit/lock_client/test_lock_client_isolation.py,sha256=a4wuRGU5N7jErRiO-xr1xMLdqLfCA0IDupZf7AVzrXU,11324
56
+ tests/backend/unit/lock_client/test_lock_client_pid.py,sha256=3nMI094HQgGjTRVzNzD-KHZPQMTsKmKUtScK61_gI94,2205
57
+ tests/backend/unit/lock_client/test_lock_client_reconcile.py,sha256=5b0Fh1r_QqSkIHXZO1FvzlGFxMlXyP8xLdDwrvtI5_4,15760
58
+ tests/backend/unit/lock_client/test_lock_client_release.py,sha256=ORtrZTazd7nsTqznHMtUmXuh2ZUhS81IZ1bpMbpT2fQ,2422
59
+ tests/backend/unit/lock_client/test_lock_client_shutdown.py,sha256=hjiZUDmqWI4zVb072fG9dhQO76LjSaM1Zj55TpB9pcA,39164
60
+ tests/backend/unit/lock_client/test_lock_client_utils.py,sha256=uziI9cXJM1ParrX6GHxSRSTplLK0f_CLNhT5vJ4Nd7g,15709
61
+ tests/backend/unit/lock_client/test_lock_client_watch.py,sha256=uiu2OXcIhCITmII_F2eEYj2XajzdS5Fvgd6chqI-18Y,29317
62
+ tests/backend/unit/scripts/__init__.py,sha256=KcBKyC5-f3yxAld1zPdzlrl5s4MtqsbNF39XIEWuX7w,41
63
+ tests/backend/unit/scripts/_helpers.py,sha256=LIHyqV97sv_Fsi28yhQLWgBTXaODgzjn1KBt4BfqaCw,1099
64
+ tests/backend/unit/scripts/test_cleanup.py,sha256=n2qOpZyp_1U6AXTummHWk0q0bujy78G_nbDaTpKzT2I,10506
65
+ tests/backend/unit/scripts/test_collab_git_hook.py,sha256=JywPm-X0ohts_7oviLlHLccFT3c34LkgwhnknIu3uzc,8454
66
+ tests/backend/unit/scripts/test_collab_git_hook_ported.py,sha256=2qATX0NWCgL0d6byOuNgajSlG8KEj3KroHuubC9sRF0,1588
67
+ tests/backend/unit/scripts/test_format_code.py,sha256=RlI65engyOFML7zK0E9fFWOA2SEPun5nX_0bo3-QIyw,12439
68
+ tests/backend/unit/scripts/test_format_code_ported.py,sha256=MDEvrYcfmBGI1M8aSrQYI7OkakDhZI0dowbw4nRptT4,5796
69
+ tests/backend/unit/scripts/test_generate_tests.py,sha256=VweI4mgwR6JM50zBnCXJFBUxkOkVPHf5zPskXyMVXjc,11938
70
+ tests/backend/unit/scripts/test_hook_templates.py,sha256=izMm41SDZ4mh_PRGCyDcPtrmyMibDJQPClyosapfhqs,11000
71
+ tests/backend/unit/scripts/test_setup_hook_overlay.py,sha256=ARzEkOl8pkuB8UoJ49RvJHF-RecF1_VpnlpewE5TedE,3489
72
+ tests/backend/unit/scripts/test_validate_code.py,sha256=ZfhBdRB-XYvT49xKeI_E26R6i6n_Q-a-IJFtnbMzwIQ,29374
73
+ tests/backend/unit/scripts/test_validate_code_ported.py,sha256=AhHhJIJj_TZwJa5G3eWrGEQ6EE5kS5m3DyFUCHouaBc,7578
74
+ tests/frontend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
+ tests/frontend/jest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
+ tests/frontend/playwright/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
+ tests/packaging/test_smoke_install.py,sha256=b4fj-73VIQSniJafzwHpd_GuuT68WxVByYM40ttyWec,2242
78
+ collab_runtime-0.2.9.dist-info/METADATA,sha256=HKVtOCx5EOVctJav5pOtrHO_5mllekk8TYs5kBQ7lsg,7126
79
+ collab_runtime-0.2.9.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
80
+ collab_runtime-0.2.9.dist-info/entry_points.txt,sha256=Bu3CJYKYvuGocYP_0GmpgHXuI0E1nih0_ulx27MuLN8,96
81
+ collab_runtime-0.2.9.dist-info/top_level.txt,sha256=MjQGhqcY6_FZnLaczYdv7yDMmMxqJTK7fdWgZa8WZNg,76
82
+ collab_runtime-0.2.9.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ collab = src.lock_client:main
3
+ collab-watcher = collab.live_locks_watcher:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 KirilMT
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,10 @@
1
+ collab
2
+ dashboard
3
+ dist
4
+ docs
5
+ hooks
6
+ pycharm
7
+ scripts
8
+ src
9
+ tests
10
+ vscode-extension