sourceverity 1.0.3 → 1.0.5
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.
- package/README.md +91 -3
- package/dist/analysis/arrayBounds.d.ts +4 -0
- package/dist/analysis/arrayBounds.d.ts.map +1 -0
- package/dist/analysis/arrayBounds.js +4 -0
- package/dist/analysis/arrayBounds.js.map +1 -0
- package/dist/analysis/arrayBoundsCore.d.ts +69 -0
- package/dist/analysis/arrayBoundsCore.d.ts.map +1 -0
- package/dist/analysis/arrayBoundsCore.js +957 -0
- package/dist/analysis/arrayBoundsCore.js.map +1 -0
- package/dist/analysis/arrayConstructionBounds.d.ts +14 -0
- package/dist/analysis/arrayConstructionBounds.d.ts.map +1 -0
- package/dist/analysis/arrayConstructionBounds.js +445 -0
- package/dist/analysis/arrayConstructionBounds.js.map +1 -0
- package/dist/analysis/arrayIterationBounds.d.ts +12 -0
- package/dist/analysis/arrayIterationBounds.d.ts.map +1 -0
- package/dist/analysis/arrayIterationBounds.js +578 -0
- package/dist/analysis/arrayIterationBounds.js.map +1 -0
- package/dist/analysis/{controlFlow.d.ts → controlFlowGuards.d.ts} +1 -9
- package/dist/analysis/controlFlowGuards.d.ts.map +1 -0
- package/dist/analysis/controlFlowGuards.js +119 -0
- package/dist/analysis/controlFlowGuards.js.map +1 -0
- package/dist/analysis/controlFlowTypes.d.ts +5 -0
- package/dist/analysis/controlFlowTypes.d.ts.map +1 -0
- package/dist/analysis/controlFlowTypes.js +2 -0
- package/dist/analysis/controlFlowTypes.js.map +1 -0
- package/dist/analysis/frameworks.d.ts.map +1 -1
- package/dist/analysis/frameworks.js +11 -23
- package/dist/analysis/frameworks.js.map +1 -1
- package/dist/analysis/functions.d.ts.map +1 -1
- package/dist/analysis/functions.js +70 -30
- package/dist/analysis/functions.js.map +1 -1
- package/dist/analysis/nonNullGuards.d.ts +7 -0
- package/dist/analysis/nonNullGuards.d.ts.map +1 -0
- package/dist/analysis/nonNullGuards.js +409 -0
- package/dist/analysis/nonNullGuards.js.map +1 -0
- package/dist/analysis/promiseFlow.d.ts +5 -0
- package/dist/analysis/promiseFlow.d.ts.map +1 -1
- package/dist/analysis/promiseFlow.js +331 -1
- package/dist/analysis/promiseFlow.js.map +1 -1
- package/dist/analysis/reactStateBounds.d.ts +8 -0
- package/dist/analysis/reactStateBounds.d.ts.map +1 -0
- package/dist/analysis/reactStateBounds.js +390 -0
- package/dist/analysis/reactStateBounds.js.map +1 -0
- package/dist/analysis/values.d.ts.map +1 -1
- package/dist/analysis/values.js +3 -0
- package/dist/analysis/values.js.map +1 -1
- package/dist/baseline/manager.d.ts +2 -0
- package/dist/baseline/manager.d.ts.map +1 -1
- package/dist/baseline/manager.js +45 -18
- package/dist/baseline/manager.js.map +1 -1
- package/dist/cli/help.js +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +22 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/core/config.d.ts +7 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +42 -0
- package/dist/core/config.js.map +1 -0
- package/dist/engine/runner.js +1 -1
- package/dist/engine/runner.js.map +1 -1
- package/dist/engine/symbols.d.ts +0 -1
- package/dist/engine/symbols.d.ts.map +1 -1
- package/dist/engine/symbols.js +2 -12
- package/dist/engine/symbols.js.map +1 -1
- package/dist/repository/detector.d.ts.map +1 -1
- package/dist/repository/detector.js +31 -11
- package/dist/repository/detector.js.map +1 -1
- package/dist/rules/async/floatingPromise.d.ts.map +1 -1
- package/dist/rules/async/floatingPromise.js +23 -3
- package/dist/rules/async/floatingPromise.js.map +1 -1
- package/dist/rules/network/fetchStatusUnchecked.js +1 -1
- package/dist/rules/network/fetchStatusUnchecked.js.map +1 -1
- package/dist/rules/react/derivedStateEffect.d.ts.map +1 -1
- package/dist/rules/react/derivedStateEffect.js +60 -5
- package/dist/rules/react/derivedStateEffect.js.map +1 -1
- package/dist/rules/typescript/nonNullAssertionRisk.js +1 -1
- package/dist/rules/typescript/nonNullAssertionRisk.js.map +1 -1
- package/package.json +1 -1
- package/dist/analysis/controlFlow.d.ts.map +0 -1
- package/dist/analysis/controlFlow.js +0 -2592
- package/dist/analysis/controlFlow.js.map +0 -1
package/README.md
CHANGED
|
@@ -65,8 +65,56 @@ npx sourceverity scan . --format agent
|
|
|
65
65
|
npx sourceverity scan . --format sarif
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
+
|
|
69
|
+
### Confidence and CI Policy
|
|
70
|
+
|
|
71
|
+
Severity describes the impact if a finding is real. Confidence describes how strongly SourceVerity can establish the condition from source and type information.
|
|
72
|
+
|
|
73
|
+
| Confidence | Meaning |
|
|
74
|
+
| ---------- | ------- |
|
|
75
|
+
| High | A resolved API, type, or local control-flow proof establishes the condition. |
|
|
76
|
+
| Medium | The operation is unconsumed or potentially risky, but an implementation or rejection path cannot be proven. |
|
|
77
|
+
| Low | Evidence is incomplete. Use this level for review, not as a CI gate. |
|
|
78
|
+
|
|
79
|
+
`--min-confidence` filters findings before output and baseline comparison. Its default is `medium`. `--fail-on` controls the process result independently: `error` is the default, `warning` fails on either warnings or errors, and `never` always exits successfully.
|
|
80
|
+
|
|
81
|
+
For CI, begin with high-confidence findings:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npx sourceverity scan . --min-confidence high --fail-on error
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Configuration
|
|
88
|
+
|
|
89
|
+
`--config` accepts a JSON file for `scan` and `baseline` commands. The path is resolved from the current working directory. Configuration is data-only; unknown fields and invalid values are rejected.
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"ignore": [
|
|
94
|
+
"generated/**",
|
|
95
|
+
"vendor/**"
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
`ignore` contains repository-relative ignore patterns. These patterns are applied in addition to SourceVerity's built-in ignores and the target repository's root `.gitignore`.
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npx sourceverity scan . --config sourceverity.json
|
|
104
|
+
npx sourceverity baseline create . --config sourceverity.json
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Diagnostic Compatibility
|
|
108
|
+
|
|
109
|
+
Rule IDs are stable baseline and suppression keys. A rule ID changes only for an intentional breaking change.
|
|
110
|
+
|
|
111
|
+
Finding fingerprints are stability-sensitive. A behavior-preserving refactor must not change them; a semantic change may change them when the reported source identity or proof changes. Severity and confidence changes require regression coverage because they can alter CI behavior.
|
|
112
|
+
|
|
113
|
+
JSON, agent, and SARIF outputs are machine interfaces. New fields may be added, but existing schema fields retain their meaning within a major version.
|
|
114
|
+
|
|
68
115
|
---
|
|
69
116
|
|
|
117
|
+
|
|
70
118
|
## Using SourceVerity with Coding Agents
|
|
71
119
|
|
|
72
120
|
SourceVerity's `agent` format provides structured, deterministic diagnostics optimized for coding assistants like Codex.
|
|
@@ -122,8 +170,8 @@ When adopting SourceVerity on an existing codebase with existing findings, gener
|
|
|
122
170
|
# Create or update baseline
|
|
123
171
|
npx sourceverity baseline create
|
|
124
172
|
|
|
125
|
-
# Run scan checking only
|
|
126
|
-
npx sourceverity
|
|
173
|
+
# Run a scan checking only findings absent from the baseline
|
|
174
|
+
npx sourceverity baseline check .
|
|
127
175
|
```
|
|
128
176
|
|
|
129
177
|
---
|
|
@@ -139,7 +187,7 @@ const user = JSON.parse(payload) as User;
|
|
|
139
187
|
|
|
140
188
|
---
|
|
141
189
|
|
|
142
|
-
##
|
|
190
|
+
## Built-in Rule Set
|
|
143
191
|
|
|
144
192
|
| Rule ID | Category | Default Severity | Confidence | Description |
|
|
145
193
|
| ------- | -------- | ---------------- | ---------- | ----------- |
|
|
@@ -173,8 +221,48 @@ const result = await scanRepository({
|
|
|
173
221
|
console.log(`Found ${result.findings.length} findings across ${result.summary.filesAnalyzed} files.`);
|
|
174
222
|
```
|
|
175
223
|
|
|
224
|
+
|
|
225
|
+
## Limits and Safety
|
|
226
|
+
|
|
227
|
+
SourceVerity is a static analyzer. It does not execute analyzed source, import target modules, run package scripts, or install dependencies. It uses the TypeScript installation supplied by the repository when one is available.
|
|
228
|
+
|
|
229
|
+
Dynamic dispatch, external callbacks, reflection, runtime-generated values, and unavailable package implementations remain unknown. SourceVerity reports these paths as advisories when useful; it does not present them as compiler errors or proven runtime failures.
|
|
230
|
+
|
|
231
|
+
Workspace discovery stays within the requested repository root, including after canonical path resolution. A workspace declaration cannot expand the scan into a parent or symlinked external directory.
|
|
232
|
+
|
|
233
|
+
## CI, Verification, and Benchmarks
|
|
234
|
+
|
|
235
|
+
The repository verification gate is:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
npm run verify
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
It runs the strict typecheck, build, test suite, package validation, and clean-consumer smoke test.
|
|
242
|
+
|
|
243
|
+
Measure semantic-audit scaling with:
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
npm run benchmark
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
The benchmark creates 100-, 1,000-, and 10,000-file TypeScript fixtures, performs one warmup scan, then reports five raw latency and RSS-delta samples per size with median and p95 latency. Override the workload when investigating a specific scale:
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
SOURCEVERITY_BENCHMARK_FILES=500,5000 SOURCEVERITY_BENCHMARK_SAMPLES=3 npm run benchmark
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Contributing
|
|
256
|
+
|
|
257
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md) for local setup and the verification gate. Changes to semantic rules require representative true-positive, true-negative, and adversarial coverage.
|
|
258
|
+
|
|
259
|
+
## Security
|
|
260
|
+
|
|
261
|
+
Analyzed repositories are untrusted input. SourceVerity keeps scans read-only, validates data-only configuration strictly, sanitizes terminal-facing output, and avoids expanding workspace paths outside the requested root.
|
|
262
|
+
|
|
176
263
|
---
|
|
177
264
|
|
|
265
|
+
|
|
178
266
|
## Requirements & Engines
|
|
179
267
|
|
|
180
268
|
- Node.js >= 20.12.0
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { hasArrayMutation, hasMutationBeforeNode, isCompleteBoundsExitGuard, isFixedLengthGuardedIndex, isNodeDescendantOf, isParamBoundedCondition, isPositiveBoundsEntryGuard, isStaticArrayLiteralBoundedIndex, normalizeArrayTarget, normalizeIndexExpression, resolveStaticConstArrayLiteral, } from "./arrayBoundsCore.js";
|
|
2
|
+
export { isFindIndexBoundedIndex, isLoopOrCallbackBoundedIndex, } from "./arrayIterationBounds.js";
|
|
3
|
+
export { isConstructedArrayCardinalityBoundedIndex, isSearchProvenanceBoundedIndex, } from "./arrayConstructionBounds.js";
|
|
4
|
+
//# sourceMappingURL=arrayBounds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrayBounds.d.ts","sourceRoot":"","sources":["../../src/analysis/arrayBounds.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACvB,0BAA0B,EAC1B,gCAAgC,EAChC,oBAAoB,EACpB,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,yCAAyC,EACzC,8BAA8B,GAC/B,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { hasArrayMutation, hasMutationBeforeNode, isCompleteBoundsExitGuard, isFixedLengthGuardedIndex, isNodeDescendantOf, isParamBoundedCondition, isPositiveBoundsEntryGuard, isStaticArrayLiteralBoundedIndex, normalizeArrayTarget, normalizeIndexExpression, resolveStaticConstArrayLiteral, } from "./arrayBoundsCore.js";
|
|
2
|
+
export { isFindIndexBoundedIndex, isLoopOrCallbackBoundedIndex, } from "./arrayIterationBounds.js";
|
|
3
|
+
export { isConstructedArrayCardinalityBoundedIndex, isSearchProvenanceBoundedIndex, } from "./arrayConstructionBounds.js";
|
|
4
|
+
//# sourceMappingURL=arrayBounds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrayBounds.js","sourceRoot":"","sources":["../../src/analysis/arrayBounds.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACvB,0BAA0B,EAC1B,gCAAgC,EAChC,oBAAoB,EACpB,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,yCAAyC,EACzC,8BAA8B,GAC/B,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type * as tsType from "typescript";
|
|
2
|
+
import type { GuardCheckResult } from "./controlFlowTypes.js";
|
|
3
|
+
declare function isParamBoundedCondition(cond: tsType.Expression, paramName: string, arrayLength: number, ts: typeof tsType, isExitGuard: boolean): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Normalizes an index expression to an identifier base + integer offset.
|
|
6
|
+
* e.g. `idx` -> { baseText: "idx", offset: 0 }
|
|
7
|
+
* e.g. `idx + 1` -> { baseText: "idx", offset: 1 }
|
|
8
|
+
* e.g. `idx - 1` -> { baseText: "idx", offset: -1 }
|
|
9
|
+
*/
|
|
10
|
+
interface NormalizedIndex {
|
|
11
|
+
readonly baseText: string;
|
|
12
|
+
readonly baseSymbol?: tsType.Symbol | undefined;
|
|
13
|
+
readonly offset: number;
|
|
14
|
+
}
|
|
15
|
+
declare function normalizeIndexExpression(expr: tsType.Expression, ts: typeof tsType, checker?: tsType.TypeChecker | undefined): NormalizedIndex | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Normalizes an array target expression (identifier or property access).
|
|
18
|
+
*/
|
|
19
|
+
interface NormalizedArray {
|
|
20
|
+
readonly text: string;
|
|
21
|
+
readonly symbol?: tsType.Symbol | undefined;
|
|
22
|
+
}
|
|
23
|
+
declare function arraysMatch(a: NormalizedArray | undefined, b: NormalizedArray | undefined): boolean;
|
|
24
|
+
declare function isNodeDescendantOf(child: tsType.Node, parent: tsType.Node): boolean;
|
|
25
|
+
declare function normalizeArrayTarget(expr: tsType.Expression, ts: typeof tsType, checker?: tsType.TypeChecker | undefined): NormalizedArray | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Checks if a binary condition expression guards an index lower bound (e.g. index === -1 or index < 0).
|
|
28
|
+
*/
|
|
29
|
+
declare function isLowerBoundNegativeGuard(cond: tsType.Expression, indexInfo: NormalizedIndex, ts: typeof tsType, checker?: tsType.TypeChecker | undefined): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Checks if an expression represents `array.length` or `array.length - K`.
|
|
32
|
+
*/
|
|
33
|
+
declare function parseArrayLengthOffset(expr: tsType.Expression, arrayInfo: NormalizedArray | readonly NormalizedArray[], ts: typeof tsType, checker?: tsType.TypeChecker | undefined): number | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Checks if an exit condition contains both a lower-bound check and an upper-bound check.
|
|
36
|
+
*/
|
|
37
|
+
declare function isCompleteBoundsExitGuard(cond: tsType.Expression, indexInfo: NormalizedIndex, arrayInfo: NormalizedArray, ts: typeof tsType, checker?: tsType.TypeChecker | undefined): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Checks if an entry condition contains both a lower-bound non-negative check and an upper-bound check against array.length.
|
|
40
|
+
* e.g. `if (i >= 0 && i < array.length - 1)`
|
|
41
|
+
*/
|
|
42
|
+
declare function isPositiveBoundsEntryGuard(cond: tsType.Expression, indexInfo: NormalizedIndex, arrayInfo: NormalizedArray, ts: typeof tsType): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Checks if an array target is a static, non-empty const array initialized with an array literal.
|
|
45
|
+
*/
|
|
46
|
+
declare function resolveStaticConstArrayLiteral(arrayExpr: tsType.Expression, ts: typeof tsType, checker?: tsType.TypeChecker | undefined): {
|
|
47
|
+
elements: readonly tsType.Expression[];
|
|
48
|
+
length: number;
|
|
49
|
+
name: string;
|
|
50
|
+
} | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Checks if a static array access has a literal integer index guaranteed to be in-bounds.
|
|
53
|
+
*/
|
|
54
|
+
declare function isStaticArrayLiteralBoundedIndex(operand: tsType.ElementAccessExpression, ts: typeof tsType, checker?: tsType.TypeChecker | undefined): GuardCheckResult | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* Checks if a literal index access is proven in-bounds by a dominating fixed-length equality or comparison guard.
|
|
57
|
+
* e.g. `if (arr.length === 2) arr[0]!` or `if (arr.length >= 2) arr[1]!`
|
|
58
|
+
*/
|
|
59
|
+
declare function isFixedLengthGuardedIndex(node: tsType.NonNullExpression, operand: tsType.ElementAccessExpression, ts: typeof tsType, checker?: tsType.TypeChecker | undefined): GuardCheckResult | undefined;
|
|
60
|
+
export { containsControlFlowExit, countUnconditionalPushes, hasArrayMutation, hasMutationBeforeNode, isLowerBoundNegativeGuard, arraysMatch, isCompleteBoundsExitGuard, isFixedLengthGuardedIndex, isNodeDescendantOf, isParamBoundedCondition, isPositiveBoundsEntryGuard, isStaticArrayLiteralBoundedIndex, normalizeArrayTarget, normalizeIndexExpression, resolveStaticConstArrayLiteral, parseArrayLengthOffset, };
|
|
61
|
+
export type { NormalizedArray };
|
|
62
|
+
/**
|
|
63
|
+
* Checks if a node or its subtrees contain mutating operations on the given array text/symbol.
|
|
64
|
+
*/
|
|
65
|
+
declare function hasArrayMutation(node: tsType.Node, arrayText: string, ts: typeof tsType, checker?: tsType.TypeChecker | undefined, arraySymbol?: tsType.Symbol | undefined): boolean;
|
|
66
|
+
declare function containsControlFlowExit(body: tsType.Node, ts: typeof tsType): boolean;
|
|
67
|
+
declare function countUnconditionalPushes(body: tsType.Node, arrayText: string, ts: typeof tsType, checker?: tsType.TypeChecker | undefined, arraySymbol?: tsType.Symbol | undefined): number;
|
|
68
|
+
declare function hasMutationBeforeNode(statementNode: tsType.Node, targetNode: tsType.Node, arrayText: string, ts: typeof tsType, checker?: tsType.TypeChecker | undefined, arraySymbol?: tsType.Symbol | undefined): boolean;
|
|
69
|
+
//# sourceMappingURL=arrayBoundsCore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrayBoundsCore.d.ts","sourceRoot":"","sources":["../../src/analysis/arrayBoundsCore.ts"],"names":[],"mappings":"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"}
|