context-engineering-cli 2.6.0__tar.gz → 2.6.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 (55) hide show
  1. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/PKG-INFO +1 -1
  2. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/pyproject.toml +1 -1
  3. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/__init__.py +1 -1
  4. context_engineering_cli-2.6.1/src/context_engineering/analysis/sessions.py +46 -0
  5. context_engineering_cli-2.6.0/src/context_engineering/analysis/sessions.py +0 -27
  6. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/.gitignore +0 -0
  7. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/LICENSE +0 -0
  8. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/provenance.json +0 -0
  9. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/__main__.py +0 -0
  10. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/__init__.py +0 -0
  11. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/backfill.py +0 -0
  12. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/context_check.py +0 -0
  13. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/context_layout.py +0 -0
  14. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/context_review.py +0 -0
  15. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/cross_cutting/__init__.py +0 -0
  16. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/cross_cutting/authors.py +0 -0
  17. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/cross_cutting/buckets.py +0 -0
  18. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/cross_cutting/co_change.py +0 -0
  19. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/cross_cutting/discover.py +0 -0
  20. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/cross_cutting/imports.py +0 -0
  21. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/cross_cutting/pair.py +0 -0
  22. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/impact.py +0 -0
  23. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/staleness.py +0 -0
  24. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/analysis/tier.py +0 -0
  25. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/__init__.py +0 -0
  26. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/antipatterns/__init__.py +0 -0
  27. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/antipatterns/context.py +0 -0
  28. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/antipatterns/density.py +0 -0
  29. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/antipatterns/line_limits.py +0 -0
  30. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/antipatterns/runner.py +0 -0
  31. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/antipatterns/splitting.py +0 -0
  32. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/antipatterns/volatile.py +0 -0
  33. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/antipatterns/watermark.py +0 -0
  34. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/contracts.py +0 -0
  35. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/depth.py +0 -0
  36. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/frontmatter.py +0 -0
  37. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/references.py +0 -0
  38. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/checks/skill_structure.py +0 -0
  39. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/cli/__init__.py +0 -0
  40. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/cli/dispatch.py +0 -0
  41. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/cli/registry.py +0 -0
  42. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/cli/render.py +0 -0
  43. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/cli/subcommands.py +0 -0
  44. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/domain/__init__.py +0 -0
  45. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/domain/commit.py +0 -0
  46. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/domain/evidence.py +0 -0
  47. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/domain/finding.py +0 -0
  48. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/domain/result.py +0 -0
  49. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/infra/__init__.py +0 -0
  50. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/infra/filesystem.py +0 -0
  51. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/infra/git.py +0 -0
  52. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/infra/git_evidence.py +0 -0
  53. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/infra/git_tree.py +0 -0
  54. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/infra/markdown.py +0 -0
  55. {context_engineering_cli-2.6.0 → context_engineering_cli-2.6.1}/src/context_engineering/infra/yaml_frontmatter.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: context-engineering-cli
3
- Version: 2.6.0
3
+ Version: 2.6.1
4
4
  Summary: Portable CLI for Context Engineering analyzers.
5
5
  License: MIT License
6
6
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "context-engineering-cli"
3
- version = "2.6.0"
3
+ version = "2.6.1"
4
4
  description = "Portable CLI for Context Engineering analyzers."
5
5
  license = {file = "LICENSE"}
6
6
  requires-python = ">=3.11"
@@ -1,3 +1,3 @@
1
1
  """Shared CLI for the context-engineering plugin."""
2
2
 
3
- __version__ = "2.6.0"
3
+ __version__ = "2.6.1"
@@ -0,0 +1,46 @@
1
+ """Rank explicitly supplied session artifacts without assuming a local agent layout."""
2
+ from __future__ import annotations
3
+
4
+ from pathlib import Path
5
+ from time import time
6
+
7
+ from ..domain.result import AnalysisResult
8
+
9
+
10
+ def analyze(project_path: str, max_results: int = 20, sessions_dir: str | None = None) -> AnalysisResult:
11
+ """Count matching JSONL text lines in a caller-configured directory only."""
12
+ result = AnalysisResult(target=project_path)
13
+ root = Path(sessions_dir).expanduser() if sessions_dir else None
14
+ if root is None:
15
+ result.data = {"state": "unavailable", "reason": "No session artifact directory was configured; continue without session evidence."}
16
+ return result
17
+ if not root.is_dir():
18
+ result.data = {"state": "unavailable", "reason": "Configured session artifact directory does not exist."}
19
+ return result
20
+
21
+ target = Path(project_path).resolve()
22
+ full_path = str(target)
23
+ basename = target.name
24
+ now = time()
25
+ sessions = []
26
+ for artifact in root.rglob("*.jsonl"):
27
+ try:
28
+ modified = artifact.stat().st_mtime
29
+ with artifact.open(encoding="utf-8") as stream:
30
+ count = sum(1 for line in stream if full_path in line or (basename and basename in line))
31
+ except (OSError, UnicodeError):
32
+ continue
33
+ if not count:
34
+ continue
35
+ age = max(0.0, (now - modified) / 86400)
36
+ weight = max(0.1, 1 - age / 33)
37
+ sessions.append({
38
+ "path": str(artifact),
39
+ "match_count": count,
40
+ "age_days": round(age, 1),
41
+ "recency_weight": round(weight, 2),
42
+ "score": round(count * weight, 2),
43
+ })
44
+ sessions.sort(key=lambda session: (-session["score"], session["path"]))
45
+ result.data = {"state": "available", "sessions": sessions[:max_results]}
46
+ return result
@@ -1,27 +0,0 @@
1
- """Optional session-artifact discovery with no assumed agent or home-directory layout."""
2
- from __future__ import annotations
3
- from pathlib import Path
4
- from ..domain.result import AnalysisResult
5
-
6
- def analyze(project_path: str, max_results: int = 20, sessions_dir: str | None = None) -> AnalysisResult:
7
- """Return explicit unavailable evidence unless the caller configures a directory.
8
-
9
- This portable fallback deliberately never searches a personal agent-history path.
10
- A caller may supply exported JSONL artifacts through a configured directory.
11
- """
12
- result=AnalysisResult(target=project_path)
13
- root=Path(sessions_dir).expanduser() if sessions_dir else None
14
- if root is None:
15
- result.data={"state":"unavailable", "reason":"No session artifact directory was configured; continue without session evidence."}
16
- return result
17
- if not root.is_dir():
18
- result.data={"state":"unavailable", "reason":"Configured session artifact directory does not exist."}
19
- return result
20
- target=str(Path(project_path).resolve())
21
- hits=[]
22
- for artifact in root.rglob("*.jsonl"):
23
- try: count=artifact.read_text(encoding="utf-8").count(target)
24
- except OSError: continue
25
- if count: hits.append((count,artifact))
26
- result.data={"state":"available", "sessions":[{"path":str(artifact),"mentions":count} for count, artifact in sorted(hits, reverse=True)[:max_results]]}
27
- return result