cluxion-agentplugin-supercoder 0.2.10__tar.gz → 0.2.11__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 (64) hide show
  1. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/PKG-INFO +1 -1
  2. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/plugin.yaml +1 -1
  3. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/pyproject.toml +1 -1
  4. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/core/hash_patch.py +13 -4
  5. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_hash_patch.py +18 -0
  6. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/uv.lock +1 -1
  7. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/.github/workflows/ci.yml +0 -0
  8. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/.github/workflows/publish.yml +0 -0
  9. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/.gitignore +0 -0
  10. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/ARCHITECTURE.md +0 -0
  11. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/Docs/README.md +0 -0
  12. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/Docs/agent-surfaces.md +0 -0
  13. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/Docs/architecture.md +0 -0
  14. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/Docs/capabilities.md +0 -0
  15. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/Docs/design.md +0 -0
  16. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/Docs/installation.md +0 -0
  17. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/Docs/rust-architecture.md +0 -0
  18. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/Docs/tools.md +0 -0
  19. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/LICENSE +0 -0
  20. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/README.md +0 -0
  21. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/__init__.py +0 -0
  22. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/adapters/claude/.claude-plugin/plugin.json +0 -0
  23. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/adapters/claude/skills/supercoder/SKILL.md +0 -0
  24. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/adapters/codex/config-snippet.toml +0 -0
  25. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/adapters/hermes/README.md +0 -0
  26. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/rust/supercoder_index/Cargo.lock +0 -0
  27. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/rust/supercoder_index/Cargo.toml +0 -0
  28. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/rust/supercoder_index/pyproject.toml +0 -0
  29. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/rust/supercoder_index/src/lib.rs +0 -0
  30. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/rust/supercoder_index/src/main.rs +0 -0
  31. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/rust/supercoder_index/src/outline.rs +0 -0
  32. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/rust/supercoder_index/src/syntax.rs +0 -0
  33. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/scripts/repack_native_wheel.py +0 -0
  34. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/__init__.py +0 -0
  35. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/cli.py +0 -0
  36. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/core/cursor.py +0 -0
  37. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/core/line_budget.py +0 -0
  38. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/core/lint_gate.py +0 -0
  39. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/core/queue.py +0 -0
  40. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/core/repo_map.py +0 -0
  41. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/core/retry_loop.py +0 -0
  42. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/core/safety.py +0 -0
  43. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/core/syntax_gate.py +0 -0
  44. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/core/test_gate.py +0 -0
  45. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/doctor/__init__.py +0 -0
  46. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/doctor/catalog.json +0 -0
  47. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/doctor/framework.py +0 -0
  48. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/doctor/probes.py +0 -0
  49. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/plugin.py +0 -0
  50. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/runner.py +0 -0
  51. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/rust_bridge.py +0 -0
  52. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/src/cluxion_agentplugin_supercoder/schemas.py +0 -0
  53. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_cursor.py +0 -0
  54. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_doctor.py +0 -0
  55. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_line_budget.py +0 -0
  56. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_lint_gate.py +0 -0
  57. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_plugin.py +0 -0
  58. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_queue.py +0 -0
  59. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_repo_map.py +0 -0
  60. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_retry_loop.py +0 -0
  61. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_rust_bridge.py +0 -0
  62. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_safety.py +0 -0
  63. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_syntax_gate.py +0 -0
  64. {cluxion_agentplugin_supercoder-0.2.10 → cluxion_agentplugin_supercoder-0.2.11}/tests/test_test_gate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cluxion-agentplugin-supercoder
3
- Version: 0.2.10
3
+ Version: 0.2.11
4
4
  Summary: Universal agent coding harness plugin: cursor logic, safe patch, line budget, Rust index, test gates.
5
5
  Project-URL: Homepage, https://github.com/cluxion/cluxion-Agentplugin-supercoder
6
6
  Project-URL: Repository, https://github.com/cluxion/cluxion-Agentplugin-supercoder
@@ -1,5 +1,5 @@
1
1
  name: cluxion-agentplugin-supercoder
2
- version: 0.2.2
2
+ version: 0.2.11
3
3
  description: "Universal agent coding harness: cursor, safe patch, line budget, Rust index."
4
4
  author: cluxion
5
5
  kind: standalone
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "cluxion-agentplugin-supercoder"
7
- version = "0.2.10"
7
+ version = "0.2.11"
8
8
  description = "Universal agent coding harness plugin: cursor logic, safe patch, line budget, Rust index, test gates."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  import hashlib
6
6
  import os
7
7
  import tempfile
8
+ import threading
8
9
  from contextlib import contextmanager
9
10
  from dataclasses import dataclass
10
11
  from difflib import SequenceMatcher
@@ -19,14 +20,22 @@ DEFAULT_FUZZY_THRESHOLD = 0.86
19
20
  MAX_CONTEXT_SCAN = 8
20
21
  MAX_LINE_DRIFT = 2
21
22
 
23
+ _thread_fallback_lock = threading.Lock()
24
+
25
+
26
+ def _lock_path(path: Path) -> Path:
27
+ return path.parent / f".{path.name}.cluxion-lock"
28
+
22
29
 
23
30
  @contextmanager
24
31
  def _exclusive_lock(path: Path):
25
- """Exclusive advisory lock on target file (fcntl.flock). Graceful degrade on non-POSIX."""
26
- if fcntl is None or not path.exists():
27
- yield
32
+ """Exclusive advisory lock on stable sidecar file (fcntl.flock). Graceful degrade on non-POSIX."""
33
+ if fcntl is None:
34
+ with _thread_fallback_lock:
35
+ yield
28
36
  return
29
- fd = os.open(str(path), os.O_RDWR)
37
+ lock_path = _lock_path(path)
38
+ fd = os.open(str(lock_path), os.O_CREAT | os.O_RDWR, 0o600)
30
39
  try:
31
40
  fcntl.flock(fd, fcntl.LOCK_EX)
32
41
  yield
@@ -158,6 +158,24 @@ def test_concurrent_patches_no_lost_update(tmp_path: Path) -> None:
158
158
  assert new_hash != file_hash(initial)
159
159
 
160
160
 
161
+ def test_concurrent_patches_no_lost_update_stress(tmp_path: Path) -> None:
162
+ """50 iterations of 8 concurrent workers: zero lost updates across all runs."""
163
+ for _ in range(50):
164
+ path = tmp_path / "concurrent_stress.py"
165
+ initial = "\n".join(f"# UNIQUE_PATCH_{i}_START" for i in range(8)) + "\n"
166
+ path.write_text(initial, encoding="utf-8")
167
+
168
+ with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor:
169
+ futures = [executor.submit(_worker_apply, i, path) for i in range(8)]
170
+ successes = [f.result() for f in concurrent.futures.as_completed(futures)]
171
+
172
+ assert all(successes), "Some patches lost due to race"
173
+ final = path.read_text(encoding="utf-8")
174
+ for i in range(8):
175
+ assert f"# UNIQUE_PATCH_{i}_DONE" in final
176
+ assert f"# UNIQUE_PATCH_{i}_START" not in final
177
+
178
+
161
179
  def test_atomic_write_interruption_leaves_original_intact(tmp_path: Path) -> None:
162
180
  """Simulated mid-write crash leaves ORIGINAL file intact (temp may remain, no truncate)."""
163
181
  path = tmp_path / "atomic_test.txt"
@@ -160,7 +160,7 @@ wheels = [
160
160
 
161
161
  [[package]]
162
162
  name = "cluxion-agentplugin-supercoder"
163
- version = "0.2.10"
163
+ version = "0.2.11"
164
164
  source = { editable = "." }
165
165
  dependencies = [
166
166
  { name = "psutil" },