@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.
@@ -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 frameworks = (config?.frameworks || ["GDPR", "OWASP"]);
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(frameworks.map(f => f.toLowerCase()));
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 controls = allPacks.filter(p => packIds.has(p.id)).flatMap(p => p.controls);
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);
@@ -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");
@@ -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 addedToConfig = addFrameworkToConfig(root, pack.id.toUpperCase());
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 (addedToConfig) {
41
- console.log(` ✓ Added ${pack.id.toUpperCase()} to project frameworks in .ges/config.json`);
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.${addedToConfig ? ` Added ${pack.id.toUpperCase()} to config frameworks.` : ""}`,
49
- details: { packs_affected: [pack.id], frameworks_added: addedToConfig ? [pack.id.toUpperCase()] : [] },
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
- removeFrameworkFromConfig(root, packId.toUpperCase());
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.5",
7
- "@greenarmor/ges-cicd-generator": "1.2.5",
8
- "@greenarmor/ges-compliance-engine": "1.2.5",
9
- "@greenarmor/ges-core": "1.2.5",
10
- "@greenarmor/ges-doc-generator": "1.2.5",
11
- "@greenarmor/ges-git-hooks": "1.2.5",
12
- "@greenarmor/ges-mcp-server": "1.2.5",
13
- "@greenarmor/ges-policy-engine": "1.2.5",
14
- "@greenarmor/ges-report-generator": "1.2.5",
15
- "@greenarmor/ges-rules-engine": "1.2.5",
16
- "@greenarmor/ges-scanner-integration": "1.2.5",
17
- "@greenarmor/ges-scoring-engine": "1.2.5",
18
- "@greenarmor/ges-web-dashboard": "1.2.5",
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.5",
56
+ "version": "1.2.6",
57
57
  "scripts": {
58
58
  "build": "tsc",
59
59
  "clean": "rm -rf dist tsconfig.tsbuildinfo",