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,80 @@
1
+ /**
2
+ * CLI Output Formatting Utilities
3
+ *
4
+ * Creates formatted tables, boxes, and colored output for better UX
5
+ */
6
+ import chalk from 'chalk';
7
+ export interface TableColumn {
8
+ key: string;
9
+ label: string;
10
+ width?: number;
11
+ align?: 'left' | 'center' | 'right';
12
+ }
13
+ export interface TableRow {
14
+ [key: string]: string | number;
15
+ }
16
+ export declare class CLIFormatter {
17
+ /**
18
+ * Create a formatted table
19
+ */
20
+ static table(columns: TableColumn[], rows: TableRow[]): string;
21
+ /**
22
+ * Create a severity badge
23
+ */
24
+ static severity(level: 'critical' | 'high' | 'medium' | 'low'): string;
25
+ /**
26
+ * Create a progress bar
27
+ */
28
+ static progressBar(current: number, total: number, width?: number): string;
29
+ /**
30
+ * Create a boxed section
31
+ */
32
+ static box(title: string, content: string, width?: number): string;
33
+ /**
34
+ * Create a bullet list with icons
35
+ */
36
+ static list(items: Array<{
37
+ icon?: string;
38
+ text: string;
39
+ color?: typeof chalk;
40
+ }>, indent?: number): string;
41
+ /**
42
+ * Create a diff-style output
43
+ */
44
+ static diff(before: string[], after: string[]): string;
45
+ /**
46
+ * Create a stats overview
47
+ */
48
+ static stats(data: Record<string, string | number>): string;
49
+ /**
50
+ * Create a warning banner
51
+ */
52
+ static warning(message: string): string;
53
+ /**
54
+ * Create an error banner
55
+ */
56
+ static error(message: string): string;
57
+ /**
58
+ * Create a success banner
59
+ */
60
+ static success(message: string): string;
61
+ /**
62
+ * Pad cell content
63
+ */
64
+ private static padCell;
65
+ }
66
+ /**
67
+ * Rich console output helper
68
+ */
69
+ export declare class RichOutput {
70
+ static header(title: string): void;
71
+ static section(title: string): void;
72
+ static info(message: string): void;
73
+ static success(message: string): void;
74
+ static warning(message: string): void;
75
+ static error(message: string): void;
76
+ static tip(message: string): void;
77
+ static debug(message: string): void;
78
+ static blank(): void;
79
+ }
80
+ //# sourceMappingURL=cli-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-formatter.d.ts","sourceRoot":"","sources":["../../src/utils/cli-formatter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,qBAAa,YAAY;IACvB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM;IAoC9D;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM;IAUtE;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM;IAW9E;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM;IAoBtE;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;KAAE,CAAC,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM;IAW5G;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IA8BtD;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM;IAY3D;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMvC;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMrC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMvC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,OAAO;CAavB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMlC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKnC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * CLI Output Formatting Utilities
3
+ *
4
+ * Creates formatted tables, boxes, and colored output for better UX
5
+ */
6
+ import chalk from 'chalk';
7
+ export class CLIFormatter {
8
+ /**
9
+ * Create a formatted table
10
+ */
11
+ static table(columns, rows) {
12
+ if (rows.length === 0) {
13
+ return chalk.gray(' (no data)');
14
+ }
15
+ // Calculate column widths
16
+ const widths = new Map();
17
+ for (const col of columns) {
18
+ let maxWidth = col.label.length;
19
+ for (const row of rows) {
20
+ const value = String(row[col.key] || '');
21
+ maxWidth = Math.max(maxWidth, value.length);
22
+ }
23
+ widths.set(col.key, Math.min(maxWidth, col.width || 50) + 2);
24
+ }
25
+ // Build header
26
+ let result = ' ' + columns
27
+ .map(col => this.padCell(col.label, widths.get(col.key) || 10, 'left'))
28
+ .join('');
29
+ result += '\n ' + columns
30
+ .map(col => '─'.repeat(widths.get(col.key) || 10))
31
+ .join('');
32
+ result += '\n';
33
+ // Build rows
34
+ for (const row of rows) {
35
+ result += ' ' + columns
36
+ .map(col => this.padCell(String(row[col.key] || ''), widths.get(col.key) || 10, col.align || 'left'))
37
+ .join('');
38
+ result += '\n';
39
+ }
40
+ return result;
41
+ }
42
+ /**
43
+ * Create a severity badge
44
+ */
45
+ static severity(level) {
46
+ const badges = {
47
+ critical: chalk.bgRed.white(' CRITICAL '),
48
+ high: chalk.bgYellow.black(' HIGH '),
49
+ medium: chalk.bgCyan.black(' MEDIUM '),
50
+ low: chalk.bgGreen.black(' LOW '),
51
+ };
52
+ return badges[level] || level;
53
+ }
54
+ /**
55
+ * Create a progress bar
56
+ */
57
+ static progressBar(current, total, width = 20) {
58
+ const percentage = current / total;
59
+ const filled = Math.round(width * percentage);
60
+ const empty = width - filled;
61
+ const bar = '█'.repeat(filled) + '░'.repeat(empty);
62
+ const percent = Math.round(percentage * 100);
63
+ return `[${bar}] ${percent}%`;
64
+ }
65
+ /**
66
+ * Create a boxed section
67
+ */
68
+ static box(title, content, width = 60) {
69
+ const titleBox = ` ${title} `;
70
+ const padding = width - titleBox.length;
71
+ const leftPad = Math.floor(padding / 2);
72
+ const rightPad = padding - leftPad;
73
+ let result = '┌' + '─'.repeat(leftPad) + titleBox + '─'.repeat(rightPad) + '┐\n';
74
+ const lines = content.split('\n');
75
+ for (const line of lines) {
76
+ const contentWidth = width - 2;
77
+ const paddedLine = line.padEnd(contentWidth);
78
+ result += '│ ' + paddedLine + ' │\n';
79
+ }
80
+ result += '└' + '─'.repeat(width) + '┘';
81
+ return result;
82
+ }
83
+ /**
84
+ * Create a bullet list with icons
85
+ */
86
+ static list(items, indent = 3) {
87
+ return items
88
+ .map(item => {
89
+ const icon = item.icon || '•';
90
+ const spaces = ' '.repeat(indent);
91
+ const colored = item.color ? item.color(item.text) : item.text;
92
+ return `${spaces}${icon} ${colored}`;
93
+ })
94
+ .join('\n');
95
+ }
96
+ /**
97
+ * Create a diff-style output
98
+ */
99
+ static diff(before, after) {
100
+ let result = '';
101
+ const beforeSet = new Set(before);
102
+ const afterSet = new Set(after);
103
+ // Added lines
104
+ for (const line of after) {
105
+ if (!beforeSet.has(line)) {
106
+ result += chalk.green(`+ ${line}\n`);
107
+ }
108
+ }
109
+ // Removed lines
110
+ for (const line of before) {
111
+ if (!afterSet.has(line)) {
112
+ result += chalk.red(`- ${line}\n`);
113
+ }
114
+ }
115
+ // Unchanged
116
+ for (const line of before) {
117
+ if (afterSet.has(line)) {
118
+ result += chalk.gray(` ${line}\n`);
119
+ }
120
+ }
121
+ return result;
122
+ }
123
+ /**
124
+ * Create a stats overview
125
+ */
126
+ static stats(data) {
127
+ const entries = Object.entries(data);
128
+ const maxKeyLength = Math.max(...entries.map(([k]) => k.length));
129
+ return entries
130
+ .map(([key, value]) => {
131
+ const paddedKey = key.padEnd(maxKeyLength);
132
+ return ` ${chalk.cyan(paddedKey)} : ${chalk.bold(value)}`;
133
+ })
134
+ .join('\n');
135
+ }
136
+ /**
137
+ * Create a warning banner
138
+ */
139
+ static warning(message) {
140
+ return chalk.yellow('\n⚠️ ' + message + '\n');
141
+ }
142
+ /**
143
+ * Create an error banner
144
+ */
145
+ static error(message) {
146
+ return chalk.red('\n✗ ' + message + '\n');
147
+ }
148
+ /**
149
+ * Create a success banner
150
+ */
151
+ static success(message) {
152
+ return chalk.green('\n✓ ' + message + '\n');
153
+ }
154
+ /**
155
+ * Pad cell content
156
+ */
157
+ static padCell(content, width, align = 'left') {
158
+ const truncated = content.length > width ? content.substring(0, width - 1) + '…' : content;
159
+ switch (align) {
160
+ case 'right':
161
+ return truncated.padStart(width);
162
+ case 'center':
163
+ const leftPad = Math.floor((width - truncated.length) / 2);
164
+ return ' '.repeat(leftPad) + truncated.padEnd(width - leftPad);
165
+ default:
166
+ return truncated.padEnd(width);
167
+ }
168
+ }
169
+ }
170
+ /**
171
+ * Rich console output helper
172
+ */
173
+ export class RichOutput {
174
+ static header(title) {
175
+ console.log('\n' + chalk.cyan('═'.repeat(title.length + 4)));
176
+ console.log(chalk.cyan(` ${title}`));
177
+ console.log(chalk.cyan('═'.repeat(title.length + 4)) + '\n');
178
+ }
179
+ static section(title) {
180
+ console.log('\n' + chalk.blue(`▶ ${title}`));
181
+ console.log(chalk.gray('─'.repeat(title.length + 2)) + '\n');
182
+ }
183
+ static info(message) {
184
+ console.log(chalk.blue(`ℹ ${message}`));
185
+ }
186
+ static success(message) {
187
+ console.log(chalk.green(`✓ ${message}`));
188
+ }
189
+ static warning(message) {
190
+ console.log(chalk.yellow(`⚠ ${message}`));
191
+ }
192
+ static error(message) {
193
+ console.log(chalk.red(`✗ ${message}`));
194
+ }
195
+ static tip(message) {
196
+ console.log(chalk.cyan(`💡 ${message}`));
197
+ }
198
+ static debug(message) {
199
+ console.log(chalk.gray(`[DEBUG] ${message}`));
200
+ }
201
+ static blank() {
202
+ console.log('');
203
+ }
204
+ }
205
+ //# sourceMappingURL=cli-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-formatter.js","sourceRoot":"","sources":["../../src/utils/cli-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Git Hook Manager
3
+ *
4
+ * Manages pre-commit hooks integration with cxgrd
5
+ */
6
+ export interface HookConfig {
7
+ enabled: boolean;
8
+ blockOnCritical: boolean;
9
+ blockOnHigh: boolean;
10
+ warnOnMedium: boolean;
11
+ autoFixSuggestions: boolean;
12
+ ignoredPatterns: string[];
13
+ riskThreshold: number;
14
+ notifySlack?: string;
15
+ }
16
+ export declare class GitHookManager {
17
+ private projectRoot;
18
+ private hooksDir;
19
+ private gitDir;
20
+ private cgDir;
21
+ constructor(projectRoot: string);
22
+ /**
23
+ * Initialize pre-commit hook setup
24
+ */
25
+ setupHooks(config?: Partial<HookConfig>): Promise<void>;
26
+ /**
27
+ * Create the actual pre-commit hook script
28
+ */
29
+ private createPreCommitHook;
30
+ private createWindowsHook;
31
+ /**
32
+ * Write hook configuration to .cg/hooks.json
33
+ */
34
+ private writeHookConfig;
35
+ /**
36
+ * Read hook configuration
37
+ */
38
+ readHookConfig(): HookConfig | null;
39
+ /**
40
+ * Make file executable — uses Node's chmodSync (cross-platform safe)
41
+ * On Windows this is a no-op but won't throw
42
+ */
43
+ private makeExecutable;
44
+ /**
45
+ * Check if hooks are installed
46
+ */
47
+ isInstalled(): boolean;
48
+ /**
49
+ * Uninstall hooks — uses Node's unlinkSync instead of shell rm
50
+ */
51
+ uninstallHooks(): Promise<void>;
52
+ /**
53
+ * Get hooks status
54
+ */
55
+ getStatus(): {
56
+ installed: boolean;
57
+ enabled: boolean;
58
+ config: HookConfig | null;
59
+ };
60
+ /**
61
+ * Enable/disable hooks
62
+ */
63
+ setEnabled(enabled: boolean): void;
64
+ /**
65
+ * Update risk threshold
66
+ */
67
+ setRiskThreshold(threshold: number): void;
68
+ /**
69
+ * Get staged files
70
+ */
71
+ getStagedFiles(): string[];
72
+ /**
73
+ * Check if file matches ignored patterns
74
+ */
75
+ isIgnored(filePath: string, patterns: string[]): boolean;
76
+ /**
77
+ * Get all staged files not matching ignore patterns
78
+ */
79
+ getRelevantStagedFiles(ignorePatterns: string[]): string[];
80
+ }
81
+ //# sourceMappingURL=git-hook-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-hook-manager.d.ts","sourceRoot":"","sources":["../../src/utils/git-hook-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,WAAW,EAAE,MAAM;IAO/B;;OAEG;IACG,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC7D;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0C3B,OAAO,CAAC,iBAAiB;IAezB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,cAAc,IAAI,UAAU,GAAG,IAAI;IAUnC;;;OAGG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,WAAW,IAAI,OAAO;IAWtB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAYrC;;OAEG;IACH,SAAS,IAAI;QACX,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;KAC3B;IASD;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IASlC;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IASzC;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAY1B;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO;IAYxD;;OAEG;IACH,sBAAsB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CAK3D"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Git Hook Manager
3
+ *
4
+ * Manages pre-commit hooks integration with cxgrd
5
+ */
6
+ import { execSync } from 'child_process';
7
+ import { writeFileSync, readFileSync, existsSync, mkdirSync, chmodSync, unlinkSync } from 'fs';
8
+ import { resolve } from 'path';
9
+ export class GitHookManager {
10
+ constructor(projectRoot) {
11
+ this.projectRoot = projectRoot;
12
+ this.gitDir = resolve(projectRoot, '.git');
13
+ this.hooksDir = resolve(this.gitDir, 'hooks');
14
+ this.cgDir = resolve(projectRoot, '.cg');
15
+ }
16
+ /**
17
+ * Initialize pre-commit hook setup
18
+ */
19
+ async setupHooks(config) {
20
+ const fullConfig = {
21
+ enabled: true,
22
+ blockOnCritical: true,
23
+ blockOnHigh: false,
24
+ warnOnMedium: true,
25
+ autoFixSuggestions: true,
26
+ ignoredPatterns: ['**/*.test.ts', '**/*.spec.ts', 'docs/**', '*.md'],
27
+ riskThreshold: 70,
28
+ ...config,
29
+ };
30
+ // Create .cg directory if needed
31
+ if (!existsSync(this.cgDir)) {
32
+ mkdirSync(this.cgDir, { recursive: true });
33
+ }
34
+ // Create hooks directory if needed
35
+ if (!existsSync(this.hooksDir)) {
36
+ mkdirSync(this.hooksDir, { recursive: true });
37
+ }
38
+ if (process.platform === 'win32') {
39
+ this.createWindowsHook();
40
+ }
41
+ // Save hook configuration
42
+ this.writeHookConfig(fullConfig);
43
+ // Create pre-commit hook script
44
+ this.createPreCommitHook();
45
+ // Make hook executable using Node fs (cross-platform)
46
+ this.makeExecutable(resolve(this.hooksDir, 'pre-commit'));
47
+ }
48
+ /**
49
+ * Create the actual pre-commit hook script
50
+ */
51
+ createPreCommitHook() {
52
+ const hookScript = `#!/bin/sh
53
+ # cxgrd pre-commit hook
54
+ # Prevents commits that break the architecture
55
+
56
+ # Get the project root
57
+ PROJECT_ROOT="$(git rev-parse --show-toplevel)"
58
+ CG_DIR="$PROJECT_ROOT/.cg"
59
+ HOOK_CONFIG="$CG_DIR/hooks.json"
60
+
61
+ # Check if cxgrd is available
62
+ if ! command -v cxgrd > /dev/null 2>&1; then
63
+ echo "warning: cxgrd not found in PATH. Skipping architecture check."
64
+ exit 0
65
+ fi
66
+
67
+ # Check if hook config exists
68
+ if [ ! -f "$HOOK_CONFIG" ]; then
69
+ exit 0
70
+ fi
71
+
72
+ # Get staged files
73
+ STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACMRUXB)
74
+
75
+ if [ -z "$STAGED_FILES" ]; then
76
+ exit 0
77
+ fi
78
+
79
+ echo "Running cxgrd team pre-commit (policy + check)..."
80
+
81
+ # Team policy + blast radius + check (falls back to check-only on Free/Pro)
82
+ if ! cxgrd team precommit "$PROJECT_ROOT"; then
83
+ echo "Architecture check failed. Commit blocked."
84
+ exit 1
85
+ fi
86
+
87
+ exit 0
88
+ `;
89
+ writeFileSync(resolve(this.hooksDir, 'pre-commit'), hookScript, { encoding: 'utf-8' });
90
+ }
91
+ createWindowsHook() {
92
+ const batScript = `@echo off
93
+ git diff --cached --name-only --diff-filter=ACMRUXB > nul 2>&1
94
+ if %errorlevel% neq 0 exit /b 0
95
+ echo Running cxgrd team precommit...
96
+ cxgrd team precommit
97
+ if %errorlevel% neq 0 (
98
+ echo Architecture check failed. Commit blocked.
99
+ exit /b 1
100
+ )
101
+ exit /b 0
102
+ `;
103
+ writeFileSync(resolve(this.hooksDir, 'pre-commit.bat'), batScript, { encoding: 'utf-8' });
104
+ }
105
+ /**
106
+ * Write hook configuration to .cg/hooks.json
107
+ */
108
+ writeHookConfig(config) {
109
+ const configPath = resolve(this.cgDir, 'hooks.json');
110
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
111
+ }
112
+ /**
113
+ * Read hook configuration
114
+ */
115
+ readHookConfig() {
116
+ const configPath = resolve(this.cgDir, 'hooks.json');
117
+ if (!existsSync(configPath))
118
+ return null;
119
+ try {
120
+ return JSON.parse(readFileSync(configPath, 'utf-8'));
121
+ }
122
+ catch {
123
+ return null;
124
+ }
125
+ }
126
+ /**
127
+ * Make file executable — uses Node's chmodSync (cross-platform safe)
128
+ * On Windows this is a no-op but won't throw
129
+ */
130
+ makeExecutable(filePath) {
131
+ try {
132
+ // 0o755 = rwxr-xr-x — works on macOS/Linux, silently ignored on Windows
133
+ chmodSync(filePath, 0o755);
134
+ }
135
+ catch {
136
+ // Silently ignore — Windows doesn't support Unix permissions
137
+ }
138
+ }
139
+ /**
140
+ * Check if hooks are installed
141
+ */
142
+ isInstalled() {
143
+ const hookPath = resolve(this.hooksDir, 'pre-commit');
144
+ if (!existsSync(hookPath))
145
+ return false;
146
+ try {
147
+ const content = readFileSync(hookPath, 'utf-8');
148
+ return content.includes('cxgrd');
149
+ }
150
+ catch {
151
+ return false;
152
+ }
153
+ }
154
+ /**
155
+ * Uninstall hooks — uses Node's unlinkSync instead of shell rm
156
+ */
157
+ async uninstallHooks() {
158
+ const hookPath = resolve(this.hooksDir, 'pre-commit');
159
+ if (existsSync(hookPath)) {
160
+ try {
161
+ unlinkSync(hookPath);
162
+ }
163
+ catch { /* ignore */ }
164
+ }
165
+ const configPath = resolve(this.cgDir, 'hooks.json');
166
+ if (existsSync(configPath)) {
167
+ try {
168
+ unlinkSync(configPath);
169
+ }
170
+ catch { /* ignore */ }
171
+ }
172
+ }
173
+ /**
174
+ * Get hooks status
175
+ */
176
+ getStatus() {
177
+ const config = this.readHookConfig();
178
+ return {
179
+ installed: this.isInstalled(),
180
+ enabled: config?.enabled ?? false,
181
+ config,
182
+ };
183
+ }
184
+ /**
185
+ * Enable/disable hooks
186
+ */
187
+ setEnabled(enabled) {
188
+ const config = this.readHookConfig();
189
+ if (config) {
190
+ config.enabled = enabled;
191
+ const configPath = resolve(this.cgDir, 'hooks.json');
192
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
193
+ }
194
+ }
195
+ /**
196
+ * Update risk threshold
197
+ */
198
+ setRiskThreshold(threshold) {
199
+ const config = this.readHookConfig();
200
+ if (config) {
201
+ config.riskThreshold = Math.max(0, Math.min(100, threshold));
202
+ const configPath = resolve(this.cgDir, 'hooks.json');
203
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
204
+ }
205
+ }
206
+ /**
207
+ * Get staged files
208
+ */
209
+ getStagedFiles() {
210
+ try {
211
+ const output = execSync('git diff --cached --name-only --diff-filter=ACMRUXB', {
212
+ cwd: this.projectRoot,
213
+ encoding: 'utf-8',
214
+ });
215
+ return output.split('\n').filter(f => f.length > 0);
216
+ }
217
+ catch {
218
+ return [];
219
+ }
220
+ }
221
+ /**
222
+ * Check if file matches ignored patterns
223
+ */
224
+ isIgnored(filePath, patterns) {
225
+ for (const pattern of patterns) {
226
+ const regexPattern = pattern
227
+ .replace(/\./g, '\\.')
228
+ .replace(/\*\*/g, '.*')
229
+ .replace(/\*/g, '[^/]*')
230
+ .replace(/\?/g, '.');
231
+ if (new RegExp(`^${regexPattern}$`).test(filePath))
232
+ return true;
233
+ }
234
+ return false;
235
+ }
236
+ /**
237
+ * Get all staged files not matching ignore patterns
238
+ */
239
+ getRelevantStagedFiles(ignorePatterns) {
240
+ return this.getStagedFiles().filter(file => !this.isIgnored(file, ignorePatterns));
241
+ }
242
+ }
243
+ //# sourceMappingURL=git-hook-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-hook-manager.js","sourceRoot":"","sources":["../../src/utils/git-hook-manager.ts"],"names":[],"mappings":"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"}