sourceverity 1.0.0

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 (192) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +188 -0
  3. package/bin/sourceverity.js +12 -0
  4. package/dist/analysis/controlFlow.d.ts +10 -0
  5. package/dist/analysis/controlFlow.d.ts.map +1 -0
  6. package/dist/analysis/controlFlow.js +278 -0
  7. package/dist/analysis/controlFlow.js.map +1 -0
  8. package/dist/analysis/frameworks.d.ts +11 -0
  9. package/dist/analysis/frameworks.d.ts.map +1 -0
  10. package/dist/analysis/frameworks.js +189 -0
  11. package/dist/analysis/frameworks.js.map +1 -0
  12. package/dist/analysis/functions.d.ts +27 -0
  13. package/dist/analysis/functions.d.ts.map +1 -0
  14. package/dist/analysis/functions.js +628 -0
  15. package/dist/analysis/functions.js.map +1 -0
  16. package/dist/analysis/promiseFlow.d.ts +44 -0
  17. package/dist/analysis/promiseFlow.d.ts.map +1 -0
  18. package/dist/analysis/promiseFlow.js +261 -0
  19. package/dist/analysis/promiseFlow.js.map +1 -0
  20. package/dist/analysis/values.d.ts +24 -0
  21. package/dist/analysis/values.d.ts.map +1 -0
  22. package/dist/analysis/values.js +189 -0
  23. package/dist/analysis/values.js.map +1 -0
  24. package/dist/baseline/manager.d.ts +20 -0
  25. package/dist/baseline/manager.d.ts.map +1 -0
  26. package/dist/baseline/manager.js +77 -0
  27. package/dist/baseline/manager.js.map +1 -0
  28. package/dist/baseline/types.d.ts +20 -0
  29. package/dist/baseline/types.d.ts.map +1 -0
  30. package/dist/baseline/types.js +2 -0
  31. package/dist/baseline/types.js.map +1 -0
  32. package/dist/cli/args.d.ts +26 -0
  33. package/dist/cli/args.d.ts.map +1 -0
  34. package/dist/cli/args.js +126 -0
  35. package/dist/cli/args.js.map +1 -0
  36. package/dist/cli/exitCodes.d.ts +8 -0
  37. package/dist/cli/exitCodes.d.ts.map +1 -0
  38. package/dist/cli/exitCodes.js +7 -0
  39. package/dist/cli/exitCodes.js.map +1 -0
  40. package/dist/cli/help.d.ts +5 -0
  41. package/dist/cli/help.d.ts.map +1 -0
  42. package/dist/cli/help.js +46 -0
  43. package/dist/cli/help.js.map +1 -0
  44. package/dist/cli/main.d.ts +7 -0
  45. package/dist/cli/main.d.ts.map +1 -0
  46. package/dist/cli/main.js +156 -0
  47. package/dist/cli/main.js.map +1 -0
  48. package/dist/core/fingerprint.d.ts +18 -0
  49. package/dist/core/fingerprint.d.ts.map +1 -0
  50. package/dist/core/fingerprint.js +26 -0
  51. package/dist/core/fingerprint.js.map +1 -0
  52. package/dist/core/paths.d.ts +10 -0
  53. package/dist/core/paths.d.ts.map +1 -0
  54. package/dist/core/paths.js +30 -0
  55. package/dist/core/paths.js.map +1 -0
  56. package/dist/core/suppressions.d.ts +24 -0
  57. package/dist/core/suppressions.d.ts.map +1 -0
  58. package/dist/core/suppressions.js +100 -0
  59. package/dist/core/suppressions.js.map +1 -0
  60. package/dist/core/terminal.d.ts +18 -0
  61. package/dist/core/terminal.d.ts.map +1 -0
  62. package/dist/core/terminal.js +39 -0
  63. package/dist/core/terminal.js.map +1 -0
  64. package/dist/core/types.d.ts +119 -0
  65. package/dist/core/types.d.ts.map +1 -0
  66. package/dist/core/types.js +2 -0
  67. package/dist/core/types.js.map +1 -0
  68. package/dist/engine/context.d.ts +16 -0
  69. package/dist/engine/context.d.ts.map +1 -0
  70. package/dist/engine/context.js +57 -0
  71. package/dist/engine/context.js.map +1 -0
  72. package/dist/engine/registry.d.ts +26 -0
  73. package/dist/engine/registry.d.ts.map +1 -0
  74. package/dist/engine/registry.js +38 -0
  75. package/dist/engine/registry.js.map +1 -0
  76. package/dist/engine/runner.d.ts +14 -0
  77. package/dist/engine/runner.d.ts.map +1 -0
  78. package/dist/engine/runner.js +166 -0
  79. package/dist/engine/runner.js.map +1 -0
  80. package/dist/engine/symbols.d.ts +46 -0
  81. package/dist/engine/symbols.d.ts.map +1 -0
  82. package/dist/engine/symbols.js +278 -0
  83. package/dist/engine/symbols.js.map +1 -0
  84. package/dist/index.d.ts +20 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +32 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/reporters/agent.d.ts +45 -0
  89. package/dist/reporters/agent.d.ts.map +1 -0
  90. package/dist/reporters/agent.js +40 -0
  91. package/dist/reporters/agent.js.map +1 -0
  92. package/dist/reporters/json.d.ts +6 -0
  93. package/dist/reporters/json.d.ts.map +1 -0
  94. package/dist/reporters/json.js +7 -0
  95. package/dist/reporters/json.js.map +1 -0
  96. package/dist/reporters/sarif.d.ts +6 -0
  97. package/dist/reporters/sarif.d.ts.map +1 -0
  98. package/dist/reporters/sarif.js +60 -0
  99. package/dist/reporters/sarif.js.map +1 -0
  100. package/dist/reporters/terminal.d.ts +10 -0
  101. package/dist/reporters/terminal.d.ts.map +1 -0
  102. package/dist/reporters/terminal.js +105 -0
  103. package/dist/reporters/terminal.js.map +1 -0
  104. package/dist/repository/detector.d.ts +6 -0
  105. package/dist/repository/detector.d.ts.map +1 -0
  106. package/dist/repository/detector.js +231 -0
  107. package/dist/repository/detector.js.map +1 -0
  108. package/dist/repository/fileFilter.d.ts +10 -0
  109. package/dist/repository/fileFilter.d.ts.map +1 -0
  110. package/dist/repository/fileFilter.js +78 -0
  111. package/dist/repository/fileFilter.js.map +1 -0
  112. package/dist/repository/git.d.ts +7 -0
  113. package/dist/repository/git.d.ts.map +1 -0
  114. package/dist/repository/git.js +53 -0
  115. package/dist/repository/git.js.map +1 -0
  116. package/dist/repository/tsLoader.d.ts +15 -0
  117. package/dist/repository/tsLoader.d.ts.map +1 -0
  118. package/dist/repository/tsLoader.js +27 -0
  119. package/dist/repository/tsLoader.js.map +1 -0
  120. package/dist/repository/types.d.ts +38 -0
  121. package/dist/repository/types.d.ts.map +1 -0
  122. package/dist/repository/types.js +2 -0
  123. package/dist/repository/types.js.map +1 -0
  124. package/dist/rules/async/asyncForeach.d.ts +3 -0
  125. package/dist/rules/async/asyncForeach.d.ts.map +1 -0
  126. package/dist/rules/async/asyncForeach.js +76 -0
  127. package/dist/rules/async/asyncForeach.js.map +1 -0
  128. package/dist/rules/async/floatingPromise.d.ts +3 -0
  129. package/dist/rules/async/floatingPromise.d.ts.map +1 -0
  130. package/dist/rules/async/floatingPromise.js +359 -0
  131. package/dist/rules/async/floatingPromise.js.map +1 -0
  132. package/dist/rules/browser/eventListenerCleanup.d.ts +3 -0
  133. package/dist/rules/browser/eventListenerCleanup.d.ts.map +1 -0
  134. package/dist/rules/browser/eventListenerCleanup.js +378 -0
  135. package/dist/rules/browser/eventListenerCleanup.js.map +1 -0
  136. package/dist/rules/browser/observerCleanup.d.ts +3 -0
  137. package/dist/rules/browser/observerCleanup.d.ts.map +1 -0
  138. package/dist/rules/browser/observerCleanup.js +184 -0
  139. package/dist/rules/browser/observerCleanup.js.map +1 -0
  140. package/dist/rules/browser/timerCleanup.d.ts +3 -0
  141. package/dist/rules/browser/timerCleanup.d.ts.map +1 -0
  142. package/dist/rules/browser/timerCleanup.js +115 -0
  143. package/dist/rules/browser/timerCleanup.js.map +1 -0
  144. package/dist/rules/index.d.ts +19 -0
  145. package/dist/rules/index.d.ts.map +1 -0
  146. package/dist/rules/index.js +41 -0
  147. package/dist/rules/index.js.map +1 -0
  148. package/dist/rules/network/fetchStatusUnchecked.d.ts +3 -0
  149. package/dist/rules/network/fetchStatusUnchecked.d.ts.map +1 -0
  150. package/dist/rules/network/fetchStatusUnchecked.js +96 -0
  151. package/dist/rules/network/fetchStatusUnchecked.js.map +1 -0
  152. package/dist/rules/react/asyncEffectCallback.d.ts +3 -0
  153. package/dist/rules/react/asyncEffectCallback.d.ts.map +1 -0
  154. package/dist/rules/react/asyncEffectCallback.js +62 -0
  155. package/dist/rules/react/asyncEffectCallback.js.map +1 -0
  156. package/dist/rules/react/derivedStateEffect.d.ts +3 -0
  157. package/dist/rules/react/derivedStateEffect.d.ts.map +1 -0
  158. package/dist/rules/react/derivedStateEffect.js +172 -0
  159. package/dist/rules/react/derivedStateEffect.js.map +1 -0
  160. package/dist/rules/react/missingEffectCleanup.d.ts +3 -0
  161. package/dist/rules/react/missingEffectCleanup.d.ts.map +1 -0
  162. package/dist/rules/react/missingEffectCleanup.js +86 -0
  163. package/dist/rules/react/missingEffectCleanup.js.map +1 -0
  164. package/dist/rules/typescript/nonNullAssertionRisk.d.ts +3 -0
  165. package/dist/rules/typescript/nonNullAssertionRisk.d.ts.map +1 -0
  166. package/dist/rules/typescript/nonNullAssertionRisk.js +65 -0
  167. package/dist/rules/typescript/nonNullAssertionRisk.js.map +1 -0
  168. package/dist/rules/typescript/uncheckedIndexAccess.d.ts +3 -0
  169. package/dist/rules/typescript/uncheckedIndexAccess.d.ts.map +1 -0
  170. package/dist/rules/typescript/uncheckedIndexAccess.js +79 -0
  171. package/dist/rules/typescript/uncheckedIndexAccess.js.map +1 -0
  172. package/dist/rules/typescript/unsafeUnvalidatedAssertion.d.ts +3 -0
  173. package/dist/rules/typescript/unsafeUnvalidatedAssertion.d.ts.map +1 -0
  174. package/dist/rules/typescript/unsafeUnvalidatedAssertion.js +94 -0
  175. package/dist/rules/typescript/unsafeUnvalidatedAssertion.js.map +1 -0
  176. package/dist/strictness/evaluator.d.ts +28 -0
  177. package/dist/strictness/evaluator.d.ts.map +1 -0
  178. package/dist/strictness/evaluator.js +141 -0
  179. package/dist/strictness/evaluator.js.map +1 -0
  180. package/dist/strictness/matrix.d.ts +8 -0
  181. package/dist/strictness/matrix.d.ts.map +1 -0
  182. package/dist/strictness/matrix.js +63 -0
  183. package/dist/strictness/matrix.js.map +1 -0
  184. package/dist/typescript/programManager.d.ts +18 -0
  185. package/dist/typescript/programManager.d.ts.map +1 -0
  186. package/dist/typescript/programManager.js +46 -0
  187. package/dist/typescript/programManager.js.map +1 -0
  188. package/dist/typescript/projectResolver.d.ts +17 -0
  189. package/dist/typescript/projectResolver.d.ts.map +1 -0
  190. package/dist/typescript/projectResolver.js +75 -0
  191. package/dist/typescript/projectResolver.js.map +1 -0
  192. package/package.json +56 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Formats AuditResult into structured Agent JSON format for LLMs/Codex.
3
+ */
4
+ export function renderAgentReport(result) {
5
+ const agentFindings = result.findings.map((f) => ({
6
+ fingerprint: f.fingerprint,
7
+ ruleId: f.ruleId,
8
+ category: f.category,
9
+ severity: f.severity,
10
+ confidence: f.confidence,
11
+ file: f.file,
12
+ range: {
13
+ start: { line: f.range.start.line, column: f.range.start.column },
14
+ end: { line: f.range.end.line, column: f.range.end.column },
15
+ },
16
+ message: f.message,
17
+ evidence: f.evidence.map((e) => e.message),
18
+ suggestedAction: f.suggestedAction ?? null,
19
+ safeAutomaticFix: f.safeAutomaticFix,
20
+ }));
21
+ const report = {
22
+ schemaVersion: 1,
23
+ tool: {
24
+ name: "sourceverity",
25
+ version: "1.0.0",
26
+ },
27
+ repository: {
28
+ typescript: result.repository.typescriptVersion,
29
+ react: result.repository.reactVersion,
30
+ },
31
+ summary: {
32
+ errors: result.summary.errors,
33
+ warnings: result.summary.warnings,
34
+ info: result.summary.info,
35
+ },
36
+ findings: agentFindings,
37
+ };
38
+ return JSON.stringify(report, null, 2);
39
+ }
40
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/reporters/agent.ts"],"names":[],"mappings":"AAqCA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,MAAM,aAAa,GAAmB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC;QACzE,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE;YACL,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE;YACjE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;SAC5D;QACD,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1C,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;QAC1C,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;KACrC,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAgB;QAC1B,aAAa,EAAE,CAAC;QAChB,IAAI,EAAE;YACJ,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,OAAO;SACjB;QACD,UAAU,EAAE;YACV,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,iBAAiB;YAC/C,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,YAAY;SACtC;QACD,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC7B,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;YACjC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;SAC1B;QACD,QAAQ,EAAE,aAAa;KACxB,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { AuditResult } from "../core/types.js";
2
+ /**
3
+ * Formats AuditResult as structured JSON.
4
+ */
5
+ export declare function renderJsonReport(result: AuditResult): string;
6
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE5D"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Formats AuditResult as structured JSON.
3
+ */
4
+ export function renderJsonReport(result) {
5
+ return JSON.stringify(result, null, 2);
6
+ }
7
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { AuditResult } from "../core/types.js";
2
+ /**
3
+ * Formats AuditResult as standard SARIF 2.1.0 log format for GitHub Code Scanning.
4
+ */
5
+ export declare function renderSarifReport(result: AuditResult): string;
6
+ //# sourceMappingURL=sarif.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../../src/reporters/sarif.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA4D7D"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Formats AuditResult as standard SARIF 2.1.0 log format for GitHub Code Scanning.
3
+ */
4
+ export function renderSarifReport(result) {
5
+ const ruleMap = new Map();
6
+ for (const f of result.findings) {
7
+ if (!ruleMap.has(f.ruleId)) {
8
+ ruleMap.set(f.ruleId, { id: f.ruleId, name: f.ruleId });
9
+ }
10
+ }
11
+ const sarifResults = result.findings.map((f) => {
12
+ const level = f.severity === "error" ? "error" : f.severity === "warning" ? "warning" : "note";
13
+ return {
14
+ ruleId: f.ruleId,
15
+ level,
16
+ message: {
17
+ text: f.message,
18
+ },
19
+ locations: [
20
+ {
21
+ physicalLocation: {
22
+ artifactLocation: {
23
+ uri: f.file,
24
+ },
25
+ region: {
26
+ startLine: f.range.start.line,
27
+ startColumn: f.range.start.column,
28
+ endLine: f.range.end.line,
29
+ endColumn: f.range.end.column,
30
+ },
31
+ },
32
+ },
33
+ ],
34
+ partialFingerprints: {
35
+ primaryLocationLineHash: f.fingerprint,
36
+ },
37
+ };
38
+ });
39
+ const sarifLog = {
40
+ $schema: "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
41
+ version: "2.1.0",
42
+ runs: [
43
+ {
44
+ tool: {
45
+ driver: {
46
+ name: "sourceverity",
47
+ version: "1.0.0",
48
+ rules: Array.from(ruleMap.values()).map((r) => ({
49
+ id: r.id,
50
+ name: r.name,
51
+ })),
52
+ },
53
+ },
54
+ results: sarifResults,
55
+ },
56
+ ],
57
+ };
58
+ return JSON.stringify(sarifLog, null, 2);
59
+ }
60
+ //# sourceMappingURL=sarif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../src/reporters/sarif.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwC,CAAC;IAEhE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAE/F,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK;YACL,OAAO,EAAE;gBACP,IAAI,EAAE,CAAC,CAAC,OAAO;aAChB;YACD,SAAS,EAAE;gBACT;oBACE,gBAAgB,EAAE;wBAChB,gBAAgB,EAAE;4BAChB,GAAG,EAAE,CAAC,CAAC,IAAI;yBACZ;wBACD,MAAM,EAAE;4BACN,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;4BAC7B,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;4BACjC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI;4BACzB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM;yBAC9B;qBACF;iBACF;aACF;YACD,mBAAmB,EAAE;gBACnB,uBAAuB,EAAE,CAAC,CAAC,WAAW;aACvC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE,gGAAgG;QACzG,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE;oBACJ,MAAM,EAAE;wBACN,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,OAAO;wBAChB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BAC9C,EAAE,EAAE,CAAC,CAAC,EAAE;4BACR,IAAI,EAAE,CAAC,CAAC,IAAI;yBACb,CAAC,CAAC;qBACJ;iBACF;gBACD,OAAO,EAAE,YAAY;aACtB;SACF;KACF,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { AuditResult } from "../core/types.js";
2
+ export interface TerminalReporterOptions {
3
+ readonly color?: boolean | undefined;
4
+ readonly verbose?: boolean | undefined;
5
+ }
6
+ /**
7
+ * Formats AuditResult as a clean, human-readable terminal report.
8
+ */
9
+ export declare function renderTerminalReport(result: AuditResult, options?: TerminalReporterOptions | undefined): string;
10
+ //# sourceMappingURL=terminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC;AAcD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,SAAS,GAAG,MAAM,CAyE/G"}
@@ -0,0 +1,105 @@
1
+ import { createStyler } from "../core/terminal.js";
2
+ const CATEGORY_NAMES = {
3
+ typescript: "Type safety",
4
+ react: "React",
5
+ async: "Async",
6
+ browser: "Browser",
7
+ network: "Network",
8
+ security: "Security",
9
+ performance: "Performance",
10
+ a11y: "Accessibility",
11
+ config: "Configuration",
12
+ };
13
+ /**
14
+ * Formats AuditResult as a clean, human-readable terminal report.
15
+ */
16
+ export function renderTerminalReport(result, options) {
17
+ const styler = createStyler(options?.color !== undefined ? { color: options.color } : undefined);
18
+ const lines = [];
19
+ // 1. Header & Repository Overview
20
+ lines.push(styler.bold("SourceVerity 1.0.0"));
21
+ lines.push("");
22
+ lines.push(styler.bold("Repository"));
23
+ if (result.repository.typescriptVersion) {
24
+ lines.push(` TypeScript ${result.repository.typescriptVersion}`);
25
+ }
26
+ if (result.repository.reactVersion) {
27
+ lines.push(` React ${result.repository.reactVersion}`);
28
+ }
29
+ lines.push(` Workspace ${result.repository.workspaceType ?? result.repository.packageManager}`);
30
+ lines.push(` Projects ${result.repository.projectCount}`);
31
+ lines.push("");
32
+ lines.push(`Analyzing ${result.summary.filesAnalyzed} source files...`);
33
+ lines.push("");
34
+ // 2. Category Summary Table
35
+ const categoryCounts = new Map();
36
+ for (const f of result.findings) {
37
+ const cat = f.category;
38
+ let counts = categoryCounts.get(cat);
39
+ if (!counts) {
40
+ counts = { errors: 0, warnings: 0, info: 0 };
41
+ categoryCounts.set(cat, counts);
42
+ }
43
+ if (f.severity === "error")
44
+ counts.errors++;
45
+ else if (f.severity === "warning")
46
+ counts.warnings++;
47
+ else if (f.severity === "info")
48
+ counts.info++;
49
+ }
50
+ for (const [cat, name] of Object.entries(CATEGORY_NAMES)) {
51
+ const counts = categoryCounts.get(cat) ?? { errors: 0, warnings: 0, info: 0 };
52
+ if (counts.errors > 0 || counts.warnings > 0 || counts.info > 0 || options?.verbose) {
53
+ const paddedName = name.padEnd(16, " ");
54
+ const errStr = counts.errors > 0 ? styler.red(`${counts.errors} error${counts.errors === 1 ? "" : "s"}`) : `0 errors`;
55
+ const warnStr = counts.warnings > 0 ? styler.yellow(`${counts.warnings} warning${counts.warnings === 1 ? "" : "s"}`) : `0 warnings`;
56
+ lines.push(`${paddedName} ${errStr} ${warnStr}`);
57
+ }
58
+ }
59
+ lines.push("");
60
+ // 3. Individual Finding Cards
61
+ if (result.findings.length > 0) {
62
+ for (const finding of result.findings) {
63
+ lines.push(formatFindingCard(finding, styler));
64
+ lines.push("");
65
+ }
66
+ }
67
+ // 4. Skipped Semantic Rules Notice (if TS missing)
68
+ if (result.skippedSemanticRules && result.skippedSemanticRules.length > 0) {
69
+ lines.push(styler.yellow("Type-aware TypeScript analysis unavailable."));
70
+ lines.push("No local TypeScript installation was found.");
71
+ lines.push(`${result.skippedSemanticRules.length} semantic rules were skipped.`);
72
+ lines.push("");
73
+ }
74
+ // 5. Summary Footer
75
+ lines.push("────────────────────────────────────────");
76
+ lines.push(`${result.summary.highConfidence} high-confidence findings`);
77
+ if (result.summary.mediumConfidence > 0 || result.summary.lowConfidence > 0) {
78
+ lines.push(`${result.summary.mediumConfidence + result.summary.lowConfidence} advisory findings`);
79
+ }
80
+ lines.push("");
81
+ return lines.join("\n");
82
+ }
83
+ function formatFindingCard(finding, styler) {
84
+ const lines = [];
85
+ const loc = `${finding.file}:${finding.range.start.line}:${finding.range.start.column}`;
86
+ lines.push(styler.bold(loc));
87
+ lines.push("");
88
+ const sevStr = finding.severity === "error" ? styler.red("error") : finding.severity === "warning" ? styler.yellow("warning") : styler.dim("info");
89
+ lines.push(`${finding.ruleId}`);
90
+ lines.push(`${sevStr} · ${finding.confidence} confidence`);
91
+ lines.push("");
92
+ lines.push(finding.message);
93
+ if (finding.evidence.length > 0) {
94
+ lines.push("");
95
+ for (const ev of finding.evidence) {
96
+ lines.push(` Evidence: ${ev.message}`);
97
+ }
98
+ }
99
+ if (finding.suggestedAction) {
100
+ lines.push("");
101
+ lines.push(styler.dim(` Suggested: ${finding.suggestedAction}`));
102
+ }
103
+ return lines.join("\n");
104
+ }
105
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { RepositoryContext } from "./types.js";
2
+ /**
3
+ * Audits repository directory and discovers packages, workspaces, package manager, and framework configuration.
4
+ */
5
+ export declare function discoverRepository(rootDir: string): Promise<RepositoryContext>;
6
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/repository/detector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAKV,iBAAiB,EAClB,MAAM,YAAY,CAAC;AA8JpB;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgFpF"}
@@ -0,0 +1,231 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { normalizePath } from "../core/paths.js";
4
+ /**
5
+ * Safely parses a JSON file, returning undefined if missing or malformed.
6
+ */
7
+ async function readJsonFile(filePath) {
8
+ try {
9
+ const raw = await fs.readFile(filePath, "utf-8");
10
+ // sourceverity-disable-next-line typescript/unsafe-unvalidated-assertion -- generic raw JSON parser helper
11
+ return JSON.parse(raw);
12
+ }
13
+ catch {
14
+ return undefined;
15
+ }
16
+ }
17
+ /**
18
+ * Checks if a file or directory exists.
19
+ */
20
+ async function pathExists(p) {
21
+ try {
22
+ await fs.access(p);
23
+ return true;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ /**
30
+ * Detects the package manager used in the repository root.
31
+ */
32
+ async function detectPackageManager(rootDir) {
33
+ if (await pathExists(path.join(rootDir, "pnpm-lock.yaml")))
34
+ return "pnpm";
35
+ if (await pathExists(path.join(rootDir, "package-lock.json")))
36
+ return "npm";
37
+ if (await pathExists(path.join(rootDir, "yarn.lock")))
38
+ return "yarn";
39
+ if ((await pathExists(path.join(rootDir, "bun.lockb"))) || (await pathExists(path.join(rootDir, "bun.lock"))))
40
+ return "bun";
41
+ return "unknown";
42
+ }
43
+ /**
44
+ * Parses pnpm-workspace.yaml package patterns without external YAML libraries.
45
+ */
46
+ async function parsePnpmWorkspaceYaml(pnpmYamlPath) {
47
+ try {
48
+ const content = await fs.readFile(pnpmYamlPath, "utf-8");
49
+ const patterns = [];
50
+ let inPackagesBlock = false;
51
+ for (const line of content.split("\n")) {
52
+ const trimmed = line.trim();
53
+ if (trimmed.startsWith("packages:")) {
54
+ inPackagesBlock = true;
55
+ continue;
56
+ }
57
+ if (inPackagesBlock) {
58
+ if (trimmed.startsWith("-")) {
59
+ const raw = trimmed.replace(/^-\s*/, "").replace(/['"]/g, "").trim();
60
+ if (raw)
61
+ patterns.push(raw);
62
+ }
63
+ else if (trimmed.length > 0 && !trimmed.startsWith("#")) {
64
+ inPackagesBlock = false;
65
+ }
66
+ }
67
+ }
68
+ return patterns;
69
+ }
70
+ catch {
71
+ return [];
72
+ }
73
+ }
74
+ /**
75
+ * Expands workspace directory globs (e.g. "apps/*", "packages/*").
76
+ */
77
+ async function expandWorkspacePatterns(rootDir, patterns) {
78
+ const result = [];
79
+ for (const pattern of patterns) {
80
+ const normalized = pattern.replace(/\\/g, "/");
81
+ if (normalized.endsWith("/*")) {
82
+ const parentDir = path.join(rootDir, normalized.slice(0, -2));
83
+ try {
84
+ const entries = await fs.readdir(parentDir, { withFileTypes: true });
85
+ for (const entry of entries) {
86
+ if (entry.isDirectory() && !entry.name.startsWith(".")) {
87
+ const pkgDir = path.join(parentDir, entry.name);
88
+ if (await pathExists(path.join(pkgDir, "package.json"))) {
89
+ result.push(pkgDir);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ catch {
95
+ // Parent dir does not exist; continue
96
+ }
97
+ }
98
+ else {
99
+ const directDir = path.join(rootDir, normalized);
100
+ if (await pathExists(path.join(directDir, "package.json"))) {
101
+ result.push(directDir);
102
+ }
103
+ }
104
+ }
105
+ return result;
106
+ }
107
+ /**
108
+ * Extracts framework and tool dependencies across all discovered packages.
109
+ */
110
+ function extractFrameworks(manifests) {
111
+ let reactVersion;
112
+ let reactDomVersion;
113
+ let hasReactCompiler = false;
114
+ const frameworksMap = new Map();
115
+ const KNOWN_FRAMEWORKS = [
116
+ { key: "next", name: "Next.js" },
117
+ { key: "vite", name: "Vite" },
118
+ { key: "@remix-run/react", name: "Remix" },
119
+ { key: "react-router", name: "React Router" },
120
+ { key: "astro", name: "Astro" },
121
+ { key: "gatsby", name: "Gatsby" },
122
+ ];
123
+ for (const manifest of manifests) {
124
+ const allDeps = {
125
+ ...manifest.peerDependencies,
126
+ ...manifest.devDependencies,
127
+ ...manifest.dependencies,
128
+ };
129
+ if (!reactVersion && allDeps["react"]) {
130
+ reactVersion = allDeps["react"];
131
+ }
132
+ if (!reactDomVersion && allDeps["react-dom"]) {
133
+ reactDomVersion = allDeps["react-dom"];
134
+ }
135
+ if (allDeps["babel-plugin-react-compiler"] || allDeps["eslint-plugin-react-compiler"]) {
136
+ hasReactCompiler = true;
137
+ }
138
+ for (const fw of KNOWN_FRAMEWORKS) {
139
+ const version = allDeps[fw.key];
140
+ if (version && !frameworksMap.has(fw.name)) {
141
+ frameworksMap.set(fw.name, version);
142
+ }
143
+ }
144
+ }
145
+ const frameworks = Array.from(frameworksMap.entries()).map(([name, version]) => ({
146
+ name,
147
+ version,
148
+ }));
149
+ return { reactVersion, reactDomVersion, hasReactCompiler, frameworks };
150
+ }
151
+ /**
152
+ * Audits repository directory and discovers packages, workspaces, package manager, and framework configuration.
153
+ */
154
+ export async function discoverRepository(rootDir) {
155
+ const resolvedRoot = path.resolve(rootDir);
156
+ const packageManager = await detectPackageManager(resolvedRoot);
157
+ const rootManifestPath = path.join(resolvedRoot, "package.json");
158
+ const rootManifest = await readJsonFile(rootManifestPath);
159
+ const packages = [];
160
+ let isMonorepo = false;
161
+ let workspaceType;
162
+ // 1. Check pnpm-workspace.yaml
163
+ const pnpmWorkspacePath = path.join(resolvedRoot, "pnpm-workspace.yaml");
164
+ if (await pathExists(pnpmWorkspacePath)) {
165
+ isMonorepo = true;
166
+ workspaceType = "pnpm";
167
+ const patterns = await parsePnpmWorkspaceYaml(pnpmWorkspacePath);
168
+ const dirs = await expandWorkspacePatterns(resolvedRoot, patterns);
169
+ for (const pkgDir of dirs) {
170
+ const pkgManifest = await readJsonFile(path.join(pkgDir, "package.json"));
171
+ if (pkgManifest) {
172
+ packages.push({
173
+ name: pkgManifest.name ?? path.basename(pkgDir),
174
+ packageDir: pkgDir,
175
+ relativePath: normalizePath(pkgDir, resolvedRoot),
176
+ packageJson: pkgManifest,
177
+ isRoot: false,
178
+ });
179
+ }
180
+ }
181
+ }
182
+ else if (rootManifest?.workspaces) {
183
+ // 2. Check package.json workspaces
184
+ isMonorepo = true;
185
+ workspaceType = packageManager === "unknown" ? "npm" : packageManager;
186
+ const rawWorkspaces = rootManifest.workspaces;
187
+ const rawPatterns = Array.isArray(rawWorkspaces)
188
+ ? rawWorkspaces
189
+ : typeof rawWorkspaces === "object" && rawWorkspaces && "packages" in rawWorkspaces && Array.isArray(rawWorkspaces.packages)
190
+ ? rawWorkspaces.packages
191
+ : [];
192
+ const dirs = await expandWorkspacePatterns(resolvedRoot, rawPatterns);
193
+ for (const pkgDir of dirs) {
194
+ const pkgManifest = await readJsonFile(path.join(pkgDir, "package.json"));
195
+ if (pkgManifest) {
196
+ packages.push({
197
+ name: pkgManifest.name ?? path.basename(pkgDir),
198
+ packageDir: pkgDir,
199
+ relativePath: normalizePath(pkgDir, resolvedRoot),
200
+ packageJson: pkgManifest,
201
+ isRoot: false,
202
+ });
203
+ }
204
+ }
205
+ }
206
+ // Add root package if package.json exists
207
+ if (rootManifest) {
208
+ packages.unshift({
209
+ name: rootManifest.name ?? "root",
210
+ packageDir: resolvedRoot,
211
+ relativePath: ".",
212
+ packageJson: rootManifest,
213
+ isRoot: true,
214
+ });
215
+ }
216
+ const allManifests = packages.map((p) => p.packageJson);
217
+ const frameworkData = extractFrameworks(allManifests);
218
+ return {
219
+ rootDir: resolvedRoot,
220
+ packageManager,
221
+ isMonorepo,
222
+ workspaceType,
223
+ rootManifest,
224
+ packages,
225
+ reactVersion: frameworkData.reactVersion,
226
+ reactDomVersion: frameworkData.reactDomVersion,
227
+ hasReactCompiler: frameworkData.hasReactCompiler,
228
+ frameworks: frameworkData.frameworks,
229
+ };
230
+ }
231
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/repository/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare const DEFAULT_IGNORE_PATTERNS: readonly ["node_modules", "node_modules/**", "dist", "dist/**", "build", "build/**", "coverage", "coverage/**", ".git", ".git/**", ".next", ".next/**", ".turbo", ".turbo/**", ".nuxt", ".nuxt/**", ".cache", ".cache/**", ".sourceverity-cache", ".sourceverity-cache/**", "*.log", ".DS_Store"];
2
+ /**
3
+ * Creates a repository file filter that checks file paths against default ignore rules,
4
+ * local .gitignore files, and optional custom patterns.
5
+ *
6
+ * Returns a predicate that returns true if the file should be INCLUDED in analysis,
7
+ * and false if the file should be IGNORED.
8
+ */
9
+ export declare function createFileFilter(rootDir: string, customIgnores?: readonly string[] | undefined): Promise<(filePath: string) => boolean>;
10
+ //# sourceMappingURL=fileFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileFilter.d.ts","sourceRoot":"","sources":["../../src/repository/fileFilter.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,uBAAuB,mSAuB1B,CAAC;AAEX;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAC5C,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CA+CxC"}
@@ -0,0 +1,78 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import ignore from "ignore";
4
+ import { normalizePath } from "../core/paths.js";
5
+ const createIgnore = typeof ignore === "function"
6
+ ? ignore
7
+ : ignore.default;
8
+ export const DEFAULT_IGNORE_PATTERNS = [
9
+ "node_modules",
10
+ "node_modules/**",
11
+ "dist",
12
+ "dist/**",
13
+ "build",
14
+ "build/**",
15
+ "coverage",
16
+ "coverage/**",
17
+ ".git",
18
+ ".git/**",
19
+ ".next",
20
+ ".next/**",
21
+ ".turbo",
22
+ ".turbo/**",
23
+ ".nuxt",
24
+ ".nuxt/**",
25
+ ".cache",
26
+ ".cache/**",
27
+ ".sourceverity-cache",
28
+ ".sourceverity-cache/**",
29
+ "*.log",
30
+ ".DS_Store",
31
+ ];
32
+ /**
33
+ * Creates a repository file filter that checks file paths against default ignore rules,
34
+ * local .gitignore files, and optional custom patterns.
35
+ *
36
+ * Returns a predicate that returns true if the file should be INCLUDED in analysis,
37
+ * and false if the file should be IGNORED.
38
+ */
39
+ export async function createFileFilter(rootDir, customIgnores) {
40
+ const ig = createIgnore();
41
+ // 1. Add default ignore patterns
42
+ ig.add(DEFAULT_IGNORE_PATTERNS);
43
+ // 2. Add custom ignore patterns if provided
44
+ if (customIgnores && customIgnores.length > 0) {
45
+ ig.add(customIgnores);
46
+ }
47
+ // 3. Read root .gitignore if present
48
+ const rootGitignore = path.join(rootDir, ".gitignore");
49
+ try {
50
+ const content = await fs.readFile(rootGitignore, "utf-8");
51
+ ig.add(content);
52
+ }
53
+ catch {
54
+ // No .gitignore present, continue with defaults
55
+ }
56
+ const resolvedRoot = path.resolve(rootDir);
57
+ return (filePath) => {
58
+ if (!filePath)
59
+ return false;
60
+ // Resolve absolute path and compute relative path from repository root
61
+ const absoluteTarget = path.isAbsolute(filePath)
62
+ ? path.resolve(filePath)
63
+ : path.resolve(resolvedRoot, filePath);
64
+ const relativeFromRoot = path.relative(resolvedRoot, absoluteTarget);
65
+ // If path resolves outside the repository root, do not include it in repository scan
66
+ if (relativeFromRoot.startsWith("..") ||
67
+ relativeFromRoot === ".." ||
68
+ path.isAbsolute(relativeFromRoot)) {
69
+ return false;
70
+ }
71
+ const normalized = normalizePath(relativeFromRoot);
72
+ if (!normalized || normalized === ".")
73
+ return false;
74
+ // ig.ignores returns true if path matches ignore rules -> invert for inclusion
75
+ return !ig.ignores(normalized);
76
+ };
77
+ }
78
+ //# sourceMappingURL=fileFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileFilter.js","sourceRoot":"","sources":["../../src/repository/fileFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAuB,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,YAAY,GAChB,OAAO,MAAM,KAAK,UAAU;IAC1B,CAAC,CAAE,MAAmC;IACtC,CAAC,CAAE,MAAgD,CAAC,OAAO,CAAC;AAEhE,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,cAAc;IACd,iBAAiB;IACjB,MAAM;IACN,SAAS;IACT,OAAO;IACP,UAAU;IACV,UAAU;IACV,aAAa;IACb,MAAM;IACN,SAAS;IACT,OAAO;IACP,UAAU;IACV,QAAQ;IACR,WAAW;IACX,OAAO;IACP,UAAU;IACV,QAAQ;IACR,WAAW;IACX,qBAAqB;IACrB,wBAAwB;IACxB,OAAO;IACP,WAAW;CACH,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,aAA6C;IAE7C,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAE1B,iCAAiC;IACjC,EAAE,CAAC,GAAG,CAAC,uBAA8C,CAAC,CAAC;IAEvD,4CAA4C;IAC5C,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,EAAE,CAAC,GAAG,CAAC,aAAyB,CAAC,CAAC;IACpC,CAAC;IAED,qCAAqC;IACrC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC1D,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3C,OAAO,CAAC,QAAgB,EAAW,EAAE;QACnC,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE5B,uEAAuE;QACvE,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YACxB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAEzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QAErE,qFAAqF;QACrF,IACE,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC;YACjC,gBAAgB,KAAK,IAAI;YACzB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EACjC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QAEpD,+EAA+E;QAC/E,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Discovers modified, added, or uncommitted files in a git repository.
3
+ * Uses safe argument arrays without shell interpolation.
4
+ * Returns null if Git is unavailable or target directory is not a git repository.
5
+ */
6
+ export declare function getChangedFiles(rootDir: string): Promise<string[] | null>;
7
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/repository/git.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CA6C/E"}