cxgrd 0.1.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 (238) hide show
  1. package/README.md +221 -0
  2. package/dist/auth/audit-usage.d.ts +30 -0
  3. package/dist/auth/audit-usage.d.ts.map +1 -0
  4. package/dist/auth/audit-usage.js +104 -0
  5. package/dist/auth/audit-usage.js.map +1 -0
  6. package/dist/auth/auth-session.d.ts +17 -0
  7. package/dist/auth/auth-session.d.ts.map +1 -0
  8. package/dist/auth/auth-session.js +102 -0
  9. package/dist/auth/auth-session.js.map +1 -0
  10. package/dist/auth/auth-store.d.ts +17 -0
  11. package/dist/auth/auth-store.d.ts.map +1 -0
  12. package/dist/auth/auth-store.js +44 -0
  13. package/dist/auth/auth-store.js.map +1 -0
  14. package/dist/auth/entitlements.d.ts +14 -0
  15. package/dist/auth/entitlements.d.ts.map +1 -0
  16. package/dist/auth/entitlements.js +62 -0
  17. package/dist/auth/entitlements.js.map +1 -0
  18. package/dist/auth/open-browser.d.ts +2 -0
  19. package/dist/auth/open-browser.d.ts.map +1 -0
  20. package/dist/auth/open-browser.js +20 -0
  21. package/dist/auth/open-browser.js.map +1 -0
  22. package/dist/auth/plans.d.ts +10 -0
  23. package/dist/auth/plans.d.ts.map +1 -0
  24. package/dist/auth/plans.js +37 -0
  25. package/dist/auth/plans.js.map +1 -0
  26. package/dist/auth/plans.test.d.ts +2 -0
  27. package/dist/auth/plans.test.d.ts.map +1 -0
  28. package/dist/auth/plans.test.js +23 -0
  29. package/dist/auth/plans.test.js.map +1 -0
  30. package/dist/cg-directory.d.ts +37 -0
  31. package/dist/cg-directory.d.ts.map +1 -0
  32. package/dist/cg-directory.js +129 -0
  33. package/dist/cg-directory.js.map +1 -0
  34. package/dist/check/check-runner.d.ts +3 -0
  35. package/dist/check/check-runner.d.ts.map +1 -0
  36. package/dist/check/check-runner.js +48 -0
  37. package/dist/check/check-runner.js.map +1 -0
  38. package/dist/check/compiler-service.d.ts +6 -0
  39. package/dist/check/compiler-service.d.ts.map +1 -0
  40. package/dist/check/compiler-service.js +69 -0
  41. package/dist/check/compiler-service.js.map +1 -0
  42. package/dist/check/parsers/cargo.d.ts +3 -0
  43. package/dist/check/parsers/cargo.d.ts.map +1 -0
  44. package/dist/check/parsers/cargo.js +34 -0
  45. package/dist/check/parsers/cargo.js.map +1 -0
  46. package/dist/check/parsers/parsers.test.d.ts +2 -0
  47. package/dist/check/parsers/parsers.test.d.ts.map +1 -0
  48. package/dist/check/parsers/parsers.test.js +51 -0
  49. package/dist/check/parsers/parsers.test.js.map +1 -0
  50. package/dist/check/parsers/pyright.d.ts +3 -0
  51. package/dist/check/parsers/pyright.d.ts.map +1 -0
  52. package/dist/check/parsers/pyright.js +27 -0
  53. package/dist/check/parsers/pyright.js.map +1 -0
  54. package/dist/check/parsers/tsc-cli.d.ts +3 -0
  55. package/dist/check/parsers/tsc-cli.d.ts.map +1 -0
  56. package/dist/check/parsers/tsc-cli.js +22 -0
  57. package/dist/check/parsers/tsc-cli.js.map +1 -0
  58. package/dist/check/project-tooling.d.ts +18 -0
  59. package/dist/check/project-tooling.d.ts.map +1 -0
  60. package/dist/check/project-tooling.js +105 -0
  61. package/dist/check/project-tooling.js.map +1 -0
  62. package/dist/check/run-command.d.ts +8 -0
  63. package/dist/check/run-command.d.ts.map +1 -0
  64. package/dist/check/run-command.js +50 -0
  65. package/dist/check/run-command.js.map +1 -0
  66. package/dist/check/scope.d.ts +11 -0
  67. package/dist/check/scope.d.ts.map +1 -0
  68. package/dist/check/scope.js +46 -0
  69. package/dist/check/scope.js.map +1 -0
  70. package/dist/check/scope.test.d.ts +2 -0
  71. package/dist/check/scope.test.d.ts.map +1 -0
  72. package/dist/check/scope.test.js +15 -0
  73. package/dist/check/scope.test.js.map +1 -0
  74. package/dist/check/strict-mode.d.ts +5 -0
  75. package/dist/check/strict-mode.d.ts.map +1 -0
  76. package/dist/check/strict-mode.js +32 -0
  77. package/dist/check/strict-mode.js.map +1 -0
  78. package/dist/check/strict-mode.test.d.ts +2 -0
  79. package/dist/check/strict-mode.test.d.ts.map +1 -0
  80. package/dist/check/strict-mode.test.js +53 -0
  81. package/dist/check/strict-mode.test.js.map +1 -0
  82. package/dist/check/structural-checks.d.ts +3 -0
  83. package/dist/check/structural-checks.d.ts.map +1 -0
  84. package/dist/check/structural-checks.js +111 -0
  85. package/dist/check/structural-checks.js.map +1 -0
  86. package/dist/check/types.d.ts +40 -0
  87. package/dist/check/types.d.ts.map +1 -0
  88. package/dist/check/types.js +2 -0
  89. package/dist/check/types.js.map +1 -0
  90. package/dist/check/verifiers/python.d.ts +7 -0
  91. package/dist/check/verifiers/python.d.ts.map +1 -0
  92. package/dist/check/verifiers/python.js +43 -0
  93. package/dist/check/verifiers/python.js.map +1 -0
  94. package/dist/check/verifiers/rust.d.ts +7 -0
  95. package/dist/check/verifiers/rust.d.ts.map +1 -0
  96. package/dist/check/verifiers/rust.js +39 -0
  97. package/dist/check/verifiers/rust.js.map +1 -0
  98. package/dist/check/verifiers/typescript.d.ts +7 -0
  99. package/dist/check/verifiers/typescript.d.ts.map +1 -0
  100. package/dist/check/verifiers/typescript.js +108 -0
  101. package/dist/check/verifiers/typescript.js.map +1 -0
  102. package/dist/commands/auth.d.ts +4 -0
  103. package/dist/commands/auth.d.ts.map +1 -0
  104. package/dist/commands/auth.js +51 -0
  105. package/dist/commands/auth.js.map +1 -0
  106. package/dist/commands/check.d.ts +9 -0
  107. package/dist/commands/check.d.ts.map +1 -0
  108. package/dist/commands/check.js +145 -0
  109. package/dist/commands/check.js.map +1 -0
  110. package/dist/commands/doctor.d.ts +2 -0
  111. package/dist/commands/doctor.d.ts.map +1 -0
  112. package/dist/commands/doctor.js +76 -0
  113. package/dist/commands/doctor.js.map +1 -0
  114. package/dist/commands/init-hooks.d.ts +15 -0
  115. package/dist/commands/init-hooks.d.ts.map +1 -0
  116. package/dist/commands/init-hooks.js +102 -0
  117. package/dist/commands/init-hooks.js.map +1 -0
  118. package/dist/commands/input.d.ts +2 -0
  119. package/dist/commands/input.d.ts.map +1 -0
  120. package/dist/commands/input.js +139 -0
  121. package/dist/commands/input.js.map +1 -0
  122. package/dist/commands/prompt.d.ts +2 -0
  123. package/dist/commands/prompt.d.ts.map +1 -0
  124. package/dist/commands/prompt.js +70 -0
  125. package/dist/commands/prompt.js.map +1 -0
  126. package/dist/commands/scan.d.ts +5 -0
  127. package/dist/commands/scan.d.ts.map +1 -0
  128. package/dist/commands/scan.js +163 -0
  129. package/dist/commands/scan.js.map +1 -0
  130. package/dist/commands/watch.d.ts +11 -0
  131. package/dist/commands/watch.d.ts.map +1 -0
  132. package/dist/commands/watch.js +74 -0
  133. package/dist/commands/watch.js.map +1 -0
  134. package/dist/config/env.d.ts +5 -0
  135. package/dist/config/env.d.ts.map +1 -0
  136. package/dist/config/env.js +60 -0
  137. package/dist/config/env.js.map +1 -0
  138. package/dist/graph.d.ts +34 -0
  139. package/dist/graph.d.ts.map +1 -0
  140. package/dist/graph.js +123 -0
  141. package/dist/graph.js.map +1 -0
  142. package/dist/index.d.ts +3 -0
  143. package/dist/index.d.ts.map +1 -0
  144. package/dist/index.js +176 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/memory/pattern-analyzer.d.ts +17 -0
  147. package/dist/memory/pattern-analyzer.d.ts.map +1 -0
  148. package/dist/memory/pattern-analyzer.js +56 -0
  149. package/dist/memory/pattern-analyzer.js.map +1 -0
  150. package/dist/memory/repo-memory.d.ts +14 -0
  151. package/dist/memory/repo-memory.d.ts.map +1 -0
  152. package/dist/memory/repo-memory.js +71 -0
  153. package/dist/memory/repo-memory.js.map +1 -0
  154. package/dist/memory/types.d.ts +32 -0
  155. package/dist/memory/types.d.ts.map +1 -0
  156. package/dist/memory/types.js +2 -0
  157. package/dist/memory/types.js.map +1 -0
  158. package/dist/prompt/llm-client.d.ts +8 -0
  159. package/dist/prompt/llm-client.d.ts.map +1 -0
  160. package/dist/prompt/llm-client.js +96 -0
  161. package/dist/prompt/llm-client.js.map +1 -0
  162. package/dist/prompt/subgraph.d.ts +26 -0
  163. package/dist/prompt/subgraph.d.ts.map +1 -0
  164. package/dist/prompt/subgraph.js +96 -0
  165. package/dist/prompt/subgraph.js.map +1 -0
  166. package/dist/scanner.d.ts +13 -0
  167. package/dist/scanner.d.ts.map +1 -0
  168. package/dist/scanner.js +92 -0
  169. package/dist/scanner.js.map +1 -0
  170. package/dist/team/audit.d.ts +4 -0
  171. package/dist/team/audit.d.ts.map +1 -0
  172. package/dist/team/audit.js +16 -0
  173. package/dist/team/audit.js.map +1 -0
  174. package/dist/team/cloud-client.d.ts +7 -0
  175. package/dist/team/cloud-client.d.ts.map +1 -0
  176. package/dist/team/cloud-client.js +106 -0
  177. package/dist/team/cloud-client.js.map +1 -0
  178. package/dist/team/dev-store.d.ts +9 -0
  179. package/dist/team/dev-store.d.ts.map +1 -0
  180. package/dist/team/dev-store.js +69 -0
  181. package/dist/team/dev-store.js.map +1 -0
  182. package/dist/team/graph-sync.d.ts +10 -0
  183. package/dist/team/graph-sync.d.ts.map +1 -0
  184. package/dist/team/graph-sync.js +78 -0
  185. package/dist/team/graph-sync.js.map +1 -0
  186. package/dist/team/policy-cache.d.ts +7 -0
  187. package/dist/team/policy-cache.d.ts.map +1 -0
  188. package/dist/team/policy-cache.js +31 -0
  189. package/dist/team/policy-cache.js.map +1 -0
  190. package/dist/team/policy-engine.d.ts +3 -0
  191. package/dist/team/policy-engine.d.ts.map +1 -0
  192. package/dist/team/policy-engine.js +35 -0
  193. package/dist/team/policy-engine.js.map +1 -0
  194. package/dist/team/policy-engine.test.d.ts +2 -0
  195. package/dist/team/policy-engine.test.d.ts.map +1 -0
  196. package/dist/team/policy-engine.test.js +29 -0
  197. package/dist/team/policy-engine.test.js.map +1 -0
  198. package/dist/team/repo-identity.d.ts +7 -0
  199. package/dist/team/repo-identity.d.ts.map +1 -0
  200. package/dist/team/repo-identity.js +41 -0
  201. package/dist/team/repo-identity.js.map +1 -0
  202. package/dist/team/types.d.ts +53 -0
  203. package/dist/team/types.d.ts.map +1 -0
  204. package/dist/team/types.js +2 -0
  205. package/dist/team/types.js.map +1 -0
  206. package/dist/toolchain/probe.d.ts +9 -0
  207. package/dist/toolchain/probe.d.ts.map +1 -0
  208. package/dist/toolchain/probe.js +123 -0
  209. package/dist/toolchain/probe.js.map +1 -0
  210. package/dist/toolchain/project-languages.d.ts +4 -0
  211. package/dist/toolchain/project-languages.d.ts.map +1 -0
  212. package/dist/toolchain/project-languages.js +41 -0
  213. package/dist/toolchain/project-languages.js.map +1 -0
  214. package/dist/toolchain/types.d.ts +32 -0
  215. package/dist/toolchain/types.d.ts.map +1 -0
  216. package/dist/toolchain/types.js +2 -0
  217. package/dist/toolchain/types.js.map +1 -0
  218. package/dist/utils/blast-radius-analyzer.d.ts +95 -0
  219. package/dist/utils/blast-radius-analyzer.d.ts.map +1 -0
  220. package/dist/utils/blast-radius-analyzer.js +277 -0
  221. package/dist/utils/blast-radius-analyzer.js.map +1 -0
  222. package/dist/utils/change-detector.d.ts +43 -0
  223. package/dist/utils/change-detector.d.ts.map +1 -0
  224. package/dist/utils/change-detector.js +190 -0
  225. package/dist/utils/change-detector.js.map +1 -0
  226. package/dist/utils/cli-formatter.d.ts +80 -0
  227. package/dist/utils/cli-formatter.d.ts.map +1 -0
  228. package/dist/utils/cli-formatter.js +205 -0
  229. package/dist/utils/cli-formatter.js.map +1 -0
  230. package/dist/utils/git-hook-manager.d.ts +81 -0
  231. package/dist/utils/git-hook-manager.d.ts.map +1 -0
  232. package/dist/utils/git-hook-manager.js +243 -0
  233. package/dist/utils/git-hook-manager.js.map +1 -0
  234. package/dist/utils/project-watcher.d.ts +91 -0
  235. package/dist/utils/project-watcher.d.ts.map +1 -0
  236. package/dist/utils/project-watcher.js +215 -0
  237. package/dist/utils/project-watcher.js.map +1 -0
  238. package/package.json +56 -0
@@ -0,0 +1,22 @@
1
+ /** Fallback parser for `tsc --noEmit` stdout when programmatic API is unavailable. */
2
+ const TSC_LINE = /^(?<file>.+)\((?<line>\d+),(?<column>\d+)\):\s+(?<severity>error|warning)\s+(?<code>TS\d+):\s+(?<message>.+)$/;
3
+ export function parseTscCliOutput(output) {
4
+ const issues = [];
5
+ for (const line of output.split('\n')) {
6
+ const match = line.trim().match(TSC_LINE);
7
+ if (!match?.groups)
8
+ continue;
9
+ issues.push({
10
+ severity: match.groups.severity === 'error' ? 'error' : 'warning',
11
+ message: match.groups.message,
12
+ file: match.groups.file,
13
+ line: Number.parseInt(match.groups.line, 10),
14
+ column: Number.parseInt(match.groups.column, 10),
15
+ code: match.groups.code,
16
+ source: 'compiler',
17
+ language: 'typescript',
18
+ });
19
+ }
20
+ return issues;
21
+ }
22
+ //# sourceMappingURL=tsc-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsc-cli.js","sourceRoot":"","sources":["../../../src/check/parsers/tsc-cli.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,QAAQ,GACZ,+GAA+G,CAAC;AAElH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE,MAAM;YAAE,SAAS;QAE7B,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YACjE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;YAC7B,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;YACvB,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5C,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YAChD,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;YACvB,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,YAAY;SACvB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface TypeScriptProject {
2
+ configPath: string;
3
+ rootDir: string;
4
+ }
5
+ export interface RustWorkspace {
6
+ manifestPath: string;
7
+ rootDir: string;
8
+ }
9
+ export interface PythonProject {
10
+ rootDir: string;
11
+ configPath?: string;
12
+ }
13
+ export declare function discoverTypeScriptProjects(projectRoot: string): Promise<TypeScriptProject[]>;
14
+ export declare function discoverRustWorkspaces(projectRoot: string): Promise<RustWorkspace[]>;
15
+ export declare function discoverPythonProjects(projectRoot: string): Promise<PythonProject[]>;
16
+ export declare function projectOverlapsScope(projectDir: string, projectRoot: string, scopeFiles: Set<string> | null): boolean;
17
+ export declare function pathExists(path: string): Promise<boolean>;
18
+ //# sourceMappingURL=project-tooling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-tooling.d.ts","sourceRoot":"","sources":["../../src/check/project-tooling.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAmDD,wBAAsB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAMlG;AAED,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAM1F;AAED,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAyB1F;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAC7B,OAAO,CAiBT;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D"}
@@ -0,0 +1,105 @@
1
+ import { readdir, stat } from 'fs/promises';
2
+ import { join, dirname, relative } from 'path';
3
+ const IGNORE_DIRS = new Set([
4
+ 'node_modules',
5
+ '.git',
6
+ 'dist',
7
+ 'build',
8
+ '.next',
9
+ 'target',
10
+ '.cg',
11
+ 'coverage',
12
+ '.venv',
13
+ 'venv',
14
+ '__pycache__',
15
+ ]);
16
+ async function walkForFiles(root, matcher, maxDepth = 6) {
17
+ const found = [];
18
+ async function walk(dir, depth) {
19
+ if (depth > maxDepth)
20
+ return;
21
+ let entries;
22
+ try {
23
+ entries = await readdir(dir, { withFileTypes: true });
24
+ }
25
+ catch {
26
+ return;
27
+ }
28
+ for (const entry of entries) {
29
+ if (entry.isDirectory() && IGNORE_DIRS.has(entry.name)) {
30
+ continue;
31
+ }
32
+ const fullPath = join(dir, entry.name);
33
+ if (entry.isFile() && matcher(entry.name)) {
34
+ found.push(fullPath);
35
+ }
36
+ else if (entry.isDirectory()) {
37
+ await walk(fullPath, depth + 1);
38
+ }
39
+ }
40
+ }
41
+ await walk(root, 0);
42
+ return found;
43
+ }
44
+ export async function discoverTypeScriptProjects(projectRoot) {
45
+ const configs = await walkForFiles(projectRoot, (name) => name === 'tsconfig.json');
46
+ return configs.map((configPath) => ({
47
+ configPath,
48
+ rootDir: dirname(configPath),
49
+ }));
50
+ }
51
+ export async function discoverRustWorkspaces(projectRoot) {
52
+ const manifests = await walkForFiles(projectRoot, (name) => name === 'Cargo.toml');
53
+ return manifests.map((manifestPath) => ({
54
+ manifestPath,
55
+ rootDir: dirname(manifestPath),
56
+ }));
57
+ }
58
+ export async function discoverPythonProjects(projectRoot) {
59
+ const roots = new Set();
60
+ const pyproject = await walkForFiles(projectRoot, (name) => name === 'pyproject.toml');
61
+ for (const path of pyproject) {
62
+ roots.add(dirname(path));
63
+ }
64
+ const requirements = await walkForFiles(projectRoot, (name) => name === 'requirements.txt');
65
+ for (const path of requirements) {
66
+ roots.add(dirname(path));
67
+ }
68
+ // If .py files exist at root but no config, still allow pyright at project root
69
+ if (roots.size === 0) {
70
+ const pyFiles = await walkForFiles(projectRoot, (name) => name.endsWith('.py'));
71
+ if (pyFiles.length > 0) {
72
+ roots.add(projectRoot);
73
+ }
74
+ }
75
+ return [...roots].map((rootDir) => ({
76
+ rootDir,
77
+ configPath: pyproject.find((p) => dirname(p) === rootDir),
78
+ }));
79
+ }
80
+ export function projectOverlapsScope(projectDir, projectRoot, scopeFiles) {
81
+ if (!scopeFiles) {
82
+ return true;
83
+ }
84
+ if (scopeFiles.size === 0) {
85
+ return false;
86
+ }
87
+ const relProject = relative(projectRoot, projectDir).replace(/\\/g, '/') || '.';
88
+ const prefix = relProject === '.' ? '' : `${relProject}/`;
89
+ for (const file of scopeFiles) {
90
+ if (relProject === '.' || file.startsWith(prefix) || file === relProject) {
91
+ return true;
92
+ }
93
+ }
94
+ return false;
95
+ }
96
+ export async function pathExists(path) {
97
+ try {
98
+ await stat(path);
99
+ return true;
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ }
105
+ //# sourceMappingURL=project-tooling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-tooling.js","sourceRoot":"","sources":["../../src/check/project-tooling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface CommandResult {
2
+ stdout: string;
3
+ stderr: string;
4
+ exitCode: number;
5
+ }
6
+ export declare function runCommand(command: string, args: string[], cwd: string, timeoutMs?: number): Promise<CommandResult>;
7
+ export declare function commandExists(command: string): Promise<boolean>;
8
+ //# sourceMappingURL=run-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-command.d.ts","sourceRoot":"","sources":["../../src/check/run-command.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,SAAS,SAAU,GAClB,OAAO,CAAC,aAAa,CAAC,CA0CxB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQrE"}
@@ -0,0 +1,50 @@
1
+ import { spawn } from 'child_process';
2
+ export function runCommand(command, args, cwd, timeoutMs = 120000) {
3
+ return new Promise((resolve, reject) => {
4
+ const child = spawn(command, args, {
5
+ cwd,
6
+ shell: process.platform === 'win32',
7
+ env: process.env,
8
+ });
9
+ let stdout = '';
10
+ let stderr = '';
11
+ let settled = false;
12
+ const timer = setTimeout(() => {
13
+ if (!settled) {
14
+ child.kill();
15
+ reject(new Error(`Command timed out after ${timeoutMs}ms: ${command} ${args.join(' ')}`));
16
+ }
17
+ }, timeoutMs);
18
+ child.stdout?.on('data', (chunk) => {
19
+ stdout += chunk.toString();
20
+ });
21
+ child.stderr?.on('data', (chunk) => {
22
+ stderr += chunk.toString();
23
+ });
24
+ child.on('error', (err) => {
25
+ settled = true;
26
+ clearTimeout(timer);
27
+ reject(err);
28
+ });
29
+ child.on('close', (code) => {
30
+ settled = true;
31
+ clearTimeout(timer);
32
+ resolve({
33
+ stdout,
34
+ stderr,
35
+ exitCode: code ?? 1,
36
+ });
37
+ });
38
+ });
39
+ }
40
+ export async function commandExists(command) {
41
+ try {
42
+ const checkCmd = process.platform === 'win32' ? 'where' : 'which';
43
+ const result = await runCommand(checkCmd, [command], process.cwd(), 10000);
44
+ return result.exitCode === 0;
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ }
50
+ //# sourceMappingURL=run-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/check/run-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAQtC,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,IAAc,EACd,GAAW,EACX,SAAS,GAAG,MAAO;IAEnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG;YACH,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;YACnC,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,SAAS,OAAO,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC;gBACN,MAAM;gBACN,MAAM;gBACN,QAAQ,EAAE,IAAI,IAAI,CAAC;aACpB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,KAAM,CAAC,CAAC;QAC5E,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare function normalizeProjectPath(projectRoot: string, filePath: string): string;
2
+ /**
3
+ * Resolve which project-relative paths are in scope for this check run.
4
+ * Returns null when scope is "all" (no file filter).
5
+ */
6
+ export declare function resolveScopeFiles(projectRoot: string, scope: 'all' | 'staged' | 'changed'): Set<string> | null;
7
+ export declare function issueInScope(issueFile: string | undefined, scopeFiles: Set<string> | null, projectRoot: string): boolean;
8
+ export declare function filterIssuesByScope<T extends {
9
+ file?: string;
10
+ }>(issues: T[], scopeFiles: Set<string> | null, projectRoot: string): T[];
11
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/check/scope.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMlF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GAClC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAepB;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAC9B,WAAW,EAAE,MAAM,GAClB,OAAO,CAcT;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7D,MAAM,EAAE,CAAC,EAAE,EACX,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAC9B,WAAW,EAAE,MAAM,GAClB,CAAC,EAAE,CAKL"}
@@ -0,0 +1,46 @@
1
+ import { relative } from 'path';
2
+ import { ChangeDetector } from '../utils/change-detector';
3
+ export function normalizeProjectPath(projectRoot, filePath) {
4
+ const rel = relative(projectRoot, filePath);
5
+ if (!rel || rel.startsWith('..')) {
6
+ return filePath.replace(/\\/g, '/');
7
+ }
8
+ return rel.replace(/\\/g, '/');
9
+ }
10
+ /**
11
+ * Resolve which project-relative paths are in scope for this check run.
12
+ * Returns null when scope is "all" (no file filter).
13
+ */
14
+ export function resolveScopeFiles(projectRoot, scope) {
15
+ if (scope === 'all') {
16
+ return null;
17
+ }
18
+ const detector = new ChangeDetector(projectRoot);
19
+ const changed = detector.getChangedFiles();
20
+ const raw = scope === 'staged' ? changed.stagedFiles : [...new Set([...changed.stagedFiles, ...changed.unstaged])];
21
+ const scoped = new Set();
22
+ for (const file of raw) {
23
+ scoped.add(normalizeProjectPath(projectRoot, file));
24
+ }
25
+ return scoped;
26
+ }
27
+ export function issueInScope(issueFile, scopeFiles, projectRoot) {
28
+ if (!scopeFiles) {
29
+ return true;
30
+ }
31
+ if (!issueFile) {
32
+ return false;
33
+ }
34
+ const normalized = normalizeProjectPath(projectRoot, issueFile);
35
+ if (scopeFiles.has(normalized)) {
36
+ return true;
37
+ }
38
+ return [...scopeFiles].some((scoped) => normalized.startsWith(scoped) || scoped.startsWith(normalized));
39
+ }
40
+ export function filterIssuesByScope(issues, scopeFiles, projectRoot) {
41
+ if (!scopeFiles) {
42
+ return issues;
43
+ }
44
+ return issues.filter((issue) => issueInScope(issue.file, scopeFiles, projectRoot));
45
+ }
46
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/check/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,UAAU,oBAAoB,CAAC,WAAmB,EAAE,QAAgB;IACxE,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,WAAmB,EACnB,KAAmC;IAEnC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;IAC3C,MAAM,GAAG,GACP,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEzG,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,SAA6B,EAC7B,UAA8B,EAC9B,WAAmB;IAEnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,UAAU,GAAG,oBAAoB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAChE,IAAI,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CACzB,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAW,EACX,UAA8B,EAC9B,WAAmB;IAEnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;AACrF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scope.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.test.d.ts","sourceRoot":"","sources":["../../src/check/scope.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { issueInScope, normalizeProjectPath } from './scope';
4
+ describe('scope', () => {
5
+ it('normalizes absolute paths to project-relative', () => {
6
+ const rel = normalizeProjectPath('C:/proj', 'C:/proj/cli/src/index.ts');
7
+ assert.equal(rel, 'cli/src/index.ts');
8
+ });
9
+ it('filters issues to scoped files', () => {
10
+ const scope = new Set(['cli/src/foo.ts']);
11
+ assert.equal(issueInScope('cli/src/foo.ts', scope, 'C:/proj'), true);
12
+ assert.equal(issueInScope('website/app/page.tsx', scope, 'C:/proj'), false);
13
+ });
14
+ });
15
+ //# sourceMappingURL=scope.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.test.js","sourceRoot":"","sources":["../../src/check/scope.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE7D,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,GAAG,GAAG,oBAAoB,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CACV,YAAY,CAAC,gBAAgB,EAAE,KAAK,EAAE,SAAS,CAAC,EAChD,IAAI,CACL,CAAC;QACF,MAAM,CAAC,KAAK,CACV,YAAY,CAAC,sBAAsB,EAAE,KAAK,EAAE,SAAS,CAAC,EACtD,KAAK,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { CheckIssue, CompilerRunSummary } from './types';
2
+ import type { CompilerLanguage } from '../toolchain/types';
3
+ export declare function collectStrictModeIssues(summaries: CompilerRunSummary[], languagesInScope: CompilerLanguage[]): CheckIssue[];
4
+ export declare function getSkippedLanguagesInScope(summaries: CompilerRunSummary[], languagesInScope: CompilerLanguage[]): CompilerLanguage[];
5
+ //# sourceMappingURL=strict-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-mode.d.ts","sourceRoot":"","sources":["../../src/check/strict-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAQ3D,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,kBAAkB,EAAE,EAC/B,gBAAgB,EAAE,gBAAgB,EAAE,GACnC,UAAU,EAAE,CAwBd;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,kBAAkB,EAAE,EAC/B,gBAAgB,EAAE,gBAAgB,EAAE,GACnC,gBAAgB,EAAE,CAKpB"}
@@ -0,0 +1,32 @@
1
+ const SKIP_HINTS = {
2
+ typescript: 'bundled TypeScript should always run — please report a bug if you see this',
3
+ python: 'pip install pyright',
4
+ rust: 'install Rust from https://rustup.rs/',
5
+ };
6
+ export function collectStrictModeIssues(summaries, languagesInScope) {
7
+ const issues = [];
8
+ for (const lang of languagesInScope) {
9
+ const runs = summaries.filter((s) => s.language === lang);
10
+ const allSkipped = runs.length === 0 || runs.every((s) => s.skipped);
11
+ if (!allSkipped) {
12
+ continue;
13
+ }
14
+ const skipReason = runs.find((s) => s.skipReason)?.skipReason;
15
+ const hint = skipReason ?? SKIP_HINTS[lang];
16
+ issues.push({
17
+ severity: 'error',
18
+ source: 'compiler',
19
+ language: lang,
20
+ code: 'CXGRD_STRICT_SKIP',
21
+ message: `Strict mode: ${lang} verification did not run (${hint}). Run \`cxgrd doctor\` for setup help.`,
22
+ });
23
+ }
24
+ return issues;
25
+ }
26
+ export function getSkippedLanguagesInScope(summaries, languagesInScope) {
27
+ return languagesInScope.filter((lang) => {
28
+ const runs = summaries.filter((s) => s.language === lang);
29
+ return runs.length === 0 || runs.every((s) => s.skipped);
30
+ });
31
+ }
32
+ //# sourceMappingURL=strict-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-mode.js","sourceRoot":"","sources":["../../src/check/strict-mode.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,GAAqC;IACnD,UAAU,EAAE,4EAA4E;IACxF,MAAM,EAAE,qBAAqB;IAC7B,IAAI,EAAE,sCAAsC;CAC7C,CAAC;AAEF,MAAM,UAAU,uBAAuB,CACrC,SAA+B,EAC/B,gBAAoC;IAEpC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAErE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;QAC9D,MAAM,IAAI,GAAG,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QAE5C,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,gBAAgB,IAAI,8BAA8B,IAAI,yCAAyC;SACzG,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,SAA+B,EAC/B,gBAAoC;IAEpC,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=strict-mode.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-mode.test.d.ts","sourceRoot":"","sources":["../../src/check/strict-mode.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { collectStrictModeIssues, getSkippedLanguagesInScope } from './strict-mode';
4
+ describe('strict mode', () => {
5
+ it('flags skipped python when project uses python', () => {
6
+ const summaries = [
7
+ {
8
+ language: 'python',
9
+ tool: 'pyright',
10
+ projectRoot: '.',
11
+ passed: true,
12
+ errorCount: 0,
13
+ warningCount: 0,
14
+ skipped: true,
15
+ skipReason: 'pyright not found',
16
+ },
17
+ ];
18
+ const issues = collectStrictModeIssues(summaries, ['python']);
19
+ assert.equal(issues.length, 1);
20
+ assert.equal(issues[0].code, 'CXGRD_STRICT_SKIP');
21
+ });
22
+ it('does not flag typescript when verifier ran', () => {
23
+ const summaries = [
24
+ {
25
+ language: 'typescript',
26
+ tool: 'typescript',
27
+ projectRoot: 'cli',
28
+ passed: true,
29
+ errorCount: 0,
30
+ warningCount: 0,
31
+ skipped: false,
32
+ },
33
+ ];
34
+ const issues = collectStrictModeIssues(summaries, ['typescript', 'python']);
35
+ assert.equal(issues.length, 1);
36
+ assert.equal(issues[0].language, 'python');
37
+ });
38
+ it('lists skipped languages for warnings', () => {
39
+ const summaries = [
40
+ {
41
+ language: 'rust',
42
+ tool: 'cargo',
43
+ projectRoot: '.',
44
+ passed: true,
45
+ errorCount: 0,
46
+ warningCount: 0,
47
+ skipped: true,
48
+ },
49
+ ];
50
+ assert.deepEqual(getSkippedLanguagesInScope(summaries, ['rust']), ['rust']);
51
+ });
52
+ });
53
+ //# sourceMappingURL=strict-mode.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-mode.test.js","sourceRoot":"","sources":["../../src/check/strict-mode.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAGpF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,SAAS,GAAyB;YACtC;gBACE,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,GAAG;gBAChB,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,mBAAmB;aAChC;SACF,CAAC;QACF,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,SAAS,GAAyB;YACtC;gBACE,QAAQ,EAAE,YAAY;gBACtB,IAAI,EAAE,YAAY;gBAClB,WAAW,EAAE,KAAK;gBAClB,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,KAAK;aACf;SACF,CAAC;QACF,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,SAAS,GAAyB;YACtC;gBACE,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,GAAG;gBAChB,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,IAAI;aACd;SACF,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,0BAA0B,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CheckIssue } from './types';
2
+ export declare function runStructuralChecks(graph: any, arch: any): CheckIssue[];
3
+ //# sourceMappingURL=structural-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-checks.d.ts","sourceRoot":"","sources":["../../src/check/structural-checks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,UAAU,EAAE,CA0CvE"}
@@ -0,0 +1,111 @@
1
+ export function runStructuralChecks(graph, arch) {
2
+ const issues = [];
3
+ const circularDeps = findCircularDependencies(graph);
4
+ for (const cycle of circularDeps) {
5
+ issues.push({
6
+ severity: 'error',
7
+ message: `Circular dependency detected: ${cycle.join(' → ')}`,
8
+ source: 'structural',
9
+ });
10
+ }
11
+ const orphanedFiles = findOrphanedFiles(graph);
12
+ for (const file of orphanedFiles.slice(0, 5)) {
13
+ issues.push({
14
+ severity: 'warning',
15
+ message: `Orphaned file: ${file}`,
16
+ file,
17
+ source: 'structural',
18
+ });
19
+ }
20
+ const violations = findArchitectureViolations(graph, arch);
21
+ for (const violation of violations.slice(0, 5)) {
22
+ issues.push({
23
+ severity: 'warning',
24
+ message: violation.message,
25
+ file: violation.file,
26
+ source: 'structural',
27
+ });
28
+ }
29
+ const unusedImports = findUnusedImports(graph);
30
+ for (const unused of unusedImports.slice(0, 3)) {
31
+ issues.push({
32
+ severity: 'info',
33
+ message: `Potentially unused import: ${unused}`,
34
+ source: 'structural',
35
+ });
36
+ }
37
+ return issues;
38
+ }
39
+ function findCircularDependencies(graph) {
40
+ const cycles = [];
41
+ const visited = new Set();
42
+ const recursionStack = new Set();
43
+ function dfs(node, path) {
44
+ visited.add(node);
45
+ recursionStack.add(node);
46
+ path.push(node);
47
+ const fileNode = graph.files?.[node];
48
+ if (fileNode?.dependencies) {
49
+ for (const dep of fileNode.dependencies) {
50
+ if (recursionStack.has(dep.to)) {
51
+ const cycleStart = path.indexOf(dep.to);
52
+ cycles.push(path.slice(cycleStart).concat([dep.to]));
53
+ }
54
+ else if (!visited.has(dep.to)) {
55
+ dfs(dep.to, path);
56
+ }
57
+ }
58
+ }
59
+ path.pop();
60
+ recursionStack.delete(node);
61
+ }
62
+ for (const file of Object.keys(graph.files || {})) {
63
+ if (!visited.has(file)) {
64
+ dfs(file, []);
65
+ }
66
+ }
67
+ return cycles;
68
+ }
69
+ function findOrphanedFiles(graph) {
70
+ const allFiles = Object.keys(graph.files || {});
71
+ const referenced = new Set();
72
+ const referencers = new Set();
73
+ for (const [filePath, node] of Object.entries(graph.files || {})) {
74
+ const fileNode = node;
75
+ referencers.add(filePath);
76
+ for (const dep of fileNode.dependencies || []) {
77
+ referenced.add(dep.to);
78
+ }
79
+ }
80
+ return allFiles.filter((f) => !referenced.has(f) && !referencers.has(f));
81
+ }
82
+ function findArchitectureViolations(graph, arch) {
83
+ const violations = [];
84
+ const utilFiles = arch?.layers?.util || [];
85
+ const serviceFiles = arch?.layers?.service || [];
86
+ for (const utilFile of utilFiles) {
87
+ const node = graph.files?.[utilFile];
88
+ if (node?.dependencies) {
89
+ for (const dep of node.dependencies) {
90
+ if (serviceFiles.some((sf) => dep.to.includes(sf))) {
91
+ violations.push({
92
+ message: 'Util layer file imports from service layer',
93
+ file: utilFile,
94
+ });
95
+ }
96
+ }
97
+ }
98
+ }
99
+ return violations;
100
+ }
101
+ function findUnusedImports(graph) {
102
+ const unused = [];
103
+ for (const [filePath, node] of Object.entries(graph.files || {})) {
104
+ const fileNode = node;
105
+ if (fileNode.dependencies?.length > 20) {
106
+ unused.push(`${filePath} (many imports: ${fileNode.dependencies.length})`);
107
+ }
108
+ }
109
+ return unused;
110
+ }
111
+ //# sourceMappingURL=structural-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-checks.js","sourceRoot":"","sources":["../../src/check/structural-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { CompilerLanguage } from '../toolchain/types';
2
+ export type IssueSeverity = 'error' | 'warning' | 'info';
3
+ export interface CheckIssue {
4
+ severity: IssueSeverity;
5
+ message: string;
6
+ file?: string;
7
+ line?: number;
8
+ column?: number;
9
+ code?: string;
10
+ source: 'structural' | 'compiler';
11
+ language?: string;
12
+ }
13
+ export interface CheckResult {
14
+ passed: boolean;
15
+ issues: CheckIssue[];
16
+ summary: string;
17
+ compilerSummary: CompilerRunSummary[];
18
+ /** Languages in scope whose compiler was skipped (informational when not strict). */
19
+ skippedLanguages: CompilerLanguage[];
20
+ }
21
+ export interface CompilerRunSummary {
22
+ language: string;
23
+ tool: string;
24
+ projectRoot: string;
25
+ passed: boolean;
26
+ errorCount: number;
27
+ warningCount: number;
28
+ skipped: boolean;
29
+ skipReason?: string;
30
+ }
31
+ export type CheckScope = 'all' | 'staged' | 'changed';
32
+ export interface CheckOptions {
33
+ projectPath: string;
34
+ scope: CheckScope;
35
+ skipStructural: boolean;
36
+ skipCompiler: boolean;
37
+ /** Fail when a detected language's compiler did not run (e.g. Pyright missing). */
38
+ strict: boolean;
39
+ }
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/check/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,GAAG,UAAU,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,kBAAkB,EAAE,CAAC;IACtC,qFAAqF;IACrF,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/check/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { CheckIssue, CompilerRunSummary } from '../types';
2
+ import type { PythonProject } from '../project-tooling';
3
+ export declare function verifyPythonProject(project: PythonProject, projectRoot: string): Promise<{
4
+ issues: CheckIssue[];
5
+ summary: CompilerRunSummary;
6
+ }>;
7
+ //# sourceMappingURL=python.d.ts.map