🎯 Objective
Create a Terraform extractor (basic-terraform) that enables Archlette to analyze Terraform/OpenTofu
infrastructure-as-code, extracting resources, modules, and dependencies to map infrastructure architecture.
📋 Architecture Overview
The Terraform extractor will follow the same modular structure as basic-node:
src/extractors/builtin/basic-terraform/
├── index.ts # Entry point (orchestrator)
├── types.ts # Terraform-specific extraction types
├── file-finder.ts # Find .tf files with glob patterns
├── file-parser.ts # Parse HCL files → FileExtraction[]
├── component-detector.ts # Extract @component from comments/tags
├── resource-extractor.ts # Extract resources, data sources
├── module-extractor.ts # Extract module blocks and dependencies
├── variable-extractor.ts # Extract variables, locals, outputs
├── provider-extractor.ts # Extract provider configurations
├── doc-extractor.ts # Extract documentation comments
└── to-ir-mapper.ts # Map FileExtraction[] → ArchletteIR
🔧 Technology Approach
Recommended: HCL2 Parser (hcl-parser)
- Native HCL parsing via
@evops/hcl-parser or hcl2-parser
- Accurate AST with full Terraform syntax support
- Handles expressions, functions, interpolations
Alternative: Terraform JSON output
- Use
terraform show -json for parsed configuration
- Trade-off: Requires Terraform installed, slower
- Benefit: Guaranteed accuracy for complex expressions
📝 Implementation Tasks
Phase 1: Setup & Scaffolding
Phase 2: HCL Parser Integration
Phase 3: Component & Documentation
Phase 4: Infrastructure Extraction
Phase 5: IR Mapping
Phase 6: Testing
Phase 7: Documentation & Polish
🎯 Terraform-Specific Features
| Feature |
Implementation Notes |
| Resources |
Extract type, provider, name, attributes |
| Modules |
Track source, version, inputs, outputs |
| Data sources |
External data dependencies |
| Variables |
Input variables with types and constraints |
| Outputs |
Module outputs and descriptions |
| Dependencies |
Implicit (references) and explicit (depends_on) |
| Expressions |
Interpolations, functions, conditionals |
✅ Success Criteria
- Extracts resources, modules, variables, outputs, providers
- Parses HCL2 syntax including complex expressions
- Detects
@component, @actor, @uses annotations in comments
- Handles module dependencies (local and remote)
- Maps to ArchletteIR compatible with existing pipeline
- 90%+ test coverage
- Works with Terraform 0.13+ / OpenTofu codebases
- Fully documented with examples
📦 Configuration Example
extractors:
- use: builtin/basic-terraform
inputs:
include: ['infrastructure/**/*.tf', 'modules/**/*.tf']
exclude: ['**/.terraform/**', '**/*.tfstate']
🔗 Related
- Mirrors basic-node extractor architecture
- Supports JSDoc-style annotations in HCL comments
- Integrates with existing Structurizr DSL generation pipeline
- Maps infrastructure components to architectural views
📚 References
- HCL2 specification: https://github.com/hashicorp/hcl
- Terraform configuration syntax: https://www.terraform.io/language/syntax/configuration
- Terraform module structure: https://www.terraform.io/language/modules/develop
- OpenTofu compatibility: https://opentofu.org/docs/
🎯 Objective
Create a Terraform extractor (
basic-terraform) that enables Archlette to analyze Terraform/OpenTofuinfrastructure-as-code, extracting resources, modules, and dependencies to map infrastructure architecture.
📋 Architecture Overview
The Terraform extractor will follow the same modular structure as
basic-node:src/extractors/builtin/basic-terraform/
├── index.ts # Entry point (orchestrator)
├── types.ts # Terraform-specific extraction types
├── file-finder.ts # Find .tf files with glob patterns
├── file-parser.ts # Parse HCL files → FileExtraction[]
├── component-detector.ts # Extract @component from comments/tags
├── resource-extractor.ts # Extract resources, data sources
├── module-extractor.ts # Extract module blocks and dependencies
├── variable-extractor.ts # Extract variables, locals, outputs
├── provider-extractor.ts # Extract provider configurations
├── doc-extractor.ts # Extract documentation comments
└── to-ir-mapper.ts # Map FileExtraction[] → ArchletteIR
🔧 Technology Approach
Recommended: HCL2 Parser (hcl-parser)
@evops/hcl-parserorhcl2-parserAlternative: Terraform JSON output
terraform show -jsonfor parsed configuration📝 Implementation Tasks
Phase 1: Setup & Scaffolding
src/extractors/builtin/basic-terraform/directory structuretypes.tswith Terraform-specific types (resources, modules, blocks)basic-terraform.tsandbasic-terraform/index.tsfile-finder.tswith Terraform file patterns (**/*.tf, exclude.terraform/)Phase 2: HCL Parser Integration
file-parser.tsto parse.tffiles to AST.tfvarsfile parsingPhase 3: Component & Documentation
component-detector.tsto parse comment tags# @component ComponentName# @actor Name {Person|System} {in|out|both} description# @uses TargetComponent descriptiondoc-extractor.tssupporting Terraform documentation patterns:Phase 4: Infrastructure Extraction
resource-extractor.tsaws_s3_bucket)module-extractor.tsvariable-extractor.tsprovider-extractor.tsPhase 5: IR Mapping
to-ir-mapper.ts@componenttags and modules@actortagsPhase 6: Testing
test/extractors/builtin/basic-terraform/fixtures/resource-extraction.test.tsmodule-extraction.test.tsvariable-extraction.test.tsprovider-extraction.test.tscomponent-detection.test.tsdependency-resolution.test.tsintegration.test.tsPhase 7: Documentation & Polish
README.mdwith Terraform extractor documentationaac.yaml🎯 Terraform-Specific Features
✅ Success Criteria
@component,@actor,@usesannotations in comments📦 Configuration Example