sourceverity 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +91 -3
  2. package/dist/analysis/arrayBounds.d.ts +4 -0
  3. package/dist/analysis/arrayBounds.d.ts.map +1 -0
  4. package/dist/analysis/arrayBounds.js +4 -0
  5. package/dist/analysis/arrayBounds.js.map +1 -0
  6. package/dist/analysis/arrayBoundsCore.d.ts +69 -0
  7. package/dist/analysis/arrayBoundsCore.d.ts.map +1 -0
  8. package/dist/analysis/arrayBoundsCore.js +863 -0
  9. package/dist/analysis/arrayBoundsCore.js.map +1 -0
  10. package/dist/analysis/arrayConstructionBounds.d.ts +14 -0
  11. package/dist/analysis/arrayConstructionBounds.d.ts.map +1 -0
  12. package/dist/analysis/arrayConstructionBounds.js +445 -0
  13. package/dist/analysis/arrayConstructionBounds.js.map +1 -0
  14. package/dist/analysis/arrayIterationBounds.d.ts +12 -0
  15. package/dist/analysis/arrayIterationBounds.d.ts.map +1 -0
  16. package/dist/analysis/arrayIterationBounds.js +578 -0
  17. package/dist/analysis/arrayIterationBounds.js.map +1 -0
  18. package/dist/analysis/controlFlowGuards.d.ts +7 -0
  19. package/dist/analysis/controlFlowGuards.d.ts.map +1 -0
  20. package/dist/analysis/controlFlowGuards.js +119 -0
  21. package/dist/analysis/controlFlowGuards.js.map +1 -0
  22. package/dist/analysis/controlFlowTypes.d.ts +5 -0
  23. package/dist/analysis/controlFlowTypes.d.ts.map +1 -0
  24. package/dist/analysis/controlFlowTypes.js +2 -0
  25. package/dist/analysis/controlFlowTypes.js.map +1 -0
  26. package/dist/analysis/frameworks.d.ts.map +1 -1
  27. package/dist/analysis/frameworks.js +95 -35
  28. package/dist/analysis/frameworks.js.map +1 -1
  29. package/dist/analysis/functions.d.ts.map +1 -1
  30. package/dist/analysis/functions.js +120 -36
  31. package/dist/analysis/functions.js.map +1 -1
  32. package/dist/analysis/{controlFlow.d.ts → nonNullGuards.d.ts} +2 -5
  33. package/dist/analysis/nonNullGuards.d.ts.map +1 -0
  34. package/dist/analysis/nonNullGuards.js +340 -0
  35. package/dist/analysis/nonNullGuards.js.map +1 -0
  36. package/dist/analysis/promiseFlow.d.ts.map +1 -1
  37. package/dist/analysis/promiseFlow.js +85 -11
  38. package/dist/analysis/promiseFlow.js.map +1 -1
  39. package/dist/analysis/reactStateBounds.d.ts +8 -0
  40. package/dist/analysis/reactStateBounds.d.ts.map +1 -0
  41. package/dist/analysis/reactStateBounds.js +390 -0
  42. package/dist/analysis/reactStateBounds.js.map +1 -0
  43. package/dist/baseline/manager.js +1 -1
  44. package/dist/baseline/manager.js.map +1 -1
  45. package/dist/baseline/types.d.ts +1 -1
  46. package/dist/baseline/types.d.ts.map +1 -1
  47. package/dist/cli/help.js +1 -1
  48. package/dist/cli/main.d.ts.map +1 -1
  49. package/dist/cli/main.js +24 -2
  50. package/dist/cli/main.js.map +1 -1
  51. package/dist/core/config.d.ts +7 -0
  52. package/dist/core/config.d.ts.map +1 -0
  53. package/dist/core/config.js +42 -0
  54. package/dist/core/config.js.map +1 -0
  55. package/dist/core/paths.d.ts +0 -4
  56. package/dist/core/paths.d.ts.map +1 -1
  57. package/dist/core/paths.js +0 -6
  58. package/dist/core/paths.js.map +1 -1
  59. package/dist/engine/runner.d.ts +6 -1
  60. package/dist/engine/runner.d.ts.map +1 -1
  61. package/dist/engine/runner.js +38 -21
  62. package/dist/engine/runner.js.map +1 -1
  63. package/dist/engine/symbols.d.ts +17 -5
  64. package/dist/engine/symbols.d.ts.map +1 -1
  65. package/dist/engine/symbols.js +269 -46
  66. package/dist/engine/symbols.js.map +1 -1
  67. package/dist/reporters/sarif.d.ts +2 -0
  68. package/dist/reporters/sarif.d.ts.map +1 -1
  69. package/dist/reporters/sarif.js +36 -7
  70. package/dist/reporters/sarif.js.map +1 -1
  71. package/dist/repository/detector.d.ts.map +1 -1
  72. package/dist/repository/detector.js +31 -11
  73. package/dist/repository/detector.js.map +1 -1
  74. package/dist/rules/async/floatingPromise.d.ts.map +1 -1
  75. package/dist/rules/async/floatingPromise.js +24 -2
  76. package/dist/rules/async/floatingPromise.js.map +1 -1
  77. package/dist/rules/browser/eventListenerCleanup.d.ts.map +1 -1
  78. package/dist/rules/browser/eventListenerCleanup.js +2 -9
  79. package/dist/rules/browser/eventListenerCleanup.js.map +1 -1
  80. package/dist/rules/browser/observerCleanup.d.ts.map +1 -1
  81. package/dist/rules/browser/observerCleanup.js +2 -9
  82. package/dist/rules/browser/observerCleanup.js.map +1 -1
  83. package/dist/rules/browser/timerCleanup.d.ts.map +1 -1
  84. package/dist/rules/browser/timerCleanup.js +2 -9
  85. package/dist/rules/browser/timerCleanup.js.map +1 -1
  86. package/dist/rules/network/fetchStatusUnchecked.d.ts.map +1 -1
  87. package/dist/rules/network/fetchStatusUnchecked.js +245 -46
  88. package/dist/rules/network/fetchStatusUnchecked.js.map +1 -1
  89. package/dist/rules/react/asyncEffectCallback.d.ts.map +1 -1
  90. package/dist/rules/react/asyncEffectCallback.js +2 -9
  91. package/dist/rules/react/asyncEffectCallback.js.map +1 -1
  92. package/dist/rules/react/derivedStateEffect.d.ts.map +1 -1
  93. package/dist/rules/react/derivedStateEffect.js +61 -13
  94. package/dist/rules/react/derivedStateEffect.js.map +1 -1
  95. package/dist/rules/react/missingEffectCleanup.d.ts.map +1 -1
  96. package/dist/rules/react/missingEffectCleanup.js +102 -10
  97. package/dist/rules/react/missingEffectCleanup.js.map +1 -1
  98. package/dist/rules/typescript/nonNullAssertionRisk.js +1 -1
  99. package/dist/rules/typescript/nonNullAssertionRisk.js.map +1 -1
  100. package/dist/rules/typescript/uncheckedIndexAccess.d.ts.map +1 -1
  101. package/dist/rules/typescript/uncheckedIndexAccess.js +55 -0
  102. package/dist/rules/typescript/uncheckedIndexAccess.js.map +1 -1
  103. package/dist/rules/typescript/unsafeUnvalidatedAssertion.d.ts.map +1 -1
  104. package/dist/rules/typescript/unsafeUnvalidatedAssertion.js +9 -4
  105. package/dist/rules/typescript/unsafeUnvalidatedAssertion.js.map +1 -1
  106. package/package.json +1 -1
  107. package/dist/analysis/controlFlow.d.ts.map +0 -1
  108. package/dist/analysis/controlFlow.js +0 -2136
  109. 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 new findings against baseline
126
- npx sourceverity scan . --baseline
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
- ## Initial Production Rule Set
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 { 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,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 { 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,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): 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): 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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"}