Architecture
This document describes the architecture of @hyperfrontend/project-scope, a comprehensive library for analyzing JavaScript/TypeScript project structure, technology stack, and dependencies.
Overview
Module Organization
| Module | Responsibility |
|---|---|
| analyze | Main entry point (analyzeProject) |
| cli | Command-line interface |
| core | Foundation utilities (file system, etc.) |
| heuristics | Intelligent detection algorithms |
| models | TypeScript types and interfaces |
| nx | NX workspace integration |
| project | Project structure analysis |
| tech | Technology stack detection |
| vfs | Virtual file system (transactional ops) |
Data Flow
Analysis Pipeline
Core Components
1. Analysis Engine (analyze.ts)
The main entry point that orchestrates all detection modules:
function analyzeProject(projectPath: string, options?: AnalyzeOptions): AnalysisResult
Responsibilities:
- Coordinate all detection modules
- Aggregate results into unified structure
- Handle options for selective analysis
- Track analysis metadata (timing, version)
2. Technology Detection (tech/)
Detects frameworks, build tools, and testing frameworks:
Design Patterns:
- Each detector implements a common interface
- Results include confidence scores (0-100)
- Detection sources are tracked for transparency
- Caching with 60-second TTL
3. Heuristics (heuristics/)
Intelligent detection using multiple signals:
Key Characteristics:
- Multi-signal analysis for accuracy
- Evidence tracking for explainability
- Confidence scoring for reliability indication
- Caching for performance
4. Virtual File System (vfs/)
Transactional file operations:
Properties:
- All changes buffered in memory
- Atomic commit or rollback
- Path traversal protection
- Symlink security validation
5. Core Utilities (core/)
Foundation layer providing:
| Component | Purpose |
|---|---|
fs/ |
Safe file system operations |
path/ |
Cross-platform path manipulation |
logger.ts |
Scoped logging with secret sanitization |
cache.ts |
In-memory caching with TTL |
errors/ |
Structured error creation |
patterns/ |
ReDoS-safe glob matching |
encoding/ |
File encoding detection |
platform/ |
OS detection |
Caching Strategy
Cache Characteristics:
- Function-specific TTLs based on volatility
- Size limits prevent memory issues
- Skip-cache option for fresh results
- Global clear for testing
Error Handling
Error Types:
FS_NOT_FOUND- File/directory not foundFS_READ_ERROR- Read operation failedFS_WRITE_ERROR- Write operation failedFS_PARSE_ERROR- JSON/config parse failureCONFIG_NOT_FOUND- Configuration not foundVALIDATION_ERROR- Invalid input
Security Considerations
Path Traversal Prevention
// VFS normalizes and validates all paths
tree.read('../../../etc/passwd') // Throws: Path escapes tree root
Symlink Security
Secret Sanitization
// Logger automatically redacts sensitive keys
logger.debug('Config loaded', { apiKey: 'secret123' })
// Output: [scope] Config loaded {"apiKey":"[REDACTED]"}
Sensitive key patterns: token, key, password, secret, credential, auth, bearer, api_key, private, passphrase
ReDoS Protection
Glob matching uses character-by-character iteration instead of regex to prevent Regular Expression Denial of Service attacks.
Extension Points
Adding a New Framework Detector
// tech/frontend/my-framework.ts
import type { FrameworkDetector } from './types'
export const myFrameworkDetector: FrameworkDetector = {
id: 'my-framework',
name: 'MyFramework',
category: 'frontend',
detect(projectPath, packageJson) {
// Detection logic
return {
id: 'my-framework',
name: 'MyFramework',
confidence: 80,
detectedFrom: [{ type: 'package.json', field: 'dependencies.my-framework' }],
}
},
}
// Register in tech/frontend/index.ts
export const frameworkDetectors = [..., myFrameworkDetector]
Adding a New CLI Command
// cli/commands/my-command.ts
import type { Command } from '../types'
export const myCommandDef: Command = {
name: 'my-command',
description: 'Does something useful',
execute(args, globalOptions) {
// Command logic
return { exitCode: 0 }
},
getHelp() {
return 'Usage: project-scope my-command [options]'
},
}
// Register in cli/run.ts
const commands = { ..., 'my-command': myCommandDef }
Performance Characteristics
| Operation | Typical Time | Caching |
|---|---|---|
analyzeProject (full) |
50-200ms | Per-component |
detectAll |
20-50ms | 60s TTL |
detectConfigs |
10-30ms | 30s TTL |
buildDependencyGraph |
100-500ms | None |
findFiles |
10-100ms | None |