sourcecode 0.38.0__tar.gz → 0.39.0__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 (144) hide show
  1. {sourcecode-0.38.0 → sourcecode-0.39.0}/PKG-INFO +1 -1
  2. {sourcecode-0.38.0 → sourcecode-0.39.0}/pyproject.toml +1 -1
  3. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/__init__.py +1 -1
  4. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/cli.py +50 -1
  5. {sourcecode-0.38.0 → sourcecode-0.39.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
  6. {sourcecode-0.38.0 → sourcecode-0.39.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
  7. {sourcecode-0.38.0 → sourcecode-0.39.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
  8. {sourcecode-0.38.0 → sourcecode-0.39.0}/.gitignore +0 -0
  9. {sourcecode-0.38.0 → sourcecode-0.39.0}/.ruff.toml +0 -0
  10. {sourcecode-0.38.0 → sourcecode-0.39.0}/CONTRIBUTING.md +0 -0
  11. {sourcecode-0.38.0 → sourcecode-0.39.0}/LICENSE +0 -0
  12. {sourcecode-0.38.0 → sourcecode-0.39.0}/README.md +0 -0
  13. {sourcecode-0.38.0 → sourcecode-0.39.0}/SECURITY.md +0 -0
  14. {sourcecode-0.38.0 → sourcecode-0.39.0}/docs/privacy.md +0 -0
  15. {sourcecode-0.38.0 → sourcecode-0.39.0}/docs/schema.md +0 -0
  16. {sourcecode-0.38.0 → sourcecode-0.39.0}/raw +0 -0
  17. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/adaptive_scanner.py +0 -0
  18. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/architecture_analyzer.py +0 -0
  19. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/architecture_summary.py +0 -0
  20. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/ast_extractor.py +0 -0
  21. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/classifier.py +0 -0
  22. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  23. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/confidence_analyzer.py +0 -0
  24. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/context_summarizer.py +0 -0
  25. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/contract_model.py +0 -0
  26. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/contract_pipeline.py +0 -0
  27. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/coverage_parser.py +0 -0
  28. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/dependency_analyzer.py +0 -0
  29. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/__init__.py +0 -0
  30. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/base.py +0 -0
  31. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  32. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/dart.py +0 -0
  33. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/dotnet.py +0 -0
  34. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/elixir.py +0 -0
  35. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/go.py +0 -0
  36. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/heuristic.py +0 -0
  37. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/hybrid.py +0 -0
  38. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/java.py +0 -0
  39. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  40. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/nodejs.py +0 -0
  41. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/parsers.py +0 -0
  42. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/php.py +0 -0
  43. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/project.py +0 -0
  44. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/python.py +0 -0
  45. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/ruby.py +0 -0
  46. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/rust.py +0 -0
  47. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/systems.py +0 -0
  48. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/terraform.py +0 -0
  49. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/detectors/tooling.py +0 -0
  50. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/doc_analyzer.py +0 -0
  51. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  52. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/env_analyzer.py +0 -0
  53. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/file_classifier.py +0 -0
  54. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/git_analyzer.py +0 -0
  55. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/graph_analyzer.py +0 -0
  56. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/metrics_analyzer.py +0 -0
  57. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/prepare_context.py +0 -0
  58. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/redactor.py +0 -0
  59. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/relevance_scorer.py +0 -0
  60. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/repo_classifier.py +0 -0
  61. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/runtime_classifier.py +0 -0
  62. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/scanner.py +0 -0
  63. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/schema.py +0 -0
  64. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/semantic_analyzer.py +0 -0
  65. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/serializer.py +0 -0
  66. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/summarizer.py +0 -0
  67. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/telemetry/__init__.py +0 -0
  68. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/telemetry/config.py +0 -0
  69. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/telemetry/consent.py +0 -0
  70. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/telemetry/events.py +0 -0
  71. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/telemetry/filters.py +0 -0
  72. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/telemetry/transport.py +0 -0
  73. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/tree_utils.py +0 -0
  74. {sourcecode-0.38.0 → sourcecode-0.39.0}/src/sourcecode/workspace.py +0 -0
  75. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/__init__.py +0 -0
  76. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/conftest.py +0 -0
  77. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/coverage.xml +0 -0
  78. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
  79. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/fastapi_app/src/main.py +0 -0
  80. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/go_service/cmd/api/main.go +0 -0
  81. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/go_service/go.mod +0 -0
  82. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/jacoco.xml +0 -0
  83. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/lcov.info +0 -0
  84. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
  85. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/nextjs_app/package.json +0 -0
  86. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
  87. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
  88. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
  89. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
  90. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
  91. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
  92. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_architecture_analyzer.py +0 -0
  93. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_architecture_summary.py +0 -0
  94. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_ast_extractor.py +0 -0
  95. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_classifier.py +0 -0
  96. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_cli.py +0 -0
  97. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_code_notes_analyzer.py +0 -0
  98. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_contract_pipeline.py +0 -0
  99. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_coverage_parser.py +0 -0
  100. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_cross_consistency.py +0 -0
  101. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_dependency_analyzer_node_python.py +0 -0
  102. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_dependency_analyzer_polyglot.py +0 -0
  103. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_dependency_schema.py +0 -0
  104. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_detector_dotnet.py +0 -0
  105. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_detector_go_rust_java.py +0 -0
  106. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_detector_nodejs.py +0 -0
  107. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_detector_php_ruby_dart.py +0 -0
  108. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_detector_python.py +0 -0
  109. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_detector_universal_managed.py +0 -0
  110. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_detector_universal_systems.py +0 -0
  111. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_detectors_base.py +0 -0
  112. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_doc_analyzer_jsdom.py +0 -0
  113. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_doc_analyzer_python.py +0 -0
  114. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_graph_analyzer_polyglot.py +0 -0
  115. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_graph_analyzer_python_node.py +0 -0
  116. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_graph_schema.py +0 -0
  117. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_hybrid_inference.py +0 -0
  118. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_integration.py +0 -0
  119. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_integration_dependencies.py +0 -0
  120. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_integration_detection.py +0 -0
  121. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_integration_docs.py +0 -0
  122. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_integration_graph_modules.py +0 -0
  123. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_integration_lqn.py +0 -0
  124. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_integration_metrics.py +0 -0
  125. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_integration_multistack.py +0 -0
  126. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_integration_semantics.py +0 -0
  127. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_integration_universal.py +0 -0
  128. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_metrics_analyzer.py +0 -0
  129. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_packaging.py +0 -0
  130. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_phase1_improvements.py +0 -0
  131. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_pipeline_integrity.py +0 -0
  132. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_real_projects.py +0 -0
  133. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_redactor.py +0 -0
  134. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_scanner.py +0 -0
  135. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_schema.py +0 -0
  136. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_schema_normalization.py +0 -0
  137. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_semantic_analyzer_node.py +0 -0
  138. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_semantic_analyzer_python.py +0 -0
  139. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_semantic_import_resolution.py +0 -0
  140. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_semantic_schema.py +0 -0
  141. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_signal_hierarchy.py +0 -0
  142. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_summarizer.py +0 -0
  143. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_telemetry.py +0 -0
  144. {sourcecode-0.38.0 → sourcecode-0.39.0}/tests/test_workspace_analyzer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 0.38.0
3
+ Version: 0.39.0
4
4
  Summary: Deterministic codebase context for AI coding agents
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "0.38.0"
7
+ version = "0.39.0"
8
8
  description = "Deterministic codebase context 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__ = "0.38.0"
3
+ __version__ = "0.39.0"
@@ -220,6 +220,29 @@ def _preprocess_argv() -> None:
220
220
  _sys.argv = _sys.argv[:1] + modified
221
221
 
222
222
 
223
+ def _copy_to_clipboard(content: str) -> bool:
224
+ """Copy text to system clipboard. Returns True on success, False otherwise (never raises)."""
225
+ import subprocess
226
+ import sys as _sys
227
+ try:
228
+ if _sys.platform == "darwin":
229
+ subprocess.run(["pbcopy"], input=content.encode("utf-8"), check=True, timeout=10)
230
+ return True
231
+ elif _sys.platform == "win32":
232
+ subprocess.run(["clip"], input=content.encode("utf-16"), check=True, timeout=10)
233
+ return True
234
+ else:
235
+ for cmd in (["xclip", "-selection", "clipboard"], ["xsel", "--clipboard", "--input"]):
236
+ try:
237
+ subprocess.run(cmd, input=content.encode("utf-8"), check=True, timeout=10)
238
+ return True
239
+ except (FileNotFoundError, subprocess.CalledProcessError):
240
+ continue
241
+ return False
242
+ except Exception:
243
+ return False
244
+
245
+
223
246
  app = typer.Typer(
224
247
  name="sourcecode",
225
248
  help=_HELP,
@@ -571,6 +594,12 @@ def main(
571
594
  "--symbol",
572
595
  help="Contract mode: extract localized context for a specific symbol name. Returns defining file + all importers.",
573
596
  ),
597
+ copy: bool = typer.Option(
598
+ False,
599
+ "--copy",
600
+ "-c",
601
+ help="Copy output to system clipboard after a successful run. No-op when --output is used or clipboard is unavailable.",
602
+ ),
574
603
  ) -> None:
575
604
  """Analyze a repository and produce structured context for AI coding agents.
576
605
 
@@ -1386,6 +1415,13 @@ def main(
1386
1415
  # 6. Write output (CLI-04)
1387
1416
  write_output(content, output=output)
1388
1417
 
1418
+ # 7. Clipboard copy (--copy / -c)
1419
+ if copy and output is None:
1420
+ _trimmed = content.strip()
1421
+ if _trimmed and _trimmed not in ("{}", "[]", "null"):
1422
+ if _copy_to_clipboard(content):
1423
+ typer.echo("✓ copied to clipboard", err=True)
1424
+
1389
1425
 
1390
1426
  @app.command("prepare-context")
1391
1427
  def prepare_context_cmd(
@@ -1417,6 +1453,12 @@ def prepare_context_cmd(
1417
1453
  "--dry-run",
1418
1454
  help="Show what would be analyzed without running it",
1419
1455
  ),
1456
+ copy: bool = typer.Option(
1457
+ False,
1458
+ "--copy",
1459
+ "-c",
1460
+ help="Copy output to system clipboard after a successful run. No-op when clipboard is unavailable.",
1461
+ ),
1420
1462
  ) -> None:
1421
1463
  """Task-specific context for AI coding agents.
1422
1464
 
@@ -1514,7 +1556,14 @@ def prepare_context_cmd(
1514
1556
  if llm_prompt:
1515
1557
  out["llm_prompt"] = builder.render_prompt(output)
1516
1558
 
1517
- typer.echo(json.dumps(out, indent=2, ensure_ascii=False))
1559
+ _pc_content = json.dumps(out, indent=2, ensure_ascii=False)
1560
+ typer.echo(_pc_content)
1561
+
1562
+ if copy:
1563
+ _trimmed = _pc_content.strip()
1564
+ if _trimmed and _trimmed not in ("{}", "[]", "null"):
1565
+ if _copy_to_clipboard(_pc_content):
1566
+ typer.echo("✓ copied to clipboard", err=True)
1518
1567
 
1519
1568
 
1520
1569
  # ── Telemetry commands ────────────────────────────────────────────────────────
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes