sourcecode 3.2.0__py3-none-any.whl → 3.2.1__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.

Potentially problematic release.


This version of sourcecode might be problematic. Click here for more details.

@@ -0,0 +1,178 @@
1
+ """test_sources.py — one answer to "is this file a test, and does this repo have any".
2
+
3
+ Four surfaces answered this independently: `signals.has_tests` by substring
4
+ (`"/test" in path`), the `analysis_gaps` testing check by a second substring rule,
5
+ `metrics_analyzer.is_test_file` by ecosystem naming patterns, and the review-pr
6
+ coverage risk by a third. On a repository whose *production* code lives in a
7
+ package called `test` — `com.example.saint.test.PruebaCreaBD` — the substring
8
+ rules reported "2 test files" and `has_tests: true` for a repository containing
9
+ **no tests at all**, and the same document's `analysis_gaps` said otherwise.
10
+
11
+ The fact this module owns:
12
+
13
+ Which files are test sources, which roots hold them, and whether the
14
+ repository has any.
15
+
16
+ Two signals decide it, in this order:
17
+
18
+ 1. **A test source root.** `src/test/java`, `src/it/…`, `src/androidTest/…`,
19
+ `src/testFixtures/…`, or a repository-level `test/`, `tests/`, `spec/`,
20
+ `__tests__/` directory. A build tool that separates test sources says so with
21
+ a directory, and that statement outranks any name.
22
+ 2. **A naming convention**, per ecosystem — `FooTest.java`, `test_foo.py`,
23
+ `foo.spec.ts`, `foo_test.go`.
24
+
25
+ What is deliberately *not* a signal: a package or directory named `test` that
26
+ sits **inside a main source root**. `src/main/java/com/ex/test/Helper.java` is
27
+ production code, and calling it a test inflates coverage in the one direction a
28
+ reader must never be misled about.
29
+
30
+ VAI: only published, tool-neutral conventions appear here — Maven/Gradle source
31
+ layout and the standard test naming patterns of each ecosystem.
32
+ """
33
+ from __future__ import annotations
34
+
35
+ import re
36
+ from dataclasses import dataclass, field
37
+ from pathlib import PurePosixPath
38
+
39
+ # Directory layouts that *declare* a test source set. Matched as path prefixes
40
+ # after normalization, so `module-a/src/test/java/...` counts too.
41
+ _TEST_ROOT_SEGMENTS: tuple[tuple[str, ...], ...] = (
42
+ ("src", "test"),
43
+ ("src", "it"),
44
+ ("src", "integration-test"),
45
+ ("src", "integrationTest"),
46
+ ("src", "androidTest"),
47
+ ("src", "testFixtures"),
48
+ )
49
+
50
+ # Repository-level test directories, for ecosystems with no src/main split.
51
+ _TEST_DIR_NAMES: frozenset[str] = frozenset(
52
+ {"test", "tests", "spec", "specs", "__tests__"}
53
+ )
54
+
55
+ # A directory named `test` under one of these is production code, not a test.
56
+ _MAIN_ROOT_SEGMENTS: tuple[tuple[str, ...], ...] = (
57
+ ("src", "main"),
58
+ )
59
+
60
+ # Naming conventions, per ecosystem. Anchored to avoid `testdata/`, `_tested.py`.
61
+ _TEST_NAME_PATTERNS: tuple[re.Pattern[str], ...] = tuple(
62
+ re.compile(p) for p in (
63
+ r"(?:^|/)test_[^/]*\.py$",
64
+ r"[^/]*_test\.py$",
65
+ r"[^/]*_test\.go$",
66
+ r"[^/]*\.(spec|test)\.(js|jsx|ts|tsx|mjs|cjs)$",
67
+ r"[^/]*(Test|Tests|Spec|IT)\.(java|kt|scala)$",
68
+ r"[^/]*_test\.rb$",
69
+ r"[^/]*_spec\.rb$",
70
+ r"[^/]*_test\.dart$",
71
+ r"[^/]*(Test|test)\.(c|cpp|cc|h|hpp)$",
72
+ r"[^/]*Test\.php$",
73
+ )
74
+ )
75
+
76
+
77
+ def _norm(path: str) -> str:
78
+ return path.replace("\\", "/").lstrip("./")
79
+
80
+
81
+ def _parts(path: str) -> list[str]:
82
+ return [p for p in _norm(path).split("/") if p]
83
+
84
+
85
+ def _under_main_root(parts: list[str]) -> bool:
86
+ for i in range(len(parts) - 1):
87
+ if tuple(parts[i:i + 2]) in _MAIN_ROOT_SEGMENTS:
88
+ return True
89
+ return False
90
+
91
+
92
+ def declared_test_root(path: str) -> "str | None":
93
+ """The declared test source root containing ``path``, if any."""
94
+ parts = _parts(path)
95
+ for i in range(len(parts) - 1):
96
+ if tuple(parts[i:i + 2]) in _TEST_ROOT_SEGMENTS:
97
+ return "/".join(parts[:i + 2])
98
+ if _under_main_root(parts):
99
+ # A `test` package inside a main source root is production code.
100
+ return None
101
+ for i, part in enumerate(parts[:-1]):
102
+ if part in _TEST_DIR_NAMES:
103
+ return "/".join(parts[:i + 1])
104
+ return None
105
+
106
+
107
+ def is_test_path(path: str) -> bool:
108
+ """Whether ``path`` is a test source.
109
+
110
+ The single derivation of this fact. A file under a declared test source root
111
+ is a test whatever it is named; a file named by convention is a test wherever
112
+ it sits; a `test` package inside a main source root is neither.
113
+ """
114
+ if declared_test_root(path) is not None:
115
+ return True
116
+ normalized = _norm(path)
117
+ return any(p.search(normalized) for p in _TEST_NAME_PATTERNS)
118
+
119
+
120
+ @dataclass(frozen=True)
121
+ class SourceTestFacts:
122
+ """What a repository's file list says about its tests."""
123
+
124
+ test_files: tuple[str, ...] = ()
125
+ roots: tuple[str, ...] = ()
126
+ basis: str = ""
127
+ extensions: tuple[str, ...] = field(default=())
128
+
129
+ @property
130
+ def count(self) -> int:
131
+ return len(self.test_files)
132
+
133
+ @property
134
+ def has_tests(self) -> bool:
135
+ return bool(self.test_files)
136
+
137
+ def to_dict(self) -> dict:
138
+ return {
139
+ "test_file_count": self.count,
140
+ "test_source_roots": list(self.roots),
141
+ "has_tests": self.has_tests,
142
+ "basis": self.basis,
143
+ }
144
+
145
+
146
+ def analyze_test_sources(
147
+ file_paths: "list[str] | tuple[str, ...]",
148
+ *,
149
+ extensions: "tuple[str, ...] | None" = None,
150
+ ) -> SourceTestFacts:
151
+ """Test sources in ``file_paths``, optionally restricted to ``extensions``.
152
+
153
+ ``extensions`` scopes the question to one language (``(".java",)`` for the
154
+ backend coverage gap) without changing the rule that answers it.
155
+ """
156
+ paths = [
157
+ p for p in file_paths
158
+ if not extensions or _norm(p).endswith(extensions)
159
+ ]
160
+ tests = tuple(sorted(p for p in paths if is_test_path(p)))
161
+ roots = tuple(sorted({r for p in tests if (r := declared_test_root(p))}))
162
+ if tests:
163
+ basis = (
164
+ f"{len(tests)} file(s) under a declared test source root "
165
+ f"or matching a test naming convention"
166
+ + (f"; roots: {', '.join(roots)}" if roots else "")
167
+ )
168
+ else:
169
+ basis = (
170
+ "no declared test source root (src/test, src/it, tests/) and no file "
171
+ "matching a test naming convention"
172
+ )
173
+ return SourceTestFacts(
174
+ test_files=tests,
175
+ roots=roots,
176
+ basis=basis,
177
+ extensions=tuple(extensions or ()),
178
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 3.2.0
3
+ Version: 3.2.1
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
@@ -73,6 +73,15 @@ Cache keyed on content hashes — invalidated only when source changes. On repea
73
73
 
74
74
  At 0.3s per call, ASK Engine becomes **constant infrastructure** inside agent loops — call it before every edit, every PR review, every test run, without batching or caching manually.
75
75
 
76
+ **What a warm actually covers.** `ask cache warm` runs the compact analysis: it rebuilds the
77
+ shared structural layers (L1/L2 + the Repository Intelligence Snapshot) and the **compact
78
+ view**. Pass `--agent` to warm the agent view as well. Deeper projections are separate view
79
+ keys and are *not* covered by either — `--full`, `--env-map` and a raised `--depth` recompute
80
+ on first use, as do most `prepare-context` tasks. Measured on a 3,342-file Spring monolith:
81
+ `cache warm` 103s → `--compact --git-context` 1s (hit), but `--agent --full --env-map
82
+ --depth 20` still 171s (miss). Budget the deep run explicitly in CI, or warm exactly the view
83
+ your pipeline consumes. Full model: [USER_GUIDE.md#caching](docs/USER_GUIDE.md#caching).
84
+
76
85
  ---
77
86
 
78
87
  ## Install
@@ -95,27 +104,55 @@ ask version # ask 2.5.1
95
104
 
96
105
  ## Quickstart
97
106
 
107
+ **Start with these four.** In three independent field evaluations they carried most of the
108
+ measured value, and `posture --diff` is the one no evaluator found an equivalent for —
109
+ commercial or open source.
110
+
98
111
  ```bash
99
- # High-signal structural summary — warm cache ~0.3s, cold 2–10s
100
- ask --compact
112
+ # What does each profile set ACTUALLY wire — and what changes between them?
113
+ # Resolves conditional beans and the filter chain, then diffs effective endpoint access.
114
+ ask posture /path/to/repo --diff dev:prod
101
115
 
102
- # Blast radius: what breaks if this class changes?
103
- ask impact OrderService /path/to/repo
116
+ # Every REST endpoint with its effective path (context-path + servlet path resolved),
117
+ # its inferred security policy and a confidence per endpoint.
118
+ ask endpoints /path/to/repo
119
+
120
+ # Spring semantic audit: transactional anomalies (private @Transactional = silent
121
+ # CGLIB no-op), security surface, request-body validation.
122
+ ask spring-audit /path/to/repo
104
123
 
105
- # Spring Boot 2→3 migration readiness (bounded decision summary)
124
+ # Spring Boot 2→3 readiness: located blockers, per-dimension score, effort estimate.
106
125
  ask migrate-check /path/to/repo --compact
126
+ ```
107
127
 
108
- # Spring semantic audit: TX anomalies + security surface
109
- ask spring-audit /path/to/repo
128
+ Then the everyday loop:
129
+
130
+ ```bash
131
+ # High-signal structural summary — warm cache ~0.3s, cold 2–10s
132
+ ask --compact
133
+
134
+ # Blast radius: what breaks if this class changes? (target the INTERFACE, not the Impl)
135
+ ask impact OrderService /path/to/repo
110
136
 
111
137
  # Onboard to an unfamiliar codebase
112
138
  ask onboard /path/to/repo
113
139
 
114
140
  # PR review: risk, test gaps, changed modules
115
141
  ask review-pr /path/to/repo --since main
142
+
143
+ # CI gate on NEW violations only, instead of on pre-existing debt
144
+ ask verify /path/to/repo --capture-baseline # accept today's debt, once
145
+ ask verify /path/to/repo # then: only new violations block
116
146
  ```
117
147
 
118
- Full command reference: **[docs/USER_GUIDE.md](docs/USER_GUIDE.md)**.
148
+ > **Adopting a gate on a real codebase.** A repository that starts declaring contracts already
149
+ > violates them somewhere; `ask verify` is **baseline-relative by default** (`--fail-on new`)
150
+ > so the gate survives contact with reality instead of being switched off on day one.
151
+ > `ask baseline capture|diff|trend` is a different thing: versioned architectural metrics over
152
+ > time, for trend reporting rather than blocking.
153
+
154
+ Full command reference: **[docs/USER_GUIDE.md](docs/USER_GUIDE.md)** · posture in depth:
155
+ **[docs/posture.md](docs/posture.md)**.
119
156
 
120
157
  ---
121
158
 
@@ -148,6 +185,15 @@ Deterministic Spring semantics: transactional anomalies (e.g. `@Transactional` o
148
185
  `ask spring-audit` · `ask validation`
149
186
  → [reference](docs/USER_GUIDE.md#core-commands)
150
187
 
188
+ ### 5b · Runtime Posture *(experimental — and the most differentiated thing here)*
189
+ What a profile set **actually wires**: which conditional beans register, which do not, and which conditions could not be decided at all — then the effective endpoint access that follows from the filter chain. `--diff` answers the question nobody else answers in one command: *what changes between `dev` and `prod`, across every endpoint at once.*
190
+ `ask posture` · `ask posture --diff dev:prod` · `ask posture --property k=v`
191
+ → [posture.md](docs/posture.md)
192
+
193
+ Unresolved is a first-class outcome: a condition the resolver cannot decide is reported as a
194
+ hole with the condition named, never folded into active or inactive. **A posture answer that
195
+ guesses is a confident security falsehood — the worst failure mode this tool has.**
196
+
151
197
  ### 6 · Developer Workflows
152
198
  The everyday loop: diff-based PR review, symptom-driven bug triage, and delta context for continuous agent runs.
153
199
  `ask review-pr` · `ask fix-bug` · `ask prepare-context`
@@ -159,6 +205,36 @@ The everyday loop: diff-based PR review, symptom-driven bug triage, and delta co
159
205
 
160
206
  ---
161
207
 
208
+ ## Every command, in one table
209
+
210
+ *`ask --help` shows a short header; this is the full surface. If you only read one row, read
211
+ `posture`.*
212
+
213
+ | Command | Answers | Note |
214
+ |---|---|---|
215
+ | `posture` | which beans a profile set wires, and how effective endpoint access differs between two sets | **experimental**, most differentiated |
216
+ | `endpoints` | every REST endpoint, effective path, security policy, confidence | Spring MVC + JAX-RS (~65 % recall on JAX-RS sub-resource locators) |
217
+ | `spring-audit` | transactional anomalies + security surface + validation gaps | `--ci`, `-f github-comment` |
218
+ | `migrate-check` | Boot 2→3 readiness: located blockers, per-dimension score, effort | `--blast-radius` orders the re-test plan |
219
+ | `impact` / `impact-chain` | blast radius of a change, to the endpoints it reaches | target the **interface**, not the `Impl` |
220
+ | `pr-impact` | the same, scoped to a PR diff | gating command: `--fail-on`, exit codes |
221
+ | `verify` | does the repo satisfy its declared contracts, **relative to a baseline** | `.ask/contracts.yml`; exit 0/1/2 |
222
+ | `verify-edit` | did the working-tree edits change runtime behaviour | semantic diff gate for the edit loop |
223
+ | `--compact` / `--agent` | bounded structural context for an agent | `--compact` is the token-cheap one |
224
+ | `onboard` / `explain` / `cold-start` | orientation in an unfamiliar repo; per-class summary; bootstrap snapshot | |
225
+ | `export` / `repo-ir` / `schema` | tool-agnostic views (C4, module graph, integrations); symbol-level IR; published JSON Schemas | |
226
+ | `modernize` | coupling hubs, cycles, dead zones, refactor candidates | |
227
+ | `review-pr` / `fix-bug` / `prepare-context` | diff review, symptom triage, task-shaped context | |
228
+ | `plan` / `compare` / `delta` / `contract-diff` | what to review for a change; candidates by measured cost; outcome of a change; public-contract break | no verdicts, measured cost only |
229
+ | `validation` | request-body validation coverage and gaps | |
230
+ | `baseline capture\|diff\|trend` | versioned architectural metrics over time | trend reporting, not gating |
231
+ | `retrieve` | typed knowledge queries over the model | **experimental** |
232
+ | `archetype` | evidence-based architectural archetype | **experimental** |
233
+ | `rename-class` / `chunk-file` | word-boundary Java rename; split a large file for an agent | |
234
+ | `cache status\|warm\|clear` · `auth` · `telemetry` · `mcp` · `config` · `version` | housekeeping | |
235
+
236
+ ---
237
+
162
238
  ## What it does — and doesn't
163
239
 
164
240
  **ASK Engine reduces exploration cost.** It accelerates context acquisition and computes
@@ -182,6 +258,13 @@ Honest limits worth knowing before you rely on it:
182
258
  > **🎉 Early-adoption: Pro is currently unlocked for everyone.** Every install runs with
183
259
  > full Pro entitlements — no size gate, no key. The tiers below describe the model the
184
260
  > paywall will return to later.
261
+ >
262
+ > **What that means concretely.** `ask auth status` reports `"status": "unauthenticated"`
263
+ > together with `"pro": true`, `"pro_reason": "early-adoption unlock"` — that combination is
264
+ > expected, not a bug: you are unauthenticated *and* unlocked. When the unlock ends, gating
265
+ > returns **by repo size and automation, never by command**: `posture`, `endpoints`,
266
+ > `spring-audit` and `migrate-check` stay in the base tier at full output. Nothing you can run
267
+ > today becomes a paid-only command tomorrow.
185
268
 
186
269
  **Gating is by repo size and automation — never by command.** Every command runs at full
187
270
  power on Free for small and mid-size repos; you upgrade when the work gets bigger or automated.
@@ -209,7 +292,13 @@ ask telemetry disable # anonymous telemetry is on by default (opt-out)
209
292
 
210
293
  Telemetry collects version, OS, commands, flags, duration, repo-size range, and errors —
211
294
  **no source code, paths, secrets, or output**. Disable any time with
212
- `export SOURCECODE_TELEMETRY=0` (or `DO_NOT_TRACK=1`).
295
+ `export SOURCECODE_TELEMETRY=0` (or `DO_NOT_TRACK=1`). It defaults to **off in CI**.
296
+
297
+ > **Auditing someone else's code — regulated, client-owned or public-sector?** Turn it off
298
+ > *before* the first run, not after: `SOURCECODE_TELEMETRY=0 ask …`, or `ask telemetry disable`
299
+ > once (remembered). The default is opt-out today; **moving it to opt-in is on the roadmap**
300
+ > (`docs/DEFECT-LEDGER.md` P-1) precisely because a default you must remember to disable is the
301
+ > wrong default for third-party code.
213
302
 
214
303
  **Custom security annotations.** Teach `endpoints`, `spring-audit`, and `explain` about
215
304
  project-specific authorization annotations via an optional `sourcecode.config.json` at the
@@ -241,3 +330,4 @@ Matching endpoints report `policy: "custom"` and drop out of the `no_security_si
241
330
  | [MANUAL-USUARIO.md](docs/MANUAL-USUARIO.md) | Guía de usuario en español |
242
331
  | [PRODUCT_IDENTITY.md](docs/PRODUCT_IDENTITY.md) | `ask` (command) vs `sourcecode` (package/alias) |
243
332
  | [privacy.md](docs/privacy.md) | Telemetry and data-handling policy |
333
+ | [DEFECT-LEDGER.md](docs/DEFECT-LEDGER.md) | Every defect found in the field, its class, and which release closed it — published on purpose |
@@ -1,4 +1,4 @@
1
- sourcecode/__init__.py,sha256=4hwV87XY8dgmsv4RaWkZzBMSpB_T8EQ4A9_-xB5CzmI,308
1
+ sourcecode/__init__.py,sha256=6x6sVPhgem27mPs9kjwcPvWQE6fXXRuvsi6L96JWOFM,308
2
2
  sourcecode/adaptive_scanner.py,sha256=yJBKjNpkY6bpueYJ2YnRezen3sYZDecEt7WaaNWdqug,9466
3
3
  sourcecode/archetype.py,sha256=qWMCyL2UzSGXJhCIZj38JjS7wI15EE3eILsWiaoCZXQ,35779
4
4
  sourcecode/architectural_baseline.py,sha256=7QzJri4pbL3nzAn9gNutZW6mZR8HHD6H2C2H1EEwYPE,17904
@@ -10,14 +10,14 @@ sourcecode/cache.py,sha256=hv5GTk-RktbediFMgNUMcd4R7NuEg5BOaAzj5ZEoD18,33739
10
10
  sourcecode/call_surface.py,sha256=fiqYfHooxN1fX9oQoysq1LS3LoZcobhyUNjAGEZKpwk,4148
11
11
  sourcecode/caller_metrics.py,sha256=7xJDoar5RHOgDTvaZhML1V5JERJDFc4DA-y_WPKfJCw,3842
12
12
  sourcecode/canonical_ir.py,sha256=LdP_Ri3rl0M5p-MY0ypVvQwhq1WuUF1FmaHid7zyzEg,29807
13
- sourcecode/chain_rules.py,sha256=1kLHv1t7g5rMmycIYSpm3az8SjCr01Xw7LtyV2tNhSA,10666
13
+ sourcecode/chain_rules.py,sha256=Bi6UHfgd-GxWswmnHRcPz5jdbAuqka3Zkz_P-MTvqhw,12767
14
14
  sourcecode/change_plan.py,sha256=MNgNyu4zrLGvBBaXPwyCh-T2ZGaUQX3Hm4W87uuhZ3w,7750
15
15
  sourcecode/cir_graphs.py,sha256=9G0HHj1kw2325IDyzo2OpX73BNswEckecf4MZUXB4JM,12078
16
16
  sourcecode/classifier.py,sha256=JBzPwSSrDG-tUHAbcKB678HRbjLpD-ohzbzzO62mgpo,20114
17
- sourcecode/cli.py,sha256=F7HXBOhTrzLppk81GDazz6sIvowkZomei1MCRXaTutc,400663
17
+ sourcecode/cli.py,sha256=zkgwPCE88xAX5lZaBtNvN-pGYDvU_FzUkOGCuehioIY,403029
18
18
  sourcecode/code_notes_analyzer.py,sha256=EJemNCNc9Dn-1RZYu-aNbK0ELzmsyC4s6FdHi3XyNEI,9392
19
19
  sourcecode/compare.py,sha256=jdePg0dNCxFpysiTGMsROL5XABLjy_zVUgVeySvdb0o,7514
20
- sourcecode/confidence_analyzer.py,sha256=vnbPI-20FnHdjO6STxHW8fbaxmB4A7y58io63ibFZjc,21586
20
+ sourcecode/confidence_analyzer.py,sha256=_nvtwO6RM3k0JMuH5m7DsBxOD0PdxGFS4Bb1fTQ536E,21946
21
21
  sourcecode/constraint_diff.py,sha256=hWIO5vsxvHjsgQx23K3r_JMy1W6wQ2Ca4DqB9R_iMnY,5831
22
22
  sourcecode/context_cache.py,sha256=WwN07VUylo8sRyWIgK7qp1D6uK4ZrR4EkPnyENFKwyU,27101
23
23
  sourcecode/context_graph.py,sha256=i2kOX3XiaCqcR20ojbUnqoX-hJbMyLNYc7rl-n15bwE,46426
@@ -28,7 +28,7 @@ sourcecode/contract_model.py,sha256=nRxJKPMs1VHwFTa8AVXhGmaLjti3Lr2sjHDpWgv1bfE,
28
28
  sourcecode/contract_pipeline.py,sha256=4XE-xhab7ysdExXyUOBl2hAH4MABo7moKnT9V4XcEwQ,30243
29
29
  sourcecode/coverage_parser.py,sha256=X9scuUWxacahYTrTBGea2Ku-sf-WCVcnc9OEB35_3IU,19340
30
30
  sourcecode/dependency_analyzer.py,sha256=fQCaWQ7_BNcVgZv8gweJCwJ1CGlXsz8nw_tqN3aHJNE,63952
31
- sourcecode/deployment_prefix.py,sha256=liaruxpoL-8mfHHZhACZrSe5L2K7Vn9Jwu4k3cZ8oXI,8637
31
+ sourcecode/deployment_prefix.py,sha256=g0_4bE_m9svjhnapRpOp8BJkj6Ul94Ij_iVezygMZ0I,11956
32
32
  sourcecode/doc_analyzer.py,sha256=05bjTUbDbmnbajD_cgRnACzS8T7xxBKVX4CjkJlhZg8,24411
33
33
  sourcecode/dynamic_argument_surface.py,sha256=iRzrJhs57UXrGvLhNPiTA-e_sdO6ka-wNqc0wIiegiM,2554
34
34
  sourcecode/endpoint_literals.py,sha256=Qf4gTZzvNSFDGDuOvF0YRL9NvaYKKj24klhR5LIOaXc,3263
@@ -52,7 +52,7 @@ sourcecode/integration_coordinates.py,sha256=7vGFxN4tCn_KTisYFJuixa8XkyHBoasEFB3
52
52
  sourcecode/jdk_exports.py,sha256=fCrlwNAXUT9gge_joq6kMnY3zJxYB2pxqy-0w3o3MJI,874
53
53
  sourcecode/license.py,sha256=keFuwNxdAtvK2Ds91Wl79GMYxuxWYnN5Wbw1qBpaoUI,24896
54
54
  sourcecode/mcp_nudge.py,sha256=lKemOqK_wny2u7Ymcr2Idi5Kx8pXY02jCi-_nJYLGMg,2992
55
- sourcecode/metrics_analyzer.py,sha256=m0ENgtqKeBL17kUIK3fmGkgo7UfXBNHxCMj0H_Y5K7c,22750
55
+ sourcecode/metrics_analyzer.py,sha256=gLoRWKygF18jLgwsqmGXSWopw-f5iO1VbM7Jjdif6ag,22809
56
56
  sourcecode/migrate_check.py,sha256=TJvaShbglENOr8ikvCodnlXQy54TtT05N2ZVe02b3lc,110421
57
57
  sourcecode/migration_blast.py,sha256=5qUsUi4n0cwBKltdJYyvyfhBkGENAYjB-d_7LZtnVks,9282
58
58
  sourcecode/openapi_surface.py,sha256=BTt0K-woZbkbWTN77IkqeBm_Okag9owR0848fmot8sk,16207
@@ -60,15 +60,16 @@ sourcecode/output_budget.py,sha256=Js9yUlfQtPhqBl9R6wn_9UHVjjJc3GtLcqyfjf5t50Q,9
60
60
  sourcecode/parse_cache.py,sha256=IIsWhtMYpBLNyRCDVoiVpUZa62QIk1Q1sZBDNG4G4V0,6668
61
61
  sourcecode/path_filters.py,sha256=qPKO7kRmVp2y9zjLNSuAVCbcpZrIInHE4QulLUlzPFI,10412
62
62
  sourcecode/perf.py,sha256=GAcEoouPIlPMCQIcHNToxK6K3WdIR-lj9aFg4prOYJI,9743
63
- sourcecode/posture.py,sha256=bWOIcq702NAwwZDRzhTxwYNz0ULdEqb9VvYf1C2yvV0,33206
63
+ sourcecode/posture.py,sha256=9xM0iZWAPfA5qBP06xxjbwAQq3WzXEYLHftdjwXjsL0,36483
64
64
  sourcecode/pr_comment_renderer.py,sha256=KmcjMruhR44gjzMDJwjBSkWP9QEvh8xWBLyxzxoRbj0,14542
65
65
  sourcecode/pr_impact.py,sha256=eaFgcPMDsjaF8VZvcitFWCPCabMTi-khtGdxpK0wXTQ,22461
66
- sourcecode/prepare_context.py,sha256=-pZdQG4g7v47zQLozsIfMW3YYbA3t5GC--iQOmJAK6Y,229897
66
+ sourcecode/prepare_context.py,sha256=cof5MFCPpbg4YWEghQWbMk3h6Egr7Ntiy2A4dAfkrgc,231349
67
67
  sourcecode/progress.py,sha256=qn30sWaHOkjTgXsSBmiPkz7Rsbwc5oSlIe6JNEMYp_k,3149
68
68
  sourcecode/ranking_engine.py,sha256=ZAucq_YX2KkWUuAZf4P0lhtQ_38vEFnUhuGtSZd1S0E,12970
69
69
  sourcecode/readiness_timeline.py,sha256=T5NKLuRHS83lPslE2kMs_RSVENd8jZJ11N1c9gpkpH8,7244
70
70
  sourcecode/reconciliation.py,sha256=GU-1PTcVr8zcbtC7BASfpHcZndP9AdboXPNQiBc0fzo,34251
71
71
  sourcecode/redactor.py,sha256=SB4hwIvg8h-hvcqKcDWaZvA-aSyn-at-BIRwa0tUv5E,3227
72
+ sourcecode/reference_facts.py,sha256=Ns495c6eTmq2SrqPkcUrJUJru4_wj_yRWm4YDeJwves,13440
72
73
  sourcecode/relevance_scorer.py,sha256=0AgEt4KrV73nioMqBgjhGjtY7L2C7L7cSyKtj3IKcrw,9408
73
74
  sourcecode/rename_refactor.py,sha256=h6dNFlB9aZ_3q6heeHBkgXQeXaT03nvPSsYH6P8qxFg,12965
74
75
  sourcecode/repo_classifier.py,sha256=FG1vaWKdWXsWdl-S8hjVMiTqcwgaRXkDyvK4rPcOGtQ,22681
@@ -83,17 +84,18 @@ sourcecode/semantic_analyzer.py,sha256=bpgdC6m0_ftVtRf3rSdwhbhWjnZnGxRXaZVcfe4Bb
83
84
  sourcecode/semantic_impact_engine.py,sha256=t09IirGC3JjQDy33JZd1_WKzQVKXkoNl3-XEUr5kjis,20563
84
85
  sourcecode/semantic_integration_engine.py,sha256=7a0WqAInOv39f0Yr_94TYo_JP_8QpeI9KGaknpzAyQU,18899
85
86
  sourcecode/semantic_services.py,sha256=nbUuPv-F01USTt_9CHT8iy_ucCIw3fz4W3Aquea_pd4,10782
86
- sourcecode/serializer.py,sha256=BAGL2J3G3bHvJS60OcxekPvTJg8x6b1LzeLKFbGaots,131497
87
+ sourcecode/serializer.py,sha256=-axoHfVW3H2oE27fDWLxUqohypFVQljLnoOPHBaaq9w,133246
87
88
  sourcecode/spring_event_topology.py,sha256=5_ON_21Le5zbG-1GRc5GLIi5HJfy_QjcXLVPC5WeUGQ,18055
88
89
  sourcecode/spring_findings.py,sha256=ICcR2qEZgYzWypZzsoaEmVeMYZ0YkuZ8AvTwA-rcVOs,7604
89
90
  sourcecode/spring_impact.py,sha256=Cm2KZplpQHjdjUC8jPX1SNnLHxOdM3HsUBNFGwgTP18,80145
90
91
  sourcecode/spring_model.py,sha256=zOAgFmrRbG4a6KLm1TJl55aWMyPNsz3OS3FSczqPG6A,16594
91
- sourcecode/spring_profiles.py,sha256=YPgBH3RuML-mtid7YwUMfA9sfSXPZwknYL7UvRMoYbE,7946
92
+ sourcecode/spring_profiles.py,sha256=A6lYmqPFrp9GqDgaI0aFJILLwW4KDKg5WKZHEGUmRfg,11458
92
93
  sourcecode/spring_properties.py,sha256=bQSOVrtj7YENsCjMQTTlVh-Gm_K0n0DdWzjPRUP38C4,8394
93
94
  sourcecode/spring_security_audit.py,sha256=FteXv5GH-iE07GLEqPpoX7sVXf_dxRns8zxh9_m6By0,23015
94
95
  sourcecode/spring_semantic.py,sha256=UrmLg_4gmBVmMqvSnUMgSReVEERVGv3X7LYDBEs6k_o,16598
95
96
  sourcecode/spring_tx_analyzer.py,sha256=lp0h5Pzzd3fPxHAAagMmG8PqR1-v2uVpFIG1o7tCWQs,41148
96
97
  sourcecode/summarizer.py,sha256=sr0-tfecFKCr-fSkPPWbl-t9HC7SY2ZxkjnnXX8DB2A,26621
98
+ sourcecode/test_sources.py,sha256=2O7LXF-M-CQ0DwEF3B7BfWE6IWmHJngSOES5aRz6WR4,6205
97
99
  sourcecode/token_estimate.py,sha256=ZP3C54aQLExuf32Yvrjok2TAS2oSSyNVRA_HjhsD6Eg,7165
98
100
  sourcecode/tree_utils.py,sha256=8GAkIfQAsvtEudIeW1l4ooH_oRtrWR8cpJQJsEa_Pfw,2093
99
101
  sourcecode/type_usage_surface.py,sha256=51IrKRQoIoRnlsiDjHnqpJBn2rc6E59aRhgS0HTzAF0,4428
@@ -125,11 +127,13 @@ sourcecode/detectors/rust.py,sha256=Tij1vz8BFZ332GEvVkL6vyMli2OMHJfHyDAppWfe66c,
125
127
  sourcecode/detectors/systems.py,sha256=nYaKbGDFu0EOXFcd_1doWFT3tTUdkbxc2DjHUF5TcqQ,1627
126
128
  sourcecode/detectors/terraform.py,sha256=cxORPR_zVLOJpHlh4e9JnFpkQsn_UnqMMom5yG65hZ4,1693
127
129
  sourcecode/detectors/tooling.py,sha256=8CKbtxwQoABP-WyBRNmdAmHDOvAH57AR1cF4UKuWEdQ,2074
130
+ sourcecode/facts/__init__.py,sha256=JpMjDb7BSaM1a9UQU91YYKr2HJ5tOOuNRCIeQwN8_2o,2341
131
+ sourcecode/facts/registry.json,sha256=9cfOX_OFMZSExOYcMDVxtGj_AG8nJGC9pqTfKOakoFA,9711
128
132
  sourcecode/mcp/__init__.py,sha256=XU4HfRGbdid8wdUA0x_4f7uKZD1z3mv_XUY_WU_T9Mw,179
129
133
  sourcecode/mcp/orchestrator.py,sha256=diVoQgn24QmgPL3Ev8Sp6hsvh02OqY3MktHXOzrlodo,36525
130
- sourcecode/mcp/registry.py,sha256=1qIcwtl01AGjEM3yMOwYgr_Ck3y-LZeRvh8i70Nhl_w,68258
134
+ sourcecode/mcp/registry.py,sha256=ZaezKqEbRtPto8aBHpP9XsnSkQ-u4fMtDxhwkgl-iuc,68418
131
135
  sourcecode/mcp/runner.py,sha256=RGimCwhLyHxjCvH7q72y12HWEnATXZLC-NBWhkzlu0I,2852
132
- sourcecode/mcp/server.py,sha256=GH7bgJRVVkBJf-orj_Zmn_mEqMENG76-KNREJS7E5FY,65354
136
+ sourcecode/mcp/server.py,sha256=aYCiQj7NiiDpr3rvZAwPeMvNPJf02X4MFxgB-pMkFGg,65514
133
137
  sourcecode/mcp/onboarding/__init__.py,sha256=sj2PWqEBmMc4zBNkomg89WtL0M6S7A9yb7_wAuSWNP4,66
134
138
  sourcecode/mcp/onboarding/applier.py,sha256=Sx9vHTaXr_M1Bs4uMjO7qa_a2_p4J9oz93oJsKQ7ds4,3298
135
139
  sourcecode/mcp/onboarding/backup.py,sha256=ihqGOR8QTX8HASRSEDyfFyXr5bkXrygPHamv4p9KTmk,1452
@@ -160,8 +164,8 @@ sourcecode/telemetry/consent.py,sha256=GuhCiA_x2n3LwGBkZnvyIwtFcf5Zwa8O0DdLqkATI
160
164
  sourcecode/telemetry/events.py,sha256=4_yeO58U-Cwc1Qb27VB0_EjhmroY0k91n3_VGxeALB8,2776
161
165
  sourcecode/telemetry/filters.py,sha256=RzxauTz8HliO4BllQnXEXc7zTeqdCZi5MgqGEDuW7OQ,6570
162
166
  sourcecode/telemetry/transport.py,sha256=4gGHsq0WeY9VywEZXA3vUxykfiYnw9uuqfjAAec7F8o,1681
163
- sourcecode-3.2.0.dist-info/METADATA,sha256=O9_rjaiou-XB3P9QZsqnkmS1OAKcBCiEsxJOjjN2D9A,11286
164
- sourcecode-3.2.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
165
- sourcecode-3.2.0.dist-info/entry_points.txt,sha256=-JEAdChrK5We51kZcb7OaDcyil-dHBjBPL-NhuO-QY8,89
166
- sourcecode-3.2.0.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
167
- sourcecode-3.2.0.dist-info/RECORD,,
167
+ sourcecode-3.2.1.dist-info/METADATA,sha256=fbRYK-M6OyhP2q9iWNDm-g0gHclD80KBOE5LWKfYboE,17855
168
+ sourcecode-3.2.1.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
169
+ sourcecode-3.2.1.dist-info/entry_points.txt,sha256=-JEAdChrK5We51kZcb7OaDcyil-dHBjBPL-NhuO-QY8,89
170
+ sourcecode-3.2.1.dist-info/licenses/LICENSE,sha256=7DdHrU9Z_3e7dSvq4ISijZNjnuHo5NIHNiHDouMQ9JU,10491
171
+ sourcecode-3.2.1.dist-info/RECORD,,