sourcecode 1.33.16__tar.gz → 1.33.18__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 (95) hide show
  1. {sourcecode-1.33.16 → sourcecode-1.33.18}/PKG-INFO +2 -2
  2. {sourcecode-1.33.16 → sourcecode-1.33.18}/README.md +1 -1
  3. {sourcecode-1.33.16 → sourcecode-1.33.18}/pyproject.toml +1 -1
  4. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/__init__.py +1 -1
  5. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/cli.py +5 -2
  6. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/mcp/runner.py +5 -4
  7. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/ris.py +5 -4
  8. {sourcecode-1.33.16 → sourcecode-1.33.18}/.github/workflows/build-windows.yml +0 -0
  9. {sourcecode-1.33.16 → sourcecode-1.33.18}/.gitignore +0 -0
  10. {sourcecode-1.33.16 → sourcecode-1.33.18}/.ruff.toml +0 -0
  11. {sourcecode-1.33.16 → sourcecode-1.33.18}/CHANGELOG.md +0 -0
  12. {sourcecode-1.33.16 → sourcecode-1.33.18}/CONTRIBUTING.md +0 -0
  13. {sourcecode-1.33.16 → sourcecode-1.33.18}/LICENSE +0 -0
  14. {sourcecode-1.33.16 → sourcecode-1.33.18}/SECURITY.md +0 -0
  15. {sourcecode-1.33.16 → sourcecode-1.33.18}/raw +0 -0
  16. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/adaptive_scanner.py +0 -0
  17. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/architecture_analyzer.py +0 -0
  18. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/architecture_summary.py +0 -0
  19. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/ast_extractor.py +0 -0
  20. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/cache.py +0 -0
  21. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/canonical_ir.py +0 -0
  22. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/classifier.py +0 -0
  23. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/code_notes_analyzer.py +0 -0
  24. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/confidence_analyzer.py +0 -0
  25. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/context_scorer.py +0 -0
  26. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/context_summarizer.py +0 -0
  27. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/contract_model.py +0 -0
  28. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/contract_pipeline.py +0 -0
  29. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/coverage_parser.py +0 -0
  30. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/dependency_analyzer.py +0 -0
  31. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/__init__.py +0 -0
  32. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/base.py +0 -0
  33. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/csproj_parser.py +0 -0
  34. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/dart.py +0 -0
  35. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/dotnet.py +0 -0
  36. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/elixir.py +0 -0
  37. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/go.py +0 -0
  38. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/heuristic.py +0 -0
  39. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/hybrid.py +0 -0
  40. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/java.py +0 -0
  41. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/jvm_ext.py +0 -0
  42. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/nodejs.py +0 -0
  43. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/parsers.py +0 -0
  44. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/php.py +0 -0
  45. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/project.py +0 -0
  46. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/python.py +0 -0
  47. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/ruby.py +0 -0
  48. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/rust.py +0 -0
  49. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/systems.py +0 -0
  50. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/terraform.py +0 -0
  51. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/detectors/tooling.py +0 -0
  52. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/doc_analyzer.py +0 -0
  53. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/entrypoint_classifier.py +0 -0
  54. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/env_analyzer.py +0 -0
  55. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/error_schema.py +0 -0
  56. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/file_classifier.py +0 -0
  57. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/flow_analyzer.py +0 -0
  58. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/git_analyzer.py +0 -0
  59. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/graph_analyzer.py +0 -0
  60. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/license.py +0 -0
  61. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/mcp/__init__.py +0 -0
  62. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  63. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  64. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  65. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  66. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  67. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/mcp/orchestrator.py +0 -0
  68. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/mcp/registry.py +0 -0
  69. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/mcp/server.py +0 -0
  70. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/mcp_nudge.py +0 -0
  71. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/metrics_analyzer.py +0 -0
  72. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/output_budget.py +0 -0
  73. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/path_filters.py +0 -0
  74. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/pr_comment_renderer.py +0 -0
  75. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/prepare_context.py +0 -0
  76. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/progress.py +0 -0
  77. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/ranking_engine.py +0 -0
  78. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/redactor.py +0 -0
  79. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/relevance_scorer.py +0 -0
  80. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/repo_classifier.py +0 -0
  81. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/repository_ir.py +0 -0
  82. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/runtime_classifier.py +0 -0
  83. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/scanner.py +0 -0
  84. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/schema.py +0 -0
  85. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/semantic_analyzer.py +0 -0
  86. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/serializer.py +0 -0
  87. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/summarizer.py +0 -0
  88. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/telemetry/__init__.py +0 -0
  89. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/telemetry/config.py +0 -0
  90. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/telemetry/consent.py +0 -0
  91. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/telemetry/events.py +0 -0
  92. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/telemetry/filters.py +0 -0
  93. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/telemetry/transport.py +0 -0
  94. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/tree_utils.py +0 -0
  95. {sourcecode-1.33.16 → sourcecode-1.33.18}/src/sourcecode/workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 1.33.16
3
+ Version: 1.33.18
4
4
  Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
5
5
  License-File: LICENSE
6
6
  Keywords: agents,ai,codebase,context,developer-tools,llm
@@ -39,7 +39,7 @@ Description-Content-Type: text/markdown
39
39
 
40
40
  **Persistent structural context and ultra-fast repeated analysis for AI coding agents.**
41
41
 
42
- ![Version](https://img.shields.io/badge/version-1.33.12-blue)
42
+ ![Version](https://img.shields.io/badge/version-1.33.18-blue)
43
43
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
44
44
 
45
45
  ---
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Persistent structural context and ultra-fast repeated analysis for AI coding agents.**
4
4
 
5
- ![Version](https://img.shields.io/badge/version-1.33.12-blue)
5
+ ![Version](https://img.shields.io/badge/version-1.33.18-blue)
6
6
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
7
7
 
8
8
  ---
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "1.33.16"
7
+ version = "1.33.18"
8
8
  description = "Persistent structural context and ultra-fast repeated analysis for AI coding agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,3 +1,3 @@
1
1
  """sourcecode — Deterministic codebase context maps for AI coding agents."""
2
2
 
3
- __version__ = "1.33.16"
3
+ __version__ = "1.33.18"
@@ -1266,7 +1266,7 @@ def main(
1266
1266
  _view_key = ""
1267
1267
  _core_hash = ""
1268
1268
 
1269
- if _cache_hit_content is not None:
1269
+ if _cache_hit_content is not None and not changed_only:
1270
1270
  from sourcecode.serializer import write_output
1271
1271
  if format == "json":
1272
1272
  try:
@@ -1948,7 +1948,10 @@ def main(
1948
1948
  if _uc:
1949
1949
  # Include untracked (new files not yet staged) so new source files
1950
1950
  # are analyzed under --changed-only, not silently treated as "clean".
1951
- _allowed_changed_files = set(_uc.staged) | set(_uc.unstaged) | set(_uc.untracked)
1951
+ # Exclude directory entries (trailing "/") e.g. untracked tool
1952
+ # cache dirs like ".sourcecode-cache/" are dirs not source files.
1953
+ _uc_files = {p for p in _uc.untracked if not p.endswith("/")}
1954
+ _allowed_changed_files = set(_uc.staged) | set(_uc.unstaged) | _uc_files
1952
1955
  if not _allowed_changed_files:
1953
1956
  # Git is available and confirms no uncommitted changes.
1954
1957
  # Do NOT fall back to a full scan — that would silently produce
@@ -39,11 +39,12 @@ def run_command(args: list[str]) -> Any:
39
39
  Returns parsed JSON dict when output is valid JSON, else the raw string.
40
40
  Raises CommandError on non-zero exit so MCP can preserve structured payloads.
41
41
  """
42
- from sourcecode.cli import _preprocess_args, _set_detected_path, app
42
+ from sourcecode.cli import app
43
43
 
44
- _set_detected_path(".")
45
- processed = _preprocess_args(list(args))
46
- result = _runner.invoke(app, processed)
44
+ # Pass raw args to invoke — the _cmd_main hook inside cli.py handles path
45
+ # extraction via _preprocess_args. Pre-processing here would strip the path
46
+ # from args, then _cmd_main would re-process the stripped list and lose it.
47
+ result = _runner.invoke(app, list(args))
47
48
 
48
49
  if result.exit_code != 0:
49
50
  stdout_raw = getattr(result, "output", "")
@@ -350,14 +350,15 @@ def _current_git_head(repo_root: Path) -> str:
350
350
 
351
351
 
352
352
  def _has_uncommitted_changes(repo_root: Path) -> bool:
353
- """Return True if working tree has staged or unstaged changes.
353
+ """Return True if working tree has staged or unstaged changes to tracked files.
354
354
 
355
- Uses ``git status --porcelain`` — any non-empty output means the working
356
- tree diverges from HEAD. Returns False on any error (non-git dirs, etc.).
355
+ Uses ``git status --porcelain --untracked-files=no`` so that untracked
356
+ files (e.g. legacy .sourcecode-cache/ directories) do not produce false
357
+ positives. Returns False on any error (non-git dirs, etc.).
357
358
  """
358
359
  try:
359
360
  result = subprocess.run(
360
- ["git", "-C", str(repo_root), "status", "--porcelain"],
361
+ ["git", "-C", str(repo_root), "status", "--porcelain", "--untracked-files=no"],
361
362
  capture_output=True,
362
363
  text=True,
363
364
  timeout=2,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes