|
1 | 1 | #!/usr/bin/env bash |
2 | | - |
3 | | -# Consolidated prerequisite checking script |
4 | | -# |
5 | | -# This script provides unified prerequisite checking for Spec-Driven Development workflow. |
6 | | -# It replaces the functionality previously spread across multiple scripts. |
7 | | -# |
8 | | -# Usage: ./check-prerequisites.sh [OPTIONS] |
9 | | -# |
10 | | -# OPTIONS: |
11 | | -# --json Output in JSON format |
12 | | -# --require-tasks Require tasks.md to exist (for implementation phase) |
13 | | -# --include-tasks Include tasks.md in AVAILABLE_DOCS list |
14 | | -# --paths-only Only output path variables (no validation) |
15 | | -# --help, -h Show help message |
16 | | -# |
17 | | -# OUTPUTS: |
18 | | -# JSON mode: {"FEATURE_DIR":"...", "AVAILABLE_DOCS":["..."]} |
19 | | -# Text mode: FEATURE_DIR:... \n AVAILABLE_DOCS: \n ✓/✗ file.md |
20 | | -# Paths only: REPO_ROOT: ... \n BRANCH: ... \n FEATURE_DIR: ... etc. |
| 2 | +# Check prerequisites for Speckit workflow phases |
21 | 3 |
|
22 | 4 | set -e |
23 | 5 |
|
24 | | -# Parse command line arguments |
25 | 6 | JSON_MODE=false |
| 7 | +REQUIRE_PLAN=false |
26 | 8 | REQUIRE_TASKS=false |
27 | | -INCLUDE_TASKS=false |
28 | | -PATHS_ONLY=false |
29 | 9 |
|
30 | 10 | for arg in "$@"; do |
31 | 11 | case "$arg" in |
32 | | - --json) |
33 | | - JSON_MODE=true |
34 | | - ;; |
35 | | - --require-tasks) |
36 | | - REQUIRE_TASKS=true |
37 | | - ;; |
38 | | - --include-tasks) |
39 | | - INCLUDE_TASKS=true |
40 | | - ;; |
41 | | - --paths-only) |
42 | | - PATHS_ONLY=true |
43 | | - ;; |
| 12 | + --json) JSON_MODE=true ;; |
| 13 | + --require-plan) REQUIRE_PLAN=true ;; |
| 14 | + --require-tasks) REQUIRE_TASKS=true ;; |
44 | 15 | --help|-h) |
45 | | - cat << 'EOF' |
46 | | -Usage: check-prerequisites.sh [OPTIONS] |
47 | | -
|
48 | | -Consolidated prerequisite checking for Spec-Driven Development workflow. |
49 | | -
|
50 | | -OPTIONS: |
51 | | - --json Output in JSON format |
52 | | - --require-tasks Require tasks.md to exist (for implementation phase) |
53 | | - --include-tasks Include tasks.md in AVAILABLE_DOCS list |
54 | | - --paths-only Only output path variables (no prerequisite validation) |
55 | | - --help, -h Show this help message |
56 | | -
|
57 | | -EXAMPLES: |
58 | | - # Check task prerequisites (plan.md required) |
59 | | - ./check-prerequisites.sh --json |
60 | | - |
61 | | - # Check implementation prerequisites (plan.md + tasks.md required) |
62 | | - ./check-prerequisites.sh --json --require-tasks --include-tasks |
63 | | - |
64 | | - # Get feature paths only (no validation) |
65 | | - ./check-prerequisites.sh --paths-only |
66 | | - |
67 | | -EOF |
| 16 | + echo "Usage: $0 [--json] [--require-plan] [--require-tasks]" |
| 17 | + echo " --json Output JSON format" |
| 18 | + echo " --require-plan Require plan.md exists" |
| 19 | + echo " --require-tasks Require tasks.md exists" |
68 | 20 | exit 0 |
69 | 21 | ;; |
70 | | - *) |
71 | | - echo "ERROR: Unknown option '$arg'. Use --help for usage information." >&2 |
72 | | - exit 1 |
73 | | - ;; |
74 | 22 | esac |
75 | 23 | done |
76 | 24 |
|
77 | | -# Source common functions |
| 25 | +# Load common functions |
78 | 26 | SCRIPT_DIR="$(CDPATH="" cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
79 | 27 | source "$SCRIPT_DIR/common.sh" |
80 | 28 |
|
81 | | -# Get feature paths and validate branch |
| 29 | +# Get paths |
82 | 30 | eval $(get_feature_paths) |
83 | 31 | check_feature_branch "$CURRENT_BRANCH" "$HAS_GIT" || exit 1 |
84 | 32 |
|
85 | | -# If paths-only mode, output paths and exit (support JSON + paths-only combined) |
86 | | -if $PATHS_ONLY; then |
87 | | - if $JSON_MODE; then |
88 | | - # Minimal JSON paths payload (no validation performed) |
89 | | - printf '{"REPO_ROOT":"%s","BRANCH":"%s","FEATURE_DIR":"%s","FEATURE_SPEC":"%s","IMPL_PLAN":"%s","TASKS":"%s"}\n' \ |
90 | | - "$REPO_ROOT" "$CURRENT_BRANCH" "$FEATURE_DIR" "$FEATURE_SPEC" "$IMPL_PLAN" "$TASKS" |
91 | | - else |
92 | | - echo "REPO_ROOT: $REPO_ROOT" |
93 | | - echo "BRANCH: $CURRENT_BRANCH" |
94 | | - echo "FEATURE_DIR: $FEATURE_DIR" |
95 | | - echo "FEATURE_SPEC: $FEATURE_SPEC" |
96 | | - echo "IMPL_PLAN: $IMPL_PLAN" |
97 | | - echo "TASKS: $TASKS" |
98 | | - fi |
99 | | - exit 0 |
100 | | -fi |
101 | | - |
102 | | -# Validate required directories and files |
| 33 | +# Check feature directory |
103 | 34 | if [[ ! -d "$FEATURE_DIR" ]]; then |
104 | 35 | echo "ERROR: Feature directory not found: $FEATURE_DIR" >&2 |
105 | | - echo "Run /speckit.specify first to create the feature structure." >&2 |
| 36 | + echo "Run /speckit.specify first." >&2 |
106 | 37 | exit 1 |
107 | 38 | fi |
108 | 39 |
|
109 | | -if [[ ! -f "$IMPL_PLAN" ]]; then |
110 | | - echo "ERROR: plan.md not found in $FEATURE_DIR" >&2 |
111 | | - echo "Run /speckit.plan first to create the implementation plan." >&2 |
| 40 | +# Check required files |
| 41 | +if $REQUIRE_PLAN && [[ ! -f "$IMPL_PLAN" ]]; then |
| 42 | + echo "ERROR: plan.md not found. Run /speckit.plan first." >&2 |
112 | 43 | exit 1 |
113 | 44 | fi |
114 | 45 |
|
115 | | -# Check for tasks.md if required |
116 | 46 | if $REQUIRE_TASKS && [[ ! -f "$TASKS" ]]; then |
117 | | - echo "ERROR: tasks.md not found in $FEATURE_DIR" >&2 |
118 | | - echo "Run /speckit.tasks first to create the task list." >&2 |
| 47 | + echo "ERROR: tasks.md not found. Run /speckit.tasks first." >&2 |
119 | 48 | exit 1 |
120 | 49 | fi |
121 | 50 |
|
122 | | -# Build list of available documents |
123 | | -docs=() |
124 | | - |
125 | | -# Always check these optional docs |
126 | | -[[ -f "$RESEARCH" ]] && docs+=("research.md") |
127 | | -[[ -f "$DATA_MODEL" ]] && docs+=("data-model.md") |
128 | | - |
129 | | -# Check contracts directory (only if it exists and has files) |
130 | | -if [[ -d "$CONTRACTS_DIR" ]] && [[ -n "$(ls -A "$CONTRACTS_DIR" 2>/dev/null)" ]]; then |
131 | | - docs+=("contracts/") |
132 | | -fi |
133 | | - |
134 | | -[[ -f "$QUICKSTART" ]] && docs+=("quickstart.md") |
135 | | - |
136 | | -# Include tasks.md if requested and it exists |
137 | | -if $INCLUDE_TASKS && [[ -f "$TASKS" ]]; then |
138 | | - docs+=("tasks.md") |
139 | | -fi |
140 | | - |
141 | | -# Output results |
| 51 | +# Output |
142 | 52 | if $JSON_MODE; then |
143 | | - # Build JSON array of documents |
144 | | - if [[ ${#docs[@]} -eq 0 ]]; then |
145 | | - json_docs="[]" |
146 | | - else |
147 | | - json_docs=$(printf '"%s",' "${docs[@]}") |
148 | | - json_docs="[${json_docs%,}]" |
149 | | - fi |
150 | | - |
151 | | - printf '{"FEATURE_DIR":"%s","AVAILABLE_DOCS":%s}\n' "$FEATURE_DIR" "$json_docs" |
| 53 | + printf '{"FEATURE_DIR":"%s","SPEC":"%s","PLAN":"%s","TASKS":"%s","BRANCH":"%s"}\n' \ |
| 54 | + "$FEATURE_DIR" "$FEATURE_SPEC" "$IMPL_PLAN" "$TASKS" "$CURRENT_BRANCH" |
152 | 55 | else |
153 | | - # Text output |
154 | | - echo "FEATURE_DIR:$FEATURE_DIR" |
155 | | - echo "AVAILABLE_DOCS:" |
156 | | - |
157 | | - # Show status of each potential document |
158 | | - check_file "$RESEARCH" "research.md" |
159 | | - check_file "$DATA_MODEL" "data-model.md" |
160 | | - check_dir "$CONTRACTS_DIR" "contracts/" |
161 | | - check_file "$QUICKSTART" "quickstart.md" |
162 | | - |
163 | | - if $INCLUDE_TASKS; then |
164 | | - check_file "$TASKS" "tasks.md" |
165 | | - fi |
| 56 | + echo "FEATURE_DIR: $FEATURE_DIR" |
| 57 | + echo "BRANCH: $CURRENT_BRANCH" |
| 58 | + check_file "$FEATURE_SPEC" "spec.md" |
| 59 | + check_file "$IMPL_PLAN" "plan.md" |
| 60 | + check_file "$TASKS" "tasks.md" |
166 | 61 | fi |
0 commit comments