| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #!/usr/bin/env pwsh
- # Consolidated prerequisite checking script (PowerShell)
- #
- # This script provides unified prerequisite checking for Spec-Driven Development workflow.
- # It replaces the functionality previously spread across multiple scripts.
- #
- # Usage: ./check-prerequisites.ps1 [OPTIONS]
- #
- # OPTIONS:
- # -Json Output in JSON format
- # -RequireTasks Require tasks.md to exist (for implementation phase)
- # -IncludeTasks Include tasks.md in AVAILABLE_DOCS list
- # -PathsOnly Only output path variables (no validation)
- # -Help, -h Show help message
- [CmdletBinding()]
- param(
- [switch]$Json,
- [switch]$RequireTasks,
- [switch]$IncludeTasks,
- [switch]$PathsOnly,
- [switch]$Help
- )
- $ErrorActionPreference = 'Stop'
- # Show help if requested
- if ($Help) {
- Write-Output @"
- Usage: check-prerequisites.ps1 [OPTIONS]
- Consolidated prerequisite checking for Spec-Driven Development workflow.
- OPTIONS:
- -Json Output in JSON format
- -RequireTasks Require tasks.md to exist (for implementation phase)
- -IncludeTasks Include tasks.md in AVAILABLE_DOCS list
- -PathsOnly Only output path variables (no prerequisite validation)
- -Help, -h Show this help message
- EXAMPLES:
- # Check task prerequisites (plan.md required)
- .\check-prerequisites.ps1 -Json
-
- # Check implementation prerequisites (plan.md + tasks.md required)
- .\check-prerequisites.ps1 -Json -RequireTasks -IncludeTasks
-
- # Get feature paths only (no validation)
- .\check-prerequisites.ps1 -PathsOnly
- "@
- exit 0
- }
- # Source common functions
- . "$PSScriptRoot/common.ps1"
- # Get feature paths
- $paths = Get-FeaturePathsEnv
- # If paths-only mode, output paths and exit (no validation)
- if ($PathsOnly) {
- if ($Json) {
- [PSCustomObject]@{
- REPO_ROOT = $paths.REPO_ROOT
- BRANCH = $paths.CURRENT_BRANCH
- FEATURE_DIR = $paths.FEATURE_DIR
- FEATURE_SPEC = $paths.FEATURE_SPEC
- IMPL_PLAN = $paths.IMPL_PLAN
- TASKS = $paths.TASKS
- } | ConvertTo-Json -Compress
- } else {
- Write-Output "REPO_ROOT: $($paths.REPO_ROOT)"
- Write-Output "BRANCH: $($paths.CURRENT_BRANCH)"
- Write-Output "FEATURE_DIR: $($paths.FEATURE_DIR)"
- Write-Output "FEATURE_SPEC: $($paths.FEATURE_SPEC)"
- Write-Output "IMPL_PLAN: $($paths.IMPL_PLAN)"
- Write-Output "TASKS: $($paths.TASKS)"
- }
- exit 0
- }
- # Validate required directories and files
- if (-not (Test-Path $paths.FEATURE_DIR -PathType Container)) {
- Write-Output "ERROR: Feature directory not found: $($paths.FEATURE_DIR)"
- $specifyCommand = '/speckit-specify'
- Write-Output "Run $specifyCommand first to create the feature structure."
- exit 1
- }
- if (-not (Test-Path $paths.IMPL_PLAN -PathType Leaf)) {
- Write-Output "ERROR: plan.md not found in $($paths.FEATURE_DIR)"
- $planCommand = '/speckit-plan'
- Write-Output "Run $planCommand first to create the implementation plan."
- exit 1
- }
- # Check for tasks.md if required
- if ($RequireTasks -and -not (Test-Path $paths.TASKS -PathType Leaf)) {
- Write-Output "ERROR: tasks.md not found in $($paths.FEATURE_DIR)"
- $tasksCommand = '/speckit-tasks'
- Write-Output "Run $tasksCommand first to create the task list."
- exit 1
- }
- # Build list of available documents
- $docs = @()
- # Always check these optional docs
- if (Test-Path $paths.RESEARCH) { $docs += 'research.md' }
- if (Test-Path $paths.DATA_MODEL) { $docs += 'data-model.md' }
- # Check contracts directory (only if it exists and has files)
- if ((Test-Path $paths.CONTRACTS_DIR) -and (Get-ChildItem -Path $paths.CONTRACTS_DIR -ErrorAction SilentlyContinue | Select-Object -First 1)) {
- $docs += 'contracts/'
- }
- if (Test-Path $paths.QUICKSTART) { $docs += 'quickstart.md' }
- # Include tasks.md if requested and it exists
- if ($IncludeTasks -and (Test-Path $paths.TASKS)) {
- $docs += 'tasks.md'
- }
- # Output results
- if ($Json) {
- # JSON output
- [PSCustomObject]@{
- FEATURE_DIR = $paths.FEATURE_DIR
- AVAILABLE_DOCS = $docs
- } | ConvertTo-Json -Compress
- } else {
- # Text output
- Write-Output "FEATURE_DIR:$($paths.FEATURE_DIR)"
- Write-Output "AVAILABLE_DOCS:"
-
- # Show status of each potential document
- Test-FileExists -Path $paths.RESEARCH -Description 'research.md' | Out-Null
- Test-FileExists -Path $paths.DATA_MODEL -Description 'data-model.md' | Out-Null
- Test-DirHasFiles -Path $paths.CONTRACTS_DIR -Description 'contracts/' | Out-Null
- Test-FileExists -Path $paths.QUICKSTART -Description 'quickstart.md' | Out-Null
-
- if ($IncludeTasks) {
- Test-FileExists -Path $paths.TASKS -Description 'tasks.md' | Out-Null
- }
- }
|