-
Notifications
You must be signed in to change notification settings - Fork 7.8k
fix: honor template overrides for tasks-template (#2278) #2292
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 5 commits
05b1ea8
01bff43
8dbe61e
f4f3110
4bb64bd
99a7524
44ca254
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,94 @@ | ||
| #!/usr/bin/env bash | ||
|
|
||
| set -e | ||
|
|
||
| # Parse command line arguments | ||
| JSON_MODE=false | ||
|
|
||
| for arg in "$@"; do | ||
| case "$arg" in | ||
| --json) JSON_MODE=true ;; | ||
| --help|-h) | ||
| echo "Usage: $0 [--json]" | ||
| echo " --json Output results in JSON format" | ||
| echo " --help Show this help message" | ||
| exit 0 | ||
| ;; | ||
| *) echo "ERROR: Unknown option '$arg'" >&2; exit 1 ;; | ||
| esac | ||
| done | ||
|
|
||
| # Source common functions | ||
| SCRIPT_DIR="$(CDPATH="" cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | ||
| source "$SCRIPT_DIR/common.sh" | ||
|
|
||
| # Get feature paths | ||
| _paths_output=$(get_feature_paths) || { echo "ERROR: Failed to resolve feature paths" >&2; exit 1; } | ||
| eval "$_paths_output" | ||
| unset _paths_output | ||
|
|
||
| # Validate branch | ||
| check_feature_branch "$CURRENT_BRANCH" "$HAS_GIT" || exit 1 | ||
|
|
||
| # Validate prerequisites | ||
| if [[ ! -d "$FEATURE_DIR" ]]; then | ||
| echo "ERROR: Feature directory not found: $FEATURE_DIR" >&2 | ||
| echo "Run /speckit.specify first to create the feature structure." >&2 | ||
| exit 1 | ||
| fi | ||
|
|
||
| if [[ ! -f "$IMPL_PLAN" ]]; then | ||
| echo "ERROR: plan.md not found in $FEATURE_DIR" >&2 | ||
| echo "Run /speckit.plan first to create the implementation plan." >&2 | ||
| exit 1 | ||
| fi | ||
|
|
||
| # Build available docs list | ||
| docs=() | ||
| [[ -f "$RESEARCH" ]] && docs+=("research.md") | ||
| [[ -f "$DATA_MODEL" ]] && docs+=("data-model.md") | ||
| if [[ -d "$CONTRACTS_DIR" ]] && [[ -n "$(ls -A "$CONTRACTS_DIR" 2>/dev/null)" ]]; then | ||
| docs+=("contracts/") | ||
| fi | ||
| [[ -f "$QUICKSTART" ]] && docs+=("quickstart.md") | ||
|
|
||
| # Resolve tasks template through override stack | ||
| TASKS_TEMPLATE=$(resolve_template "tasks-template" "$REPO_ROOT") || true | ||
| if [[ -z "$TASKS_TEMPLATE" ]] || [[ ! -f "$TASKS_TEMPLATE" ]]; then | ||
| echo "ERROR: Could not resolve required tasks-template in $REPO_ROOT" >&2 | ||
| echo "Expected shared core template at .specify/templates/tasks-template.md; run 'specify init' or reinstall shared infra to restore it." >&2 | ||
| exit 1 | ||
| fi | ||
|
|
||
| # Output results | ||
| if $JSON_MODE; then | ||
| if has_jq; then | ||
| if [[ ${#docs[@]} -eq 0 ]]; then | ||
| json_docs="[]" | ||
| else | ||
| json_docs=$(printf '%s\n' "${docs[@]}" | jq -R . | jq -s .) | ||
| fi | ||
| jq -cn \ | ||
| --arg feature_dir "$FEATURE_DIR" \ | ||
| --argjson docs "$json_docs" \ | ||
| --arg tasks_template "${TASKS_TEMPLATE:-}" \ | ||
| '{FEATURE_DIR:$feature_dir,AVAILABLE_DOCS:$docs,TASKS_TEMPLATE:$tasks_template}' | ||
| else | ||
| if [[ ${#docs[@]} -eq 0 ]]; then | ||
| json_docs="[]" | ||
| else | ||
| json_docs=$(for d in "${docs[@]}"; do printf '"%s",' "$(json_escape "$d")"; done) | ||
| json_docs="[${json_docs%,}]" | ||
| fi | ||
| printf '{"FEATURE_DIR":"%s","AVAILABLE_DOCS":%s,"TASKS_TEMPLATE":"%s"}\n' \ | ||
| "$(json_escape "$FEATURE_DIR")" "$json_docs" "$(json_escape "${TASKS_TEMPLATE:-}")" | ||
| fi | ||
| else | ||
| echo "FEATURE_DIR: $FEATURE_DIR" | ||
| echo "TASKS_TEMPLATE: ${TASKS_TEMPLATE:-not found}" | ||
| echo "AVAILABLE_DOCS:" | ||
| check_file "$RESEARCH" "research.md" | ||
| check_file "$DATA_MODEL" "data-model.md" | ||
| check_dir "$CONTRACTS_DIR" "contracts/" | ||
| check_file "$QUICKSTART" "quickstart.md" | ||
| fi |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,71 @@ | ||||||||||||||||||||||||
| #!/usr/bin/env pwsh | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| [CmdletBinding()] | ||||||||||||||||||||||||
| param( | ||||||||||||||||||||||||
| [switch]$Json, | ||||||||||||||||||||||||
| [switch]$Help | ||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| $ErrorActionPreference = 'Stop' | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| if ($Help) { | ||||||||||||||||||||||||
| Write-Output "Usage: setup-tasks.ps1 [-Json] [-Help]" | ||||||||||||||||||||||||
| exit 0 | ||||||||||||||||||||||||
| } | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| # Source common functions | ||||||||||||||||||||||||
| . "$PSScriptRoot/common.ps1" | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| # Get feature paths and validate branch | ||||||||||||||||||||||||
| $paths = Get-FeaturePathsEnv | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| if (-not (Test-FeatureBranch -Branch $paths.CURRENT_BRANCH -HasGit:$paths.HAS_GIT)) { | ||||||||||||||||||||||||
| exit 1 | ||||||||||||||||||||||||
| } | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| # Validate prerequisites | ||||||||||||||||||||||||
| if (-not (Test-Path $paths.FEATURE_DIR -PathType Container)) { | ||||||||||||||||||||||||
| Write-Output "ERROR: Feature directory not found: $($paths.FEATURE_DIR)" | ||||||||||||||||||||||||
| Write-Output "Run /speckit.specify 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)" | ||||||||||||||||||||||||
| Write-Output "Run /speckit.plan first to create the implementation plan." | ||||||||||||||||||||||||
| exit 1 | ||||||||||||||||||||||||
| } | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| # Build available docs list | ||||||||||||||||||||||||
| $docs = @() | ||||||||||||||||||||||||
| if (Test-Path $paths.RESEARCH) { $docs += 'research.md' } | ||||||||||||||||||||||||
| if (Test-Path $paths.DATA_MODEL) { $docs += 'data-model.md' } | ||||||||||||||||||||||||
| 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' } | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| # Resolve tasks template through override stack | ||||||||||||||||||||||||
| $tasksTemplate = Resolve-Template -TemplateName 'tasks-template' -RepoRoot $paths.REPO_ROOT | ||||||||||||||||||||||||
| if (-not $tasksTemplate) { | ||||||||||||||||||||||||
| $expectedCoreTemplate = Join-Path $paths.REPO_ROOT '.specify/templates/tasks-template.md' | ||||||||||||||||||||||||
| [Console]::Error.WriteLine("Tasks template not found for repository root: $($paths.REPO_ROOT)`nExpected shared/core template location: $expectedCoreTemplate`nTo continue, restore the shared templates (for example by re-running 'specify init') so that '.specify/templates/tasks-template.md' exists, or add a valid tasks-template override.") | ||||||||||||||||||||||||
| exit 1 | ||||||||||||||||||||||||
| } | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
| if (-not $tasksTemplate) { | |
| $expectedCoreTemplate = Join-Path $paths.REPO_ROOT '.specify/templates/tasks-template.md' | |
| [Console]::Error.WriteLine("Tasks template not found for repository root: $($paths.REPO_ROOT)`nExpected shared/core template location: $expectedCoreTemplate`nTo continue, restore the shared templates (for example by re-running 'specify init') so that '.specify/templates/tasks-template.md' exists, or add a valid tasks-template override.") | |
| exit 1 | |
| } | |
| if (-not $tasksTemplate -or -not (Test-Path -LiteralPath $tasksTemplate -PathType Leaf)) { | |
| $expectedCoreTemplate = Join-Path $paths.REPO_ROOT '.specify/templates/tasks-template.md' | |
| [Console]::Error.WriteLine("Tasks template not found for repository root: $($paths.REPO_ROOT)`nExpected shared/core template location: $expectedCoreTemplate`nTo continue, restore the shared templates (for example by re-running 'specify init') so that '.specify/templates/tasks-template.md' exists, or add a valid tasks-template override.") | |
| exit 1 | |
| } | |
| $tasksTemplate = (Resolve-Path -LiteralPath $tasksTemplate).Path |
Uh oh!
There was an error while loading. Please reload this page.