@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.
- package/LICENSE +21 -0
- package/README.md +74 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +34 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/audit.d.ts +2 -0
- package/dist/commands/audit.js +107 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/compliance.d.ts +2 -0
- package/dist/commands/compliance.js +32 -0
- package/dist/commands/compliance.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +60 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/generate.d.ts +2 -0
- package/dist/commands/generate.js +47 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +112 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp-setup.d.ts +2 -0
- package/dist/commands/mcp-setup.js +206 -0
- package/dist/commands/mcp-setup.js.map +1 -0
- package/dist/commands/mcp.d.ts +2 -0
- package/dist/commands/mcp.js +50 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/policy.d.ts +2 -0
- package/dist/commands/policy.js +50 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/report.d.ts +2 -0
- package/dist/commands/report.js +51 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/scan.d.ts +2 -0
- package/dist/commands/scan.js +19 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/score.d.ts +2 -0
- package/dist/commands/score.js +33 -0
- package/dist/commands/score.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.js +9 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.js +63 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/project.d.ts +6 -0
- package/dist/utils/project.js +41 -0
- package/dist/utils/project.js.map +1 -0
- package/package.json +60 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 greenarmor
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# @greenarmor/ges
|
|
2
|
+
|
|
3
|
+
Green Engineering Standard Framework - Compliance-as-Code CLI
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @greenarmor/ges
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or use without installing:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @greenarmor/ges init
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Navigate to any project
|
|
21
|
+
cd my-project
|
|
22
|
+
|
|
23
|
+
# Initialize compliance framework
|
|
24
|
+
ges init
|
|
25
|
+
|
|
26
|
+
# Run security and compliance audit
|
|
27
|
+
ges audit
|
|
28
|
+
|
|
29
|
+
# View compliance score
|
|
30
|
+
ges score
|
|
31
|
+
|
|
32
|
+
# Generate reports
|
|
33
|
+
ges report
|
|
34
|
+
|
|
35
|
+
# Diagnose configuration
|
|
36
|
+
ges doctor
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Commands
|
|
40
|
+
|
|
41
|
+
| Command | Description |
|
|
42
|
+
|---------|-------------|
|
|
43
|
+
| `ges init` | Initialize GESF in the current project |
|
|
44
|
+
| `ges audit` | Scan source code for security and compliance issues |
|
|
45
|
+
| `ges score` | Calculate and display compliance score |
|
|
46
|
+
| `ges report` | Generate compliance reports (Markdown/HTML) |
|
|
47
|
+
| `ges doctor` | Diagnose GESF configuration and health |
|
|
48
|
+
| `ges scan` | Run external security scanners |
|
|
49
|
+
| `ges compliance` | Show compliance status and installed packs |
|
|
50
|
+
| `ges validate` | Validate GESF configuration |
|
|
51
|
+
| `ges generate` | Regenerate documentation and workflows |
|
|
52
|
+
| `ges policy list` | List available policy packs |
|
|
53
|
+
| `ges policy install <pack>` | Install a policy pack |
|
|
54
|
+
| `ges policy remove <pack>` | Remove a policy pack |
|
|
55
|
+
| `ges update` | Check for updates |
|
|
56
|
+
|
|
57
|
+
## What It Detects
|
|
58
|
+
|
|
59
|
+
- **Secrets**: Hardcoded passwords, API keys, connection strings, private keys, tokens
|
|
60
|
+
- **Weak Crypto**: MD5, SHA1, DES, AES-128, disabled TLS verification
|
|
61
|
+
- **SQL Injection**: String concatenation in SQL queries with user input
|
|
62
|
+
- **XSS**: innerHTML with user input, document.write, v-html, dangerouslySetInnerHTML
|
|
63
|
+
- **Missing Auth**: Routes without authentication middleware
|
|
64
|
+
- **Missing Security**: No helmet, no CORS config, no rate limiting, no MFA
|
|
65
|
+
- **Config Issues**: Secrets in .env without .gitignore, Docker as root, missing logging
|
|
66
|
+
- **Database Issues**: Missing audit columns, missing soft delete patterns
|
|
67
|
+
|
|
68
|
+
## Supported Project Types
|
|
69
|
+
|
|
70
|
+
SaaS, AI Application, MCP Server, Blockchain, Wallet, Government System, Healthcare System, Event Platform, Photo Storage Platform, Vulnerability Scanner, Generic Web Application, API Backend, Mobile Application
|
|
71
|
+
|
|
72
|
+
## Compliance Frameworks
|
|
73
|
+
|
|
74
|
+
GDPR, OWASP ASVS, CIS Controls, NIST CSF, ISO 27001, ISO 27701
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { initCommand } from "./commands/init.js";
|
|
4
|
+
import { auditCommand } from "./commands/audit.js";
|
|
5
|
+
import { scoreCommand } from "./commands/score.js";
|
|
6
|
+
import { reportCommand } from "./commands/report.js";
|
|
7
|
+
import { doctorCommand } from "./commands/doctor.js";
|
|
8
|
+
import { scanCommand } from "./commands/scan.js";
|
|
9
|
+
import { complianceCommand } from "./commands/compliance.js";
|
|
10
|
+
import { validateCommand } from "./commands/validate.js";
|
|
11
|
+
import { generateCommand } from "./commands/generate.js";
|
|
12
|
+
import { policyCommand } from "./commands/policy.js";
|
|
13
|
+
import { updateCommand } from "./commands/update.js";
|
|
14
|
+
import { mcpCommand } from "./commands/mcp.js";
|
|
15
|
+
import { GESF_VERSION } from "@greenarmor/ges-core";
|
|
16
|
+
const program = new Command();
|
|
17
|
+
program
|
|
18
|
+
.name("ges")
|
|
19
|
+
.description("Green Engineering Standard Framework - Compliance-as-Code CLI")
|
|
20
|
+
.version(GESF_VERSION);
|
|
21
|
+
program.addCommand(initCommand);
|
|
22
|
+
program.addCommand(auditCommand);
|
|
23
|
+
program.addCommand(scoreCommand);
|
|
24
|
+
program.addCommand(reportCommand);
|
|
25
|
+
program.addCommand(doctorCommand);
|
|
26
|
+
program.addCommand(scanCommand);
|
|
27
|
+
program.addCommand(complianceCommand);
|
|
28
|
+
program.addCommand(validateCommand);
|
|
29
|
+
program.addCommand(generateCommand);
|
|
30
|
+
program.addCommand(policyCommand);
|
|
31
|
+
program.addCommand(updateCommand);
|
|
32
|
+
program.addCommand(mcpCommand);
|
|
33
|
+
program.parse();
|
|
34
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,+DAA+D,CAAC;KAC5E,OAAO,CAAC,YAAY,CAAC,CAAC;AAEzB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { ensureGESInitialized, readJsonFile, writeJsonFile } from "../utils/project.js";
|
|
3
|
+
import { getAllPacks } from "@greenarmor/ges-policy-engine";
|
|
4
|
+
import { generateScoreFile, formatScoreOutput } from "@greenarmor/ges-scoring-engine";
|
|
5
|
+
import { runAudit, deduplicateFindings } from "@greenarmor/ges-audit-engine";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
export const auditCommand = new Command("audit")
|
|
8
|
+
.description("Run a compliance audit on the project")
|
|
9
|
+
.option("--ci", "CI mode - exit with error code on failures")
|
|
10
|
+
.option("--json", "Output findings as JSON")
|
|
11
|
+
.action(async (options) => {
|
|
12
|
+
const root = ensureGESInitialized();
|
|
13
|
+
const config = readJsonFile(path.join(root, ".ges", "config.json"));
|
|
14
|
+
console.log("\n GESF Compliance Audit");
|
|
15
|
+
console.log(" ────────────────────\n");
|
|
16
|
+
console.log(" Scanning project files...");
|
|
17
|
+
const { findings: rawFindings, scannedFiles } = runAudit(root);
|
|
18
|
+
const findings = deduplicateFindings(rawFindings);
|
|
19
|
+
console.log(` Scanned ${scannedFiles} files\n`);
|
|
20
|
+
const frameworks = (config?.frameworks || ["GDPR", "OWASP"]);
|
|
21
|
+
const controls = getAllPacks().flatMap(p => p.controls);
|
|
22
|
+
const updatedControls = updateControlsFromFindings(controls, findings);
|
|
23
|
+
const scoreData = generateScoreFile(updatedControls, frameworks);
|
|
24
|
+
writeJsonFile(path.join(root, ".ges", "score.json"), scoreData);
|
|
25
|
+
const critical = findings.filter(f => f.severity === "critical");
|
|
26
|
+
const high = findings.filter(f => f.severity === "high");
|
|
27
|
+
const medium = findings.filter(f => f.severity === "medium");
|
|
28
|
+
const low = findings.filter(f => f.severity === "low");
|
|
29
|
+
if (options.json) {
|
|
30
|
+
console.log(JSON.stringify({ findings, score: scoreData }, null, 2));
|
|
31
|
+
if (options.ci && critical.length > 0)
|
|
32
|
+
process.exit(1);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
console.log(" ── Findings ─────────────────────\n");
|
|
36
|
+
console.log(` Total findings: ${findings.length}`);
|
|
37
|
+
console.log(` Critical: ${critical.length} High: ${high.length} Medium: ${medium.length} Low: ${low.length}\n`);
|
|
38
|
+
if (findings.length > 0) {
|
|
39
|
+
const grouped = groupByCategory(findings);
|
|
40
|
+
for (const [category, categoryFindings] of Object.entries(grouped)) {
|
|
41
|
+
console.log(` [${category.toUpperCase()}]`);
|
|
42
|
+
for (const f of categoryFindings.slice(0, 10)) {
|
|
43
|
+
const sev = f.severity === "critical" ? "CRIT" : f.severity === "high" ? "HIGH" : f.severity === "medium" ? "MED " : "LOW ";
|
|
44
|
+
const loc = f.file !== "project" ? ` (${f.file}${f.line ? ":" + f.line : ""})` : "";
|
|
45
|
+
console.log(` [${sev}] ${f.title}${loc}`);
|
|
46
|
+
if (f.evidence && f.file !== "project") {
|
|
47
|
+
console.log(` ${f.evidence.slice(0, 100)}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (categoryFindings.length > 10) {
|
|
51
|
+
console.log(` ... and ${categoryFindings.length - 10} more`);
|
|
52
|
+
}
|
|
53
|
+
console.log("");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
console.log(" ✓ No security or compliance issues found in source code.\n");
|
|
58
|
+
}
|
|
59
|
+
console.log(" ── Compliance Score ──────────────");
|
|
60
|
+
console.log(formatScoreOutput(scoreData));
|
|
61
|
+
if (critical.length > 0) {
|
|
62
|
+
console.log(" !! Critical issues must be resolved before deployment. !!\n");
|
|
63
|
+
}
|
|
64
|
+
if (options.ci && critical.length > 0) {
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
function updateControlsFromFindings(controls, findings) {
|
|
69
|
+
return controls.map(control => {
|
|
70
|
+
const relevantFindings = findings.filter(f => f.controlIds.includes(control.id));
|
|
71
|
+
if (relevantFindings.length === 0)
|
|
72
|
+
return control;
|
|
73
|
+
const hasCritical = relevantFindings.some(f => f.severity === "critical" || f.severity === "high");
|
|
74
|
+
const updatedChecks = control.checks.map(check => {
|
|
75
|
+
if (hasCritical) {
|
|
76
|
+
return { ...check, status: "fail" };
|
|
77
|
+
}
|
|
78
|
+
return { ...check, status: "warning" };
|
|
79
|
+
});
|
|
80
|
+
return {
|
|
81
|
+
...control,
|
|
82
|
+
checks: updatedChecks,
|
|
83
|
+
status: hasCritical ? "fail" : "warning",
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function groupByCategory(findings) {
|
|
88
|
+
const groups = {};
|
|
89
|
+
for (const f of findings) {
|
|
90
|
+
const cat = f.category;
|
|
91
|
+
if (!groups[cat])
|
|
92
|
+
groups[cat] = [];
|
|
93
|
+
groups[cat].push(f);
|
|
94
|
+
}
|
|
95
|
+
const order = ["secrets", "authentication", "encryption", "injection", "xss", "security", "database", "config", "infrastructure", "dependencies"];
|
|
96
|
+
const sorted = {};
|
|
97
|
+
for (const cat of order) {
|
|
98
|
+
if (groups[cat])
|
|
99
|
+
sorted[cat] = groups[cat];
|
|
100
|
+
}
|
|
101
|
+
for (const [cat, items] of Object.entries(groups)) {
|
|
102
|
+
if (!sorted[cat])
|
|
103
|
+
sorted[cat] = items;
|
|
104
|
+
}
|
|
105
|
+
return sorted;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { ensureGESInitialized, readJsonFile } from "../utils/project.js";
|
|
3
|
+
import { getPacksForProjectType } from "@greenarmor/ges-policy-engine";
|
|
4
|
+
import { formatScoreOutput } from "@greenarmor/ges-scoring-engine";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
export const complianceCommand = new Command("compliance")
|
|
7
|
+
.description("Show compliance status")
|
|
8
|
+
.action(async () => {
|
|
9
|
+
const root = ensureGESInitialized();
|
|
10
|
+
const scorePath = path.join(root, ".ges", "score.json");
|
|
11
|
+
const score = readJsonFile(scorePath);
|
|
12
|
+
if (score && score.frameworks && Object.keys(score.frameworks).length > 0) {
|
|
13
|
+
console.log(formatScoreOutput(score));
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
console.log("\n No compliance score available. Run 'ges audit' first.\n");
|
|
17
|
+
}
|
|
18
|
+
const config = readJsonFile(path.join(root, ".ges", "config.json"));
|
|
19
|
+
if (config) {
|
|
20
|
+
console.log(" Installed Policy Packs:");
|
|
21
|
+
const packs = getPacksForProjectType(config.project_type);
|
|
22
|
+
for (const pack of packs) {
|
|
23
|
+
const controlsFile = path.join(root, "controls", pack.id, "controls.json");
|
|
24
|
+
const controls = readJsonFile(controlsFile);
|
|
25
|
+
const total = controls?.length || 0;
|
|
26
|
+
const passed = controls?.filter(c => c.status === "pass").length || 0;
|
|
27
|
+
console.log(` ${pack.id.padEnd(15)} ${passed}/${total} controls passed`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
console.log("");
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=compliance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance.js","sourceRoot":"","sources":["../../src/commands/compliance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;KACvD,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IAEpC,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,KAAK,IAAI,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAgB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IACnF,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YAC3E,MAAM,QAAQ,GAAG,YAAY,CAAY,YAAY,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,IAAI,KAAK,kBAAkB,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { findProjectRoot, readJsonFile } from "../utils/project.js";
|
|
3
|
+
import { GESF_VERSION, GES_DIR } from "@greenarmor/ges-core";
|
|
4
|
+
import * as fs from "node:fs";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
export const doctorCommand = new Command("doctor")
|
|
7
|
+
.description("Diagnose GESF configuration and health")
|
|
8
|
+
.action(async () => {
|
|
9
|
+
console.log("\n GESF Doctor - Diagnostic Check");
|
|
10
|
+
console.log(" ─────────────────────────────\n");
|
|
11
|
+
const checks = [];
|
|
12
|
+
const root = findProjectRoot();
|
|
13
|
+
if (root) {
|
|
14
|
+
checks.push({ name: "GESF initialized", status: "OK", detail: root });
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
checks.push({ name: "GESF initialized", status: "FAIL", detail: "Run 'ges init' first" });
|
|
18
|
+
}
|
|
19
|
+
if (root) {
|
|
20
|
+
const configPath = path.join(root, GES_DIR, "config.yaml");
|
|
21
|
+
checks.push({
|
|
22
|
+
name: "Config file",
|
|
23
|
+
status: fs.existsSync(configPath) ? "OK" : "WARN",
|
|
24
|
+
detail: fs.existsSync(configPath) ? configPath : "config.yaml not found",
|
|
25
|
+
});
|
|
26
|
+
const scorePath = path.join(root, GES_DIR, "score.json");
|
|
27
|
+
const score = readJsonFile(scorePath);
|
|
28
|
+
checks.push({
|
|
29
|
+
name: "Score file",
|
|
30
|
+
status: score ? "OK" : "WARN",
|
|
31
|
+
detail: score ? `Overall: ${score.overall}%` : "Run 'ges score'",
|
|
32
|
+
});
|
|
33
|
+
const dirs = ["compliance", "security", "controls", "policies", "checklists", "docs", "reports"];
|
|
34
|
+
for (const dir of dirs) {
|
|
35
|
+
const exists = fs.existsSync(path.join(root, dir));
|
|
36
|
+
checks.push({ name: `${dir}/ directory`, status: exists ? "OK" : "MISSING" });
|
|
37
|
+
}
|
|
38
|
+
const ghWorkflows = path.join(root, ".github", "workflows");
|
|
39
|
+
if (fs.existsSync(ghWorkflows)) {
|
|
40
|
+
const workflows = fs.readdirSync(ghWorkflows).filter(f => f.endsWith(".yml"));
|
|
41
|
+
checks.push({ name: "GitHub Actions", status: "OK", detail: `${workflows.length} workflow(s)` });
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
checks.push({ name: "GitHub Actions", status: "WARN", detail: "No .github/workflows found" });
|
|
45
|
+
}
|
|
46
|
+
const config = readJsonFile(path.join(root, GES_DIR, "config.json"));
|
|
47
|
+
if (config) {
|
|
48
|
+
checks.push({ name: "Project", status: "OK", detail: `${config.project_name} (${config.project_type})` });
|
|
49
|
+
checks.push({ name: "Frameworks", status: "OK", detail: config.frameworks.join(", ") });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
checks.push({ name: "GESF Version", status: "OK", detail: GESF_VERSION });
|
|
53
|
+
for (const check of checks) {
|
|
54
|
+
const icon = check.status === "OK" ? "✓" : check.status === "WARN" ? "!" : "✗";
|
|
55
|
+
const line = ` [${icon}] ${check.name}`;
|
|
56
|
+
console.log(line + (check.detail ? ` - ${check.detail}` : ""));
|
|
57
|
+
}
|
|
58
|
+
console.log("");
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEjD,MAAM,MAAM,GAAwD,EAAE,CAAC;IAEvE,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;YACjD,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,uBAAuB;SACzE,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,YAAY,CAA0B,SAAS,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;YAC7B,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,iBAAiB;SACjE,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACjG,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9E,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC;QACnG,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC,CAAC;QAChG,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAgB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;QACpF,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;YAC1G,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAE1E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/E,MAAM,IAAI,GAAG,MAAM,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { ensureGESInitialized, readJsonFile, writeFileSync } from "../utils/project.js";
|
|
3
|
+
import { generateComplianceDocs, generateSecurityDocs } from "@greenarmor/ges-doc-generator";
|
|
4
|
+
import { generateAllWorkflows } from "@greenarmor/ges-cicd-generator";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
export const generateCommand = new Command("generate")
|
|
7
|
+
.description("Regenerate documentation and workflows")
|
|
8
|
+
.option("--docs", "Regenerate documentation")
|
|
9
|
+
.option("--workflows", "Regenerate GitHub Actions workflows")
|
|
10
|
+
.option("--all", "Regenerate everything")
|
|
11
|
+
.action(async (options) => {
|
|
12
|
+
const root = ensureGESInitialized();
|
|
13
|
+
const config = readJsonFile(path.join(".ges", "config.json"));
|
|
14
|
+
if (!config) {
|
|
15
|
+
console.error(" Error: Could not read configuration.");
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
const doDocs = options.docs || options.all;
|
|
19
|
+
const doWorkflows = options.workflows || options.all;
|
|
20
|
+
if (!doDocs && !doWorkflows) {
|
|
21
|
+
console.log(" Specify --docs, --workflows, or --all");
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (doDocs) {
|
|
25
|
+
console.log(" Generating compliance documents...");
|
|
26
|
+
const complianceDocs = generateComplianceDocs(config.project_name, config.project_type);
|
|
27
|
+
for (const doc of complianceDocs) {
|
|
28
|
+
writeFileSync(path.join(root, doc.filePath), doc.content);
|
|
29
|
+
}
|
|
30
|
+
console.log(" Generating security documents...");
|
|
31
|
+
const securityDocs = generateSecurityDocs(config.project_name, config.project_type);
|
|
32
|
+
for (const doc of securityDocs) {
|
|
33
|
+
writeFileSync(path.join(root, doc.filePath), doc.content);
|
|
34
|
+
}
|
|
35
|
+
console.log(" ✓ Documents generated");
|
|
36
|
+
}
|
|
37
|
+
if (doWorkflows) {
|
|
38
|
+
console.log(" Generating GitHub Actions workflows...");
|
|
39
|
+
const workflows = generateAllWorkflows(config);
|
|
40
|
+
for (const wf of workflows) {
|
|
41
|
+
writeFileSync(path.join(root, wf.filePath), wf.content);
|
|
42
|
+
}
|
|
43
|
+
console.log(" ✓ Workflows generated");
|
|
44
|
+
}
|
|
45
|
+
console.log("");
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAExF,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,QAAQ,EAAE,0BAA0B,CAAC;KAC5C,MAAM,CAAC,aAAa,EAAE,qCAAqC,CAAC;KAC5D,MAAM,CAAC,OAAO,EAAE,uBAAuB,CAAC;KACxC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,YAAY,CAAgB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IAE7E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;IAErD,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,MAAM,cAAc,GAAG,sBAAsB,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QACxF,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACjC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QACpF,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC/C,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { input, select, checkbox } from "@inquirer/prompts";
|
|
3
|
+
import { PROJECT_TYPES, FRAMEWORKS, DEFAULT_FRAMEWORKS, GESF_VERSION, GES_DIR, COMPLIANCE_DIR, SECURITY_DIR, CONTROLS_DIR, POLICIES_DIR, CHECKLISTS_DIR, DOCS_DIR, REPORTS_DIR, } from "@greenarmor/ges-core";
|
|
4
|
+
import { getPacksForProjectType } from "@greenarmor/ges-policy-engine";
|
|
5
|
+
import { generateComplianceDocs, generateSecurityDocs, generateConfigYaml, generateConfigJson, generateMetadataJson, generateFrameworkVersionJson, generateScoreJson, } from "@greenarmor/ges-doc-generator";
|
|
6
|
+
import { generateAllWorkflows } from "@greenarmor/ges-cicd-generator";
|
|
7
|
+
import { writeFileSync } from "../utils/project.js";
|
|
8
|
+
import * as fs from "node:fs";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
export const initCommand = new Command("init")
|
|
11
|
+
.description("Initialize GESF in the current project")
|
|
12
|
+
.option("-n, --name <name>", "Project name")
|
|
13
|
+
.option("-t, --type <type>", "Project type")
|
|
14
|
+
.option("-f, --frameworks <frameworks>", "Comma-separated frameworks")
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
console.log("\n Green Engineering Standard Framework (GESF) v" + GESF_VERSION);
|
|
17
|
+
console.log(" ─────────────────────────────────────────────\n");
|
|
18
|
+
if (fs.existsSync(path.join(process.cwd(), GES_DIR))) {
|
|
19
|
+
console.error(" Error: GESF is already initialized in this project.");
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
const projectName = options.name || await input({ message: "Project name:", default: path.basename(process.cwd()) });
|
|
23
|
+
const projectType = options.type
|
|
24
|
+
? options.type
|
|
25
|
+
: await select({
|
|
26
|
+
message: "Select project type:",
|
|
27
|
+
choices: PROJECT_TYPES.map(t => ({ value: t.value, name: t.label })),
|
|
28
|
+
});
|
|
29
|
+
const selectedFrameworks = options.frameworks
|
|
30
|
+
? options.frameworks.split(",").map((f) => f.trim())
|
|
31
|
+
: await checkbox({
|
|
32
|
+
message: "Select compliance frameworks:",
|
|
33
|
+
choices: FRAMEWORKS.map(f => ({
|
|
34
|
+
value: f.value,
|
|
35
|
+
name: f.label,
|
|
36
|
+
checked: DEFAULT_FRAMEWORKS.includes(f.value),
|
|
37
|
+
})),
|
|
38
|
+
});
|
|
39
|
+
if (selectedFrameworks.length === 0) {
|
|
40
|
+
console.error(" Error: At least one framework must be selected.");
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
const now = new Date().toISOString();
|
|
44
|
+
const config = {
|
|
45
|
+
project_name: projectName,
|
|
46
|
+
project_type: projectType,
|
|
47
|
+
frameworks: selectedFrameworks,
|
|
48
|
+
requirements: {
|
|
49
|
+
encryption: { required: true, level: "mandatory" },
|
|
50
|
+
mfa: { required: true, level: "mandatory" },
|
|
51
|
+
audit_logs: { required: true, level: "mandatory" },
|
|
52
|
+
backups: { required: true, level: "mandatory" },
|
|
53
|
+
retention_policy: { required: true, level: "mandatory" },
|
|
54
|
+
vulnerability_scanning: { required: true, level: "mandatory" },
|
|
55
|
+
authentication: { required: true, level: "mandatory" },
|
|
56
|
+
authorization: { required: true, level: "mandatory" },
|
|
57
|
+
secrets_management: { required: true, level: "mandatory" },
|
|
58
|
+
logging: { required: true, level: "mandatory" },
|
|
59
|
+
monitoring: { required: true, level: "recommended" },
|
|
60
|
+
data_classification: { required: true, level: "mandatory" },
|
|
61
|
+
disaster_recovery: { required: true, level: "mandatory" },
|
|
62
|
+
incident_response: { required: true, level: "mandatory" },
|
|
63
|
+
privacy_controls: { required: true, level: "mandatory" },
|
|
64
|
+
},
|
|
65
|
+
created_at: now,
|
|
66
|
+
version: GESF_VERSION,
|
|
67
|
+
};
|
|
68
|
+
const dirs = [GES_DIR, COMPLIANCE_DIR, SECURITY_DIR, CONTROLS_DIR, POLICIES_DIR, CHECKLISTS_DIR, DOCS_DIR, REPORTS_DIR];
|
|
69
|
+
for (const dir of dirs) {
|
|
70
|
+
fs.mkdirSync(path.join(process.cwd(), dir), { recursive: true });
|
|
71
|
+
}
|
|
72
|
+
const configYaml = generateConfigYaml(config);
|
|
73
|
+
writeFileSync(path.join(process.cwd(), configYaml.filePath), configYaml.content);
|
|
74
|
+
const configJson = generateConfigJson(config);
|
|
75
|
+
writeFileSync(path.join(process.cwd(), configJson.filePath), configJson.content);
|
|
76
|
+
const metadata = generateMetadataJson(config);
|
|
77
|
+
writeFileSync(path.join(process.cwd(), metadata.filePath), metadata.content);
|
|
78
|
+
const fwVersion = generateFrameworkVersionJson();
|
|
79
|
+
writeFileSync(path.join(process.cwd(), fwVersion.filePath), fwVersion.content);
|
|
80
|
+
const scoreFile = generateScoreJson();
|
|
81
|
+
writeFileSync(path.join(process.cwd(), scoreFile.filePath), scoreFile.content);
|
|
82
|
+
const complianceDocs = generateComplianceDocs(projectName, projectType);
|
|
83
|
+
for (const doc of complianceDocs) {
|
|
84
|
+
writeFileSync(path.join(process.cwd(), doc.filePath), doc.content);
|
|
85
|
+
}
|
|
86
|
+
const securityDocs = generateSecurityDocs(projectName, projectType);
|
|
87
|
+
for (const doc of securityDocs) {
|
|
88
|
+
writeFileSync(path.join(process.cwd(), doc.filePath), doc.content);
|
|
89
|
+
}
|
|
90
|
+
const packs = getPacksForProjectType(projectType);
|
|
91
|
+
for (const pack of packs) {
|
|
92
|
+
const packDir = path.join(process.cwd(), CONTROLS_DIR, pack.id);
|
|
93
|
+
fs.mkdirSync(packDir, { recursive: true });
|
|
94
|
+
writeFileSync(path.join(packDir, "controls.json"), JSON.stringify(pack.controls, null, 2));
|
|
95
|
+
}
|
|
96
|
+
const workflows = generateAllWorkflows(config);
|
|
97
|
+
for (const wf of workflows) {
|
|
98
|
+
writeFileSync(path.join(process.cwd(), wf.filePath), wf.content);
|
|
99
|
+
}
|
|
100
|
+
console.log(" ✓ Project structure created");
|
|
101
|
+
console.log(" ✓ Configuration files generated");
|
|
102
|
+
console.log(" ✓ Compliance documents created");
|
|
103
|
+
console.log(" ✓ Security documents created");
|
|
104
|
+
console.log(" ✓ Control packs installed:", packs.map(p => p.id).join(", "));
|
|
105
|
+
console.log(" ✓ GitHub Actions workflows generated");
|
|
106
|
+
console.log(`\n GESF initialized for "${projectName}" (${projectType})`);
|
|
107
|
+
console.log("\n Next steps:");
|
|
108
|
+
console.log(" 1. Review generated compliance documents");
|
|
109
|
+
console.log(" 2. Run 'ges audit' to evaluate your project");
|
|
110
|
+
console.log(" 3. Run 'ges score' to see your compliance score\n");
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACL,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,OAAO,EACP,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,4BAA4B,EAC5B,iBAAiB,GAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,mBAAmB,EAAE,cAAc,CAAC;KAC3C,MAAM,CAAC,mBAAmB,EAAE,cAAc,CAAC;KAC3C,MAAM,CAAC,+BAA+B,EAAE,4BAA4B,CAAC;KACrE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,mDAAmD,GAAG,YAAY,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IAEjE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAErH,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI;QAC9B,CAAC,CAAE,OAAO,CAAC,IAAoB;QAC/B,CAAC,CAAC,MAAM,MAAM,CAAC;YACX,OAAO,EAAE,sBAAsB;YAC/B,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;SACrE,CAAgB,CAAC;IAEtB,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU;QAC3C,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAmB,CAAC;QAC7E,CAAC,CAAC,MAAM,QAAQ,CAAC;YACb,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC5B,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,CAAC,CAAC,KAAK;gBACb,OAAO,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;aAC9C,CAAC,CAAC;SACJ,CAAoB,CAAC;IAE1B,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,MAAM,GAAkB;QAC5B,YAAY,EAAE,WAAW;QACzB,YAAY,EAAE,WAAW;QACzB,UAAU,EAAE,kBAAkB;QAC9B,YAAY,EAAE;YACZ,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YAClD,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YAC3C,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YAClD,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YAC/C,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YACxD,sBAAsB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YAC9D,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YACtD,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YACrD,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YAC1D,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YAC/C,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;YACpD,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YAC3D,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YACzD,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;YACzD,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;SACzD;QACD,UAAU,EAAE,GAAG;QACf,OAAO,EAAE,YAAY;KACtB,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACxH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAEjF,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAEjF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE7E,MAAM,SAAS,GAAG,4BAA4B,EAAE,CAAC;IACjD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAE/E,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;IACtC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAE/E,MAAM,cAAc,GAAG,sBAAsB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACxE,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,YAAY,GAAG,oBAAoB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACpE,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,KAAK,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAChE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,EACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CACvC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/C,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,6BAA6B,WAAW,MAAM,WAAW,GAAG,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC"}
|