- name
- configuration-inventory
- description
- Generate comprehensive configuration and externalized settings inventory
# Configuration & Externalized Settings Inventory
Analyze the project to produce a comprehensive inventory of all configuration sources, build profiles, runtime profiles, externalized properties, secrets workflows, feature flags, startup dependencies, and framework versions. Save to `.github/modernize/assessment/engines/facts/configuration-inventory.md`.
> Note: This skill produces a comprehensive reference document. For structured findings suitable for automated processing, see `fact-profile-settings`, `fact-environment-variables`, and `fact-xml-configs`.
## Input Parameters
- `workspace-path` (optional): Path to the project to analyze (defaults to current directory)
## Scope Boundaries — Avoid Redundancy with Other Skills
This skill is part of a set of four complementary assessment skills. To avoid content duplication across their output documents, observe these scope rules:
- **Introduction**: Write a 1-2 sentence intro focused on the configuration landscape (number of config sources, profiles, secrets approach). Do NOT restate the application's architecture type, business domain, or API surface.
- **Database architecture details** (entity models, ER diagrams, ORM mappings, caching strategy rationale, repository methods) are owned by the `data-architecture` skill. In the Properties Inventory, list database-related property keys and values as raw configuration entries, but do NOT explain their behavioral implications (e.g., do not explain what `spring.jpa.open-in-view=false` means for lazy loading — that belongs in `data-architecture.md`).
- **API endpoints** are owned by the `api-service-contracts` skill. Do NOT list HTTP endpoints, controller routes, or actuator paths.
- **Business workflows and validation rules** are owned by the `business-workflows` skill. Do NOT describe business processes or entity validation constraints.
- **Entity/domain model listings** are owned by `data-architecture` and `business-workflows`. Do NOT enumerate entity names, fields, or relationships.
## Execution Steps
### Step 1: Generate Configuration Sources Section
Identify all configuration files and sources and produce the complete `## Configuration Sources` section:
- Java (Spring): `application.properties`, `application.yml`, `bootstrap.properties`, `bootstrap.yml` — note that `bootstrap.*` files are distinct from `application.*` (bootstrap configures the config server connection and runs before application context; application configures the app itself)
- .NET: `appsettings.json`, `appsettings.{Environment}.json`, `web.config`, `launchSettings.json`
- JavaScript/TypeScript: `.env`, `.env.local`, `.env.production`, `config/*.js`, `config/*.ts`
- Shared: `docker-compose.yml` environment sections, Kubernetes ConfigMaps/Secrets YAML files
- Config server references: Spring Cloud Config (note the external Git repository URI), Azure App Configuration, AWS AppConfig, Consul KV
- Secret stores: HashiCorp Vault, Azure KeyVault, AWS Secrets Manager references
- External configuration repositories: document the URI/path of any external config repos (e.g., `spring.cloud.config.server.git.uri`)
### Step 2: Generate Build Profiles Section
Identify build-time profiles that affect compilation, packaging, and dependency resolution, and produce the complete `## Build Profiles` section:
- **Java/Maven**: profiles in `pom.xml` (e.g., `springboot`, `buildDocker`, `dev`, `cloud`) — for each, document activation condition (auto, manual `-P`, system property `-Denv=`), purpose, and key dependencies or plugins added
- **Java/Gradle**: build types and flavors in `build.gradle`
- **.NET**: build configurations (Debug, Release), conditional compilation symbols, MSBuild properties
- **JavaScript/TypeScript**: build scripts in `package.json`, webpack/vite/esbuild configurations per environment
For each build profile extract:
- Profile name
- Activation condition (automatic, manual flag, system property, environment variable)
- Purpose (what it enables)
- Key dependencies or plugins added/removed
### Step 3: Generate Runtime Profiles Section
List all runtime profile-specific or environment-specific configuration and produce the complete `## Runtime Profiles` section:
- Java (Spring): Profile-specific files (`application-dev.yml`, `application-prod.yml`), `@Profile` annotations, `spring.profiles.active` settings, combined profile activation (e.g., `mysql,key-vault`)
- .NET: Environment-specific files (`appsettings.Development.json`, `appsettings.Production.json`), `ASPNETCORE_ENVIRONMENT` usage
- JavaScript/TypeScript: `.env.development`, `.env.production`, NODE_ENV-based branching
- Identify profile activation conditions, defaults, and how profiles compose (multiple active profiles)
### Step 4: Generate Properties Inventory Section
For each service/module, catalog all configuration properties and produce the complete `## Properties Inventory` section:
- Property keys with their default values
- Which profiles/environments override each property
- Data types and expected value ranges (where inferable)
- Properties sourced from environment variables (`${ENV_VAR}`, `%ENV_VAR%`)
- Placeholder references and property resolution chain
> Do NOT include JVM startup parameters, `-Xms`/`-Xmx` heap settings, `-D` system properties, container memory/CPU limits, or instance counts here — those belong in the `## Startup Parameters & Resource Requirements` section (Step 5).
### Step 5: Generate Startup Parameters & Resource Requirements Section
Document JVM startup options, runtime parameters, and per-service resource allocations, and produce the complete `## Startup Parameters & Resource Requirements` section:
- JVM heap settings (`-Xms`, `-Xmx`) per service
- System properties passed at startup (`-Dspring.profiles.active=`, `-Dazure.keyvault.uri=`, etc.)
- Docker/container environment variable overrides (`SPRING_PROFILES_ACTIVE`, `ASPNETCORE_ENVIRONMENT`)
- Memory allocation per service (Docker `mem_limit`, Kubernetes `resources.requests/limits`, cloud deployment settings)
- CPU allocation if specified
- Instance count and scaling configuration
- JVM heap settings mapped to service memory allocation (e.g., `-Xms2048m -Xmx2048m` for 2Gi services)
### Step 6: Generate Startup Dependency Chain Section
Map the service startup order and readiness dependencies and produce the complete `## Startup Dependency Chain` section:
- Which services must start before others (e.g., config-server → discovery-server → business services → gateway)
- Health-check/wait mechanisms: `dockerize` wait-for-TCP, Kubernetes readiness probes, Spring Cloud Config retry, Docker Compose `depends_on` with health checks
- Startup timeout configurations
- Service readiness indicators (actuator health endpoints, custom health checks)
### Step 7: Generate Secrets & Sensitive Configuration Section
Flag sensitive configuration entries and document the secrets provisioning workflow, and produce the complete `## Secrets & Sensitive Configuration` section (including the `### Secrets Provisioning Workflow` subsection):
- Database passwords, API keys, connection strings with credentials
- Secret references: KeyVault URIs, Vault paths, encrypted property values
- Entries marked as sensitive by framework conventions (e.g., `spring.datasource.password`)
- **Do NOT output actual secret values** — show the reference path or "[MASKED]" placeholder
- Note encryption methods if present (Jasypt, DPAPI, sealed secrets)
Document how secrets flow through the system (`### Secrets Provisioning Workflow`):
- Secret source: environment variables, Key Vault, Vault, AWS Secrets Manager, sealed secrets
- Identity/access model: managed identities, service principals, RBAC permissions (e.g., "system-assigned managed identity with `get` and `list` permissions on Key Vault")
- Provisioning sequence: how secrets are set up during deployment (e.g., GitHub Actions retrieves service principal credentials → authenticates → creates MySQL secrets → binds to services)
- Which services need which secrets (e.g., data services need MySQL connection strings, all services need config server credentials)
### Step 8: Generate Feature Flags Section
Identify feature toggles and conditional configuration and produce the complete `## Feature Flags` section:
- Feature flag frameworks: Spring Feature Flags, LaunchDarkly, Unleash, .NET FeatureManagement, custom toggles
- Conditional beans/services (`@ConditionalOnProperty`, `@ConditionalOnExpression`)
- A/B testing flags and gradual rollout configurations
- Default values and controlling sources (config file, environment variable, remote service)
### Step 9: Generate Framework & Runtime Versions Section
Catalog the technology stack versions that affect configuration and produce the complete `## Framework & Runtime Versions` section:
- Core framework versions: Spring Boot, Spring Cloud, ASP.NET Core, Node.js, Express
- Target language/runtime version: Java 8/11/17/21, .NET 6/7/8, Node.js 18/20
- Key library versions: Hibernate, EF Core, Resilience4j, Eureka, etc.
- Docker base images and their versions (e.g., `openjdk:11-jre`, `mcr.microsoft.com/dotnet/aspnet:8.0`)
- Build tool versions: Maven, Gradle, MSBuild, npm/yarn/pnpm
### Step 10: Save Output
Save to `.github/modernize/assessment/engines/facts/configuration-inventory.md` with this exact structure:
```
# Configuration & Externalized Settings Inventory
A brief introduction (1-2 sentences) summarizing the configuration landscape.
## Configuration Sources
[Table: Source | Type | Path/Location | Notes]
## Build Profiles
[Table: Profile | Activation | Purpose | Key Dependencies/Plugins]
## Runtime Profiles
[Table: Profile | Activation Method | Config Files | Key Overrides]
## Properties Inventory
[Per-service tables: Property Key | Default | Profiles | Source]
## Startup Parameters & Resource Requirements
[Table: Service | JVM/Runtime Options | Memory | Instance Count]
## Startup Dependency Chain
[Ordered list: Service → waits for → Service, with mechanism (dockerize, health check, etc.)]
## Secrets & Sensitive Configuration
[Table: Secret Reference | Type | Storage (masked)]
### Secrets Provisioning Workflow
[Description of how secrets flow: source → identity/access → binding → services]
## Feature Flags
[Table: Flag Name | Default | Controlled By]
## Framework & Runtime Versions
[Table: Component | Version | Source]
```
## Scaling Rules
- If the project has **more than 100 properties**, group by category (database, messaging, security, etc.) and show representative examples with counts
- For multi-module projects, organize the properties inventory by module/service
- Collapse repetitive property patterns (e.g., 20 similar cache TTL settings) into a summary row with count
## Error Handling
- **Unsupported project type**: Output a single line: `> ERROR: Unsupported project type. This skill supports Java, .NET, JavaScript, and TypeScript projects only.`
- **No configuration files found**: Output: `> ERROR: No recognized configuration files found at {workspace-path}. Verify the path is correct.`
- **Insufficient info**: Generate a best-effort inventory from available data. Add a note: `> Note: Some configuration sources or properties could not be fully identified.`
## Success Criteria
- Configuration sources table lists all discovered config files, external config repos, and secret stores
- Build profiles are documented separately from runtime profiles with activation conditions and purposes
- Runtime profiles are documented with config files and key overrides
- Properties inventory covers all discovered properties with defaults and sources
- Startup parameters and resource requirements are documented per service
- Startup dependency chain shows service boot order with wait mechanisms
- Secrets are identified with references (no actual values exposed) and the provisioning workflow is described
- Feature flags are cataloged with defaults and controlling sources
- Framework and runtime versions are documented
- File saved to `.github/modernize/assessment/engines/facts/configuration-inventory.md`
GitHubで見る