sourcecode 1.28.0__py3-none-any.whl → 1.30.0__py3-none-any.whl
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.
- sourcecode/__init__.py +1 -1
- sourcecode/cli.py +58 -1
- sourcecode/prepare_context.py +197 -10
- {sourcecode-1.28.0.dist-info → sourcecode-1.30.0.dist-info}/METADATA +3 -3
- {sourcecode-1.28.0.dist-info → sourcecode-1.30.0.dist-info}/RECORD +8 -8
- {sourcecode-1.28.0.dist-info → sourcecode-1.30.0.dist-info}/WHEEL +0 -0
- {sourcecode-1.28.0.dist-info → sourcecode-1.30.0.dist-info}/entry_points.txt +0 -0
- {sourcecode-1.28.0.dist-info → sourcecode-1.30.0.dist-info}/licenses/LICENSE +0 -0
sourcecode/__init__.py
CHANGED
sourcecode/cli.py
CHANGED
|
@@ -1633,7 +1633,7 @@ def prepare_context_cmd(
|
|
|
1633
1633
|
refactor Structural issues, improvement opportunities
|
|
1634
1634
|
generate-tests Untested source files, test gap analysis
|
|
1635
1635
|
onboard Full project context for new agents/developers
|
|
1636
|
-
review-pr
|
|
1636
|
+
review-pr PR diff: changed files, security/transactional impact, test gaps (requires git diff or --since)
|
|
1637
1637
|
delta Incremental context: git-changed files only
|
|
1638
1638
|
|
|
1639
1639
|
\b
|
|
@@ -1642,6 +1642,8 @@ def prepare_context_cmd(
|
|
|
1642
1642
|
sourcecode prepare-context explain /path/to/repo
|
|
1643
1643
|
sourcecode prepare-context fix-bug
|
|
1644
1644
|
sourcecode prepare-context delta --since main
|
|
1645
|
+
sourcecode prepare-context review-pr --since origin/main
|
|
1646
|
+
sourcecode prepare-context review-pr . --since main --output review.json
|
|
1645
1647
|
sourcecode prepare-context onboard --llm-prompt
|
|
1646
1648
|
sourcecode prepare-context --task-help
|
|
1647
1649
|
"""
|
|
@@ -1734,6 +1736,14 @@ def prepare_context_cmd(
|
|
|
1734
1736
|
"test_gaps": False, "code_notes_summary": False,
|
|
1735
1737
|
"changed_files": True, "affected_entry_points": True,
|
|
1736
1738
|
},
|
|
1739
|
+
"review-pr": {
|
|
1740
|
+
"project_summary": False, "architecture_summary": False,
|
|
1741
|
+
"relevant_files": True, "key_dependencies": False,
|
|
1742
|
+
"gaps": True, "confidence": False,
|
|
1743
|
+
"suspected_areas": False, "improvement_opportunities": False,
|
|
1744
|
+
"test_gaps": False, "code_notes_summary": False,
|
|
1745
|
+
"changed_files": True, "affected_entry_points": True,
|
|
1746
|
+
},
|
|
1737
1747
|
}
|
|
1738
1748
|
_content_filter = _TASK_CONTENT_MAP.get(task, {})
|
|
1739
1749
|
|
|
@@ -1813,6 +1823,53 @@ def prepare_context_cmd(
|
|
|
1813
1823
|
out["dependency_graph_summary"] = output.dependency_graph_summary
|
|
1814
1824
|
if output.impact_score_per_file:
|
|
1815
1825
|
out["impact_score_per_file"] = output.impact_score_per_file
|
|
1826
|
+
# review-pr specific fields
|
|
1827
|
+
if task == "review-pr":
|
|
1828
|
+
if output.error_code:
|
|
1829
|
+
_err_out: dict[str, Any] = {
|
|
1830
|
+
"task": output.task,
|
|
1831
|
+
"ci_decision": output.ci_decision or "error",
|
|
1832
|
+
"error": output.error_code,
|
|
1833
|
+
"message": output.error_message,
|
|
1834
|
+
}
|
|
1835
|
+
if output.since:
|
|
1836
|
+
_err_out["since"] = output.since
|
|
1837
|
+
if output.error_hints:
|
|
1838
|
+
_err_out["hint"] = output.error_hints
|
|
1839
|
+
_err_json = json.dumps(_err_out, indent=2, ensure_ascii=False)
|
|
1840
|
+
if output_path is not None:
|
|
1841
|
+
output_path.write_text(_err_json, encoding="utf-8")
|
|
1842
|
+
else:
|
|
1843
|
+
import sys as _sys
|
|
1844
|
+
_sys.stdout.buffer.write(_err_json.encode("utf-8"))
|
|
1845
|
+
_sys.stdout.buffer.write(b"\n")
|
|
1846
|
+
_sys.stdout.buffer.flush()
|
|
1847
|
+
raise typer.Exit(code=1)
|
|
1848
|
+
out["review_type"] = "pull_request"
|
|
1849
|
+
if output.ci_decision:
|
|
1850
|
+
out["ci_decision"] = output.ci_decision
|
|
1851
|
+
if output.base_ref:
|
|
1852
|
+
out["base_ref"] = output.base_ref
|
|
1853
|
+
if output.since:
|
|
1854
|
+
out["since"] = output.since
|
|
1855
|
+
if output.affected_modules:
|
|
1856
|
+
out["affected_modules"] = output.affected_modules
|
|
1857
|
+
if output.security_impact:
|
|
1858
|
+
out["security_impact"] = output.security_impact
|
|
1859
|
+
if output.transactional_impact:
|
|
1860
|
+
out["transactional_impact"] = output.transactional_impact
|
|
1861
|
+
if output.configuration_impact:
|
|
1862
|
+
out["configuration_impact"] = output.configuration_impact
|
|
1863
|
+
if output.test_coverage_risk:
|
|
1864
|
+
out["test_coverage_risk"] = output.test_coverage_risk
|
|
1865
|
+
if output.review_hotspots:
|
|
1866
|
+
out["review_hotspots"] = output.review_hotspots
|
|
1867
|
+
if output.suggested_review_order:
|
|
1868
|
+
out["suggested_review_order"] = output.suggested_review_order
|
|
1869
|
+
if output.impact_summary:
|
|
1870
|
+
out["impact_summary"] = output.impact_summary
|
|
1871
|
+
if output.why_these_files:
|
|
1872
|
+
out["reasoning"] = output.why_these_files
|
|
1816
1873
|
if output.limitations:
|
|
1817
1874
|
out["limitations"] = output.limitations
|
|
1818
1875
|
if output.symptom:
|
sourcecode/prepare_context.py
CHANGED
|
@@ -338,11 +338,19 @@ class TaskOutput:
|
|
|
338
338
|
error_message: Optional[str] = None
|
|
339
339
|
error_hints: list[str] = field(default_factory=list)
|
|
340
340
|
# CI decision state machine — machine-decidable signal
|
|
341
|
-
ci_decision: Optional[str] = None # "no_changes" | "analysis_success" | "git_ref_error"
|
|
341
|
+
ci_decision: Optional[str] = None # "no_changes" | "analysis_success" | "git_ref_error" | "no_git_repo"
|
|
342
342
|
# git baseline resolution metadata
|
|
343
343
|
resolved_since_ref: Optional[str] = None # actual ref/hash used for the diff
|
|
344
344
|
resolution_path: Optional[str] = None # "exact_local_ref"|"remote_tracking_ref"|"symbolic_ref"|"head_minus_1_fallback"|"uncommitted_changes"|"unresolvable"
|
|
345
345
|
diff_validation_status: Optional[str] = None # "valid_non_empty"|"valid_empty"|"invalid_ref"
|
|
346
|
+
# review-pr specific impact sections
|
|
347
|
+
base_ref: Optional[str] = None
|
|
348
|
+
security_impact: dict = field(default_factory=dict)
|
|
349
|
+
transactional_impact: dict = field(default_factory=dict)
|
|
350
|
+
configuration_impact: dict = field(default_factory=dict)
|
|
351
|
+
test_coverage_risk: dict = field(default_factory=dict)
|
|
352
|
+
review_hotspots: list[str] = field(default_factory=list)
|
|
353
|
+
suggested_review_order: list[str] = field(default_factory=list)
|
|
346
354
|
|
|
347
355
|
|
|
348
356
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -659,6 +667,64 @@ class TaskContextBuilder:
|
|
|
659
667
|
elif _delta_raw:
|
|
660
668
|
_delta_files = set(_delta_raw)
|
|
661
669
|
|
|
670
|
+
# ── 5d. review-pr: git-first gate ──────────────────────────────────────
|
|
671
|
+
if task_name == "review-pr":
|
|
672
|
+
if not self._is_git_repo():
|
|
673
|
+
return TaskOutput(
|
|
674
|
+
task="review-pr", goal=spec.goal,
|
|
675
|
+
project_summary=None, architecture_summary=None,
|
|
676
|
+
relevant_files=[], suspected_areas=[],
|
|
677
|
+
improvement_opportunities=[], test_gaps=[],
|
|
678
|
+
key_dependencies=[], code_notes_summary=None,
|
|
679
|
+
limitations=[], confidence="low",
|
|
680
|
+
error_code="no_git_repo",
|
|
681
|
+
error_message="review-pr requires a git repository.",
|
|
682
|
+
ci_decision="no_git_repo",
|
|
683
|
+
)
|
|
684
|
+
if since is None:
|
|
685
|
+
# review-pr with no --since: check only uncommitted changes.
|
|
686
|
+
# _get_git_changed_files(since=None) defaults to HEAD~1 which
|
|
687
|
+
# returns the last *committed* diff — a false positive here.
|
|
688
|
+
_pr_raw: Optional[list[str]] = self._get_uncommitted_changed_files()
|
|
689
|
+
else:
|
|
690
|
+
_pr_raw = self._get_git_changed_files(since=since)
|
|
691
|
+
if _pr_raw is None:
|
|
692
|
+
_avail_pr, _sug_pr = self._get_available_refs(since or "")
|
|
693
|
+
_pr_hints: list[str] = []
|
|
694
|
+
if _sug_pr:
|
|
695
|
+
_pr_hints.append(f"Did you mean '{_sug_pr}'?")
|
|
696
|
+
if _avail_pr:
|
|
697
|
+
_pr_hints.append(f"Available refs: {', '.join(_avail_pr[:8])}")
|
|
698
|
+
return TaskOutput(
|
|
699
|
+
task="review-pr", goal=spec.goal,
|
|
700
|
+
project_summary=None, architecture_summary=None,
|
|
701
|
+
relevant_files=[], suspected_areas=[],
|
|
702
|
+
improvement_opportunities=[], test_gaps=[],
|
|
703
|
+
key_dependencies=[], code_notes_summary=None,
|
|
704
|
+
limitations=[], confidence="low",
|
|
705
|
+
since=since,
|
|
706
|
+
error_code="git_ref_not_found",
|
|
707
|
+
error_message=f"Base ref '{since}' not found in this repository.",
|
|
708
|
+
error_hints=_pr_hints,
|
|
709
|
+
gaps=[f"Cannot compute PR diff: git ref '{since}' not found."] + _pr_hints,
|
|
710
|
+
ci_decision="git_ref_error",
|
|
711
|
+
)
|
|
712
|
+
if not _pr_raw:
|
|
713
|
+
_no_diff_hint = "review-pr requires changed files or --since <ref>."
|
|
714
|
+
return TaskOutput(
|
|
715
|
+
task="review-pr", goal=spec.goal,
|
|
716
|
+
project_summary=None, architecture_summary=None,
|
|
717
|
+
relevant_files=[], suspected_areas=[],
|
|
718
|
+
improvement_opportunities=[], test_gaps=[],
|
|
719
|
+
key_dependencies=[], code_notes_summary=None,
|
|
720
|
+
limitations=[], confidence="low",
|
|
721
|
+
error_code="no_diff",
|
|
722
|
+
error_message=f"No PR diff detected. {_no_diff_hint}",
|
|
723
|
+
gaps=[f"No PR diff detected. {_no_diff_hint}"],
|
|
724
|
+
ci_decision="no_changes",
|
|
725
|
+
)
|
|
726
|
+
_delta_files = set(_pr_raw)
|
|
727
|
+
|
|
662
728
|
# ── 5c. review-pr suspected_areas (needs git uncommitted_files) ──────
|
|
663
729
|
if task_name == "review-pr" and spec.enable_code_notes:
|
|
664
730
|
pr_areas: dict[str, int] = {}
|
|
@@ -698,7 +764,7 @@ class TaskContextBuilder:
|
|
|
698
764
|
_delta_dep_graph_summary: dict = {}
|
|
699
765
|
_delta_impact_score_per_file: dict = {}
|
|
700
766
|
|
|
701
|
-
if task_name
|
|
767
|
+
if task_name in ("delta", "review-pr"):
|
|
702
768
|
_delta_changed_list: list[str] = sorted(_delta_files) if _delta_files else []
|
|
703
769
|
(
|
|
704
770
|
relevant_files,
|
|
@@ -727,7 +793,88 @@ class TaskContextBuilder:
|
|
|
727
793
|
delta_files=None,
|
|
728
794
|
)
|
|
729
795
|
|
|
730
|
-
# ── 6b.
|
|
796
|
+
# ── 6b. review-pr: derive PR-specific impact sections from delta analysis ──
|
|
797
|
+
_pr_security_impact: dict = {}
|
|
798
|
+
_pr_transactional_impact: dict = {}
|
|
799
|
+
_pr_configuration_impact: dict = {}
|
|
800
|
+
_pr_test_coverage_risk: dict = {}
|
|
801
|
+
_pr_review_hotspots: list[str] = []
|
|
802
|
+
_pr_suggested_review_order: list[str] = []
|
|
803
|
+
_pr_base_ref: Optional[str] = None
|
|
804
|
+
|
|
805
|
+
if task_name == "review-pr":
|
|
806
|
+
_pr_base_ref = since or "HEAD"
|
|
807
|
+
_sys_risk_areas = _delta_system_impact.get("risk_areas", [])
|
|
808
|
+
|
|
809
|
+
_security_files = [
|
|
810
|
+
f for ra in _sys_risk_areas if ra["area"] == "security"
|
|
811
|
+
for f in ra["affected_files"]
|
|
812
|
+
]
|
|
813
|
+
_transaction_files = [
|
|
814
|
+
f for ra in _sys_risk_areas if ra["area"] in ("transactions", "business_logic")
|
|
815
|
+
for f in ra["affected_files"]
|
|
816
|
+
]
|
|
817
|
+
_config_files = [
|
|
818
|
+
f for ra in _sys_risk_areas if ra["area"] in ("api", "config")
|
|
819
|
+
for f in ra["affected_files"]
|
|
820
|
+
if any(kw in f.lower() for kw in ("config", "properties", "yml", "yaml", "xml", "spring"))
|
|
821
|
+
]
|
|
822
|
+
|
|
823
|
+
if _security_files:
|
|
824
|
+
_pr_security_impact = {
|
|
825
|
+
"affected_resources": _security_files,
|
|
826
|
+
"risk_level": "high",
|
|
827
|
+
}
|
|
828
|
+
if _transaction_files:
|
|
829
|
+
_pr_transactional_impact = {
|
|
830
|
+
"affected_transactions": _transaction_files,
|
|
831
|
+
"risk": "possible transaction boundary change",
|
|
832
|
+
}
|
|
833
|
+
if _config_files:
|
|
834
|
+
_pr_configuration_impact = {"changed_configs": _config_files}
|
|
835
|
+
|
|
836
|
+
# Test coverage risk scoped to changed source files only
|
|
837
|
+
_changed_src = [
|
|
838
|
+
f for f in sorted(_delta_files or set())
|
|
839
|
+
if not self._is_test(f) and self._is_source(f)
|
|
840
|
+
]
|
|
841
|
+
_test_stems = {Path(p).stem for p in test_set}
|
|
842
|
+
_untested_changed = [f for f in _changed_src if Path(f).stem not in _test_stems]
|
|
843
|
+
_test_risk_level = (
|
|
844
|
+
"high" if len(_untested_changed) > 3
|
|
845
|
+
else "medium" if _untested_changed
|
|
846
|
+
else "low"
|
|
847
|
+
)
|
|
848
|
+
_pr_test_coverage_risk = {
|
|
849
|
+
"changed_files_without_tests": _untested_changed[:10],
|
|
850
|
+
"risk_level": _test_risk_level,
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
# Review hotspots: top changed files ranked by impact score
|
|
854
|
+
_pr_review_hotspots = sorted(
|
|
855
|
+
_delta_files or set(),
|
|
856
|
+
key=lambda f: _delta_impact_score_per_file.get(f, 0.0),
|
|
857
|
+
reverse=True,
|
|
858
|
+
)[:8]
|
|
859
|
+
|
|
860
|
+
# Suggested review order: security first, then api → service → persistence → config
|
|
861
|
+
_ORDER_TYPES = ["security", "controller", "service", "repository", "mapper",
|
|
862
|
+
"spring_config", "config", "domain_model", "dto"]
|
|
863
|
+
_seen_order: set[str] = set()
|
|
864
|
+
for _otype in _ORDER_TYPES:
|
|
865
|
+
for _ra in _delta_risk_areas:
|
|
866
|
+
for _f in _ra.get("affected_files", []):
|
|
867
|
+
if _f not in _seen_order:
|
|
868
|
+
_cls = self._classify_changed_file(_f)
|
|
869
|
+
if _cls["artifact_type"] == _otype:
|
|
870
|
+
_pr_suggested_review_order.append(_f)
|
|
871
|
+
_seen_order.add(_f)
|
|
872
|
+
for _f in _pr_review_hotspots:
|
|
873
|
+
if _f not in _seen_order:
|
|
874
|
+
_pr_suggested_review_order.append(_f)
|
|
875
|
+
_seen_order.add(_f)
|
|
876
|
+
|
|
877
|
+
# ── 6c. Symptom keyword boost + related notes (fix-bug + --symptom) ──
|
|
731
878
|
symptom_keywords: list[str] = []
|
|
732
879
|
related_notes: list[dict] = []
|
|
733
880
|
symptom_note: Optional[str] = None
|
|
@@ -883,7 +1030,7 @@ class TaskContextBuilder:
|
|
|
883
1030
|
|
|
884
1031
|
conf_summary, analysis_gaps = ConfidenceAnalyzer().analyze(sm_for_conf)
|
|
885
1032
|
confidence = conf_summary.overall
|
|
886
|
-
if task_name
|
|
1033
|
+
if task_name in ("delta", "review-pr"):
|
|
887
1034
|
# Use delta-specific gaps; ConfidenceAnalyzer gaps are about full-repo
|
|
888
1035
|
# detection quality and are not meaningful for an incremental diff.
|
|
889
1036
|
gaps = _delta_analysis_gaps
|
|
@@ -895,16 +1042,16 @@ class TaskContextBuilder:
|
|
|
895
1042
|
gaps.append(_mybatis_warning["reason"])
|
|
896
1043
|
|
|
897
1044
|
# ── 9. why_these_files ────────────────────────────────────────────────
|
|
898
|
-
if task_name
|
|
1045
|
+
if task_name in ("delta", "review-pr"):
|
|
899
1046
|
why_these_files = _delta_why
|
|
900
1047
|
else:
|
|
901
1048
|
why_these_files = {rf.path: rf.reason for rf in relevant_files}
|
|
902
1049
|
|
|
903
|
-
# ── 10. Delta: git changed files + entry points
|
|
1050
|
+
# ── 10. Delta / review-pr: git changed files + entry points ──────────
|
|
904
1051
|
changed_files: list[str] = []
|
|
905
1052
|
affected_entry_points: list[str] = []
|
|
906
|
-
if task_name
|
|
907
|
-
changed_files = sorted(_delta_files) if _delta_files else self._get_git_changed_files(since=since)
|
|
1053
|
+
if task_name in ("delta", "review-pr"):
|
|
1054
|
+
changed_files = sorted(_delta_files) if _delta_files else (self._get_git_changed_files(since=since) or [])
|
|
908
1055
|
_ep_set = {ep.path for ep in entry_points}
|
|
909
1056
|
# include framework-detected entry points AND files classified as
|
|
910
1057
|
# entrypoint/controller/security by artifact taxonomy
|
|
@@ -939,16 +1086,24 @@ class TaskContextBuilder:
|
|
|
939
1086
|
impact_summary=_delta_impact_summary,
|
|
940
1087
|
affected_modules=_delta_affected_modules,
|
|
941
1088
|
risk_areas=_delta_risk_areas,
|
|
942
|
-
since=since if task_name
|
|
1089
|
+
since=since if task_name in ("delta", "review-pr") else None,
|
|
943
1090
|
system_impact=_delta_system_impact,
|
|
944
1091
|
change_type=_delta_change_type,
|
|
945
1092
|
dependency_graph_summary=_delta_dep_graph_summary,
|
|
946
1093
|
impact_score_per_file=_delta_impact_score_per_file,
|
|
947
1094
|
ci_decision=(
|
|
948
1095
|
"no_changes" if task_name == "delta" and not changed_files
|
|
949
|
-
else "analysis_success" if task_name
|
|
1096
|
+
else "analysis_success" if task_name in ("delta", "review-pr")
|
|
950
1097
|
else None
|
|
951
1098
|
),
|
|
1099
|
+
# review-pr specific
|
|
1100
|
+
base_ref=_pr_base_ref,
|
|
1101
|
+
security_impact=_pr_security_impact,
|
|
1102
|
+
transactional_impact=_pr_transactional_impact,
|
|
1103
|
+
configuration_impact=_pr_configuration_impact,
|
|
1104
|
+
test_coverage_risk=_pr_test_coverage_risk,
|
|
1105
|
+
review_hotspots=_pr_review_hotspots,
|
|
1106
|
+
suggested_review_order=_pr_suggested_review_order,
|
|
952
1107
|
)
|
|
953
1108
|
|
|
954
1109
|
def render_prompt(self, output: TaskOutput) -> str:
|
|
@@ -1240,6 +1395,19 @@ class TaskContextBuilder:
|
|
|
1240
1395
|
def _is_source(self, path: str) -> bool:
|
|
1241
1396
|
return Path(path).suffix.lower() in _SOURCE_EXTENSIONS
|
|
1242
1397
|
|
|
1398
|
+
def _is_git_repo(self) -> bool:
|
|
1399
|
+
import subprocess
|
|
1400
|
+
try:
|
|
1401
|
+
r = subprocess.run(
|
|
1402
|
+
["git", "rev-parse", "--git-dir"],
|
|
1403
|
+
cwd=str(self.root),
|
|
1404
|
+
capture_output=True, text=True,
|
|
1405
|
+
encoding="utf-8", errors="replace", timeout=5,
|
|
1406
|
+
)
|
|
1407
|
+
return r.returncode == 0
|
|
1408
|
+
except (subprocess.TimeoutExpired, FileNotFoundError):
|
|
1409
|
+
return False
|
|
1410
|
+
|
|
1243
1411
|
# ── Delta impact analysis ─────────────────────────────────────────────────
|
|
1244
1412
|
|
|
1245
1413
|
@staticmethod
|
|
@@ -2248,6 +2416,25 @@ class TaskContextBuilder:
|
|
|
2248
2416
|
"error": True,
|
|
2249
2417
|
}
|
|
2250
2418
|
|
|
2419
|
+
def _get_uncommitted_changed_files(self) -> list[str]:
|
|
2420
|
+
"""Return files with uncommitted working-tree changes (unstaged only).
|
|
2421
|
+
|
|
2422
|
+
Used by review-pr when no --since ref is given, so we don't confuse
|
|
2423
|
+
the last *committed* diff (HEAD~1 vs HEAD) with an actual PR diff.
|
|
2424
|
+
"""
|
|
2425
|
+
import subprocess
|
|
2426
|
+
try:
|
|
2427
|
+
result = subprocess.run(
|
|
2428
|
+
["git", "diff", "--name-only", "--relative"],
|
|
2429
|
+
cwd=str(self.root), capture_output=True, text=True,
|
|
2430
|
+
encoding="utf-8", errors="replace", timeout=10,
|
|
2431
|
+
)
|
|
2432
|
+
if result.returncode == 0:
|
|
2433
|
+
return [l.strip() for l in (result.stdout or "").splitlines() if l.strip()]
|
|
2434
|
+
except (subprocess.TimeoutExpired, FileNotFoundError):
|
|
2435
|
+
pass
|
|
2436
|
+
return []
|
|
2437
|
+
|
|
2251
2438
|
def _get_git_changed_files(self, since: Optional[str] = None) -> Optional[list[str]]:
|
|
2252
2439
|
"""Get files changed since a git ref (default: HEAD~1) relative to self.root.
|
|
2253
2440
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.30.0
|
|
4
4
|
Summary: Deterministic codebase context for AI coding agents
|
|
5
5
|
License: Apache License
|
|
6
6
|
Version 2.0, January 2004
|
|
@@ -221,7 +221,7 @@ Description-Content-Type: text/markdown
|
|
|
221
221
|
|
|
222
222
|
**Compressed AI-ready context for Java/Spring enterprise codebases.**
|
|
223
223
|
|
|
224
|
-

|
|
225
225
|

|
|
226
226
|
|
|
227
227
|
---
|
|
@@ -255,7 +255,7 @@ pipx install sourcecode
|
|
|
255
255
|
|
|
256
256
|
```bash
|
|
257
257
|
sourcecode version
|
|
258
|
-
# sourcecode 1.
|
|
258
|
+
# sourcecode 1.30.0
|
|
259
259
|
```
|
|
260
260
|
|
|
261
261
|
---
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
sourcecode/__init__.py,sha256=
|
|
1
|
+
sourcecode/__init__.py,sha256=Bqhw95H9r5IFRlnJFDRt1uCsK_ahVHjggAAWdJ3d-5c,103
|
|
2
2
|
sourcecode/adaptive_scanner.py,sha256=RTNExwWPXzjgLaRueT7UuxkPj5ZEToWjGbx1j0LSZ9E,10250
|
|
3
3
|
sourcecode/architecture_analyzer.py,sha256=MyBa0Hf5HmkudZQDLKrjcWDKETXETXl0mQX1swtTwAA,39091
|
|
4
4
|
sourcecode/architecture_summary.py,sha256=z34_6v7cSwy98cof2UVciGho7SCrZ93tiqMmq5WNzRQ,20405
|
|
5
5
|
sourcecode/ast_extractor.py,sha256=XgrZg2DcWcUm9r87cRG3KGO7IK2TIL_N-CvhSbUmmh4,49901
|
|
6
6
|
sourcecode/classifier.py,sha256=pYve2J1LqtYssU3lYLMDz18PT-CjN5c18QYE7R_IG1Q,7507
|
|
7
|
-
sourcecode/cli.py,sha256=
|
|
7
|
+
sourcecode/cli.py,sha256=iWzo7u-wmWjj0GYAF54UpbicfpXt2OUxPRy44h2VaCI,80646
|
|
8
8
|
sourcecode/code_notes_analyzer.py,sha256=y1MJBnPZHYp4i6cQCXUb9ATIyifS_qMQWjw_8lPkpsU,9215
|
|
9
9
|
sourcecode/confidence_analyzer.py,sha256=xw_Jv8pAd0wd8t2vvQlorw8Ih0rSF3YCoFS8K-_4aXg,15762
|
|
10
10
|
sourcecode/context_scorer.py,sha256=QpChSpsmaAYz91rXA4Ue5xzQmNz_ZboZN09YOHScq1U,14679
|
|
@@ -20,7 +20,7 @@ sourcecode/file_classifier.py,sha256=48ly5Z6exkzBy8lNy1AkdP4-oJqIA1zT3LZfffuTyDo
|
|
|
20
20
|
sourcecode/git_analyzer.py,sha256=_pCg2V4d2aa17k9hayTzpexAj8syvyk4y9NYNvvgOAI,12802
|
|
21
21
|
sourcecode/graph_analyzer.py,sha256=iUK-7pSV-cvGqqD2hENdYmhnm0wcXFEyK-xnu5ul8OU,62515
|
|
22
22
|
sourcecode/metrics_analyzer.py,sha256=m0ENgtqKeBL17kUIK3fmGkgo7UfXBNHxCMj0H_Y5K7c,22750
|
|
23
|
-
sourcecode/prepare_context.py,sha256=
|
|
23
|
+
sourcecode/prepare_context.py,sha256=UxAwXHLZC61WFmYWwp-LWRUXnH6CbaX_lsyn6W7ok4o,121062
|
|
24
24
|
sourcecode/progress.py,sha256=qn30sWaHOkjTgXsSBmiPkz7Rsbwc5oSlIe6JNEMYp_k,3149
|
|
25
25
|
sourcecode/ranking_engine.py,sha256=virVglafZufioHpZpwktjMvUiL0TZELWQCQnQNV8dFo,9360
|
|
26
26
|
sourcecode/redactor.py,sha256=xuGcadGEHaPw4qZXlMDvzMCsr4VOkdp3oBQptHyJk8c,2884
|
|
@@ -61,8 +61,8 @@ sourcecode/telemetry/consent.py,sha256=wLMvGNJeSSyZoNkQXpoUioY6mMv4Qdvuw7S9jAEWn
|
|
|
61
61
|
sourcecode/telemetry/events.py,sha256=oEvvulfsv5GIDWG2174gSS6tNB95w38AIYiYeifGKlE,2294
|
|
62
62
|
sourcecode/telemetry/filters.py,sha256=Asa71oRl7q3Wt_FMwuufIZJFzSYdgRNKS8LHCIyFeYE,4805
|
|
63
63
|
sourcecode/telemetry/transport.py,sha256=KJeIPCPWMdmbCP3ySGs2iUlia34U6vWne2dZsUezesw,1560
|
|
64
|
-
sourcecode-1.
|
|
65
|
-
sourcecode-1.
|
|
66
|
-
sourcecode-1.
|
|
67
|
-
sourcecode-1.
|
|
68
|
-
sourcecode-1.
|
|
64
|
+
sourcecode-1.30.0.dist-info/METADATA,sha256=RDWe-iF73ttF7ZeXsUoUp2kQQUGB8lnxCWHI7dZQroM,23417
|
|
65
|
+
sourcecode-1.30.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
66
|
+
sourcecode-1.30.0.dist-info/entry_points.txt,sha256=ex3F9rmbXeyDIoFQHtkEqTsKSaJow8F0LrVu8XfIktQ,57
|
|
67
|
+
sourcecode-1.30.0.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
|
|
68
|
+
sourcecode-1.30.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|