mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-04-27 09:46:25 +02:00
161 lines
4.2 KiB
Markdown
161 lines
4.2 KiB
Markdown
|
|
---
|
||
|
|
name: 'step-04-installer'
|
||
|
|
description: 'Setup _module-installer folder and installer.js'
|
||
|
|
|
||
|
|
nextStepFile: './step-05-agents.md'
|
||
|
|
moduleInstallerStandardsFile: '../../data/module-installer-standards.md'
|
||
|
|
buildTrackingFile: '{bmb_creations_output_folder}/modules/module-build-{module_code}.md'
|
||
|
|
targetLocation: '{build_tracking_targetLocation}'
|
||
|
|
---
|
||
|
|
|
||
|
|
# Step 4: Module Installer
|
||
|
|
|
||
|
|
## STEP GOAL:
|
||
|
|
|
||
|
|
Setup the _module-installer folder and create installer.js if needed.
|
||
|
|
|
||
|
|
## MANDATORY EXECUTION RULES:
|
||
|
|
|
||
|
|
### Universal Rules:
|
||
|
|
|
||
|
|
- 🛑 NEVER generate content without user input
|
||
|
|
- 📖 CRITICAL: Read the complete step file before taking any action
|
||
|
|
- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read
|
||
|
|
- 📋 YOU ARE A FACILITATOR, not a content generator
|
||
|
|
- ✅ Speak in `{communication_language}`
|
||
|
|
|
||
|
|
### Role Reinforcement:
|
||
|
|
|
||
|
|
- ✅ You are the **Module Builder** — installer expert
|
||
|
|
- ✅ Not all modules need installers
|
||
|
|
- ✅ Follow installer patterns
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## MANDATORY SEQUENCE
|
||
|
|
|
||
|
|
### 1. Assess Need for Installer
|
||
|
|
|
||
|
|
Load `{moduleInstallerStandardsFile}` and ask:
|
||
|
|
|
||
|
|
"**Does your module need an installer?**"
|
||
|
|
|
||
|
|
Installers are needed when:
|
||
|
|
- Creating directories from config variables
|
||
|
|
- Copying template/assets
|
||
|
|
- IDE-specific configuration
|
||
|
|
- Platform-specific setup
|
||
|
|
|
||
|
|
**If NO installer needed:**
|
||
|
|
|
||
|
|
Skip to step 5. Folder structure already exists.
|
||
|
|
|
||
|
|
**If YES:** Continue to step 4.2
|
||
|
|
|
||
|
|
### 2. Determine Installer Requirements
|
||
|
|
|
||
|
|
"**What should the installer do?**"
|
||
|
|
|
||
|
|
- Create directories? (which variables)
|
||
|
|
- Copy assets? (from where)
|
||
|
|
- IDE configuration? (which IDEs)
|
||
|
|
- Platform-specific setup?
|
||
|
|
|
||
|
|
### 3. Create installer.js
|
||
|
|
|
||
|
|
Create `{targetLocation}/_module-installer/installer.js`:
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
const fs = require('fs-extra');
|
||
|
|
const path = require('node:path');
|
||
|
|
const chalk = require('chalk');
|
||
|
|
const platformCodes = require(path.join(__dirname, '../../../../tools/cli/lib/platform-codes'));
|
||
|
|
|
||
|
|
/**
|
||
|
|
* {module_name} Module Installer
|
||
|
|
*/
|
||
|
|
async function install(options) {
|
||
|
|
const { projectRoot, config, installedIDEs, logger } = options;
|
||
|
|
|
||
|
|
try {
|
||
|
|
logger.log(chalk.blue('Installing {module_name}...'));
|
||
|
|
|
||
|
|
// Create directories
|
||
|
|
if (config['{variable_name}']) {
|
||
|
|
const dirConfig = config['{variable_name}'].replace('{project-root}/', '');
|
||
|
|
const dirPath = path.join(projectRoot, dirConfig);
|
||
|
|
if (!(await fs.pathExists(dirPath))) {
|
||
|
|
logger.log(chalk.yellow(`Creating directory: ${dirConfig}`));
|
||
|
|
await fs.ensureDir(dirPath);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// IDE-specific configuration
|
||
|
|
if (installedIDEs && installedIDEs.length > 0) {
|
||
|
|
for (const ide of installedIDEs) {
|
||
|
|
await configureForIDE(ide, projectRoot, config, logger);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
logger.log(chalk.green('✓ {module_name} installation complete'));
|
||
|
|
return true;
|
||
|
|
} catch (error) {
|
||
|
|
logger.error(chalk.red(`Error installing module: ${error.message}`));
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function configureForIDE(ide, projectRoot, config, logger) {
|
||
|
|
if (!platformCodes.isValidPlatform(ide)) {
|
||
|
|
logger.warn(chalk.yellow(`Unknown platform: '${ide}'. Skipping.`));
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const platformSpecificPath = path.join(__dirname, 'platform-specifics', `${ide}.js`);
|
||
|
|
|
||
|
|
try {
|
||
|
|
if (await fs.pathExists(platformSpecificPath)) {
|
||
|
|
const platformHandler = require(platformSpecificPath);
|
||
|
|
if (typeof platformHandler.install === 'function') {
|
||
|
|
await platformHandler.install({ projectRoot, config, logger });
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} catch (error) {
|
||
|
|
logger.warn(chalk.yellow(`Warning: Could not configure ${ide}: ${error.message}`));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = { install };
|
||
|
|
```
|
||
|
|
|
||
|
|
Customize based on module requirements.
|
||
|
|
|
||
|
|
### 4. Platform-Specific Handlers (Optional)
|
||
|
|
|
||
|
|
If IDE-specific setup needed, ask which IDEs and create:
|
||
|
|
- `{targetLocation}/_module-installer/platform-specifics/claude-code.js`
|
||
|
|
- `{targetLocation}/_module-installer/platform-specifics/windsurf.js`
|
||
|
|
- etc.
|
||
|
|
|
||
|
|
### 5. Update Build Tracking
|
||
|
|
|
||
|
|
Update `{buildTrackingFile}`:
|
||
|
|
- Add 'step-04-installer' to stepsCompleted
|
||
|
|
- Note: installer created or skipped
|
||
|
|
|
||
|
|
### 6. MENU OPTIONS
|
||
|
|
|
||
|
|
**Select an Option:** [C] Continue
|
||
|
|
|
||
|
|
- IF C: Update tracking, load `{nextStepFile}`
|
||
|
|
- IF Any other: Help, then redisplay menu
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Success Metrics
|
||
|
|
|
||
|
|
✅ Assessed installer need
|
||
|
|
✅ installer.js created (if needed)
|
||
|
|
✅ Platform handlers created (if needed)
|
||
|
|
✅ Build tracking updated
|