@greenarmor/ges 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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +74 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +34 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/audit.d.ts +2 -0
  7. package/dist/commands/audit.js +107 -0
  8. package/dist/commands/audit.js.map +1 -0
  9. package/dist/commands/compliance.d.ts +2 -0
  10. package/dist/commands/compliance.js +32 -0
  11. package/dist/commands/compliance.js.map +1 -0
  12. package/dist/commands/doctor.d.ts +2 -0
  13. package/dist/commands/doctor.js +60 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/generate.d.ts +2 -0
  16. package/dist/commands/generate.js +47 -0
  17. package/dist/commands/generate.js.map +1 -0
  18. package/dist/commands/init.d.ts +2 -0
  19. package/dist/commands/init.js +112 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/mcp-setup.d.ts +2 -0
  22. package/dist/commands/mcp-setup.js +206 -0
  23. package/dist/commands/mcp-setup.js.map +1 -0
  24. package/dist/commands/mcp.d.ts +2 -0
  25. package/dist/commands/mcp.js +50 -0
  26. package/dist/commands/mcp.js.map +1 -0
  27. package/dist/commands/policy.d.ts +2 -0
  28. package/dist/commands/policy.js +50 -0
  29. package/dist/commands/policy.js.map +1 -0
  30. package/dist/commands/report.d.ts +2 -0
  31. package/dist/commands/report.js +51 -0
  32. package/dist/commands/report.js.map +1 -0
  33. package/dist/commands/scan.d.ts +2 -0
  34. package/dist/commands/scan.js +19 -0
  35. package/dist/commands/scan.js.map +1 -0
  36. package/dist/commands/score.d.ts +2 -0
  37. package/dist/commands/score.js +33 -0
  38. package/dist/commands/score.js.map +1 -0
  39. package/dist/commands/update.d.ts +2 -0
  40. package/dist/commands/update.js +9 -0
  41. package/dist/commands/update.js.map +1 -0
  42. package/dist/commands/validate.d.ts +2 -0
  43. package/dist/commands/validate.js +63 -0
  44. package/dist/commands/validate.js.map +1 -0
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.js +2 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/utils/project.d.ts +6 -0
  49. package/dist/utils/project.js +41 -0
  50. package/dist/utils/project.js.map +1 -0
  51. package/package.json +60 -0
@@ -0,0 +1,206 @@
1
+ import { Command } from "commander";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import * as os from "node:os";
5
+ import * as url from "node:url";
6
+ import { select } from "@inquirer/prompts";
7
+ const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
8
+ const SERVER_NAME = "gesf";
9
+ const CLIENTS = [
10
+ {
11
+ id: "claude-desktop",
12
+ name: "Claude Desktop",
13
+ configPaths: [
14
+ path.join(os.homedir(), "Library", "Application Support", "Claude", "claude_desktop_config.json"),
15
+ path.join(os.homedir(), ".config", "Claude", "claude_desktop_config.json"),
16
+ ],
17
+ configKey: "mcpServers",
18
+ format: "mcpServers",
19
+ },
20
+ {
21
+ id: "vscode",
22
+ name: "VS Code (Copilot)",
23
+ configPaths: [
24
+ path.join(".vscode", "mcp.json"),
25
+ ],
26
+ configKey: "servers",
27
+ format: "servers",
28
+ },
29
+ {
30
+ id: "cursor",
31
+ name: "Cursor",
32
+ configPaths: [
33
+ path.join(".cursor", "mcp.json"),
34
+ ],
35
+ configKey: "mcpServers",
36
+ format: "mcpServers",
37
+ },
38
+ {
39
+ id: "opencode",
40
+ name: "OpenCode",
41
+ configPaths: [
42
+ "opencode.json",
43
+ path.join(".config", "opencode", "opencode.json"),
44
+ ],
45
+ configKey: "mcp",
46
+ format: "mcp",
47
+ },
48
+ {
49
+ id: "crush",
50
+ name: "Crush",
51
+ configPaths: [
52
+ path.join(os.homedir(), ".local", "share", "crush", "crush.json"),
53
+ ],
54
+ configKey: "mcp",
55
+ format: "mcp",
56
+ },
57
+ {
58
+ id: "windsurf",
59
+ name: "Windsurf",
60
+ configPaths: [
61
+ path.join(".windsurf", "mcp.json"),
62
+ ],
63
+ configKey: "mcpServers",
64
+ format: "mcpServers",
65
+ },
66
+ ];
67
+ function resolveServerPath() {
68
+ const cliDist = path.resolve(__dirname, "..", "..", "mcp-server", "dist", "server.js");
69
+ if (fs.existsSync(cliDist)) {
70
+ return { command: "node", args: [cliDist] };
71
+ }
72
+ return { command: "npx", args: ["-y", "@greenarmor/ges-mcp-server"] };
73
+ }
74
+ function buildServerEntry(client) {
75
+ const { command, args } = resolveServerPath();
76
+ const entry = { command, args };
77
+ if (client.format === "servers") {
78
+ entry.type = "stdio";
79
+ }
80
+ return entry;
81
+ }
82
+ function readJsonFile(filePath) {
83
+ try {
84
+ if (!fs.existsSync(filePath))
85
+ return null;
86
+ const content = fs.readFileSync(filePath, "utf-8");
87
+ return JSON.parse(content);
88
+ }
89
+ catch {
90
+ return null;
91
+ }
92
+ }
93
+ function writeJsonFile(filePath, data) {
94
+ const dir = path.dirname(filePath);
95
+ if (!fs.existsSync(dir)) {
96
+ fs.mkdirSync(dir, { recursive: true });
97
+ }
98
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n");
99
+ }
100
+ function addServerToConfig(config, client) {
101
+ const result = { ...config };
102
+ const key = client.configKey;
103
+ const existing = result[key] || {};
104
+ result[key] = {
105
+ ...existing,
106
+ [SERVER_NAME]: buildServerEntry(client),
107
+ };
108
+ return result;
109
+ }
110
+ function getConfigPath(client) {
111
+ for (const p of client.configPaths) {
112
+ if (fs.existsSync(p))
113
+ return p;
114
+ }
115
+ return client.configPaths[0];
116
+ }
117
+ function printSetupInstructions(client, configPath) {
118
+ console.log(`\n ${client.name}`);
119
+ console.log(` Config: ${configPath}`);
120
+ switch (client.id) {
121
+ case "claude-desktop":
122
+ console.log(" Restart Claude Desktop to load the server.");
123
+ break;
124
+ case "vscode":
125
+ console.log(" Reload the VS Code window (Cmd+Shift+P → Developer: Reload Window).");
126
+ break;
127
+ case "cursor":
128
+ console.log(" Restart Cursor to load the server.");
129
+ break;
130
+ case "opencode":
131
+ console.log(" Restart OpenCode to load the server.");
132
+ break;
133
+ case "crush":
134
+ console.log(" Restart Crush to load the server.");
135
+ break;
136
+ case "windsurf":
137
+ console.log(" Restart Windsurf to load the server.");
138
+ break;
139
+ }
140
+ }
141
+ async function setupClient(clientId) {
142
+ const client = CLIENTS.find((c) => c.id === clientId);
143
+ if (!client) {
144
+ console.error(`Unknown client: ${clientId}`);
145
+ process.exit(1);
146
+ }
147
+ const configPath = getConfigPath(client);
148
+ const existing = readJsonFile(configPath) || {};
149
+ const updated = addServerToConfig(existing, client);
150
+ writeJsonFile(configPath, updated);
151
+ printSetupInstructions(client, configPath);
152
+ console.log(` Status: configured\n`);
153
+ }
154
+ async function setupAll() {
155
+ console.log("\n GESF MCP Server Setup\n");
156
+ console.log(" ─────────────────────\n");
157
+ for (const client of CLIENTS) {
158
+ try {
159
+ await setupClient(client.id);
160
+ }
161
+ catch (err) {
162
+ console.log(` ${client.name}: skipped (${err instanceof Error ? err.message : String(err)})\n`);
163
+ }
164
+ }
165
+ console.log(" Done. Restart your MCP clients to connect.\n");
166
+ }
167
+ async function setupInteractive() {
168
+ const clientId = await select({
169
+ message: "Which MCP client do you want to configure?",
170
+ choices: [
171
+ ...CLIENTS.map((c) => ({ name: c.name, value: c.id })),
172
+ { name: "All clients", value: "all" },
173
+ ],
174
+ });
175
+ if (clientId === "all") {
176
+ await setupAll();
177
+ }
178
+ else {
179
+ await setupClient(clientId);
180
+ }
181
+ }
182
+ export const mcpSetupCommand = new Command("setup")
183
+ .description("Configure MCP clients to use the GESF compliance server")
184
+ .addCommand(new Command("claude")
185
+ .description("Configure Claude Desktop")
186
+ .action(() => setupClient("claude-desktop")))
187
+ .addCommand(new Command("vscode")
188
+ .description("Configure VS Code (Copilot)")
189
+ .action(() => setupClient("vscode")))
190
+ .addCommand(new Command("cursor")
191
+ .description("Configure Cursor")
192
+ .action(() => setupClient("cursor")))
193
+ .addCommand(new Command("opencode")
194
+ .description("Configure OpenCode")
195
+ .action(() => setupClient("opencode")))
196
+ .addCommand(new Command("crush")
197
+ .description("Configure Crush")
198
+ .action(() => setupClient("crush")))
199
+ .addCommand(new Command("windsurf")
200
+ .description("Configure Windsurf")
201
+ .action(() => setupClient("windsurf")))
202
+ .addCommand(new Command("all")
203
+ .description("Configure all supported MCP clients")
204
+ .action(() => setupAll()))
205
+ .action(() => setupInteractive());
206
+ //# sourceMappingURL=mcp-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-setup.js","sourceRoot":"","sources":["../../src/commands/mcp-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const mcpCommand: Command;
@@ -0,0 +1,50 @@
1
+ import { Command } from "commander";
2
+ import * as readline from "node:readline";
3
+ import { handleRequest } from "@greenarmor/ges-mcp-server";
4
+ import { mcpSetupCommand } from "./mcp-setup.js";
5
+ export const mcpCommand = new Command("mcp")
6
+ .description("MCP AI Compliance Assistant")
7
+ .addCommand(new Command("start")
8
+ .description("Start the GESF MCP server (JSON-RPC over stdio)")
9
+ .action(() => {
10
+ const rl = readline.createInterface({ input: process.stdin });
11
+ rl.on("line", (line) => {
12
+ const trimmed = line.trim();
13
+ if (!trimmed)
14
+ return;
15
+ let parsed;
16
+ try {
17
+ parsed = JSON.parse(trimmed);
18
+ }
19
+ catch {
20
+ process.stdout.write(JSON.stringify({
21
+ jsonrpc: "2.0",
22
+ id: null,
23
+ error: { code: -32700, message: "Parse error" },
24
+ }) + "\n");
25
+ return;
26
+ }
27
+ try {
28
+ const response = handleRequest(parsed);
29
+ if (response !== null) {
30
+ process.stdout.write(JSON.stringify(response) + "\n");
31
+ }
32
+ }
33
+ catch (err) {
34
+ process.stdout.write(JSON.stringify({
35
+ jsonrpc: "2.0",
36
+ id: parsed.id ?? null,
37
+ error: {
38
+ code: -32603,
39
+ message: "Internal error",
40
+ data: err instanceof Error ? err.message : String(err),
41
+ },
42
+ }) + "\n");
43
+ }
44
+ });
45
+ rl.on("close", () => {
46
+ process.exit(0);
47
+ });
48
+ }))
49
+ .addCommand(mcpSetupCommand);
50
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,6BAA6B,CAAC;KAC1C,UAAU,CACT,IAAI,OAAO,CAAC,OAAO,CAAC;KACjB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAE9D,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,IAAI,MAAkB,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE;aAChD,CAAC,GAAG,IAAI,CACV,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,IAAI;gBACrB,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC,KAAK;oBACZ,OAAO,EAAE,gBAAgB;oBACzB,IAAI,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACvD;aACF,CAAC,GAAG,IAAI,CACV,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CACL;KACA,UAAU,CAAC,eAAe,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const policyCommand: Command;
@@ -0,0 +1,50 @@
1
+ import { Command } from "commander";
2
+ import { getAllPacks, listPackIds } from "@greenarmor/ges-policy-engine";
3
+ import { ensureGESInitialized, writeFileSync } from "../utils/project.js";
4
+ import * as fs from "node:fs";
5
+ import * as path from "node:path";
6
+ const policyCmd = new Command("policy")
7
+ .description("Manage policy packs");
8
+ policyCmd
9
+ .command("list")
10
+ .description("List available policy packs")
11
+ .action(() => {
12
+ console.log("\n Available Policy Packs:\n");
13
+ const packs = getAllPacks();
14
+ for (const pack of packs) {
15
+ console.log(` ${pack.id.padEnd(15)} ${pack.name}`);
16
+ console.log(` ${"".padEnd(15)} ${pack.controls.length} controls | ${pack.project_types.join(", ")}`);
17
+ console.log("");
18
+ }
19
+ });
20
+ policyCmd
21
+ .command("install <packId>")
22
+ .description("Install a policy pack")
23
+ .action((packId) => {
24
+ const root = ensureGESInitialized();
25
+ const packs = getAllPacks();
26
+ const pack = packs.find(p => p.id === packId);
27
+ if (!pack) {
28
+ console.error(` Error: Pack '${packId}' not found. Available: ${listPackIds().join(", ")}`);
29
+ process.exit(1);
30
+ }
31
+ const packDir = path.join(root, "controls", pack.id);
32
+ fs.mkdirSync(packDir, { recursive: true });
33
+ writeFileSync(path.join(packDir, "controls.json"), JSON.stringify(pack.controls, null, 2));
34
+ console.log(`\n ✓ Installed policy pack: ${pack.id} (${pack.controls.length} controls)\n`);
35
+ });
36
+ policyCmd
37
+ .command("remove <packId>")
38
+ .description("Remove a policy pack")
39
+ .action((packId) => {
40
+ const root = ensureGESInitialized();
41
+ const packDir = path.join(root, "controls", packId);
42
+ if (!fs.existsSync(packDir)) {
43
+ console.error(` Error: Pack '${packId}' is not installed.`);
44
+ process.exit(1);
45
+ }
46
+ fs.rmSync(packDir, { recursive: true, force: true });
47
+ console.log(`\n ✓ Removed policy pack: ${packId}\n`);
48
+ });
49
+ export const policyCommand = policyCmd;
50
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/commands/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const reportCommand: Command;
@@ -0,0 +1,51 @@
1
+ import { Command } from "commander";
2
+ import { ensureGESInitialized, readJsonFile, writeFileSync } from "../utils/project.js";
3
+ import { getAllPacks } from "@greenarmor/ges-policy-engine";
4
+ import { generateMarkdownReport, generateHtmlReport } from "@greenarmor/ges-report-generator";
5
+ import { runAudit, deduplicateFindings } from "@greenarmor/ges-audit-engine";
6
+ import * as path from "node:path";
7
+ export const reportCommand = new Command("report")
8
+ .description("Generate compliance reports")
9
+ .option("-f, --format <format>", "Report format (markdown, html, pdf)", "markdown")
10
+ .option("-o, --output <path>", "Output file path")
11
+ .action(async (options) => {
12
+ const root = ensureGESInitialized();
13
+ const config = readJsonFile(path.join(root, ".ges", "config.json"));
14
+ console.log("\n Generating compliance report...\n");
15
+ const score = readJsonFile(path.join(root, ".ges", "score.json"));
16
+ if (!score) {
17
+ console.error(" Error: No score data. Run 'ges audit' first.");
18
+ process.exit(1);
19
+ }
20
+ const controls = getAllPacks().flatMap(p => p.controls);
21
+ const { findings: rawFindings } = runAudit(root);
22
+ const findings = deduplicateFindings(rawFindings);
23
+ const reportOptions = {
24
+ format: options.format || "markdown",
25
+ title: `Compliance Report - ${config?.project_name || "Project"}`,
26
+ include_executive_summary: true,
27
+ include_risk_assessment: true,
28
+ include_compliance: true,
29
+ include_security: true,
30
+ };
31
+ let content;
32
+ let ext;
33
+ if (options.format === "html") {
34
+ content = generateHtmlReport(reportOptions, score, controls, findings);
35
+ ext = "html";
36
+ }
37
+ else {
38
+ content = generateMarkdownReport(reportOptions, score, controls, findings);
39
+ ext = "md";
40
+ }
41
+ const defaultOutput = path.join(root, "reports", `compliance-report.${ext}`);
42
+ const outputPath = options.output || defaultOutput;
43
+ writeFileSync(outputPath, content);
44
+ console.log(` Report generated: ${outputPath}`);
45
+ console.log(` ${findings.length} security findings included\n`);
46
+ if (options.format === "pdf") {
47
+ console.log(" Note: PDF generation requires pandoc:");
48
+ console.log(` pandoc ${outputPath} -o ${outputPath.replace(".md", ".pdf")}\n`);
49
+ }
50
+ });
51
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const scanCommand: Command;
@@ -0,0 +1,19 @@
1
+ import { Command } from "commander";
2
+ import { ensureGESInitialized } from "../utils/project.js";
3
+ import { runAllScans, formatScanResults } from "@greenarmor/ges-scanner-integration";
4
+ export const scanCommand = new Command("scan")
5
+ .description("Run security scans")
6
+ .option("--ci", "CI mode")
7
+ .action(async (options) => {
8
+ const root = ensureGESInitialized();
9
+ console.log("\n Running security scans...\n");
10
+ const results = runAllScans();
11
+ console.log(formatScanResults(results));
12
+ if (options.ci) {
13
+ const failed = results.filter(r => r.status === "fail");
14
+ if (failed.length > 0) {
15
+ process.exit(1);
16
+ }
17
+ }
18
+ });
19
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAErF,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;KACzB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAExC,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const scoreCommand: Command;
@@ -0,0 +1,33 @@
1
+ import { Command } from "commander";
2
+ import { ensureGESInitialized, readJsonFile } from "../utils/project.js";
3
+ import * as path from "node:path";
4
+ export const scoreCommand = new Command("score")
5
+ .description("Calculate and display compliance score")
6
+ .option("--ci", "CI mode - output JSON format")
7
+ .action(async (options) => {
8
+ const root = ensureGESInitialized();
9
+ const scorePath = path.join(root, ".ges", "score.json");
10
+ const score = readJsonFile(scorePath);
11
+ if (!score || !score.frameworks || Object.keys(score.frameworks).length === 0) {
12
+ console.log("\n No compliance score available. Run 'ges audit' first.\n");
13
+ return;
14
+ }
15
+ if (options.ci) {
16
+ console.log(JSON.stringify(score, null, 2));
17
+ }
18
+ else {
19
+ const lines = [""];
20
+ for (const [fw, data] of Object.entries(score.frameworks)) {
21
+ const padding = Math.max(1, 20 - fw.length);
22
+ const dots = ".".repeat(padding);
23
+ lines.push(` ${fw} ${dots} ${data.score}%`);
24
+ }
25
+ const overallPadding = Math.max(1, 20 - "Overall".length);
26
+ lines.push(` Overall ${".".repeat(overallPadding)} ${score.overall}%`);
27
+ lines.push("");
28
+ lines.push(` Last evaluated: ${score.evaluated_at}`);
29
+ lines.push("");
30
+ console.log(lines.join("\n"));
31
+ }
32
+ });
33
+ //# sourceMappingURL=score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score.js","sourceRoot":"","sources":["../../src/commands/score.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAiB,MAAM,qBAAqB,CAAC;AAExF,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,MAAM,EAAE,8BAA8B,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,YAAY,CAAY,SAAS,CAAC,CAAC;IAEjD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAa,CAAC,EAAE,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const updateCommand: Command;
@@ -0,0 +1,9 @@
1
+ import { Command } from "commander";
2
+ import { GESF_VERSION } from "@greenarmor/ges-core";
3
+ export const updateCommand = new Command("update")
4
+ .description("Check for GESF updates")
5
+ .action(async () => {
6
+ console.log(`\n GESF Version: ${GESF_VERSION}`);
7
+ console.log(" Update check: Run 'npm update -g @greenarmor/ges' or 'pnpm update -g @greenarmor/ges'\n");
8
+ });
9
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,qBAAqB,YAAY,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,2FAA2F,CAAC,CAAC;AAC3G,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const validateCommand: Command;
@@ -0,0 +1,63 @@
1
+ import { Command } from "commander";
2
+ import { ensureGESInitialized, readJsonFile } from "../utils/project.js";
3
+ import { ProjectConfigSchema } from "@greenarmor/ges-core";
4
+ import { GES_DIR } from "@greenarmor/ges-core";
5
+ import * as fs from "node:fs";
6
+ import * as path from "node:path";
7
+ export const validateCommand = new Command("validate")
8
+ .description("Validate GESF configuration and controls")
9
+ .action(async () => {
10
+ const root = ensureGESInitialized();
11
+ let hasErrors = false;
12
+ console.log("\n Validating GESF configuration...\n");
13
+ const configPath = path.join(root, GES_DIR, "config.json");
14
+ const config = readJsonFile(configPath);
15
+ if (!config) {
16
+ console.log(" [✗] config.json not found or invalid");
17
+ hasErrors = true;
18
+ }
19
+ else {
20
+ const result = ProjectConfigSchema.safeParse(config);
21
+ if (result.success) {
22
+ console.log(" [✓] Configuration is valid");
23
+ }
24
+ else {
25
+ console.log(" [✗] Configuration validation errors:");
26
+ for (const error of result.error.errors) {
27
+ console.log(` - ${error.path.join(".")}: ${error.message}`);
28
+ }
29
+ hasErrors = true;
30
+ }
31
+ }
32
+ const controlsDir = path.join(root, "controls");
33
+ if (fs.existsSync(controlsDir)) {
34
+ const packDirs = fs.readdirSync(controlsDir);
35
+ for (const packDir of packDirs) {
36
+ const controlsFile = path.join(controlsDir, packDir, "controls.json");
37
+ if (fs.existsSync(controlsFile)) {
38
+ const controls = readJsonFile(controlsFile);
39
+ if (controls) {
40
+ console.log(` [✓] ${packDir}: ${controls.length} controls`);
41
+ }
42
+ else {
43
+ console.log(` [✗] ${packDir}: Invalid controls.json`);
44
+ hasErrors = true;
45
+ }
46
+ }
47
+ }
48
+ }
49
+ const requiredDirs = ["compliance", "security", "controls"];
50
+ for (const dir of requiredDirs) {
51
+ if (fs.existsSync(path.join(root, dir))) {
52
+ console.log(` [✓] ${dir}/ directory exists`);
53
+ }
54
+ else {
55
+ console.log(` [✗] ${dir}/ directory missing`);
56
+ hasErrors = true;
57
+ }
58
+ }
59
+ console.log(hasErrors ? "\n Validation failed.\n" : "\n All validations passed.\n");
60
+ if (hasErrors)
61
+ process.exit(1);
62
+ });
63
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export declare const GES_DIR = ".ges";
2
+ export declare function findProjectRoot(startDir?: string): string | null;
3
+ export declare function ensureGESInitialized(): string;
4
+ export declare function writeFileSync(filePath: string, content: string): void;
5
+ export declare function readJsonFile<T>(filePath: string): T | null;
6
+ export declare function writeJsonFile(filePath: string, data: unknown): void;
@@ -0,0 +1,41 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ export const GES_DIR = ".ges";
4
+ export function findProjectRoot(startDir = process.cwd()) {
5
+ let dir = startDir;
6
+ while (dir !== path.dirname(dir)) {
7
+ if (fs.existsSync(path.join(dir, GES_DIR, "config.yaml"))) {
8
+ return dir;
9
+ }
10
+ dir = path.dirname(dir);
11
+ }
12
+ return null;
13
+ }
14
+ export function ensureGESInitialized() {
15
+ const root = findProjectRoot();
16
+ if (!root) {
17
+ console.error("Error: GESF not initialized. Run 'ges init' first.");
18
+ process.exit(1);
19
+ }
20
+ return root;
21
+ }
22
+ export function writeFileSync(filePath, content) {
23
+ const dir = path.dirname(filePath);
24
+ if (!fs.existsSync(dir)) {
25
+ fs.mkdirSync(dir, { recursive: true });
26
+ }
27
+ fs.writeFileSync(filePath, content, "utf-8");
28
+ }
29
+ export function readJsonFile(filePath) {
30
+ try {
31
+ const content = fs.readFileSync(filePath, "utf-8");
32
+ return JSON.parse(content);
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ export function writeJsonFile(filePath, data) {
39
+ writeFileSync(filePath, JSON.stringify(data, null, 2));
40
+ }
41
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC;AAE9B,MAAM,UAAU,eAAe,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC9D,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,OAAO,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;YAC1D,OAAO,GAAG,CAAC;QACb,CAAC;QACD,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAe;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,QAAgB;IAC9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAa;IAC3D,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC"}