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.
- package/README.md +221 -0
- package/dist/auth/audit-usage.d.ts +30 -0
- package/dist/auth/audit-usage.d.ts.map +1 -0
- package/dist/auth/audit-usage.js +104 -0
- package/dist/auth/audit-usage.js.map +1 -0
- package/dist/auth/auth-session.d.ts +17 -0
- package/dist/auth/auth-session.d.ts.map +1 -0
- package/dist/auth/auth-session.js +102 -0
- package/dist/auth/auth-session.js.map +1 -0
- package/dist/auth/auth-store.d.ts +17 -0
- package/dist/auth/auth-store.d.ts.map +1 -0
- package/dist/auth/auth-store.js +44 -0
- package/dist/auth/auth-store.js.map +1 -0
- package/dist/auth/entitlements.d.ts +14 -0
- package/dist/auth/entitlements.d.ts.map +1 -0
- package/dist/auth/entitlements.js +62 -0
- package/dist/auth/entitlements.js.map +1 -0
- package/dist/auth/open-browser.d.ts +2 -0
- package/dist/auth/open-browser.d.ts.map +1 -0
- package/dist/auth/open-browser.js +20 -0
- package/dist/auth/open-browser.js.map +1 -0
- package/dist/auth/plans.d.ts +10 -0
- package/dist/auth/plans.d.ts.map +1 -0
- package/dist/auth/plans.js +37 -0
- package/dist/auth/plans.js.map +1 -0
- package/dist/auth/plans.test.d.ts +2 -0
- package/dist/auth/plans.test.d.ts.map +1 -0
- package/dist/auth/plans.test.js +23 -0
- package/dist/auth/plans.test.js.map +1 -0
- package/dist/cg-directory.d.ts +37 -0
- package/dist/cg-directory.d.ts.map +1 -0
- package/dist/cg-directory.js +129 -0
- package/dist/cg-directory.js.map +1 -0
- package/dist/check/check-runner.d.ts +3 -0
- package/dist/check/check-runner.d.ts.map +1 -0
- package/dist/check/check-runner.js +48 -0
- package/dist/check/check-runner.js.map +1 -0
- package/dist/check/compiler-service.d.ts +6 -0
- package/dist/check/compiler-service.d.ts.map +1 -0
- package/dist/check/compiler-service.js +69 -0
- package/dist/check/compiler-service.js.map +1 -0
- package/dist/check/parsers/cargo.d.ts +3 -0
- package/dist/check/parsers/cargo.d.ts.map +1 -0
- package/dist/check/parsers/cargo.js +34 -0
- package/dist/check/parsers/cargo.js.map +1 -0
- package/dist/check/parsers/parsers.test.d.ts +2 -0
- package/dist/check/parsers/parsers.test.d.ts.map +1 -0
- package/dist/check/parsers/parsers.test.js +51 -0
- package/dist/check/parsers/parsers.test.js.map +1 -0
- package/dist/check/parsers/pyright.d.ts +3 -0
- package/dist/check/parsers/pyright.d.ts.map +1 -0
- package/dist/check/parsers/pyright.js +27 -0
- package/dist/check/parsers/pyright.js.map +1 -0
- package/dist/check/parsers/tsc-cli.d.ts +3 -0
- package/dist/check/parsers/tsc-cli.d.ts.map +1 -0
- package/dist/check/parsers/tsc-cli.js +22 -0
- package/dist/check/parsers/tsc-cli.js.map +1 -0
- package/dist/check/project-tooling.d.ts +18 -0
- package/dist/check/project-tooling.d.ts.map +1 -0
- package/dist/check/project-tooling.js +105 -0
- package/dist/check/project-tooling.js.map +1 -0
- package/dist/check/run-command.d.ts +8 -0
- package/dist/check/run-command.d.ts.map +1 -0
- package/dist/check/run-command.js +50 -0
- package/dist/check/run-command.js.map +1 -0
- package/dist/check/scope.d.ts +11 -0
- package/dist/check/scope.d.ts.map +1 -0
- package/dist/check/scope.js +46 -0
- package/dist/check/scope.js.map +1 -0
- package/dist/check/scope.test.d.ts +2 -0
- package/dist/check/scope.test.d.ts.map +1 -0
- package/dist/check/scope.test.js +15 -0
- package/dist/check/scope.test.js.map +1 -0
- package/dist/check/strict-mode.d.ts +5 -0
- package/dist/check/strict-mode.d.ts.map +1 -0
- package/dist/check/strict-mode.js +32 -0
- package/dist/check/strict-mode.js.map +1 -0
- package/dist/check/strict-mode.test.d.ts +2 -0
- package/dist/check/strict-mode.test.d.ts.map +1 -0
- package/dist/check/strict-mode.test.js +53 -0
- package/dist/check/strict-mode.test.js.map +1 -0
- package/dist/check/structural-checks.d.ts +3 -0
- package/dist/check/structural-checks.d.ts.map +1 -0
- package/dist/check/structural-checks.js +111 -0
- package/dist/check/structural-checks.js.map +1 -0
- package/dist/check/types.d.ts +40 -0
- package/dist/check/types.d.ts.map +1 -0
- package/dist/check/types.js +2 -0
- package/dist/check/types.js.map +1 -0
- package/dist/check/verifiers/python.d.ts +7 -0
- package/dist/check/verifiers/python.d.ts.map +1 -0
- package/dist/check/verifiers/python.js +43 -0
- package/dist/check/verifiers/python.js.map +1 -0
- package/dist/check/verifiers/rust.d.ts +7 -0
- package/dist/check/verifiers/rust.d.ts.map +1 -0
- package/dist/check/verifiers/rust.js +39 -0
- package/dist/check/verifiers/rust.js.map +1 -0
- package/dist/check/verifiers/typescript.d.ts +7 -0
- package/dist/check/verifiers/typescript.d.ts.map +1 -0
- package/dist/check/verifiers/typescript.js +108 -0
- package/dist/check/verifiers/typescript.js.map +1 -0
- package/dist/commands/auth.d.ts +4 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +51 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/check.d.ts +9 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +145 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +76 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init-hooks.d.ts +15 -0
- package/dist/commands/init-hooks.d.ts.map +1 -0
- package/dist/commands/init-hooks.js +102 -0
- package/dist/commands/init-hooks.js.map +1 -0
- package/dist/commands/input.d.ts +2 -0
- package/dist/commands/input.d.ts.map +1 -0
- package/dist/commands/input.js +139 -0
- package/dist/commands/input.js.map +1 -0
- package/dist/commands/prompt.d.ts +2 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +70 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/scan.d.ts +5 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +163 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/watch.d.ts +11 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +74 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config/env.d.ts +5 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +60 -0
- package/dist/config/env.js.map +1 -0
- package/dist/graph.d.ts +34 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +123 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +176 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/pattern-analyzer.d.ts +17 -0
- package/dist/memory/pattern-analyzer.d.ts.map +1 -0
- package/dist/memory/pattern-analyzer.js +56 -0
- package/dist/memory/pattern-analyzer.js.map +1 -0
- package/dist/memory/repo-memory.d.ts +14 -0
- package/dist/memory/repo-memory.d.ts.map +1 -0
- package/dist/memory/repo-memory.js +71 -0
- package/dist/memory/repo-memory.js.map +1 -0
- package/dist/memory/types.d.ts +32 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/prompt/llm-client.d.ts +8 -0
- package/dist/prompt/llm-client.d.ts.map +1 -0
- package/dist/prompt/llm-client.js +96 -0
- package/dist/prompt/llm-client.js.map +1 -0
- package/dist/prompt/subgraph.d.ts +26 -0
- package/dist/prompt/subgraph.d.ts.map +1 -0
- package/dist/prompt/subgraph.js +96 -0
- package/dist/prompt/subgraph.js.map +1 -0
- package/dist/scanner.d.ts +13 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +92 -0
- package/dist/scanner.js.map +1 -0
- package/dist/team/audit.d.ts +4 -0
- package/dist/team/audit.d.ts.map +1 -0
- package/dist/team/audit.js +16 -0
- package/dist/team/audit.js.map +1 -0
- package/dist/team/cloud-client.d.ts +7 -0
- package/dist/team/cloud-client.d.ts.map +1 -0
- package/dist/team/cloud-client.js +106 -0
- package/dist/team/cloud-client.js.map +1 -0
- package/dist/team/dev-store.d.ts +9 -0
- package/dist/team/dev-store.d.ts.map +1 -0
- package/dist/team/dev-store.js +69 -0
- package/dist/team/dev-store.js.map +1 -0
- package/dist/team/graph-sync.d.ts +10 -0
- package/dist/team/graph-sync.d.ts.map +1 -0
- package/dist/team/graph-sync.js +78 -0
- package/dist/team/graph-sync.js.map +1 -0
- package/dist/team/policy-cache.d.ts +7 -0
- package/dist/team/policy-cache.d.ts.map +1 -0
- package/dist/team/policy-cache.js +31 -0
- package/dist/team/policy-cache.js.map +1 -0
- package/dist/team/policy-engine.d.ts +3 -0
- package/dist/team/policy-engine.d.ts.map +1 -0
- package/dist/team/policy-engine.js +35 -0
- package/dist/team/policy-engine.js.map +1 -0
- package/dist/team/policy-engine.test.d.ts +2 -0
- package/dist/team/policy-engine.test.d.ts.map +1 -0
- package/dist/team/policy-engine.test.js +29 -0
- package/dist/team/policy-engine.test.js.map +1 -0
- package/dist/team/repo-identity.d.ts +7 -0
- package/dist/team/repo-identity.d.ts.map +1 -0
- package/dist/team/repo-identity.js +41 -0
- package/dist/team/repo-identity.js.map +1 -0
- package/dist/team/types.d.ts +53 -0
- package/dist/team/types.d.ts.map +1 -0
- package/dist/team/types.js +2 -0
- package/dist/team/types.js.map +1 -0
- package/dist/toolchain/probe.d.ts +9 -0
- package/dist/toolchain/probe.d.ts.map +1 -0
- package/dist/toolchain/probe.js +123 -0
- package/dist/toolchain/probe.js.map +1 -0
- package/dist/toolchain/project-languages.d.ts +4 -0
- package/dist/toolchain/project-languages.d.ts.map +1 -0
- package/dist/toolchain/project-languages.js +41 -0
- package/dist/toolchain/project-languages.js.map +1 -0
- package/dist/toolchain/types.d.ts +32 -0
- package/dist/toolchain/types.d.ts.map +1 -0
- package/dist/toolchain/types.js +2 -0
- package/dist/toolchain/types.js.map +1 -0
- package/dist/utils/blast-radius-analyzer.d.ts +95 -0
- package/dist/utils/blast-radius-analyzer.d.ts.map +1 -0
- package/dist/utils/blast-radius-analyzer.js +277 -0
- package/dist/utils/blast-radius-analyzer.js.map +1 -0
- package/dist/utils/change-detector.d.ts +43 -0
- package/dist/utils/change-detector.d.ts.map +1 -0
- package/dist/utils/change-detector.js +190 -0
- package/dist/utils/change-detector.js.map +1 -0
- package/dist/utils/cli-formatter.d.ts +80 -0
- package/dist/utils/cli-formatter.d.ts.map +1 -0
- package/dist/utils/cli-formatter.js +205 -0
- package/dist/utils/cli-formatter.js.map +1 -0
- package/dist/utils/git-hook-manager.d.ts +81 -0
- package/dist/utils/git-hook-manager.d.ts.map +1 -0
- package/dist/utils/git-hook-manager.js +243 -0
- package/dist/utils/git-hook-manager.js.map +1 -0
- package/dist/utils/project-watcher.d.ts +91 -0
- package/dist/utils/project-watcher.d.ts.map +1 -0
- package/dist/utils/project-watcher.js +215 -0
- package/dist/utils/project-watcher.js.map +1 -0
- 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":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAa1B,MAAM,OAAO,YAAY;IACvB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAsB,EAAE,IAAgB;QACnD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpC,CAAC;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;YAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9C,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,eAAe;QACf,IAAI,MAAM,GAAG,KAAK,GAAG,OAAO;aACzB,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;aACtE,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,IAAI,OAAO,GAAG,OAAO;aACxB,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;aACjD,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,IAAI,IAAI,CAAC;QAEf,aAAa;QACb,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,GAAG,OAAO;iBACtB,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;iBACpG,IAAI,CAAC,EAAE,CAAC,CAAC;YACZ,MAAM,IAAI,IAAI,CAAC;QACjB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,KAA6C;QAC3D,MAAM,MAAM,GAA2B;YACrC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;YACzC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;YACpC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;YACtC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;SAClC,CAAC;QACF,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAe,EAAE,KAAa,EAAE,QAAgB,EAAE;QACnE,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;QAE7B,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;QAE7C,OAAO,IAAI,GAAG,KAAK,OAAO,GAAG,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,QAAgB,EAAE;QAC3D,MAAM,QAAQ,GAAG,IAAI,KAAK,GAAG,CAAC;QAC9B,MAAM,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;QAEnC,IAAI,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QAEjF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,IAAI,IAAI,GAAG,UAAU,GAAG,MAAM,CAAC;QACvC,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;QAExC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,KAAmE,EAAE,SAAiB,CAAC;QACjG,OAAO,KAAK;aACT,GAAG,CAAC,IAAI,CAAC,EAAE;YACV,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;YAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC/D,OAAO,GAAG,MAAM,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;QACvC,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAgB,EAAE,KAAe;QAC3C,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAEhC,cAAc;QACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,YAAY;QACZ,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,IAAqC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAEjE,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACpB,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3C,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAe;QAC5B,OAAO,KAAK,CAAC,MAAM,CACjB,QAAQ,GAAG,OAAO,GAAG,IAAI,CAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAe;QAC1B,OAAO,KAAK,CAAC,GAAG,CACd,MAAM,GAAG,OAAO,GAAG,IAAI,CACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAe;QAC5B,OAAO,KAAK,CAAC,KAAK,CAChB,MAAM,GAAG,OAAO,GAAG,IAAI,CACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,OAAO,CAAC,OAAe,EAAE,KAAa,EAAE,QAAqC,MAAM;QAChG,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QAE3F,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,OAAO;gBACV,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACnC,KAAK,QAAQ;gBACX,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3D,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC;YACjE;gBACE,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,UAAU;IACrB,MAAM,CAAC,MAAM,CAAC,KAAa;QACzB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,KAAa;QAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAe;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,OAAe;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,OAAe;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,OAAe;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,KAAK;QACV,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -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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"}
|