@greenarmor/ges 1.2.5 → 1.2.6
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/dist/commands/audit.js +9 -4
- package/dist/commands/init.js +14 -1
- package/dist/commands/policy.js +20 -6
- package/package.json +14 -14
package/dist/commands/audit.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { ensureGESInitialized, readJsonFile, writeJsonFile } from "../utils/project.js";
|
|
3
|
-
import { recordActivity } from "@greenarmor/ges-core";
|
|
3
|
+
import { recordActivity, loadControlsFromDisk } from "@greenarmor/ges-core";
|
|
4
4
|
import { getPacksForProjectType, getAllPacks } from "@greenarmor/ges-policy-engine";
|
|
5
5
|
import { generateScoreFile, formatScoreOutput } from "@greenarmor/ges-scoring-engine";
|
|
6
6
|
import { runAudit, runAuditIncremental, deduplicateFindings } from "@greenarmor/ges-audit-engine";
|
|
@@ -37,16 +37,21 @@ export const auditCommand = new Command("audit")
|
|
|
37
37
|
}
|
|
38
38
|
const findings = deduplicateFindings(rawFindings);
|
|
39
39
|
console.log("");
|
|
40
|
-
const
|
|
40
|
+
const configFrameworks = (config?.frameworks || ["GDPR", "OWASP"]);
|
|
41
41
|
const projectPacks = getPacksForProjectType(config?.project_type || "generic-web-application");
|
|
42
42
|
const packIds = new Set(projectPacks.map(p => p.id));
|
|
43
|
-
const fwLower = new Set(
|
|
43
|
+
const fwLower = new Set(configFrameworks.map(f => f.toLowerCase()));
|
|
44
44
|
const allPacks = getAllPacks();
|
|
45
45
|
for (const p of allPacks) {
|
|
46
46
|
if (fwLower.has(p.id))
|
|
47
47
|
packIds.add(p.id);
|
|
48
48
|
}
|
|
49
|
-
const
|
|
49
|
+
const memoryControls = allPacks.filter(p => packIds.has(p.id)).flatMap(p => p.controls);
|
|
50
|
+
const diskControls = loadControlsFromDisk(root);
|
|
51
|
+
const seenIds = new Set(memoryControls.map(c => c.id));
|
|
52
|
+
const extraFromDisk = diskControls.filter(c => !seenIds.has(c.id));
|
|
53
|
+
const controls = [...memoryControls, ...extraFromDisk];
|
|
54
|
+
const frameworks = [...new Set(controls.map(c => c.framework).filter(Boolean))];
|
|
50
55
|
const overrides = loadControlOverrides(root);
|
|
51
56
|
const updatedControls = applyControlOverrides(controls, overrides);
|
|
52
57
|
const auditedControls = updateControlsFromFindings(updatedControls, findings);
|
package/dist/commands/init.js
CHANGED
|
@@ -75,10 +75,22 @@ export const initCommand = new Command("init")
|
|
|
75
75
|
created_at: now,
|
|
76
76
|
version: CLI_VERSION,
|
|
77
77
|
};
|
|
78
|
-
const dirs = [GES_DIR, COMPLIANCE_DIR, SECURITY_DIR, CONTROLS_DIR, POLICIES_DIR, CHECKLISTS_DIR, DOCS_DIR, REPORTS_DIR];
|
|
78
|
+
const dirs = [GES_DIR, COMPLIANCE_DIR, SECURITY_DIR, CONTROLS_DIR, POLICIES_DIR, CHECKLISTS_DIR, DOCS_DIR, REPORTS_DIR, ".dev-logs"];
|
|
79
79
|
for (const dir of dirs) {
|
|
80
80
|
fs.mkdirSync(path.join(process.cwd(), dir), { recursive: true });
|
|
81
81
|
}
|
|
82
|
+
const gitignorePath = path.join(process.cwd(), ".gitignore");
|
|
83
|
+
const devLogsIgnore = ".dev-logs/\n";
|
|
84
|
+
if (fs.existsSync(gitignorePath)) {
|
|
85
|
+
const existing = fs.readFileSync(gitignorePath, "utf-8");
|
|
86
|
+
if (!existing.includes(".dev-logs/")) {
|
|
87
|
+
fs.appendFileSync(gitignorePath, `\n# GESF developer logs (not for remote)\n${devLogsIgnore}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
writeFileSync(gitignorePath, `# GESF developer logs (not for remote)\n${devLogsIgnore}\n`);
|
|
92
|
+
}
|
|
93
|
+
writeFileSync(path.join(process.cwd(), ".dev-logs", "README.md"), `# Developer Logs\n\nThis directory is for GESF development notes, session logs, AI recommendations, and release notes.\n\n**This directory is gitignored and intended for developers only. Do not submit to remote.**\n\n## Structure\n\n- \`session-*.md\` — Session logs\n- \`release-notes-*.md\` — Release notes\n- \`ai-recommendations/\` — Recommendations from AI assistants using the MCP server\n`);
|
|
82
94
|
const configJson = generateConfigJson(config);
|
|
83
95
|
writeFileSync(path.join(process.cwd(), configJson.filePath), configJson.content);
|
|
84
96
|
const metadata = generateMetadataJson(config);
|
|
@@ -114,6 +126,7 @@ export const initCommand = new Command("init")
|
|
|
114
126
|
console.log(" ✓ Security documents created");
|
|
115
127
|
console.log(" ✓ Control packs installed:", packs.map(p => p.id).join(", "));
|
|
116
128
|
console.log(" ✓ GitHub Actions workflows generated");
|
|
129
|
+
console.log(" ✓ Developer logs directory created (.dev-logs/)");
|
|
117
130
|
console.log(`\n GESF initialized for "${projectName}" (${projectType})`);
|
|
118
131
|
console.log(" Next steps:");
|
|
119
132
|
console.log(" 1. Review generated compliance documents");
|
package/dist/commands/policy.js
CHANGED
|
@@ -35,18 +35,23 @@ policyCmd
|
|
|
35
35
|
const packDir = path.join(root, "controls", pack.id);
|
|
36
36
|
fs.mkdirSync(packDir, { recursive: true });
|
|
37
37
|
writeFileSync(path.join(packDir, "controls.json"), JSON.stringify(pack.controls, null, 2));
|
|
38
|
-
const
|
|
38
|
+
const frameworksAdded = [];
|
|
39
|
+
for (const fw of pack.frameworks) {
|
|
40
|
+
if (addFrameworkToConfig(root, fw)) {
|
|
41
|
+
frameworksAdded.push(fw);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
39
44
|
console.log(`\n ✓ Installed policy pack: ${pack.id} (${pack.controls.length} controls)`);
|
|
40
|
-
if (
|
|
41
|
-
console.log(` ✓ Added ${
|
|
45
|
+
if (frameworksAdded.length > 0) {
|
|
46
|
+
console.log(` ✓ Added ${frameworksAdded.join(", ")} to project frameworks in .ges/config.json`);
|
|
42
47
|
}
|
|
43
48
|
console.log(" ✓ Dashboard will now reflect this pack's controls\n");
|
|
44
49
|
recordActivity(root, {
|
|
45
50
|
source: "cli",
|
|
46
51
|
action: "policy_install",
|
|
47
52
|
title: `Installed pack: ${pack.name}`,
|
|
48
|
-
description: `Installed ${pack.controls.length} controls from ${pack.id} pack.${
|
|
49
|
-
details: { packs_affected: [pack.id], frameworks_added:
|
|
53
|
+
description: `Installed ${pack.controls.length} controls from ${pack.id} pack.${frameworksAdded.length > 0 ? ` Added ${frameworksAdded.join(", ")} to config frameworks.` : ""}`,
|
|
54
|
+
details: { packs_affected: [pack.id], frameworks_added: frameworksAdded },
|
|
50
55
|
});
|
|
51
56
|
await showNextStepsMenu("policy-install");
|
|
52
57
|
});
|
|
@@ -61,7 +66,16 @@ policyCmd
|
|
|
61
66
|
process.exit(1);
|
|
62
67
|
}
|
|
63
68
|
fs.rmSync(packDir, { recursive: true, force: true });
|
|
64
|
-
|
|
69
|
+
const packs = getAllPacks();
|
|
70
|
+
const pack = packs.find(p => p.id === packId);
|
|
71
|
+
if (pack) {
|
|
72
|
+
for (const fw of pack.frameworks) {
|
|
73
|
+
removeFrameworkFromConfig(root, fw);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
removeFrameworkFromConfig(root, packId.toUpperCase());
|
|
78
|
+
}
|
|
65
79
|
console.log(`\n ✓ Removed policy pack: ${packId}\n`);
|
|
66
80
|
recordActivity(root, {
|
|
67
81
|
source: "cli",
|
package/package.json
CHANGED
|
@@ -3,19 +3,19 @@
|
|
|
3
3
|
"ges": "./dist/cli.js"
|
|
4
4
|
},
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@greenarmor/ges-audit-engine": "1.2.
|
|
7
|
-
"@greenarmor/ges-cicd-generator": "1.2.
|
|
8
|
-
"@greenarmor/ges-compliance-engine": "1.2.
|
|
9
|
-
"@greenarmor/ges-core": "1.2.
|
|
10
|
-
"@greenarmor/ges-doc-generator": "1.2.
|
|
11
|
-
"@greenarmor/ges-git-hooks": "1.2.
|
|
12
|
-
"@greenarmor/ges-mcp-server": "1.2.
|
|
13
|
-
"@greenarmor/ges-policy-engine": "1.2.
|
|
14
|
-
"@greenarmor/ges-report-generator": "1.2.
|
|
15
|
-
"@greenarmor/ges-rules-engine": "1.2.
|
|
16
|
-
"@greenarmor/ges-scanner-integration": "1.2.
|
|
17
|
-
"@greenarmor/ges-scoring-engine": "1.2.
|
|
18
|
-
"@greenarmor/ges-web-dashboard": "1.2.
|
|
6
|
+
"@greenarmor/ges-audit-engine": "1.2.6",
|
|
7
|
+
"@greenarmor/ges-cicd-generator": "1.2.6",
|
|
8
|
+
"@greenarmor/ges-compliance-engine": "1.2.6",
|
|
9
|
+
"@greenarmor/ges-core": "1.2.6",
|
|
10
|
+
"@greenarmor/ges-doc-generator": "1.2.6",
|
|
11
|
+
"@greenarmor/ges-git-hooks": "1.2.6",
|
|
12
|
+
"@greenarmor/ges-mcp-server": "1.2.6",
|
|
13
|
+
"@greenarmor/ges-policy-engine": "1.2.6",
|
|
14
|
+
"@greenarmor/ges-report-generator": "1.2.6",
|
|
15
|
+
"@greenarmor/ges-rules-engine": "1.2.6",
|
|
16
|
+
"@greenarmor/ges-scanner-integration": "1.2.6",
|
|
17
|
+
"@greenarmor/ges-scoring-engine": "1.2.6",
|
|
18
|
+
"@greenarmor/ges-web-dashboard": "1.2.6",
|
|
19
19
|
"commander": "^13.0.0"
|
|
20
20
|
},
|
|
21
21
|
"description": "Green Engineering Standard Framework - Compliance-as-Code CLI",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
},
|
|
54
54
|
"type": "module",
|
|
55
55
|
"types": "./dist/index.d.ts",
|
|
56
|
-
"version": "1.2.
|
|
56
|
+
"version": "1.2.6",
|
|
57
57
|
"scripts": {
|
|
58
58
|
"build": "tsc",
|
|
59
59
|
"clean": "rm -rf dist tsconfig.tsbuildinfo",
|