245 lines
7.4 KiB
Markdown
245 lines
7.4 KiB
Markdown
# Detailed Implementation Plan - Issue #477
|
|
|
|
## Overview
|
|
|
|
Fix the installer to skip configuration questions during updates and preserve existing settings from `install-manifest.yaml`.
|
|
|
|
## Phase 1: Analysis & Preparation
|
|
|
|
### Task 1.1: Understand Current Installer Flow
|
|
|
|
- **File**: `tools/cli/commands/install.js`
|
|
- **Objective**: Map the current installation flow
|
|
- **Deliverable**: Document showing:
|
|
- Entry point for install command
|
|
- How it decides between fresh install vs update
|
|
- Where configuration questions are asked
|
|
- How manifest is currently used (if at all)
|
|
|
|
### Task 1.2: Identify Question Points
|
|
|
|
- **Files to scan**:
|
|
- `tools/cli/installers/lib/` (all files)
|
|
- `tools/cli/lib/` (all configuration-related files)
|
|
- **Objective**: Find all places where user is prompted for config
|
|
- **Deliverable**: List of all prompt locations with context
|
|
|
|
### Task 1.3: Test Environment Setup
|
|
|
|
- **Create test fixtures**:
|
|
- Mock existing `.bmad-core/install-manifest.yaml`
|
|
- Mock project structure
|
|
- Create test scenarios for each install type
|
|
|
|
## Phase 2: Configuration Loading
|
|
|
|
### Task 2.1: Create Config Loader
|
|
|
|
- **File**: `tools/cli/lib/config-loader.js` (new)
|
|
- **Responsibilities**:
|
|
- Load `install-manifest.yaml` if exists
|
|
- Parse YAML safely with error handling
|
|
- Cache loaded configuration
|
|
- Provide getter methods for each config field
|
|
- **Tests Required**:
|
|
- Load valid manifest
|
|
- Handle missing manifest (fresh install)
|
|
- Handle corrupted manifest
|
|
- Handle partial manifest (missing fields)
|
|
- Verify caching behavior
|
|
|
|
### Task 2.2: Update Manifest Schema
|
|
|
|
- **File**: `tools/cli/installers/lib/core/manifest.js`
|
|
- **Changes**:
|
|
- Add schema validation
|
|
- Document required fields
|
|
- Add field defaults
|
|
- Add version migration logic
|
|
- **Tests Required**:
|
|
- Validate complete manifest
|
|
- Validate partial manifest
|
|
- Test field migrations
|
|
|
|
## Phase 3: Update Detection Logic
|
|
|
|
### Task 3.1: Create Update Mode Detector
|
|
|
|
- **File**: `tools/cli/installers/lib/core/installer.js`
|
|
- **Add method**: `detectInstallMode(projectDir, manifestPath)`
|
|
- **Returns**: One of:
|
|
- `'fresh'` - No manifest, new installation
|
|
- `'update'` - Manifest exists, different version
|
|
- `'reinstall'` - Manifest exists, same version
|
|
- `'invalid'` - Manifest corrupted or invalid
|
|
- **Tests Required**:
|
|
- Fresh install detection
|
|
- Update detection with version difference
|
|
- Reinstall detection (same version)
|
|
- Invalid manifest detection
|
|
- Missing manifest detection
|
|
|
|
### Task 3.2: Load Previous Configuration
|
|
|
|
- **File**: `tools/cli/commands/install.js`
|
|
- **Add logic**:
|
|
- Call config loader when update detected
|
|
- Store config in installer context
|
|
- Pass to all prompt functions
|
|
- **Tests Required**:
|
|
- Configuration loaded correctly
|
|
- Configuration available to prompts
|
|
- Defaults applied properly
|
|
|
|
## Phase 4: Question Skipping
|
|
|
|
### Task 4.1: Add Update Flag to Prompts
|
|
|
|
- **Files**: All prompt functions in `tools/cli/installers/lib/`
|
|
- **Changes**:
|
|
- Add `isUpdate` parameter to prompt functions
|
|
- Skip questions if `isUpdate === true` and config exists
|
|
- Return cached config value
|
|
- Log what was skipped (debug mode)
|
|
- **Prompts to Skip**:
|
|
1. "Will the PRD be sharded?" → Use `config.prd_sharding`
|
|
2. "Will the Architecture be sharded?" → Use `config.architecture_sharding`
|
|
3. "Document Organization Settings" → Use `config.doc_organization`
|
|
4. "Bootstrap questions" → Use corresponding config values
|
|
|
|
### Task 4.2: Test Question Skipping
|
|
|
|
- **Tests Required**:
|
|
- Each question skipped during update
|
|
- Correct default value returned
|
|
- Questions asked during fresh install
|
|
- Questions asked during reinstall (optional flag)
|
|
|
|
## Phase 5: Manifest Validation
|
|
|
|
### Task 5.1: Add Validation Logic
|
|
|
|
- **File**: `tools/cli/installers/lib/core/manifest.js`
|
|
- **Add method**: `validateManifest(manifestData)`
|
|
- **Checks**:
|
|
- Required fields present: `version`, `installed_at`, `install_type`
|
|
- Field types correct
|
|
- Version format valid (semver)
|
|
- Dates valid ISO format
|
|
- IDEs array valid (if present)
|
|
- **Tests Required**:
|
|
- Valid manifest passes
|
|
- Missing required field fails
|
|
- Invalid version format fails
|
|
- Invalid date format fails
|
|
- Extra fields ignored gracefully
|
|
|
|
### Task 5.2: Add Fallback Logic
|
|
|
|
- **File**: `tools/cli/commands/install.js`
|
|
- **Logic**:
|
|
- If validation fails, treat as fresh install
|
|
- Log warning about invalid manifest
|
|
- Proceed with questions
|
|
- **Tests Required**:
|
|
- Fallback on invalid manifest
|
|
- User warned appropriately
|
|
- No crash or corruption
|
|
|
|
## Phase 6: Integration & Testing
|
|
|
|
### Task 6.1: End-to-End Tests
|
|
|
|
- **Test Scenarios**:
|
|
1. Fresh install (no manifest) → asks all questions
|
|
2. Update install (manifest v4.36.2 → v4.39.2) → skips questions
|
|
3. Reinstall (manifest v4.36.2 → v4.36.2) → skips questions (optional)
|
|
4. Invalid manifest → asks all questions
|
|
5. IDE configuration preserved
|
|
6. Expansion packs preserved
|
|
|
|
### Task 6.2: Backward Compatibility
|
|
|
|
- **Tests**:
|
|
- Works with old manifest format
|
|
- Works without IDE configuration field
|
|
- Works without expansion_packs field
|
|
- Graceful degradation
|
|
|
|
### Task 6.3: CLI Flag Options
|
|
|
|
- **Add optional flags** (future enhancement):
|
|
- `--reconfigure` - Force questions even on update
|
|
- `--skip-questions` - Skip all questions (use all defaults)
|
|
- `--manifest-path` - Custom manifest location
|
|
|
|
## Phase 7: Documentation & Release
|
|
|
|
### Task 7.1: Update README
|
|
|
|
- Document update behavior
|
|
- Show examples of update vs fresh install
|
|
- Explain question skipping
|
|
|
|
### Task 7.2: Add Code Comments
|
|
|
|
- Document new methods
|
|
- Explain update detection logic
|
|
- Explain question skipping
|
|
|
|
### Task 7.3: Create Migration Guide
|
|
|
|
- For users experiencing the issue
|
|
- Show new expected behavior
|
|
|
|
## Implementation Order
|
|
|
|
1. **Start with tests** (TDD approach)
|
|
2. Create test fixtures and scenarios
|
|
3. Create configuration loader
|
|
4. Create update mode detector
|
|
5. Integrate into install command
|
|
6. Add question skipping logic
|
|
7. Add validation logic
|
|
8. Run all tests
|
|
9. Manual testing with real project
|
|
10. Documentation updates
|
|
|
|
## Estimated Effort
|
|
|
|
- Phase 1: 2 hours (analysis)
|
|
- Phase 2: 3 hours (config loading)
|
|
- Phase 3: 3 hours (update detection)
|
|
- Phase 4: 4 hours (question skipping)
|
|
- Phase 5: 2 hours (validation)
|
|
- Phase 6: 4 hours (integration & testing)
|
|
- Phase 7: 2 hours (documentation)
|
|
|
|
**Total: ~20 hours of implementation**
|
|
|
|
## Dependencies
|
|
|
|
- No external dependencies (uses existing libraries)
|
|
- Depends on understanding current installer architecture
|
|
- Requires test infrastructure setup
|
|
|
|
## Risks & Mitigations
|
|
|
|
| Risk | Mitigation |
|
|
| -------------------------------- | ------------------------------------------------ |
|
|
| Breaking existing workflows | Comprehensive backward compatibility tests |
|
|
| Data loss from invalid manifest | Validation before use, fallback to safe defaults |
|
|
| Confused users with new behavior | Clear documentation and example output |
|
|
| Performance impact | Cache configuration, lazy loading |
|
|
|
|
## Success Criteria
|
|
|
|
All acceptance criteria from issue must pass:
|
|
|
|
- [ ] Running install on existing setup doesn't ask config questions
|
|
- [ ] Existing settings are preserved from `install-manifest.yaml`
|
|
- [ ] Version detection still works (shows update available)
|
|
- [ ] Files are properly updated without re-asking questions
|
|
- [ ] All IDE configurations are preserved
|
|
- [ ] Backward compatible with existing installations
|