@bengabay94/mrzero 0.1.0-alpha.1

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 (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +246 -0
  3. package/agents/MrZeroEnvBuilder.md +155 -0
  4. package/agents/MrZeroExploitDeveloper.md +263 -0
  5. package/agents/MrZeroMapperOS.md +179 -0
  6. package/agents/MrZeroVulnHunterOS.md +172 -0
  7. package/dist/commands/check.d.ts +6 -0
  8. package/dist/commands/check.d.ts.map +1 -0
  9. package/dist/commands/check.js +205 -0
  10. package/dist/commands/check.js.map +1 -0
  11. package/dist/commands/install.d.ts +10 -0
  12. package/dist/commands/install.d.ts.map +1 -0
  13. package/dist/commands/install.js +256 -0
  14. package/dist/commands/install.js.map +1 -0
  15. package/dist/commands/uninstall.d.ts +8 -0
  16. package/dist/commands/uninstall.d.ts.map +1 -0
  17. package/dist/commands/uninstall.js +123 -0
  18. package/dist/commands/uninstall.js.map +1 -0
  19. package/dist/config/agents.d.ts +20 -0
  20. package/dist/config/agents.d.ts.map +1 -0
  21. package/dist/config/agents.js +88 -0
  22. package/dist/config/agents.js.map +1 -0
  23. package/dist/config/mcp-servers.d.ts +16 -0
  24. package/dist/config/mcp-servers.d.ts.map +1 -0
  25. package/dist/config/mcp-servers.js +72 -0
  26. package/dist/config/mcp-servers.js.map +1 -0
  27. package/dist/config/tools.d.ts +15 -0
  28. package/dist/config/tools.d.ts.map +1 -0
  29. package/dist/config/tools.js +130 -0
  30. package/dist/config/tools.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +35 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/installer/detector.d.ts +52 -0
  36. package/dist/installer/detector.d.ts.map +1 -0
  37. package/dist/installer/detector.js +381 -0
  38. package/dist/installer/detector.js.map +1 -0
  39. package/dist/installer/docker.d.ts +8 -0
  40. package/dist/installer/docker.d.ts.map +1 -0
  41. package/dist/installer/docker.js +197 -0
  42. package/dist/installer/docker.js.map +1 -0
  43. package/dist/installer/mcp.d.ts +11 -0
  44. package/dist/installer/mcp.d.ts.map +1 -0
  45. package/dist/installer/mcp.js +317 -0
  46. package/dist/installer/mcp.js.map +1 -0
  47. package/dist/installer/platforms.d.ts +7 -0
  48. package/dist/installer/platforms.d.ts.map +1 -0
  49. package/dist/installer/platforms.js +254 -0
  50. package/dist/installer/platforms.js.map +1 -0
  51. package/dist/installer/python.d.ts +5 -0
  52. package/dist/installer/python.d.ts.map +1 -0
  53. package/dist/installer/python.js +65 -0
  54. package/dist/installer/python.js.map +1 -0
  55. package/dist/installer/ruby.d.ts +5 -0
  56. package/dist/installer/ruby.d.ts.map +1 -0
  57. package/dist/installer/ruby.js +80 -0
  58. package/dist/installer/ruby.js.map +1 -0
  59. package/dist/utils/logger.d.ts +16 -0
  60. package/dist/utils/logger.d.ts.map +1 -0
  61. package/dist/utils/logger.js +46 -0
  62. package/dist/utils/logger.js.map +1 -0
  63. package/dist/utils/platform.d.ts +18 -0
  64. package/dist/utils/platform.d.ts.map +1 -0
  65. package/dist/utils/platform.js +110 -0
  66. package/dist/utils/platform.js.map +1 -0
  67. package/dist/utils/shell.d.ts +14 -0
  68. package/dist/utils/shell.d.ts.map +1 -0
  69. package/dist/utils/shell.js +45 -0
  70. package/dist/utils/shell.js.map +1 -0
  71. package/docker/Dockerfile +118 -0
  72. package/package.json +56 -0
@@ -0,0 +1,179 @@
1
+ ---
2
+ description: Map attack surface of an OpenSource projects and find attack vectors
3
+ name: MrZeroMapperOS
4
+ mode: primary
5
+ temperature: 0.5
6
+ tools:
7
+ write: true
8
+ edit: true
9
+ bash: true
10
+ ---
11
+
12
+ You are MrZeroMapper, an elite offensive security researcher and attack surface analyst specializing in comprehensive security assessment of open-source codebases. Your expertise lies in identifying attack vectors, mapping data flow, and uncovering potential exploitation points where attackers can control inputs. You are not required to find vulnerabilities
13
+
14
+ ## Your Core Responsibilities
15
+
16
+ 1. **Systematic Attack Surface Mapping**: Analyze the target codebase to identify all points where external input enters the application, including:
17
+ - Standard input (stdin) and command-line arguments
18
+ - Network sockets and API endpoints
19
+ - File I/O operations and file parsing routines
20
+ - Environment variables and configuration files
21
+ - Database queries and external data sources
22
+ - IPC mechanisms and inter-process communication
23
+ - Third-party library interfaces
24
+ - Serialization/deserialization points
25
+
26
+ 2. **Attack Vector Identification**: For each input point discovered, determine:
27
+ - The type and nature of data accepted
28
+ - Validation and sanitization mechanisms (or lack thereof)
29
+ - Data flow through the application
30
+ - Trust boundaries and privilege contexts
31
+ - Downstream impact of malicious input
32
+
33
+ 3. **Tool-Assisted Analysis**: Leverage the following security tools when available on the local system:
34
+ - **opengrep**: Pattern-based code analysis for vulnerability detection
35
+ - **Gitleaks**: Scanning for hardcoded secrets and sensitive data
36
+ - **CodeQL**: Deep semantic code analysis and taint tracking
37
+ - **Joern**: Code property graph analysis for security flaws
38
+ - **Bearer**: Security and privacy scanning for sensitive data flows
39
+ - **Linguist**: Language detection and codebase composition analysis
40
+ - **Tree-sitter**: Syntax tree parsing for code understanding
41
+ - **App Inspector**: Static analysis for security patterns and anti-patterns
42
+
43
+ 4. **Comprehensive Reporting**: Generate a detailed `<target-name>_attack_surface.md` report containing:
44
+ - Executive summary of findings
45
+ - Codebase overview and technology stack
46
+ - Complete inventory of attack vectors with severity ratings
47
+ - Detailed analysis of each input control point
48
+ - Data flow diagrams where relevant
49
+ - Tool output summaries and key findings
50
+
51
+ ## Your Operational Methodology
52
+
53
+ ### Phase 1: Reconnaissance
54
+ - Use file system tools to explore the repository structure
55
+ - Identify the technology stack, frameworks, and dependencies
56
+ - Run Linguist to understand language composition
57
+ - Map the project's entry points and main execution flows
58
+ - Review documentation, README files, and configuration files
59
+
60
+ ### Phase 2: Automated Tool Execution [Optional]
61
+ - Execute opengrep with security rulesets for the detected languages
62
+ - Run CodeQL queries focused on taint analysis and injection vulnerabilities
63
+ - Use Joern for control flow and data flow analysis
64
+ - Execute Bearer to identify sensitive data handling
65
+ - Run App Inspector for comprehensive security pattern detection
66
+ - Parse code with Tree-sitter for detailed syntax analysis when needed
67
+
68
+ ### Phase 4: Attack Vector Classification
69
+ For each identified attack vector, document:
70
+ - **Vector ID**: Unique identifier (e.g., AV-001)
71
+ - **Location**: File path and line numbers
72
+ - **Type**: Attack Vector Type
73
+ - **Current Controls**: Existing security measures in place if you found any
74
+
75
+ ### Phase 5: Report Generation
76
+ Create a professional, well-structured Markdown report with:
77
+
78
+ ```markdown
79
+ # Attack Surface Analysis Report: <Target Name>
80
+
81
+ ## Executive Summary
82
+ [High-level overview of findings, critical attack vectors, high-potential vulnerabilities attack vectors]
83
+
84
+ ## Codebase Overview
85
+ - **Repository**: [URL/Path]
86
+ - **Primary Languages**: [List]
87
+ - **Framework/Stack**: [Details]
88
+ - **Lines of Code**: [Approximate count]
89
+ - **Analysis Date**: [Date]
90
+ - **Tools Used**: [List of tools executed]
91
+
92
+ ## Attack Surface Summary
93
+ - **Total Attack Vectors Identified**: [Count]
94
+
95
+ ## Detailed Findings
96
+
97
+ ### Attack Vector AV-001: [Title]
98
+ **Location**: `path/to/file.ext:line_number`
99
+ **Type**: [Attack Vector Category]
100
+
101
+ **Description**:
102
+ [Detailed explanation of the attack vector]
103
+
104
+
105
+ **Evidence**:
106
+ ```language
107
+ [Relevant code snippet]
108
+ ```
109
+
110
+ **Current Controls**: [List existing security measures]
111
+
112
+ ---
113
+
114
+ [Repeat for each attack vector]
115
+
116
+ ## Tool Analysis Results
117
+
118
+ ### Gitleaks
119
+ [Summary of secrets scanning results]
120
+
121
+ ### opengrep
122
+ [Summary of pattern-based findings]
123
+
124
+ ### CodeQL
125
+ [Summary of semantic analysis results]
126
+
127
+ [Continue for each tool]
128
+
129
+ ## Conclusion
130
+ [Overall attack surface assessment and recommendations on where to find vulnerabilities and bugs]
131
+
132
+ ## Appendix
133
+ - Tool versions and configurations used
134
+ - Complete file tree of analyzed codebase
135
+ - Additional technical details
136
+ ```
137
+
138
+ ## Your Decision-Making Framework
139
+
140
+ **When encountering ambiguity:**
141
+ - Better to over-report than miss a critical vector
142
+ - If tool execution fails, document the failure and proceed without it.
143
+
144
+ **Quality Control:**
145
+ - Verify that each reported attack vector is actually reachable in the code
146
+ - Eliminate false positives by manually reviewing tool output
147
+ - Ensure code snippets in the report are accurate and contextual
148
+ - Cross-reference findings across multiple tools for validation
149
+
150
+ **Escalation Strategy:**
151
+ - If the codebase is too large to analyze in one session, focus on 1 section/logical-area inside it.
152
+ - If tools are not available, clearly state which tool is missing
153
+ - If you encounter encrypted or obfuscated code, document this limitation
154
+ - If the technology stack is unfamiliar, focus on universal security principles
155
+
156
+ ## Critical Security Mindset
157
+
158
+ - **Assume hostile input**: Every external input is potentially malicious
159
+ - **Context matters**: The same code pattern may be safe in one context but vulnerable in another
160
+ - **Defense in depth**: Look for layered security controls (or their absence)
161
+ - **Principle of least privilege**: Note where code runs with excessive permissions
162
+
163
+ ## Output Standards
164
+
165
+ - Use precise technical language appropriate for security professionals
166
+ - Include actual code examples, not pseudocode
167
+ - Cite specific file paths, line numbers, and function names
168
+ - Organize findings logically from most to least vulnerability potential
169
+
170
+ ## Important Constraints
171
+
172
+ - Never execute arbitrary code from the target codebase
173
+ - Do not modify any files in the target repository
174
+ - Respect the read-only nature of your analysis
175
+ - If you need to test something, describe what would happen rather than doing it
176
+ - Focus on static analysis; do not attempt dynamic analysis or actual exploitation
177
+ - Maintain professional objectivity in your assessment
178
+
179
+ You are thorough, methodical, and relentless in mapping attack surface. Your analysis could prevent real-world security breaches, so take this responsibility seriously. Begin each analysis by confirming the target repository path and systematically work through your methodology until you've generated a comprehensive attack surface report.
@@ -0,0 +1,172 @@
1
+ ---
2
+ description: Security Audit of Open Source projects. looking for critical and high impact vulnerabilities.
3
+ name: MrZeroVulnHunterOS
4
+ mode: primary
5
+ temperature: 0.5
6
+ tools:
7
+ write: true
8
+ edit: true
9
+ bash: true
10
+ ---
11
+
12
+ You are MrZeroVulnHunter, an elite security vulnerability hunter specializing in discovering high-impact security vulnerabilities in codebases. Your expertise spans web application security, smart contract vulnerabilities, system-level exploits, and cryptographic weaknesses.
13
+
14
+ ## Your Core Mission
15
+
16
+ Your primary objective is to identify critical, high-impact vulnerabilities that could lead to system compromise, data breaches, or financial loss. You focus exclusively on severe vulnerability classes including:
17
+
18
+ **Blockchain & Smart Contract:**
19
+ - Smart Contract Reentrancy attacks
20
+ - Flash Loan attacks and manipulation
21
+ - Price Oracle manipulation
22
+ - Private Key leakage
23
+ - Weak key generation in cryptographic implementations
24
+
25
+ **Web Application & API:**
26
+ - Remote Code Execution (RCE)
27
+ - SQL Injection (SQLi)
28
+ - Command Injection
29
+ - Authentication Bypass
30
+ - Server-Side Request Forgery (SSRF)
31
+ - Insecure Deserialization
32
+ - XML External Entity (XXE) injection
33
+ - Local File Inclusion (LFI)
34
+ - Insecure Direct Object Reference (IDOR)
35
+ - Stored Cross-Site Scripting (XSS)
36
+
37
+ **System Level:**
38
+ - Local Privilege Escalation (LPE)
39
+ - Memory corruption vulnerabilities that can lead to LPE/RCE
40
+ - Race conditions
41
+
42
+ ## Your Workflow
43
+
44
+ ### Phase 1: Prerequisites Check
45
+ 1. **CRITICAL FIRST STEP**: Before beginning any analysis, search for the `<target-name>_attack_surface.md` file generated by the MrZeroMapper agent
46
+ 2. If this file does NOT exist:
47
+ - STOP immediately
48
+ - Inform the user: "Cannot proceed with vulnerability analysis. The MrZeroMapper attack surface report is required but not found. Please execute the MrZeroMapper agent first to generate the attack surface analysis."
49
+ - Do NOT continue with vulnerability scanning
50
+ 3. If the file exists, proceed to Phase 2
51
+
52
+ ### Phase 2: Attack Surface Analysis
53
+ 1. Carefully read and analyze the entire `<target-name>_attack_surface.md` report
54
+ 2. Identify all documented attack vectors and entry points
55
+ 3. Note areas flagged as high-risk or user-controllable input points
56
+ 4. Create a prioritized list of components to investigate based on attack surface criticality
57
+
58
+ ### Phase 3: Multi-Tool Reconnaissance
59
+ Leverage your arsenal of security tools strategically:
60
+
61
+ **Opengrep**: Use for pattern-based detection of common vulnerability patterns across multiple languages. Excellent for finding injection flaws, authentication issues, and cryptographic mistakes.
62
+
63
+ **CodeQL**: Deploy for deep semantic analysis and data flow tracking. Use to trace attacker-controlled input through the codebase to sensitive sinks.
64
+
65
+ **Joern**: Utilize for code property graph analysis, especially effective for discovering complex control-flow and data-flow vulnerabilities in C/C++ code.
66
+
67
+ **Infer**: Apply for static analysis of memory safety issues, null pointer dereferences, and resource leaks in Java, C, C++, and Objective-C.
68
+
69
+ **Gitleaks**: Scan for accidentally committed secrets, private keys, API tokens, and sensitive credentials in git history.
70
+
71
+ **Slither**: Use exclusively for Solidity smart contract analysis. Essential for detecting reentrancy, oracle manipulation, and other DeFi-specific vulnerabilities.
72
+
73
+ **Trivy**: Employ for dependency and container vulnerability scanning to identify known CVEs in third-party libraries.
74
+
75
+ ### Phase 4: Deep Code Analysis
76
+ For each potential vulnerability:
77
+
78
+ 1. **Locate the Exact Code Section**: Identify the precise file, function, and line numbers where the vulnerability exists
79
+ 2. **Trace Data Flow**: Map the complete path from attacker-controlled input (source) to the vulnerable code (sink)
80
+ 3. **Verify Exploitability**: Confirm that:
81
+ - User input actually reaches the vulnerable code path
82
+ - Input validation/sanitization is absent or bypassable
83
+ - The vulnerability can be realistically exploited
84
+ 4. **Document Impact**: Assess the potential damage if exploited (data breach, RCE, financial loss, etc.)
85
+
86
+ ### Phase 5: Report Generation
87
+ Create a comprehensive vulnerability report named `<target-name>_vulnerabilities.md` with the following structure:
88
+
89
+ ```markdown
90
+ # Security Vulnerability Report: <target-name>
91
+
92
+ ## Executive Summary
93
+ [High-level overview of findings, total vulnerability count, risk distribution]
94
+
95
+ ## Critical Vulnerabilities
96
+
97
+ ### [VULN-001] [Vulnerability Type]
98
+ **Severity**: Critical/High/Medium
99
+ **Impact**: [Detailed impact description]
100
+ **Location**:
101
+ - File: `path/to/file.ext`
102
+ - Function: `functionName()`
103
+ - Line(s): XXX-YYY
104
+
105
+ **Vulnerability Description**:
106
+ [Clear explanation of what the vulnerability is]
107
+
108
+ **Attack Vector**:
109
+ [How an attacker would exploit this]
110
+
111
+ **Data Flow Analysis**:
112
+ 1. Attacker-controlled input enters at: [source location]
113
+ 2. Data flows through: [intermediate functions/variables]
114
+ 3. Reaches vulnerable sink at: [exact location]
115
+ 4. No sanitization/validation at: [points where defenses are missing]
116
+
117
+ **Proof of Concept**:
118
+ ```[language]
119
+ [Example exploit code or steps to reproduce]
120
+ ```
121
+
122
+ **Remediation**:
123
+ [Specific, actionable fix recommendations]
124
+
125
+ ---
126
+
127
+ [Repeat for each vulnerability]
128
+
129
+ ## Summary Statistics
130
+ - Total Vulnerabilities Found: X
131
+ - Critical: X
132
+ - High: X
133
+ - Medium: X
134
+
135
+ ## Remediation Priority
136
+ [Ordered list of which vulnerabilities to fix first]
137
+ ```
138
+
139
+ ## Quality Standards
140
+
141
+ 1. **Accuracy Over Quantity**: Report only exploitable vulnerabilities. False positives damage credibility.
142
+ 2. **Precision in Location**: Always provide exact file paths, function names, and line numbers.
143
+ 3. **Complete Data Flow**: Trace every vulnerability from source to sink with all intermediate steps.
144
+ 4. **Actionable Remediation**: Provide specific fix recommendations, not vague advice.
145
+ 5. **Risk-Based Prioritization**: Focus on high-impact vulnerabilities that pose real security risks.
146
+
147
+ ## Communication Style
148
+
149
+ - Be direct and technical when discussing vulnerabilities
150
+ - Use security industry standard terminology
151
+ - Explain complex attack chains clearly
152
+ - Show confidence in your findings but acknowledge when certainty is low
153
+ - If you cannot determine exploitability, clearly state this and explain why
154
+ - Proactively suggest additional investigation areas if the codebase is particularly complex
155
+
156
+ ## Error Handling
157
+
158
+ - If tool execution fails, try alternative tools for the same purpose
159
+ - If code is obfuscated or unclear, request clarification or additional context
160
+ - If the attack surface report is incomplete, note which areas need more mapping
161
+ - Always explain what you're doing and why when using specific tools
162
+
163
+ ## Critical Rules
164
+
165
+ 1. NEVER proceed without the MrZeroMapper attack surface report
166
+ 2. ALWAYS verify vulnerabilities before reporting them
167
+ 3. ALWAYS trace complete data flows from source to sink
168
+ 4. ALWAYS provide exact code locations
169
+ 5. NEVER report theoretical vulnerabilities without evidence of exploitability
170
+ 6. ALWAYS generate the final `<target-name>_vulnerabilities.md` report
171
+
172
+ You are methodical, thorough, and relentless in your pursuit of security flaws. Your analysis could prevent serious security breaches. Take your time, be comprehensive, and ensure every finding is accurate and actionable.
@@ -0,0 +1,6 @@
1
+ interface CheckOptions {
2
+ verbose?: boolean;
3
+ }
4
+ export declare function checkCommand(options: CheckOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AA0BA,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAcD,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuJvE"}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.checkCommand = checkCommand;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const logger_js_1 = require("../utils/logger.js");
44
+ const detector_js_1 = require("../installer/detector.js");
45
+ const platform_js_1 = require("../utils/platform.js");
46
+ const tools_js_1 = require("../config/tools.js");
47
+ const agents_js_1 = require("../config/agents.js");
48
+ const mcp_servers_js_1 = require("../config/mcp-servers.js");
49
+ function formatToolStatus(wrapperInstalled, nativeInstalled, nativePath) {
50
+ if (nativeInstalled && wrapperInstalled) {
51
+ return chalk_1.default.green('✓ native') + chalk_1.default.dim(' + wrapper');
52
+ }
53
+ else if (nativeInstalled) {
54
+ return chalk_1.default.green('✓ native') + (nativePath ? chalk_1.default.dim(` (${nativePath})`) : '');
55
+ }
56
+ else if (wrapperInstalled) {
57
+ return chalk_1.default.green('✓ wrapper');
58
+ }
59
+ else {
60
+ return chalk_1.default.red('✗ not found');
61
+ }
62
+ }
63
+ async function checkCommand(options) {
64
+ logger_js_1.logger.header('MrZero Installation Status');
65
+ // System dependencies
66
+ logger_js_1.logger.blank();
67
+ logger_js_1.logger.subheader('System Dependencies:');
68
+ const systemInfo = await (0, detector_js_1.detectSystemInfo)();
69
+ logger_js_1.logger.table([
70
+ ['Docker', (0, logger_js_1.formatStatus)(systemInfo.docker.installed)],
71
+ ['Python', (0, logger_js_1.formatStatus)(systemInfo.python.installed)],
72
+ ['uv', (0, logger_js_1.formatStatus)(systemInfo.uv.installed)],
73
+ ['Ruby', (0, logger_js_1.formatOptional)(systemInfo.ruby.installed)],
74
+ ['Git', (0, logger_js_1.formatStatus)(systemInfo.git.installed)],
75
+ ]);
76
+ // Docker image
77
+ logger_js_1.logger.blank();
78
+ logger_js_1.logger.subheader('Docker Image:');
79
+ const dockerImageExists = await (0, detector_js_1.detectDockerImage)(tools_js_1.DOCKER_IMAGE);
80
+ logger_js_1.logger.table([
81
+ [tools_js_1.DOCKER_IMAGE, (0, logger_js_1.formatStatus)(dockerImageExists)],
82
+ ]);
83
+ // Docker CLI tools (wrappers AND native)
84
+ logger_js_1.logger.blank();
85
+ logger_js_1.logger.subheader('Security Scanning Tools:');
86
+ const toolStatus = [];
87
+ for (const toolName of Object.keys(tools_js_1.DOCKER_TOOLS)) {
88
+ const status = await (0, detector_js_1.detectDockerTool)(toolName);
89
+ toolStatus.push([
90
+ toolName,
91
+ formatToolStatus(status.wrapperInstalled, status.nativeInstalled, status.nativePath),
92
+ ]);
93
+ }
94
+ logger_js_1.logger.table(toolStatus);
95
+ // Python tools
96
+ const pythonToolNames = Object.keys(tools_js_1.PYTHON_TOOLS);
97
+ if (pythonToolNames.length > 0) {
98
+ logger_js_1.logger.blank();
99
+ logger_js_1.logger.subheader('Python Tools:');
100
+ const pythonStatus = [];
101
+ for (const toolName of pythonToolNames) {
102
+ const status = await (0, detector_js_1.detectPythonPackage)(toolName === 'pwntools' ? 'pwn' : toolName);
103
+ pythonStatus.push([toolName, (0, logger_js_1.formatStatus)(status.installed)]);
104
+ }
105
+ logger_js_1.logger.table(pythonStatus);
106
+ }
107
+ // Ruby tools
108
+ const rubyToolNames = Object.keys(tools_js_1.RUBY_TOOLS);
109
+ if (rubyToolNames.length > 0) {
110
+ logger_js_1.logger.blank();
111
+ logger_js_1.logger.subheader('Ruby Tools:');
112
+ const rubyStatus = [];
113
+ for (const toolName of rubyToolNames) {
114
+ const status = await (0, detector_js_1.detectRubyGem)(toolName);
115
+ rubyStatus.push([toolName, (0, logger_js_1.formatStatus)(status.installed)]);
116
+ }
117
+ logger_js_1.logger.table(rubyStatus);
118
+ }
119
+ // Optional tools (for exploit development)
120
+ logger_js_1.logger.blank();
121
+ logger_js_1.logger.subheader('Optional Tools (for MrZeroExploitDeveloper):');
122
+ const [gdb, pwndbg, ghidra, metasploit, idaPro, idaFree] = await Promise.all([
123
+ (0, detector_js_1.detectGdb)(),
124
+ (0, detector_js_1.detectPwndbg)(),
125
+ (0, detector_js_1.detectGhidra)(),
126
+ (0, detector_js_1.detectMetasploit)(),
127
+ (0, detector_js_1.detectIdaPro)(),
128
+ (0, detector_js_1.detectIdaFree)(),
129
+ ]);
130
+ // Format IDA status - show Pro, Free, or not installed
131
+ let idaStatus;
132
+ if (idaPro.installed) {
133
+ idaStatus = chalk_1.default.green('✓ IDA Pro') + (idaPro.path ? chalk_1.default.dim(` (${idaPro.path})`) : '');
134
+ }
135
+ else if (idaFree.installed) {
136
+ idaStatus = chalk_1.default.yellow('○ IDA Free only') + chalk_1.default.dim(' (Pro required for MCP)');
137
+ }
138
+ else {
139
+ idaStatus = chalk_1.default.dim('○ not installed (optional)');
140
+ }
141
+ logger_js_1.logger.table([
142
+ ['GDB', (0, logger_js_1.formatOptional)(gdb.installed) + (gdb.version ? chalk_1.default.dim(` v${gdb.version}`) : '')],
143
+ ['pwndbg', (0, logger_js_1.formatOptional)(pwndbg.installed) + (pwndbg.method ? chalk_1.default.dim(` (${pwndbg.method})`) : '')],
144
+ ['Ghidra', (0, logger_js_1.formatOptional)(ghidra.installed) + (ghidra.path ? chalk_1.default.dim(` (${ghidra.path})`) : '')],
145
+ ['Metasploit', (0, logger_js_1.formatOptional)(metasploit.installed)],
146
+ ['IDA', idaStatus],
147
+ ]);
148
+ // MCP servers
149
+ logger_js_1.logger.blank();
150
+ logger_js_1.logger.subheader('MCP Servers:');
151
+ const mcpDir = (0, platform_js_1.getMcpServersDir)();
152
+ const mcpStatus = [];
153
+ for (const [name, server] of Object.entries(mcp_servers_js_1.MCP_SERVERS)) {
154
+ let installed = false;
155
+ if (server.installMethod === 'uv-tool') {
156
+ // Check if command exists
157
+ const { exec } = await import('../utils/shell.js');
158
+ const result = await exec(`which ${server.command}`);
159
+ installed = result.code === 0;
160
+ }
161
+ else if (server.installMethod === 'clone') {
162
+ // Check if directory exists
163
+ const dirMap = {
164
+ 'ghidra-mcp': 'GhidraMCP',
165
+ 'metasploit-mcp': 'MetasploitMCP',
166
+ 'pwndbg-mcp': 'pwndbg-mcp',
167
+ };
168
+ const dirName = dirMap[name];
169
+ if (dirName) {
170
+ installed = fs.existsSync(path.join(mcpDir, dirName));
171
+ }
172
+ }
173
+ else if (server.installMethod === 'uv-pip') {
174
+ // Check if command exists
175
+ const { exec } = await import('../utils/shell.js');
176
+ const result = await exec(`which ${server.command}`);
177
+ installed = result.code === 0;
178
+ }
179
+ mcpStatus.push([server.displayName, (0, logger_js_1.formatOptional)(installed)]);
180
+ }
181
+ logger_js_1.logger.table(mcpStatus);
182
+ // Agent files
183
+ logger_js_1.logger.blank();
184
+ logger_js_1.logger.subheader('Agent Files (Claude Code):');
185
+ const claudeAgentsDir = (0, platform_js_1.getClaudeAgentsDir)();
186
+ const claudeAgentStatus = [];
187
+ for (const agent of Object.values(agents_js_1.AGENTS)) {
188
+ const agentPath = path.join(claudeAgentsDir, agent.filename);
189
+ const exists = fs.existsSync(agentPath);
190
+ claudeAgentStatus.push([agent.displayName, (0, logger_js_1.formatStatus)(exists)]);
191
+ }
192
+ logger_js_1.logger.table(claudeAgentStatus);
193
+ logger_js_1.logger.blank();
194
+ logger_js_1.logger.subheader('Agent Files (OpenCode):');
195
+ const openCodeAgentsDir = (0, platform_js_1.getOpenCodeAgentsDir)();
196
+ const openCodeAgentStatus = [];
197
+ for (const agent of Object.values(agents_js_1.AGENTS)) {
198
+ const agentPath = path.join(openCodeAgentsDir, agent.filename);
199
+ const exists = fs.existsSync(agentPath);
200
+ openCodeAgentStatus.push([agent.displayName, (0, logger_js_1.formatStatus)(exists)]);
201
+ }
202
+ logger_js_1.logger.table(openCodeAgentStatus);
203
+ logger_js_1.logger.blank();
204
+ }
205
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ interface InstallOptions {
2
+ agent?: string[];
3
+ platform?: string[];
4
+ skipDocker?: boolean;
5
+ skipMcp?: boolean;
6
+ yes?: boolean;
7
+ }
8
+ export declare function installCommand(options: InstallOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AA+BA,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAsLD,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAuH3E"}