cluxion-agentplugin-supercoder 0.2.3__tar.gz → 0.2.4__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.3 → cluxion_agentplugin_supercoder-0.2.4}/PKG-INFO +1 -1
  2. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/pyproject.toml +1 -1
  3. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/__init__.py +1 -1
  4. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/doctor/probes.py +69 -0
  5. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/tests/test_doctor.py +21 -5
  6. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/uv.lock +1 -1
  7. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/.github/workflows/ci.yml +0 -0
  8. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/.github/workflows/publish.yml +0 -0
  9. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/.gitignore +0 -0
  10. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/ARCHITECTURE.md +0 -0
  11. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/Docs/README.md +0 -0
  12. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/Docs/agent-surfaces.md +0 -0
  13. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/Docs/architecture.md +0 -0
  14. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/Docs/capabilities.md +0 -0
  15. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/Docs/design.md +0 -0
  16. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/Docs/installation.md +0 -0
  17. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/Docs/rust-architecture.md +0 -0
  18. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/Docs/tools.md +0 -0
  19. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/LICENSE +0 -0
  20. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/README.md +0 -0
  21. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/__init__.py +0 -0
  22. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/adapters/claude/.claude-plugin/plugin.json +0 -0
  23. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/adapters/claude/skills/supercoder/SKILL.md +0 -0
  24. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/adapters/codex/config-snippet.toml +0 -0
  25. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/adapters/hermes/README.md +0 -0
  26. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/plugin.yaml +0 -0
  27. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/rust/supercoder_index/Cargo.lock +0 -0
  28. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/rust/supercoder_index/Cargo.toml +0 -0
  29. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/rust/supercoder_index/pyproject.toml +0 -0
  30. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/rust/supercoder_index/src/lib.rs +0 -0
  31. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/rust/supercoder_index/src/main.rs +0 -0
  32. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/rust/supercoder_index/src/outline.rs +0 -0
  33. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/rust/supercoder_index/src/syntax.rs +0 -0
  34. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/scripts/repack_native_wheel.py +0 -0
  35. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/cli.py +0 -0
  36. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/core/cursor.py +0 -0
  37. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/core/hash_patch.py +0 -0
  38. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/core/line_budget.py +0 -0
  39. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/core/lint_gate.py +0 -0
  40. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/core/queue.py +0 -0
  41. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/core/repo_map.py +0 -0
  42. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/core/retry_loop.py +0 -0
  43. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/core/safety.py +0 -0
  44. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/core/syntax_gate.py +0 -0
  45. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/core/test_gate.py +0 -0
  46. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/doctor/__init__.py +0 -0
  47. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/doctor/catalog.json +0 -0
  48. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/doctor/framework.py +0 -0
  49. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/plugin.py +0 -0
  50. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/runner.py +0 -0
  51. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/rust_bridge.py +0 -0
  52. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/src/cluxion_agentplugin_supercoder/schemas.py +0 -0
  53. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/tests/test_cursor.py +0 -0
  54. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/tests/test_hash_patch.py +0 -0
  55. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/tests/test_line_budget.py +0 -0
  56. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/tests/test_lint_gate.py +0 -0
  57. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/tests/test_plugin.py +0 -0
  58. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/tests/test_queue.py +0 -0
  59. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/tests/test_repo_map.py +0 -0
  60. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/tests/test_retry_loop.py +0 -0
  61. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/tests/test_rust_bridge.py +0 -0
  62. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/tests/test_safety.py +0 -0
  63. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/tests/test_syntax_gate.py +0 -0
  64. {cluxion_agentplugin_supercoder-0.2.3 → cluxion_agentplugin_supercoder-0.2.4}/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.3
3
+ Version: 0.2.4
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "cluxion-agentplugin-supercoder"
7
- version = "0.2.3"
7
+ version = "0.2.4"
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"
@@ -1,5 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.2.3"
3
+ __version__ = "0.2.4"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -3,8 +3,12 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import importlib.metadata
6
+ import importlib.util
7
+ import json
8
+ import os
6
9
  import shutil
7
10
  from collections.abc import Callable
11
+ from pathlib import Path
8
12
 
9
13
  from .framework import DoctorContext
10
14
 
@@ -115,4 +119,69 @@ def handler_exception_coverage(ctx: DoctorContext) -> tuple[str, str]:
115
119
  return "skip", f"cannot invoke guard: {e}"
116
120
 
117
121
 
122
+ # NEW deterministic probes for previously-skipped catalog checks (import-avail, json-det, abi3/sqlite patterns adapted)
123
+ # hermes_requirements_installed (import availability using find_spec to satisfy linter)
124
+ @_register("hermes_requirements_installed")
125
+ def hermes_requirements_installed(ctx: DoctorContext) -> tuple[str, str]:
126
+ try:
127
+ if importlib.util.find_spec("psutil") and importlib.util.find_spec("yaml"):
128
+ return "pass", "psutil+PyYAML importable"
129
+ return "warn", "missing dep"
130
+ except Exception as e:
131
+ return "skip", f"import check error: {e}"
132
+
133
+
134
+ # repo_map_deterministic (json determinism + real call)
135
+ @_register("repo_map_deterministic")
136
+ def repo_map_deterministic(ctx: DoctorContext) -> tuple[str, str]:
137
+ try:
138
+ from cluxion_agentplugin_supercoder.core.repo_map import build_repo_map
139
+ m1 = build_repo_map(ctx.cwd, budget_chars=2000)
140
+ m2 = build_repo_map(ctx.cwd, budget_chars=2000)
141
+ def strip(d):
142
+ if isinstance(d, dict):
143
+ return {k: strip(v) for k, v in d.items() if k != "_stats"}
144
+ if isinstance(d, list):
145
+ return [strip(x) for x in d]
146
+ return d
147
+ if strip(m1) == strip(m2):
148
+ j1 = json.dumps(m1, sort_keys=True)
149
+ j2 = json.dumps(m2, sort_keys=True)
150
+ if j1 == j2:
151
+ return "pass", "deterministic + json roundtrip ok"
152
+ return "warn", "map match but json not"
153
+ return "fail", "non-deterministic"
154
+ except Exception as e:
155
+ return "skip", f"cannot run: {e}"
156
+
157
+
158
+ # ruff_binary_discoverable (real env/path probe)
159
+ @_register("ruff_binary_discoverable")
160
+ def ruff_binary_discoverable(ctx: DoctorContext) -> tuple[str, str]:
161
+ try:
162
+ envb = os.environ.get("CLUXION_SUPERCODER_RUFF_BIN")
163
+ if envb and Path(envb).is_file():
164
+ return "pass", envb
165
+ cands = [Path(ctx.cwd)/".venv/bin/ruff", shutil.which("ruff")]
166
+ for c in cands:
167
+ if c and Path(c).is_file():
168
+ return "pass", str(c)
169
+ return "warn", "no ruff binary (advisory)"
170
+ except Exception as e:
171
+ return "skip", f"probe error: {e}"
172
+
173
+
174
+ # file_hash_consistency (real check)
175
+ @_register("file_hash_consistency")
176
+ def file_hash_consistency(ctx: DoctorContext) -> tuple[str, str]:
177
+ try:
178
+ from cluxion_agentplugin_supercoder.core.hash_patch import _normalize_newlines, file_hash
179
+ c = 'a=1\r\nb=2'
180
+ if file_hash(c) == file_hash(_normalize_newlines(c)):
181
+ return "pass", "CRLF safe"
182
+ return "fail", "hash mismatch"
183
+ except Exception as e:
184
+ return "skip", f"hash error: {e}"
185
+
186
+
118
187
  # note: other checks in catalog will be reported as skip (no probe)
@@ -24,7 +24,7 @@ def test_run_doctor_returns_result_and_deterministic():
24
24
  catalog_path=cat,
25
25
  probes=PROBES,
26
26
  plugin="supercoder",
27
- version="0.2.3",
27
+ version="0.2.4",
28
28
  )
29
29
  assert isinstance(r1, DoctorResult)
30
30
  j1 = render_json(r1)
@@ -33,7 +33,7 @@ def test_run_doctor_returns_result_and_deterministic():
33
33
  catalog_path=cat,
34
34
  probes=PROBES,
35
35
  plugin="supercoder",
36
- version="0.2.3",
36
+ version="0.2.4",
37
37
  )
38
38
  j2 = render_json(r2)
39
39
  assert j1 == j2 # byte identical
@@ -49,7 +49,7 @@ def test_cross_cutting_checks_present():
49
49
  catalog_path=cat,
50
50
  probes=PROBES,
51
51
  plugin="supercoder",
52
- version="0.2.3",
52
+ version="0.2.4",
53
53
  )
54
54
  statuses = {c.check_id: c.status for c in result.checks}
55
55
  for key in ("hermes_on_path", "entry_point_registered", "toolset_valid"):
@@ -57,6 +57,22 @@ def test_cross_cutting_checks_present():
57
57
  assert statuses[key] in ("pass", "warn", "fail", "skip")
58
58
 
59
59
 
60
+ def test_new_probes_non_skip():
61
+ cat = _catalog_path()
62
+ result = run_doctor(
63
+ cwd=Path.cwd(),
64
+ catalog_path=cat,
65
+ probes=PROBES,
66
+ plugin="supercoder",
67
+ version="0.2.4",
68
+ )
69
+ statuses = {c.check_id: c.status for c in result.checks}
70
+ # assert at least two newly implemented return non-skip
71
+ new_checks = ["hermes_requirements_installed", "repo_map_deterministic", "ruff_binary_discoverable", "file_hash_consistency"]
72
+ non_skip_count = sum(1 for k in new_checks if k in statuses and statuses[k] != "skip")
73
+ assert non_skip_count >= 2, f"only {non_skip_count} new probes non-skip"
74
+
75
+
60
76
  def test_probe_exception_becomes_fail():
61
77
  def bad_probe(ctx):
62
78
  raise RuntimeError("boom")
@@ -66,7 +82,7 @@ def test_probe_exception_becomes_fail():
66
82
  catalog_path=_catalog_path(),
67
83
  probes={"hermes_on_path": bad_probe},
68
84
  plugin="supercoder",
69
- version="0.2.3",
85
+ version="0.2.4",
70
86
  )
71
87
  statuses = {c.check_id: c.status for c in result.checks}
72
88
  assert statuses["hermes_on_path"] == "fail"
@@ -78,6 +94,6 @@ def test_warn_only_is_ok():
78
94
  checks = (
79
95
  CheckResult(check_id="x", category="c", severity="medium", status="warn", detail="w"),
80
96
  )
81
- r = DoctorResult(plugin="p", version="0.2.3", checks=checks)
97
+ r = DoctorResult(plugin="p", version="0.2.4", checks=checks)
82
98
  assert r.ok is True
83
99
  # exit would be 0
@@ -160,7 +160,7 @@ wheels = [
160
160
 
161
161
  [[package]]
162
162
  name = "cluxion-agentplugin-supercoder"
163
- version = "0.2.3"
163
+ version = "0.2.4"
164
164
  source = { editable = "." }
165
165
  dependencies = [
166
166
  { name = "psutil" },