opena2a-cli 0.1.1 → 0.2.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 (119) hide show
  1. package/README.md +227 -3
  2. package/dist/adapters/registry.js +1 -1
  3. package/dist/adapters/registry.js.map +1 -1
  4. package/dist/commands/guard-hooks.d.ts +27 -0
  5. package/dist/commands/guard-hooks.d.ts.map +1 -0
  6. package/dist/commands/guard-hooks.js +207 -0
  7. package/dist/commands/guard-hooks.js.map +1 -0
  8. package/dist/commands/guard-policy.d.ts +54 -0
  9. package/dist/commands/guard-policy.d.ts.map +1 -0
  10. package/dist/commands/guard-policy.js +251 -0
  11. package/dist/commands/guard-policy.js.map +1 -0
  12. package/dist/commands/guard-signing.d.ts +52 -0
  13. package/dist/commands/guard-signing.d.ts.map +1 -0
  14. package/dist/commands/guard-signing.js +185 -0
  15. package/dist/commands/guard-signing.js.map +1 -0
  16. package/dist/commands/guard-snapshots.d.ts +54 -0
  17. package/dist/commands/guard-snapshots.d.ts.map +1 -0
  18. package/dist/commands/guard-snapshots.js +346 -0
  19. package/dist/commands/guard-snapshots.js.map +1 -0
  20. package/dist/commands/guard.d.ts +60 -4
  21. package/dist/commands/guard.d.ts.map +1 -1
  22. package/dist/commands/guard.js +475 -95
  23. package/dist/commands/guard.js.map +1 -1
  24. package/dist/commands/init.d.ts.map +1 -1
  25. package/dist/commands/init.js +77 -3
  26. package/dist/commands/init.js.map +1 -1
  27. package/dist/commands/protect.d.ts +2 -0
  28. package/dist/commands/protect.d.ts.map +1 -1
  29. package/dist/commands/protect.js +56 -10
  30. package/dist/commands/protect.js.map +1 -1
  31. package/dist/commands/runtime.d.ts +1 -1
  32. package/dist/commands/runtime.js +5 -5
  33. package/dist/commands/runtime.js.map +1 -1
  34. package/dist/commands/self-register.js +6 -6
  35. package/dist/commands/self-register.js.map +1 -1
  36. package/dist/commands/shield.d.ts +39 -0
  37. package/dist/commands/shield.d.ts.map +1 -0
  38. package/dist/commands/shield.js +1262 -0
  39. package/dist/commands/shield.js.map +1 -0
  40. package/dist/commands/verify.js +1 -1
  41. package/dist/commands/verify.js.map +1 -1
  42. package/dist/index.js +41 -3
  43. package/dist/index.js.map +1 -1
  44. package/dist/router.d.ts.map +1 -1
  45. package/dist/router.js +1 -0
  46. package/dist/router.js.map +1 -1
  47. package/dist/shield/arp-bridge.d.ts +62 -0
  48. package/dist/shield/arp-bridge.d.ts.map +1 -0
  49. package/dist/shield/arp-bridge.js +198 -0
  50. package/dist/shield/arp-bridge.js.map +1 -0
  51. package/dist/shield/baselines.d.ts +58 -0
  52. package/dist/shield/baselines.d.ts.map +1 -0
  53. package/dist/shield/baselines.js +371 -0
  54. package/dist/shield/baselines.js.map +1 -0
  55. package/dist/shield/detect.d.ts +18 -0
  56. package/dist/shield/detect.d.ts.map +1 -0
  57. package/dist/shield/detect.js +402 -0
  58. package/dist/shield/detect.js.map +1 -0
  59. package/dist/shield/events.d.ts +65 -0
  60. package/dist/shield/events.d.ts.map +1 -0
  61. package/dist/shield/events.js +342 -0
  62. package/dist/shield/events.js.map +1 -0
  63. package/dist/shield/findings.d.ts +52 -0
  64. package/dist/shield/findings.d.ts.map +1 -0
  65. package/dist/shield/findings.js +336 -0
  66. package/dist/shield/findings.js.map +1 -0
  67. package/dist/shield/init.d.ts +22 -0
  68. package/dist/shield/init.d.ts.map +1 -0
  69. package/dist/shield/init.js +290 -0
  70. package/dist/shield/init.js.map +1 -0
  71. package/dist/shield/integrity.d.ts +75 -0
  72. package/dist/shield/integrity.d.ts.map +1 -0
  73. package/dist/shield/integrity.js +439 -0
  74. package/dist/shield/integrity.js.map +1 -0
  75. package/dist/shield/llm-backend.d.ts +36 -0
  76. package/dist/shield/llm-backend.d.ts.map +1 -0
  77. package/dist/shield/llm-backend.js +145 -0
  78. package/dist/shield/llm-backend.js.map +1 -0
  79. package/dist/shield/llm.d.ts +116 -0
  80. package/dist/shield/llm.d.ts.map +1 -0
  81. package/dist/shield/llm.js +536 -0
  82. package/dist/shield/llm.js.map +1 -0
  83. package/dist/shield/policy.d.ts +70 -0
  84. package/dist/shield/policy.d.ts.map +1 -0
  85. package/dist/shield/policy.js +399 -0
  86. package/dist/shield/policy.js.map +1 -0
  87. package/dist/shield/report-html.d.ts +29 -0
  88. package/dist/shield/report-html.d.ts.map +1 -0
  89. package/dist/shield/report-html.js +596 -0
  90. package/dist/shield/report-html.js.map +1 -0
  91. package/dist/shield/sarif.d.ts +65 -0
  92. package/dist/shield/sarif.d.ts.map +1 -0
  93. package/dist/shield/sarif.js +108 -0
  94. package/dist/shield/sarif.js.map +1 -0
  95. package/dist/shield/session.d.ts +63 -0
  96. package/dist/shield/session.d.ts.map +1 -0
  97. package/dist/shield/session.js +242 -0
  98. package/dist/shield/session.js.map +1 -0
  99. package/dist/shield/signing.d.ts +41 -0
  100. package/dist/shield/signing.d.ts.map +1 -0
  101. package/dist/shield/signing.js +161 -0
  102. package/dist/shield/signing.js.map +1 -0
  103. package/dist/shield/status.d.ts +4 -0
  104. package/dist/shield/status.d.ts.map +1 -0
  105. package/dist/shield/status.js +241 -0
  106. package/dist/shield/status.js.map +1 -0
  107. package/dist/shield/types.d.ts +416 -0
  108. package/dist/shield/types.d.ts.map +1 -0
  109. package/dist/shield/types.js +32 -0
  110. package/dist/shield/types.js.map +1 -0
  111. package/dist/util/drift-liveness.d.ts +37 -0
  112. package/dist/util/drift-liveness.d.ts.map +1 -0
  113. package/dist/util/drift-liveness.js +114 -0
  114. package/dist/util/drift-liveness.js.map +1 -0
  115. package/dist/util/drift-verification.d.ts +60 -0
  116. package/dist/util/drift-verification.d.ts.map +1 -0
  117. package/dist/util/drift-verification.js +457 -0
  118. package/dist/util/drift-verification.js.map +1 -0
  119. package/package.json +4 -2
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ // Shield artifact signing and verification.
3
+ //
4
+ // Uses SHA-256 hashing (same pattern as guard.ts) to protect Shield's own
5
+ // artifacts: policy.yaml, scan.json, llm-cache.json. Signatures are stored
6
+ // in ~/.opena2a/shield/signatures.json with 0o600 permissions.
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.signArtifact = signArtifact;
9
+ exports.verifyArtifact = verifyArtifact;
10
+ exports.signAllArtifacts = signAllArtifacts;
11
+ exports.loadSignatures = loadSignatures;
12
+ exports.saveSignatures = saveSignatures;
13
+ exports.verifyAllArtifacts = verifyAllArtifacts;
14
+ const node_crypto_1 = require("node:crypto");
15
+ const node_fs_1 = require("node:fs");
16
+ const node_path_1 = require("node:path");
17
+ const node_os_1 = require("node:os");
18
+ const types_js_1 = require("./types.js");
19
+ const events_js_1 = require("./events.js");
20
+ // Files that Shield signs (relative to shield dir)
21
+ const SHIELD_ARTIFACT_FILES = [
22
+ types_js_1.SHIELD_POLICY_FILE,
23
+ types_js_1.SHIELD_SCAN_FILE,
24
+ types_js_1.SHIELD_LLM_CACHE_FILE,
25
+ ];
26
+ /**
27
+ * Compute a SHA-256 signature for a single artifact file.
28
+ */
29
+ function signArtifact(filePath) {
30
+ const content = (0, node_fs_1.readFileSync)(filePath);
31
+ const hash = 'sha256:' + (0, node_crypto_1.createHash)('sha256').update(content).digest('hex');
32
+ const stat = (0, node_fs_1.statSync)(filePath);
33
+ const shieldDir = (0, events_js_1.getShieldDir)();
34
+ // Compute relative path from shield dir
35
+ let relPath = filePath;
36
+ if (filePath.startsWith(shieldDir)) {
37
+ relPath = filePath.slice(shieldDir.length + 1);
38
+ }
39
+ return {
40
+ filePath: relPath,
41
+ hash,
42
+ signedAt: new Date().toISOString(),
43
+ signedBy: (0, node_os_1.userInfo)().username + '@opena2a-cli',
44
+ fileSize: stat.size,
45
+ };
46
+ }
47
+ /**
48
+ * Verify an artifact file against its stored signature.
49
+ *
50
+ * Returns { valid: true } when:
51
+ * - No signatures file exists (never signed = acceptable)
52
+ * - The file has no stored signature (not yet tracked)
53
+ * - The current hash matches the stored hash
54
+ *
55
+ * Returns { valid: false, detail } when signatures exist and hash doesn't match.
56
+ */
57
+ function verifyArtifact(filePath) {
58
+ const store = loadSignatures();
59
+ if (!store) {
60
+ return { valid: true, detail: 'No signatures file found; skipping verification.' };
61
+ }
62
+ const shieldDir = (0, events_js_1.getShieldDir)();
63
+ let relPath = filePath;
64
+ if (filePath.startsWith(shieldDir)) {
65
+ relPath = filePath.slice(shieldDir.length + 1);
66
+ }
67
+ const sig = store.signatures.find(s => s.filePath === relPath);
68
+ if (!sig) {
69
+ return { valid: true, detail: `No signature recorded for ${relPath}.` };
70
+ }
71
+ if (!(0, node_fs_1.existsSync)(filePath)) {
72
+ return { valid: false, detail: `Signed file ${relPath} is missing.` };
73
+ }
74
+ const content = (0, node_fs_1.readFileSync)(filePath);
75
+ const currentHash = 'sha256:' + (0, node_crypto_1.createHash)('sha256').update(content).digest('hex');
76
+ if (currentHash === sig.hash) {
77
+ return { valid: true, detail: `${relPath} integrity verified.` };
78
+ }
79
+ return {
80
+ valid: false,
81
+ detail: `${relPath} has been modified since ${sig.signedAt}. Expected ${sig.hash}, got ${currentHash}.`,
82
+ };
83
+ }
84
+ /**
85
+ * Sign all known Shield artifacts that exist on disk.
86
+ */
87
+ function signAllArtifacts() {
88
+ const shieldDir = (0, events_js_1.getShieldDir)();
89
+ const signatures = [];
90
+ for (const relPath of SHIELD_ARTIFACT_FILES) {
91
+ const fullPath = (0, node_path_1.join)(shieldDir, relPath);
92
+ if (!(0, node_fs_1.existsSync)(fullPath))
93
+ continue;
94
+ signatures.push(signArtifact(fullPath));
95
+ }
96
+ const store = {
97
+ version: 1,
98
+ signatures,
99
+ updatedAt: new Date().toISOString(),
100
+ };
101
+ saveSignatures(store);
102
+ }
103
+ /**
104
+ * Load the signatures store from disk.
105
+ * Returns null if the file does not exist or is malformed.
106
+ */
107
+ function loadSignatures() {
108
+ const sigPath = (0, node_path_1.join)((0, events_js_1.getShieldDir)(), types_js_1.SHIELD_SIGNATURES_FILE);
109
+ if (!(0, node_fs_1.existsSync)(sigPath))
110
+ return null;
111
+ try {
112
+ const raw = (0, node_fs_1.readFileSync)(sigPath, 'utf-8');
113
+ const parsed = JSON.parse(raw);
114
+ if (parsed.version !== 1)
115
+ return null;
116
+ return parsed;
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ /**
123
+ * Save the signatures store to disk with restricted permissions.
124
+ */
125
+ function saveSignatures(store) {
126
+ const sigPath = (0, node_path_1.join)((0, events_js_1.getShieldDir)(), types_js_1.SHIELD_SIGNATURES_FILE);
127
+ (0, node_fs_1.writeFileSync)(sigPath, JSON.stringify(store, null, 2), {
128
+ encoding: 'utf-8',
129
+ mode: 0o600,
130
+ });
131
+ }
132
+ /**
133
+ * Verify all Shield artifact signatures.
134
+ * Returns a summary suitable for use as an IntegrityCheck.
135
+ */
136
+ function verifyAllArtifacts() {
137
+ const store = loadSignatures();
138
+ if (!store) {
139
+ return { valid: true, detail: 'No artifact signatures recorded; skipping.' };
140
+ }
141
+ const shieldDir = (0, events_js_1.getShieldDir)();
142
+ const failures = [];
143
+ for (const sig of store.signatures) {
144
+ const fullPath = (0, node_path_1.join)(shieldDir, sig.filePath);
145
+ const result = verifyArtifact(fullPath);
146
+ if (!result.valid) {
147
+ failures.push(result.detail);
148
+ }
149
+ }
150
+ if (failures.length === 0) {
151
+ return {
152
+ valid: true,
153
+ detail: `All ${store.signatures.length} artifact signatures verified.`,
154
+ };
155
+ }
156
+ return {
157
+ valid: false,
158
+ detail: failures.join(' '),
159
+ };
160
+ }
161
+ //# sourceMappingURL=signing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signing.js","sourceRoot":"","sources":["../../src/shield/signing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ShieldStatus } from './types.js';
2
+ export declare function getShieldStatus(targetDir?: string): ShieldStatus;
3
+ export declare function formatStatus(status: ShieldStatus, format: 'text' | 'json'): string;
4
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/shield/status.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAA8C,MAAM,YAAY,CAAC;AAkH3F,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CA+EhE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAuDlF"}
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getShieldStatus = getShieldStatus;
4
+ exports.formatStatus = formatStatus;
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ const node_os_1 = require("node:os");
8
+ const node_child_process_1 = require("node:child_process");
9
+ const types_js_1 = require("./types.js");
10
+ function getShieldDir() {
11
+ return (0, node_path_1.join)((0, node_os_1.homedir)(), '.opena2a', 'shield');
12
+ }
13
+ function tryExec(cmd) {
14
+ try {
15
+ return (0, node_child_process_1.execSync)(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ /** Resolve a binary via which, returning the path or null. */
22
+ function whichBinary(name) {
23
+ try {
24
+ return (0, node_child_process_1.execFileSync)('which', [name], { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ function detectProduct(name) {
31
+ switch (name) {
32
+ case 'Secretless': {
33
+ const version = whichBinary('secretless-ai') ? tryExec('secretless-ai --version 2>/dev/null') : null;
34
+ const configExists = (0, node_fs_1.existsSync)((0, node_path_1.join)(process.cwd(), '.secretless.json')) ||
35
+ (0, node_fs_1.existsSync)((0, node_path_1.join)((0, node_os_1.homedir)(), '.secretless', 'config.json'));
36
+ return {
37
+ name: 'Secretless',
38
+ installed: version !== null,
39
+ active: configExists,
40
+ version,
41
+ keyMetric: configExists ? 'configured' : 'not configured',
42
+ };
43
+ }
44
+ case 'ARP': {
45
+ const configExists = (0, node_fs_1.existsSync)((0, node_path_1.join)(process.cwd(), '.arp.yaml')) ||
46
+ (0, node_fs_1.existsSync)((0, node_path_1.join)(process.cwd(), 'arp.yaml'));
47
+ const eventsPath = (0, node_path_1.join)(process.cwd(), '.opena2a', 'arp', 'events.jsonl');
48
+ const hasEvents = (0, node_fs_1.existsSync)(eventsPath);
49
+ return {
50
+ name: 'Runtime Guard (ARP)',
51
+ installed: configExists,
52
+ active: hasEvents,
53
+ version: null,
54
+ keyMetric: hasEvents ? 'monitoring' : configExists ? 'configured' : 'not configured',
55
+ };
56
+ }
57
+ case 'Browser Guard': {
58
+ const configPaths = [
59
+ (0, node_path_1.join)((0, node_os_1.homedir)(), '.config', 'opena2a', 'browser-guard.json'),
60
+ (0, node_path_1.join)((0, node_os_1.homedir)(), '.opena2a', 'browser-guard.json'),
61
+ ];
62
+ const found = configPaths.some(p => (0, node_fs_1.existsSync)(p));
63
+ return {
64
+ name: 'Browser Guard',
65
+ installed: found,
66
+ active: found,
67
+ version: null,
68
+ keyMetric: found ? 'active' : 'not installed',
69
+ };
70
+ }
71
+ case 'HMA': {
72
+ const version = whichBinary('hackmyagent') ? tryExec('hackmyagent --version 2>/dev/null') : null;
73
+ return {
74
+ name: 'HackMyAgent',
75
+ installed: version !== null,
76
+ active: version !== null,
77
+ version,
78
+ keyMetric: version ? `v${version}` : 'not installed',
79
+ };
80
+ }
81
+ case 'Registry': {
82
+ // Registry is typically a remote service; check if CLI supports it
83
+ const hasRegistry = whichBinary('opena2a') !== null;
84
+ return {
85
+ name: 'Registry',
86
+ installed: hasRegistry !== null,
87
+ active: false,
88
+ version: null,
89
+ keyMetric: hasRegistry ? 'available' : 'not available',
90
+ };
91
+ }
92
+ case 'ConfigGuard': {
93
+ const sigFile = (0, node_path_1.join)(process.cwd(), '.opena2a', 'guard', 'signatures.json');
94
+ let fileCount = 0;
95
+ if ((0, node_fs_1.existsSync)(sigFile)) {
96
+ try {
97
+ const store = JSON.parse((0, node_fs_1.readFileSync)(sigFile, 'utf-8'));
98
+ fileCount = Array.isArray(store.signatures) ? store.signatures.length : 0;
99
+ }
100
+ catch { /* ok */ }
101
+ }
102
+ return {
103
+ name: 'ConfigGuard',
104
+ installed: true, // Built into CLI
105
+ active: fileCount > 0,
106
+ version: null,
107
+ keyMetric: fileCount > 0 ? `${fileCount} files signed` : 'no signatures',
108
+ };
109
+ }
110
+ default:
111
+ return { name, installed: false, active: false, version: null, keyMetric: 'unknown' };
112
+ }
113
+ }
114
+ function getShieldStatus(targetDir) {
115
+ const shieldDir = getShieldDir();
116
+ const products = [
117
+ detectProduct('Secretless'),
118
+ detectProduct('ARP'),
119
+ detectProduct('Browser Guard'),
120
+ detectProduct('HMA'),
121
+ detectProduct('Registry'),
122
+ detectProduct('ConfigGuard'),
123
+ ];
124
+ // Policy status
125
+ const policyPath = (0, node_path_1.join)(shieldDir, types_js_1.SHIELD_POLICY_FILE);
126
+ let policyLoaded = false;
127
+ let policyMode = null;
128
+ if ((0, node_fs_1.existsSync)(policyPath)) {
129
+ policyLoaded = true;
130
+ try {
131
+ const raw = (0, node_fs_1.readFileSync)(policyPath, 'utf-8');
132
+ const policy = JSON.parse(raw);
133
+ policyMode = policy.mode ?? 'adaptive';
134
+ }
135
+ catch {
136
+ policyMode = null;
137
+ }
138
+ }
139
+ // Shell integration
140
+ const shell = process.env.SHELL?.includes('zsh') ? 'zsh'
141
+ : process.env.SHELL?.includes('bash') ? 'bash'
142
+ : null;
143
+ let shellIntegration = false;
144
+ if (shell) {
145
+ const rcFile = shell === 'zsh'
146
+ ? (0, node_path_1.join)((0, node_os_1.homedir)(), '.zshrc')
147
+ : (0, node_path_1.join)((0, node_os_1.homedir)(), '.bashrc');
148
+ try {
149
+ const content = (0, node_fs_1.readFileSync)(rcFile, 'utf-8');
150
+ shellIntegration = content.includes('opena2a_shield_preexec') ||
151
+ content.includes('opena2a_shield_debug');
152
+ }
153
+ catch { /* ok */ }
154
+ }
155
+ // Integrity status
156
+ let integrityStatus = 'healthy';
157
+ const lockdownPath = (0, node_path_1.join)(shieldDir, 'lockdown');
158
+ if ((0, node_fs_1.existsSync)(lockdownPath)) {
159
+ integrityStatus = 'lockdown';
160
+ }
161
+ // Last report
162
+ let lastReportScore = null;
163
+ let lastReportDate = null;
164
+ const reportsDir = (0, node_path_1.join)(shieldDir, types_js_1.SHIELD_REPORTS_DIR);
165
+ if ((0, node_fs_1.existsSync)(reportsDir)) {
166
+ try {
167
+ const files = (0, node_fs_1.readdirSync)(reportsDir)
168
+ .filter(f => f.endsWith('.json'))
169
+ .sort()
170
+ .reverse();
171
+ if (files.length > 0) {
172
+ const latestReport = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(reportsDir, files[0]), 'utf-8'));
173
+ lastReportScore = latestReport.posture?.score ?? null;
174
+ lastReportDate = latestReport.generatedAt ?? null;
175
+ }
176
+ }
177
+ catch { /* ok */ }
178
+ }
179
+ return {
180
+ timestamp: new Date().toISOString(),
181
+ products,
182
+ policyLoaded,
183
+ policyMode,
184
+ shellIntegration,
185
+ integrityStatus,
186
+ lastReportScore,
187
+ lastReportDate,
188
+ };
189
+ }
190
+ function formatStatus(status, format) {
191
+ if (format === 'json') {
192
+ return JSON.stringify(status, null, 2);
193
+ }
194
+ const lines = [];
195
+ lines.push('Shield Status\n');
196
+ // Products table
197
+ lines.push('Products:');
198
+ for (const p of status.products) {
199
+ const state = p.active ? 'ACTIVE' : p.installed ? 'INSTALLED' : ' -- ';
200
+ lines.push(` ${state.padEnd(10)} ${p.name.padEnd(22)} ${p.keyMetric}`);
201
+ }
202
+ lines.push('');
203
+ // Policy
204
+ if (status.policyLoaded) {
205
+ lines.push(`Policy: loaded (${status.policyMode ?? 'unknown'} mode)`);
206
+ }
207
+ else {
208
+ lines.push('Policy: not loaded (run: opena2a shield init)');
209
+ }
210
+ // Shell integration
211
+ lines.push(`Shell integration: ${status.shellIntegration ? 'active' : 'inactive'}`);
212
+ // Integrity
213
+ lines.push(`Integrity: ${status.integrityStatus.toUpperCase()}`);
214
+ // Last report
215
+ if (status.lastReportScore !== null) {
216
+ lines.push(`Last report: ${status.lastReportScore}/100 (${status.lastReportDate ?? 'unknown'})`);
217
+ }
218
+ // Recommendations
219
+ const recs = [];
220
+ if (!status.policyLoaded)
221
+ recs.push('Run: opena2a shield init');
222
+ if (!status.shellIntegration)
223
+ recs.push('Shell hooks not installed. Re-run: opena2a shield init');
224
+ if (status.integrityStatus === 'lockdown')
225
+ recs.push('LOCKDOWN active. Run: opena2a shield recover --verify');
226
+ if (status.integrityStatus === 'compromised')
227
+ recs.push('Integrity issues detected. Run: opena2a shield selfcheck');
228
+ const inactiveProducts = status.products.filter(p => !p.active && p.name !== 'Registry');
229
+ if (inactiveProducts.length > 0) {
230
+ recs.push(`Inactive products: ${inactiveProducts.map(p => p.name).join(', ')}`);
231
+ }
232
+ if (recs.length > 0) {
233
+ lines.push('');
234
+ lines.push('Recommendations:');
235
+ for (const r of recs) {
236
+ lines.push(` - ${r}`);
237
+ }
238
+ }
239
+ return lines.join('\n');
240
+ }
241
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/shield/status.ts"],"names":[],"mappings":"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"}