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.
- collab/__init__.py +77 -0
- collab/__main__.py +11 -0
- collab_runtime-0.2.9.dist-info/METADATA +218 -0
- collab_runtime-0.2.9.dist-info/RECORD +82 -0
- collab_runtime-0.2.9.dist-info/WHEEL +5 -0
- collab_runtime-0.2.9.dist-info/entry_points.txt +3 -0
- collab_runtime-0.2.9.dist-info/licenses/LICENSE +21 -0
- collab_runtime-0.2.9.dist-info/top_level.txt +10 -0
- scripts/cleanup.py +395 -0
- scripts/collab_git_hook.py +190 -0
- scripts/format_code.py +594 -0
- scripts/generate_tests.py +560 -0
- scripts/validate_code.py +1397 -0
- src/__init__.py +4 -0
- src/dashboard/index.html +1131 -0
- src/live_locks_watcher.py +1982 -0
- src/lock_client.py +4268 -0
- src/logging_config.py +259 -0
- src/main.py +436 -0
- tests/backend/__init__.py +0 -0
- tests/backend/functional/__init__.py +0 -0
- tests/backend/functional/test_package_imports.py +43 -0
- tests/backend/integration/__init__.py +0 -0
- tests/backend/integration/test_cli_contract_parity.py +220 -0
- tests/backend/performance/__init__.py +0 -0
- tests/backend/reliability/__init__.py +0 -0
- tests/backend/security/__init__.py +0 -0
- tests/backend/unit/live_locks_watcher/__init__.py +5 -0
- tests/backend/unit/live_locks_watcher/_helpers.py +123 -0
- tests/backend/unit/live_locks_watcher/conftest.py +18 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_dashboard.py +188 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_developer.py +56 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_graceful_shutdown.py +459 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_main.py +1925 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_module.py +187 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_multi_session.py +320 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_notify.py +67 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_parsing.py +155 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_process_helpers.py +684 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_processing.py +173 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_prompt_abort.py +71 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_reconcile.py +516 -0
- tests/backend/unit/live_locks_watcher/test_live_locks_watcher_scan.py +296 -0
- tests/backend/unit/lock_client/__init__.py +1 -0
- tests/backend/unit/lock_client/_helpers.py +132 -0
- tests/backend/unit/lock_client/test_lock_client_acquire.py +214 -0
- tests/backend/unit/lock_client/test_lock_client_active.py +104 -0
- tests/backend/unit/lock_client/test_lock_client_api.py +63 -0
- tests/backend/unit/lock_client/test_lock_client_cli.py +682 -0
- tests/backend/unit/lock_client/test_lock_client_daemon.py +3730 -0
- tests/backend/unit/lock_client/test_lock_client_dashboard.py +438 -0
- tests/backend/unit/lock_client/test_lock_client_discover.py +241 -0
- tests/backend/unit/lock_client/test_lock_client_force_release.py +354 -0
- tests/backend/unit/lock_client/test_lock_client_helper_branches.py +1890 -0
- tests/backend/unit/lock_client/test_lock_client_history.py +301 -0
- tests/backend/unit/lock_client/test_lock_client_isolation.py +316 -0
- tests/backend/unit/lock_client/test_lock_client_pid.py +75 -0
- tests/backend/unit/lock_client/test_lock_client_reconcile.py +464 -0
- tests/backend/unit/lock_client/test_lock_client_release.py +77 -0
- tests/backend/unit/lock_client/test_lock_client_shutdown.py +1110 -0
- tests/backend/unit/lock_client/test_lock_client_utils.py +474 -0
- tests/backend/unit/lock_client/test_lock_client_watch.py +866 -0
- tests/backend/unit/scripts/__init__.py +1 -0
- tests/backend/unit/scripts/_helpers.py +42 -0
- tests/backend/unit/scripts/test_cleanup.py +285 -0
- tests/backend/unit/scripts/test_collab_git_hook.py +280 -0
- tests/backend/unit/scripts/test_collab_git_hook_ported.py +50 -0
- tests/backend/unit/scripts/test_format_code.py +368 -0
- tests/backend/unit/scripts/test_format_code_ported.py +177 -0
- tests/backend/unit/scripts/test_generate_tests.py +305 -0
- tests/backend/unit/scripts/test_hook_templates.py +357 -0
- tests/backend/unit/scripts/test_setup_hook_overlay.py +95 -0
- tests/backend/unit/scripts/test_validate_code.py +867 -0
- tests/backend/unit/scripts/test_validate_code_ported.py +237 -0
- tests/backend/unit/test_entrypoints_main_run.py +83 -0
- tests/backend/unit/test_logging_config.py +529 -0
- tests/backend/unit/test_main_watch_pid_file.py +278 -0
- tests/conftest.py +167 -0
- tests/frontend/__init__.py +0 -0
- tests/frontend/jest/__init__.py +0 -0
- tests/frontend/playwright/__init__.py +0 -0
- 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
|
+
[](https://www.python.org/)
|
|
31
|
+
[](https://github.com/KirilMT/collab/blob/main/LICENSE)
|
|
32
|
+
[](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,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.
|