@bengabay94/mrzero 0.1.0-alpha.1 → 0.2.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 (58) hide show
  1. package/agents/templates/MrZeroExploitDeveloper.template.md +258 -0
  2. package/agents/templates/MrZeroMapperOS.template.md +180 -0
  3. package/agents/templates/MrZeroVulnHunterOS.template.md +174 -0
  4. package/dist/commands/check.d.ts.map +1 -1
  5. package/dist/commands/check.js +18 -1
  6. package/dist/commands/check.js.map +1 -1
  7. package/dist/commands/install.d.ts.map +1 -1
  8. package/dist/commands/install.js +137 -44
  9. package/dist/commands/install.js.map +1 -1
  10. package/dist/commands/uninstall.d.ts.map +1 -1
  11. package/dist/commands/uninstall.js +12 -11
  12. package/dist/commands/uninstall.js.map +1 -1
  13. package/dist/config/agents.d.ts +0 -4
  14. package/dist/config/agents.d.ts.map +1 -1
  15. package/dist/config/agents.js +4 -22
  16. package/dist/config/agents.js.map +1 -1
  17. package/dist/config/tool-strings.d.ts +33 -0
  18. package/dist/config/tool-strings.d.ts.map +1 -0
  19. package/dist/config/tool-strings.js +148 -0
  20. package/dist/config/tool-strings.js.map +1 -0
  21. package/dist/config/tools.d.ts +1 -0
  22. package/dist/config/tools.d.ts.map +1 -1
  23. package/dist/config/tools.js +17 -23
  24. package/dist/config/tools.js.map +1 -1
  25. package/dist/installer/detector.d.ts +3 -1
  26. package/dist/installer/detector.d.ts.map +1 -1
  27. package/dist/installer/detector.js +29 -5
  28. package/dist/installer/detector.js.map +1 -1
  29. package/dist/installer/docker.d.ts.map +1 -1
  30. package/dist/installer/docker.js +12 -13
  31. package/dist/installer/docker.js.map +1 -1
  32. package/dist/installer/launcher.d.ts +13 -0
  33. package/dist/installer/launcher.d.ts.map +1 -0
  34. package/dist/installer/launcher.js +162 -0
  35. package/dist/installer/launcher.js.map +1 -0
  36. package/dist/installer/mcp.d.ts.map +1 -1
  37. package/dist/installer/mcp.js +22 -64
  38. package/dist/installer/mcp.js.map +1 -1
  39. package/dist/installer/platforms.d.ts +3 -3
  40. package/dist/installer/platforms.d.ts.map +1 -1
  41. package/dist/installer/platforms.js +101 -22
  42. package/dist/installer/platforms.js.map +1 -1
  43. package/dist/installer/python.js +3 -3
  44. package/dist/installer/python.js.map +1 -1
  45. package/dist/installer/ruby.d.ts +13 -0
  46. package/dist/installer/ruby.d.ts.map +1 -1
  47. package/dist/installer/ruby.js +138 -5
  48. package/dist/installer/ruby.js.map +1 -1
  49. package/dist/installer/template-renderer.d.ts +28 -0
  50. package/dist/installer/template-renderer.d.ts.map +1 -0
  51. package/dist/installer/template-renderer.js +210 -0
  52. package/dist/installer/template-renderer.js.map +1 -0
  53. package/dist/utils/platform.d.ts +6 -0
  54. package/dist/utils/platform.d.ts.map +1 -1
  55. package/dist/utils/platform.js +42 -1
  56. package/dist/utils/platform.js.map +1 -1
  57. package/docker/Dockerfile +37 -15
  58. package/package.json +1 -1
@@ -1,3 +1,16 @@
1
+ /**
2
+ * Create a wrapper script in ~/.local/bin for a Ruby gem
3
+ * This makes the gem callable from PATH without modifying shell configs
4
+ */
5
+ export declare function createRubyWrapper(toolName: string): Promise<boolean>;
6
+ /**
7
+ * Remove the wrapper script for a Ruby gem
8
+ */
9
+ export declare function removeRubyWrapper(toolName: string): boolean;
10
+ /**
11
+ * Check if a wrapper exists for a Ruby gem
12
+ */
13
+ export declare function hasRubyWrapper(toolName: string): boolean;
1
14
  export declare function installRubyTool(toolName: string): Promise<boolean>;
2
15
  export declare function installAllRubyTools(tools: string[]): Promise<void>;
3
16
  export declare function checkRubyTool(toolName: string): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"ruby.d.ts","sourceRoot":"","sources":["../../src/installer/ruby.ts"],"names":[],"mappings":"AAIA,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4CxE;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQxE;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQtE;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAc1E"}
1
+ {"version":3,"file":"ruby.d.ts","sourceRoot":"","sources":["../../src/installer/ruby.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwB1E;AAgCD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAO3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGxD;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwDxE;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQxE;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQtE;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoB1E"}
@@ -1,12 +1,128 @@
1
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
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createRubyWrapper = createRubyWrapper;
37
+ exports.removeRubyWrapper = removeRubyWrapper;
38
+ exports.hasRubyWrapper = hasRubyWrapper;
3
39
  exports.installRubyTool = installRubyTool;
4
40
  exports.installAllRubyTools = installAllRubyTools;
5
41
  exports.checkRubyTool = checkRubyTool;
6
42
  exports.uninstallRubyTool = uninstallRubyTool;
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const os = __importStar(require("os"));
7
46
  const shell_js_1 = require("../utils/shell.js");
8
47
  const logger_js_1 = require("../utils/logger.js");
9
48
  const tools_js_1 = require("../config/tools.js");
49
+ /**
50
+ * Get the gem user bin directory dynamically based on the user's Ruby version
51
+ */
52
+ async function getGemBinDir() {
53
+ const result = await (0, shell_js_1.exec)("ruby -e 'puts Gem.user_dir'");
54
+ if (result.code !== 0) {
55
+ return null;
56
+ }
57
+ return path.join(result.stdout.trim(), 'bin');
58
+ }
59
+ /**
60
+ * Create a wrapper script in ~/.local/bin for a Ruby gem
61
+ * This makes the gem callable from PATH without modifying shell configs
62
+ */
63
+ async function createRubyWrapper(toolName) {
64
+ const gemBinDir = await getGemBinDir();
65
+ if (!gemBinDir) {
66
+ logger_js_1.logger.warning(`Could not determine gem directory, ${toolName} may not be in PATH`);
67
+ return false;
68
+ }
69
+ const gemBinPath = path.join(gemBinDir, toolName);
70
+ // Verify the gem binary exists
71
+ if (!fs.existsSync(gemBinPath)) {
72
+ // Try system gem dir as fallback
73
+ const sysGemResult = await (0, shell_js_1.exec)('gem environment gemdir');
74
+ if (sysGemResult.code === 0) {
75
+ const sysGemBinPath = path.join(sysGemResult.stdout.trim(), 'bin', toolName);
76
+ if (fs.existsSync(sysGemBinPath)) {
77
+ return createWrapperFile(toolName, sysGemBinPath);
78
+ }
79
+ }
80
+ logger_js_1.logger.warning(`Gem binary not found at ${gemBinPath}`);
81
+ return false;
82
+ }
83
+ return createWrapperFile(toolName, gemBinPath);
84
+ }
85
+ /**
86
+ * Create the actual wrapper file
87
+ */
88
+ async function createWrapperFile(toolName, gemBinPath) {
89
+ const wrapperDir = path.join(os.homedir(), '.local', 'bin');
90
+ const wrapperPath = path.join(wrapperDir, toolName);
91
+ // Ensure directory exists
92
+ fs.mkdirSync(wrapperDir, { recursive: true });
93
+ // Write wrapper script
94
+ const wrapperContent = `#!/bin/bash
95
+ exec "${gemBinPath}" "$@"
96
+ `;
97
+ fs.writeFileSync(wrapperPath, wrapperContent, { mode: 0o755 });
98
+ // Check if ~/.local/bin is in PATH
99
+ const localBin = path.join(os.homedir(), '.local', 'bin');
100
+ const pathDirs = (process.env.PATH || '').split(':');
101
+ if (!pathDirs.includes(localBin)) {
102
+ logger_js_1.logger.warning(`~/.local/bin is not in your PATH`);
103
+ logger_js_1.logger.info(`Add this to your shell config (~/.bashrc or ~/.zshrc):`);
104
+ logger_js_1.logger.info(` export PATH="$HOME/.local/bin:$PATH"`);
105
+ }
106
+ return true;
107
+ }
108
+ /**
109
+ * Remove the wrapper script for a Ruby gem
110
+ */
111
+ function removeRubyWrapper(toolName) {
112
+ const wrapperPath = path.join(os.homedir(), '.local', 'bin', toolName);
113
+ if (fs.existsSync(wrapperPath)) {
114
+ fs.unlinkSync(wrapperPath);
115
+ return true;
116
+ }
117
+ return false;
118
+ }
119
+ /**
120
+ * Check if a wrapper exists for a Ruby gem
121
+ */
122
+ function hasRubyWrapper(toolName) {
123
+ const wrapperPath = path.join(os.homedir(), '.local', 'bin', toolName);
124
+ return fs.existsSync(wrapperPath);
125
+ }
10
126
  async function installRubyTool(toolName) {
11
127
  const tool = tools_js_1.RUBY_TOOLS[toolName];
12
128
  if (!tool) {
@@ -30,20 +146,32 @@ async function installRubyTool(toolName) {
30
146
  // Install using gem
31
147
  const installCmd = tool.installCommand || `gem install ${toolName}`;
32
148
  const result = await (0, shell_js_1.exec)(installCmd);
149
+ let installed = false;
33
150
  if (result.code === 0) {
34
- logger_js_1.logger.success(`Installed ${tool.displayName}`);
35
- return true;
151
+ installed = true;
36
152
  }
37
153
  else {
38
- // Try with sudo if permission denied
154
+ // Try with --user-install if permission denied
39
155
  if (result.stderr.includes('Permission denied') || result.stderr.includes('permission')) {
40
156
  logger_js_1.logger.warning('Permission denied, trying with --user-install...');
41
157
  const userResult = await (0, shell_js_1.exec)(`gem install --user-install ${toolName}`);
42
158
  if (userResult.code === 0) {
43
- logger_js_1.logger.success(`Installed ${tool.displayName}`);
44
- return true;
159
+ installed = true;
45
160
  }
46
161
  }
162
+ }
163
+ if (installed) {
164
+ // Create wrapper script so the tool is callable from PATH
165
+ const wrapperCreated = await createRubyWrapper(toolName);
166
+ if (wrapperCreated) {
167
+ logger_js_1.logger.success(`Installed ${tool.displayName}`);
168
+ }
169
+ else {
170
+ logger_js_1.logger.success(`Installed ${tool.displayName} (wrapper not created, may not be in PATH)`);
171
+ }
172
+ return true;
173
+ }
174
+ else {
47
175
  logger_js_1.logger.error(`Failed to install ${tool.displayName}: ${result.stderr}`);
48
176
  return false;
49
177
  }
@@ -70,6 +198,11 @@ async function uninstallRubyTool(toolName) {
70
198
  return false;
71
199
  }
72
200
  logger_js_1.logger.step(`Uninstalling ${tool.displayName}...`);
201
+ // Remove wrapper first
202
+ if (removeRubyWrapper(toolName)) {
203
+ logger_js_1.logger.info(`Removed wrapper for ${toolName}`);
204
+ }
205
+ // Uninstall gem
73
206
  const result = await (0, shell_js_1.exec)(`gem uninstall -x ${toolName}`);
74
207
  if (result.code === 0) {
75
208
  logger_js_1.logger.success(`Uninstalled ${tool.displayName}`);
@@ -1 +1 @@
1
- {"version":3,"file":"ruby.js","sourceRoot":"","sources":["../../src/installer/ruby.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ruby.js","sourceRoot":"","sources":["../../src/installer/ruby.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Template renderer for agent system prompts.
3
+ *
4
+ * This module handles rendering agent template files by replacing placeholders
5
+ * with actual tool strings based on what tools the user has installed.
6
+ *
7
+ * Template syntax:
8
+ * - {{PLACEHOLDER_NAME}}: Replaced with tool string if tool is installed, empty string otherwise
9
+ * - {{SECTION_NAME_START}} ... {{SECTION_NAME_END}}: Section markers, removed if section is empty
10
+ */
11
+ export interface RenderContext {
12
+ installedTools: string[];
13
+ installedMcpServers: string[];
14
+ }
15
+ /**
16
+ * Main template rendering function
17
+ *
18
+ * @param agentName - Name of the agent (e.g., 'MrZeroMapperOS')
19
+ * @param templateContent - Raw template content with placeholders
20
+ * @param context - Installation context with lists of installed tools
21
+ * @returns Rendered markdown content with placeholders replaced
22
+ */
23
+ export declare function renderAgentTemplate(agentName: string, templateContent: string, context: RenderContext): string;
24
+ /**
25
+ * Check if an agent has a template (vs static file)
26
+ */
27
+ export declare function agentHasTemplate(agentName: string): boolean;
28
+ //# sourceMappingURL=template-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-renderer.d.ts","sourceRoot":"","sources":["../../src/installer/template-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AA8MD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,aAAa,GACrB,MAAM,CAwBR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAI3D"}
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * Template renderer for agent system prompts.
4
+ *
5
+ * This module handles rendering agent template files by replacing placeholders
6
+ * with actual tool strings based on what tools the user has installed.
7
+ *
8
+ * Template syntax:
9
+ * - {{PLACEHOLDER_NAME}}: Replaced with tool string if tool is installed, empty string otherwise
10
+ * - {{SECTION_NAME_START}} ... {{SECTION_NAME_END}}: Section markers, removed if section is empty
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.renderAgentTemplate = renderAgentTemplate;
14
+ exports.agentHasTemplate = agentHasTemplate;
15
+ const tool_strings_js_1 = require("../config/tool-strings.js");
16
+ /**
17
+ * Normalize tool name for matching (handle variations like tree-sitter vs treesitter)
18
+ */
19
+ function normalizeToolName(name) {
20
+ return name.toLowerCase().replace(/-/g, '').replace(/_/g, '');
21
+ }
22
+ /**
23
+ * Check if a tool is installed (handles name variations)
24
+ */
25
+ function isToolInstalled(toolName, context) {
26
+ const normalizedToolName = normalizeToolName(toolName);
27
+ // Check in installed tools
28
+ const inTools = context.installedTools.some(t => normalizeToolName(t) === normalizedToolName);
29
+ // Check in installed MCP servers
30
+ const inMcp = context.installedMcpServers.some(m => normalizeToolName(m) === normalizedToolName);
31
+ return inTools || inMcp;
32
+ }
33
+ /**
34
+ * Extract tool name from placeholder name
35
+ * E.g., TOOL_LIST_OPENGREP -> opengrep, TOOL_USAGE_CODEQL -> codeql
36
+ */
37
+ function extractToolNameFromPlaceholder(placeholder) {
38
+ // Pattern: TOOL_{TYPE}_{TOOLNAME}
39
+ const match = placeholder.match(/^TOOL_[A-Z]+_([A-Z0-9]+)$/);
40
+ if (match) {
41
+ return match[1].toLowerCase();
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * Find all placeholders in template content
47
+ */
48
+ function findPlaceholders(content) {
49
+ const regex = /\{\{([A-Z_0-9]+)\}\}/g;
50
+ const placeholders = [];
51
+ let match;
52
+ while ((match = regex.exec(content)) !== null) {
53
+ if (!placeholders.includes(match[1])) {
54
+ placeholders.push(match[1]);
55
+ }
56
+ }
57
+ return placeholders;
58
+ }
59
+ /**
60
+ * Find all section markers in template content
61
+ * Returns pairs of [startMarker, endMarker]
62
+ */
63
+ function findSectionMarkers(content) {
64
+ const regex = /\{\{SECTION_([A-Z_0-9]+)_START\}\}/g;
65
+ const sections = [];
66
+ let match;
67
+ while ((match = regex.exec(content)) !== null) {
68
+ const sectionName = match[1];
69
+ sections.push([
70
+ `{{SECTION_${sectionName}_START}}`,
71
+ `{{SECTION_${sectionName}_END}}`
72
+ ]);
73
+ }
74
+ return sections;
75
+ }
76
+ /**
77
+ * Check if a section contains meaningful tool content after placeholder replacement.
78
+ * A section is considered empty if:
79
+ * - It contains only whitespace, or
80
+ * - It contains only headers/static text but no actual tool-related content
81
+ *
82
+ * We detect this by checking if all TOOL_ placeholders in the original section
83
+ * were replaced with empty strings (meaning no tools were installed for that section).
84
+ */
85
+ function isSectionEmpty(originalSection, renderedSection) {
86
+ // Find all TOOL_ placeholders that were in the original section
87
+ const placeholderRegex = /\{\{(TOOL_[A-Z_0-9]+)\}\}/g;
88
+ const placeholders = [];
89
+ let match;
90
+ while ((match = placeholderRegex.exec(originalSection)) !== null) {
91
+ placeholders.push(match[1]);
92
+ }
93
+ // If there were no placeholders, section is not empty (it's static content)
94
+ if (placeholders.length === 0) {
95
+ return false;
96
+ }
97
+ // Check if the rendered section has any non-whitespace content
98
+ // beyond just the static header text
99
+ // We do this by comparing: if all placeholders were replaced with empty strings,
100
+ // the rendered content would only be the static text
101
+ // Get the static text by removing all placeholders from original
102
+ const staticText = originalSection.replace(placeholderRegex, '').trim();
103
+ const renderedText = renderedSection.trim();
104
+ // If the rendered section equals just the static text (headers etc),
105
+ // then all tools were empty and we should remove the section
106
+ // Normalize whitespace for comparison
107
+ const normalizedStatic = staticText.replace(/\s+/g, ' ');
108
+ const normalizedRendered = renderedText.replace(/\s+/g, ' ');
109
+ return normalizedRendered === normalizedStatic || renderedText.length === 0;
110
+ }
111
+ /**
112
+ * Remove empty sections from content
113
+ * A section is considered empty if all tool placeholders in it were replaced with empty strings
114
+ */
115
+ function removeEmptySections(originalContent, renderedContent) {
116
+ const sections = findSectionMarkers(originalContent);
117
+ let result = renderedContent;
118
+ for (const [startMarker, endMarker] of sections) {
119
+ // Find section in original content
120
+ const origStartIdx = originalContent.indexOf(startMarker);
121
+ const origEndIdx = originalContent.indexOf(endMarker);
122
+ // Find section in rendered content
123
+ const rendStartIdx = result.indexOf(startMarker);
124
+ const rendEndIdx = result.indexOf(endMarker);
125
+ if (origStartIdx !== -1 && origEndIdx !== -1 &&
126
+ rendStartIdx !== -1 && rendEndIdx !== -1) {
127
+ const originalSection = originalContent.substring(origStartIdx + startMarker.length, origEndIdx);
128
+ const renderedSection = result.substring(rendStartIdx + startMarker.length, rendEndIdx);
129
+ if (isSectionEmpty(originalSection, renderedSection)) {
130
+ // Remove the entire section including markers
131
+ result = result.substring(0, rendStartIdx) + result.substring(rendEndIdx + endMarker.length);
132
+ }
133
+ else {
134
+ // Keep the content but remove the markers
135
+ result = result.replace(startMarker, '').replace(endMarker, '');
136
+ }
137
+ }
138
+ }
139
+ return result;
140
+ }
141
+ /**
142
+ * Clean up excessive blank lines (more than 2 consecutive blank lines -> 2)
143
+ */
144
+ function cleanupWhitespace(content) {
145
+ // Replace 3+ consecutive newlines with 2 newlines
146
+ let result = content.replace(/\n{3,}/g, '\n\n');
147
+ // Remove trailing whitespace from lines
148
+ result = result.split('\n').map(line => line.trimEnd()).join('\n');
149
+ // Ensure file ends with single newline
150
+ result = result.trimEnd() + '\n';
151
+ return result;
152
+ }
153
+ /**
154
+ * Get the replacement string for a placeholder
155
+ */
156
+ function getPlaceholderReplacement(agentName, placeholder, context) {
157
+ const agentStrings = tool_strings_js_1.TOOL_STRINGS[agentName];
158
+ if (!agentStrings) {
159
+ return '';
160
+ }
161
+ // Search through all tools for this agent to find the placeholder
162
+ for (const [toolName, toolStrings] of Object.entries(agentStrings)) {
163
+ if (placeholder in toolStrings) {
164
+ // Found the placeholder, check if tool is installed
165
+ if (isToolInstalled(toolName, context)) {
166
+ return toolStrings[placeholder];
167
+ }
168
+ else {
169
+ return '';
170
+ }
171
+ }
172
+ }
173
+ return '';
174
+ }
175
+ /**
176
+ * Main template rendering function
177
+ *
178
+ * @param agentName - Name of the agent (e.g., 'MrZeroMapperOS')
179
+ * @param templateContent - Raw template content with placeholders
180
+ * @param context - Installation context with lists of installed tools
181
+ * @returns Rendered markdown content with placeholders replaced
182
+ */
183
+ function renderAgentTemplate(agentName, templateContent, context) {
184
+ let result = templateContent;
185
+ // Step 1: Find all placeholders
186
+ const placeholders = findPlaceholders(result);
187
+ // Step 2: Replace each placeholder
188
+ for (const placeholder of placeholders) {
189
+ // Skip section markers - they're handled separately
190
+ if (placeholder.startsWith('SECTION_')) {
191
+ continue;
192
+ }
193
+ const replacement = getPlaceholderReplacement(agentName, placeholder, context);
194
+ result = result.replace(new RegExp(`\\{\\{${placeholder}\\}\\}`, 'g'), replacement);
195
+ }
196
+ // Step 3: Remove empty sections (pass original template for comparison)
197
+ result = removeEmptySections(templateContent, result);
198
+ // Step 4: Clean up whitespace
199
+ result = cleanupWhitespace(result);
200
+ return result;
201
+ }
202
+ /**
203
+ * Check if an agent has a template (vs static file)
204
+ */
205
+ function agentHasTemplate(agentName) {
206
+ // Agents with templates are those defined in TOOL_STRINGS
207
+ // MrZeroEnvBuilder is static (no tools in prompt)
208
+ return agentName in tool_strings_js_1.TOOL_STRINGS;
209
+ }
210
+ //# sourceMappingURL=template-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-renderer.js","sourceRoot":"","sources":["../../src/installer/template-renderer.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ export declare function getHomeDir(): string;
7
7
  export declare function getMrZeroDir(): string;
8
8
  export declare function getMcpServersDir(): string;
9
9
  export declare function getWrappersDir(): string;
10
+ export declare function getLauncherPath(): string;
11
+ export declare function getLauncherBinaryName(): string;
10
12
  export declare function getClaudeConfigDir(): string;
11
13
  export declare function getClaudeAgentsDir(): string;
12
14
  export declare function getOpenCodeConfigDir(): string;
@@ -15,4 +17,8 @@ export declare function getDistroInfo(): {
15
17
  name: string;
16
18
  version: string;
17
19
  } | null;
20
+ export declare function getArch(): string;
21
+ export declare function isArm64(): boolean;
22
+ export declare function isX64(): boolean;
23
+ export declare function isLinuxArm64(): boolean;
18
24
  //# sourceMappingURL=platform.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;AAEpE,wBAAgB,WAAW,IAAI,QAAQ,CAMtC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,aAAa,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiBxE"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;AAEpE,wBAAgB,WAAW,IAAI,QAAQ,CAMtC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAwB9C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,aAAa,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiBxE;AAED,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
@@ -41,11 +41,17 @@ exports.getHomeDir = getHomeDir;
41
41
  exports.getMrZeroDir = getMrZeroDir;
42
42
  exports.getMcpServersDir = getMcpServersDir;
43
43
  exports.getWrappersDir = getWrappersDir;
44
+ exports.getLauncherPath = getLauncherPath;
45
+ exports.getLauncherBinaryName = getLauncherBinaryName;
44
46
  exports.getClaudeConfigDir = getClaudeConfigDir;
45
47
  exports.getClaudeAgentsDir = getClaudeAgentsDir;
46
48
  exports.getOpenCodeConfigDir = getOpenCodeConfigDir;
47
49
  exports.getOpenCodeAgentsDir = getOpenCodeAgentsDir;
48
50
  exports.getDistroInfo = getDistroInfo;
51
+ exports.getArch = getArch;
52
+ exports.isArm64 = isArm64;
53
+ exports.isX64 = isX64;
54
+ exports.isLinuxArm64 = isLinuxArm64;
49
55
  const os = __importStar(require("os"));
50
56
  const path = __importStar(require("path"));
51
57
  function getPlatform() {
@@ -74,7 +80,30 @@ function getMcpServersDir() {
74
80
  return path.join(getMrZeroDir(), 'mcp-servers');
75
81
  }
76
82
  function getWrappersDir() {
77
- return path.join(getHomeDir(), '.local', 'bin');
83
+ return path.join(getHomeDir(), '.local', 'bin', 'mrzero-tools');
84
+ }
85
+ function getLauncherPath() {
86
+ return path.join(getHomeDir(), '.local', 'bin', 'mrzero');
87
+ }
88
+ function getLauncherBinaryName() {
89
+ const platform = os.platform(); // 'linux', 'darwin', 'win32'
90
+ const arch = os.arch(); // 'x64', 'arm64'
91
+ const osMap = {
92
+ 'linux': 'linux',
93
+ 'darwin': 'darwin',
94
+ 'win32': 'windows',
95
+ };
96
+ const archMap = {
97
+ 'x64': 'amd64',
98
+ 'arm64': 'arm64',
99
+ };
100
+ const goos = osMap[platform];
101
+ const goarch = archMap[arch];
102
+ if (!goos || !goarch) {
103
+ throw new Error(`Unsupported platform: ${platform}-${arch}`);
104
+ }
105
+ const ext = platform === 'win32' ? '.exe' : '';
106
+ return `mrzero-${goos}-${goarch}${ext}`;
78
107
  }
79
108
  function getClaudeConfigDir() {
80
109
  return path.join(getHomeDir(), '.claude');
@@ -107,4 +136,16 @@ function getDistroInfo() {
107
136
  catch { }
108
137
  return null;
109
138
  }
139
+ function getArch() {
140
+ return os.arch();
141
+ }
142
+ function isArm64() {
143
+ return os.arch() === 'arm64';
144
+ }
145
+ function isX64() {
146
+ return os.arch() === 'x64';
147
+ }
148
+ function isLinuxArm64() {
149
+ return isLinux() && isArm64();
150
+ }
110
151
  //# sourceMappingURL=platform.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,kCAMC;AAED,0BAEC;AAED,sBAEC;AAED,8BAEC;AAED,gCAEC;AAED,oCAEC;AAED,4CAEC;AAED,wCAEC;AAED,gDAEC;AAED,gDAEC;AAED,oDAEC;AAED,oDAEC;AAED,sCAiBC;AA1ED,uCAAyB;AACzB,2CAA6B;AAI7B,SAAgB,WAAW;IACzB,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC1E,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAgB,OAAO;IACrB,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC;AACnC,CAAC;AAED,SAAgB,KAAK;IACnB,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,QAAQ,CAAC;AACpC,CAAC;AAED,SAAgB,SAAS;IACvB,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC;AACnC,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAED,SAAgB,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,SAAgB,oBAAoB;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,oBAAoB;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED,SAAgB,aAAa;IAC3B,IAAI,CAAC,OAAO,EAAE;QAAE,OAAO,IAAI,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,WAAW,GAAG,iBAAiB,CAAC;QACtC,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACxD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YACjE,OAAO;gBACL,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS;gBACjC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS;aACxC,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"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"}