91 lines
2.6 KiB
PowerShell
91 lines
2.6 KiB
PowerShell
#!/usr/bin/env pwsh
|
|
# Create a new feature
|
|
[CmdletBinding()]
|
|
param(
|
|
[switch]$Json,
|
|
[Parameter(ValueFromRemainingArguments = $true)]
|
|
[string[]]$FeatureDescription
|
|
)
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
if (-not $FeatureDescription -or $FeatureDescription.Count -eq 0) {
|
|
Write-Error "Usage: ./create-new-feature.ps1 [-Json] <feature description>"
|
|
exit 1
|
|
}
|
|
$featureDesc = ($FeatureDescription -join ' ').Trim()
|
|
|
|
# Resolve repository root. Prefer git information when available, but fall back
|
|
# to the script location so the workflow still functions in repositories that
|
|
# were initialised with --no-git.
|
|
$scriptDir = Split-Path -Parent $PSScriptRoot
|
|
$fallbackRoot = (Resolve-Path (Join-Path $scriptDir "..")).Path
|
|
|
|
try {
|
|
$repoRoot = git rev-parse --show-toplevel 2>$null
|
|
if ($LASTEXITCODE -eq 0) {
|
|
$hasGit = $true
|
|
} else {
|
|
throw "Git not available"
|
|
}
|
|
} catch {
|
|
$repoRoot = $fallbackRoot
|
|
$hasGit = $false
|
|
}
|
|
|
|
Set-Location $repoRoot
|
|
|
|
$specsDir = Join-Path $repoRoot 'specs'
|
|
New-Item -ItemType Directory -Path $specsDir -Force | Out-Null
|
|
|
|
$highest = 0
|
|
if (Test-Path $specsDir) {
|
|
Get-ChildItem -Path $specsDir -Directory | ForEach-Object {
|
|
if ($_.Name -match '^(\d{3})') {
|
|
$num = [int]$matches[1]
|
|
if ($num -gt $highest) { $highest = $num }
|
|
}
|
|
}
|
|
}
|
|
$next = $highest + 1
|
|
$featureNum = ('{0:000}' -f $next)
|
|
|
|
$branchName = $featureDesc.ToLower() -replace '[^a-z0-9]', '-' -replace '-{2,}', '-' -replace '^-', '' -replace '-$', ''
|
|
$words = ($branchName -split '-') | Where-Object { $_ } | Select-Object -First 3
|
|
$branchName = "$featureNum-$([string]::Join('-', $words))"
|
|
|
|
if ($hasGit) {
|
|
try {
|
|
git checkout -b $branchName | Out-Null
|
|
} catch {
|
|
Write-Warning "Failed to create git branch: $branchName"
|
|
}
|
|
} else {
|
|
Write-Warning "[specify] Warning: Git repository not detected; skipped branch creation for $branchName"
|
|
}
|
|
|
|
$featureDir = Join-Path $specsDir $branchName
|
|
New-Item -ItemType Directory -Path $featureDir -Force | Out-Null
|
|
|
|
$template = Join-Path $repoRoot 'templates/spec-template.md'
|
|
$specFile = Join-Path $featureDir 'spec.md'
|
|
if (Test-Path $template) {
|
|
Copy-Item $template $specFile -Force
|
|
} else {
|
|
New-Item -ItemType File -Path $specFile | Out-Null
|
|
}
|
|
|
|
if ($Json) {
|
|
$obj = [PSCustomObject]@{
|
|
BRANCH_NAME = $branchName
|
|
SPEC_FILE = $specFile
|
|
FEATURE_NUM = $featureNum
|
|
HAS_GIT = $hasGit
|
|
}
|
|
$obj | ConvertTo-Json -Compress
|
|
} else {
|
|
Write-Output "BRANCH_NAME: $branchName"
|
|
Write-Output "SPEC_FILE: $specFile"
|
|
Write-Output "FEATURE_NUM: $featureNum"
|
|
Write-Output "HAS_GIT: $hasGit"
|
|
}
|