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.
- sourcecode/__init__.py +1 -1
- sourcecode/chain_rules.py +49 -8
- sourcecode/cli.py +218 -176
- sourcecode/confidence_analyzer.py +10 -6
- sourcecode/deployment_prefix.py +85 -0
- sourcecode/facts/__init__.py +71 -0
- sourcecode/facts/registry.json +158 -0
- sourcecode/mcp/registry.py +1 -1
- sourcecode/mcp/server.py +1 -1
- sourcecode/metrics_analyzer.py +8 -5
- sourcecode/posture.py +78 -6
- sourcecode/prepare_context.py +44 -19
- sourcecode/reference_facts.py +307 -0
- sourcecode/serializer.py +36 -9
- sourcecode/spring_profiles.py +93 -13
- sourcecode/test_sources.py +178 -0
- {sourcecode-3.2.0.dist-info → sourcecode-3.2.1.dist-info}/METADATA +100 -10
- {sourcecode-3.2.0.dist-info → sourcecode-3.2.1.dist-info}/RECORD +21 -17
- {sourcecode-3.2.0.dist-info → sourcecode-3.2.1.dist-info}/WHEEL +0 -0
- {sourcecode-3.2.0.dist-info → sourcecode-3.2.1.dist-info}/entry_points.txt +0 -0
- {sourcecode-3.2.0.dist-info → sourcecode-3.2.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -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.
|
|
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
|
-
#
|
|
100
|
-
|
|
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
|
-
#
|
|
103
|
-
|
|
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
|
|
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
|
-
|
|
109
|
-
|
|
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
|
-
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
164
|
-
sourcecode-3.2.
|
|
165
|
-
sourcecode-3.2.
|
|
166
|
-
sourcecode-3.2.
|
|
167
|
-
sourcecode-3.2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|