Skip to content

Commit b8ea251

Browse files
committed
refactor: remove build mode leftovers
Remove all references to the removed build mode architecture: - Delete mode_defaults dict from spec_cli/__init__.py - Delete get_mode_config() and get_current_mode() functions from scripts - Delete detect-workflow-config.sh script - Remove build mode cases from rollback functions - Update build mode references in templates and docs - Always perform blocking micro-reviews (spec mode default) - Remove atomic_commits guidance from task context Build mode was removed from core commands but leftover code remained, causing dead code paths and configuration inconsistencies.
1 parent b9c00ff commit b8ea251

10 files changed

Lines changed: 39 additions & 238 deletions

File tree

scripts/bash/check-prerequisites.sh

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,12 +147,6 @@ print(json.dumps(risks, ensure_ascii=False))
147147
PY
148148
}
149149

150-
# Extract mode configuration - always returns spec mode for core commands
151-
get_mode_config() {
152-
# Core commands always use spec mode
153-
echo '{"current_mode":"spec","options":{"tdd_enabled":true,"contracts_enabled":true,"data_models_enabled":true,"risk_tests_enabled":true}}'
154-
}
155-
156150
# Get feature paths and validate branch
157151
eval $(get_feature_paths)
158152
check_feature_branch "$CURRENT_BRANCH" "$HAS_GIT" || exit 1
@@ -240,7 +234,6 @@ if $JSON_MODE; then
240234

241235
SPEC_RISKS=$(extract_risks "$FEATURE_SPEC")
242236
PLAN_RISKS=$(extract_risks "$IMPL_PLAN")
243-
MODE_CONFIG=$(get_mode_config)
244237

245238
# Check for constitution and architecture (optional governance documents)
246239
CONSTITUTION_EXISTS="false"
@@ -260,8 +253,8 @@ if $JSON_MODE; then
260253
ARCHITECTURE_DIAGRAMS=$(extract_architecture_diagrams "$ARCHITECTURE")
261254
fi
262255

263-
printf '{"FEATURE_DIR":"%s","AVAILABLE_DOCS":%s,"SPEC_RISKS":%s,"PLAN_RISKS":%s,"MODE_CONFIG":%s,"CONSTITUTION":"%s","CONSTITUTION_EXISTS":%s,"CONSTITUTION_RULES":%s,"ARCHITECTURE":"%s","ARCHITECTURE_EXISTS":%s,"ARCHITECTURE_VIEWS":%s,"ARCHITECTURE_DIAGRAMS":%s}\n' \
264-
"$FEATURE_DIR" "$json_docs" "$SPEC_RISKS" "$PLAN_RISKS" "$MODE_CONFIG" \
256+
printf '{"FEATURE_DIR":"%s","AVAILABLE_DOCS":%s,"SPEC_RISKS":%s,"PLAN_RISKS":%s,"CONSTITUTION":"%s","CONSTITUTION_EXISTS":%s,"CONSTITUTION_RULES":%s,"ARCHITECTURE":"%s","ARCHITECTURE_EXISTS":%s,"ARCHITECTURE_VIEWS":%s,"ARCHITECTURE_DIAGRAMS":%s}\n' \
257+
"$FEATURE_DIR" "$json_docs" "$SPEC_RISKS" "$PLAN_RISKS" \
265258
"$CONSTITUTION" "$CONSTITUTION_EXISTS" "$CONSTITUTION_RULES" \
266259
"$ARCHITECTURE" "$ARCHITECTURE_EXISTS" "$ARCHITECTURE_VIEWS" "$ARCHITECTURE_DIAGRAMS"
267260
else

scripts/bash/common.sh

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -35,37 +35,6 @@ get_config_path() {
3535
fi
3636
}
3737

38-
# Get current workflow mode - always returns "spec" for core commands
39-
get_current_mode() {
40-
# Core commands always use spec mode
41-
echo "spec"
42-
}
43-
44-
# Get a specific mode configuration value
45-
# Usage: get_mode_config "atomic_commits" → returns "true" or "false"
46-
# Usage: get_mode_config "skip_micro_review" → returns "true" or "false"
47-
get_mode_config() {
48-
local key="$1"
49-
local config_file
50-
config_file=$(get_config_path)
51-
52-
# Default to false if no config exists or jq not available
53-
if [[ ! -f "$config_file" ]] || ! command -v jq >/dev/null 2>&1; then
54-
echo "false"
55-
return
56-
fi
57-
58-
# Get current mode
59-
local mode
60-
mode=$(get_current_mode)
61-
62-
# Read mode-specific config value, default to false
63-
local value
64-
value=$(jq -r ".mode_defaults.${mode}.${key} // false" "$config_file" 2>/dev/null)
65-
66-
echo "$value"
67-
}
68-
6938
# Get architecture diagram format from config (mermaid or ascii)
7039
# Defaults to "mermaid" if config doesn't exist or format is invalid
7140
get_architecture_diagram_format() {
@@ -398,21 +367,6 @@ except Exception as e:
398367
PY
399368
}
400369

401-
# Detect workflow mode and framework options from spec.md
402-
# Usage: detect_workflow_config [path/to/spec.md]
403-
# Returns JSON: {"mode":"build|spec","tdd":true|false,"contracts":true|false,"data_models":true|false,"risk_tests":true|false}
404-
detect_workflow_config() {
405-
local spec_file="${1:-spec.md}"
406-
407-
# Source the standalone script
408-
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
409-
source "$script_dir/detect-workflow-config.sh"
410-
411-
# Call the function
412-
detect_workflow_config "$spec_file"
413-
}
414-
415-
416370
# Extract diagram blocks from architecture.md
417371
# Returns JSON array of diagrams with type and format
418372
extract_architecture_diagrams() {

scripts/bash/detect-workflow-config.sh

Lines changed: 0 additions & 14 deletions
This file was deleted.

scripts/bash/implement.sh

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -287,23 +287,8 @@ execute_task() {
287287
# Mark as completed (in real implementation, this would happen after successful execution)
288288
safe_json_update "$TASKS_META_FILE" --arg task_id "$task_id" '.tasks[$task_id].status = "completed"'
289289

290-
# Conditional micro-review based on mode
291-
local skip_review
292-
skip_review=$(get_mode_config "skip_micro_review")
293-
294-
if [[ "$skip_review" == "true" ]]; then
295-
# Build/GSD mode: Non-blocking, log for post-hoc review
296-
log_info "Task $task_id complete - Atomic commit created"
297-
if command -v git >/dev/null 2>&1; then
298-
local last_commit
299-
last_commit=$(git log -1 --oneline 2>/dev/null || echo "No git repository")
300-
log_info "Commit: $last_commit"
301-
fi
302-
log_info "Review at any time with: git log -p, git show, git diff"
303-
else
304-
# Spec mode: Blocking review gate
305-
perform_micro_review "$TASKS_META_FILE" "$task_id"
306-
fi
290+
# Spec mode: Always perform blocking micro-review gate
291+
perform_micro_review "$TASKS_META_FILE" "$task_id"
307292
else
308293
handle_task_failure "$task_id" "SYNC task execution failed"
309294
fi
@@ -502,13 +487,13 @@ Choose (1-5): "
502487
safe_json_update "$TASKS_META_FILE" --arg task_id "$task_id" '.tasks[$task_id].status = "pending"'
503488
;;
504489
2)
505-
log_info "Rolling back task $task_id with $mode mode strategy"
506-
execute_mode_aware_rollback "$FEATURE_DIR" "task" "$mode" "$task_id"
490+
log_info "Rolling back task $task_id"
491+
execute_rollback "$FEATURE_DIR" "task" "$task_id"
507492
ensure_documentation_consistency "$FEATURE_DIR"
508493
;;
509494
3)
510495
log_info "Rolling back entire feature and regenerating tasks"
511-
execute_mode_aware_rollback "$FEATURE_DIR" "feature" "$mode"
496+
execute_rollback "$FEATURE_DIR" "feature"
512497
regenerate_tasks_after_rollback "$FEATURE_DIR" "$failure_reason"
513498
ensure_documentation_consistency "$FEATURE_DIR"
514499
;;

scripts/bash/setup-plan.sh

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,8 @@ fi
4242
# Ensure the feature directory exists
4343
mkdir -p "$FEATURE_DIR"
4444

45-
# Detect current workflow mode and select appropriate plan template
46-
CURRENT_MODE=$(get_current_mode)
47-
48-
if [[ "$CURRENT_MODE" == "build" ]]; then
49-
TEMPLATE="$REPO_ROOT/.specify/templates/plan-template-build.md"
50-
else
51-
TEMPLATE="$REPO_ROOT/.specify/templates/plan-template.md"
52-
fi
45+
# Select plan template
46+
TEMPLATE="$REPO_ROOT/.specify/templates/plan-template.md"
5347

5448
if [[ -f "$TEMPLATE" ]]; then
5549
cp "$TEMPLATE" "$IMPL_PLAN"

scripts/bash/spec-hooks-install.sh

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -168,20 +168,6 @@ function create_config {
168168
"data_models_enabled": false,
169169
"risk_tests_enabled": false
170170
},
171-
"mode_defaults": {
172-
"build": {
173-
"tdd_enabled": false,
174-
"contracts_enabled": false,
175-
"data_models_enabled": false,
176-
"risk_tests_enabled": false
177-
},
178-
"spec": {
179-
"tdd_enabled": true,
180-
"contracts_enabled": true,
181-
"data_models_enabled": true,
182-
"risk_tests_enabled": true
183-
}
184-
},
185171
"spec_sync": {
186172
"enabled": true,
187173
"queue": {

scripts/bash/tasks-meta-utils.sh

Lines changed: 28 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -189,25 +189,6 @@ generate_delegation_prompt() {
189189
190190
${agent_context}"
191191

192-
# Add atomic commits guidance if enabled
193-
local atomic_commits
194-
atomic_commits=$(get_mode_config "atomic_commits")
195-
196-
if [[ "$atomic_commits" == "true" ]]; then
197-
full_context="${full_context}
198-
199-
## COMMIT STRUCTURE GUIDANCE
200-
Create atomic commits following this pattern:
201-
- Each commit represents one logical unit of work
202-
- Independently reviewable (can understand from commit message + diff)
203-
- Self-contained (feature complete or milestone complete)
204-
- Descriptive message: \"[Feature]: What was accomplished\"
205-
Example: \"[auth]: Implement JWT token validation\"
206-
207-
This enables post-execution review and rollback capability.
208-
"
209-
fi
210-
211192
# Substitute variables using awk to handle multiline content safely
212193
local prompt
213194
prompt=$(awk -v agent_type="$agent_type" \
@@ -637,66 +618,29 @@ ensure_documentation_consistency() {
637618
fi
638619
}
639620

640-
# Mode-aware rollback strategies
641-
get_mode_aware_rollback_strategy() {
642-
local mode="${1:-spec}" # Default to spec mode
621+
# Execute rollback (spec mode only)
622+
execute_rollback() {
623+
local feature_dir="$1"
624+
local rollback_type="$2"
625+
local task_id="${3:-}" # Optional task_id for task rollback
626+
627+
echo "Executing spec_mode_rollback for $rollback_type"
643628

644-
case "$mode" in
645-
"build")
646-
echo "build_mode_rollback"
629+
case "$rollback_type" in
630+
"task")
631+
if [[ -z "$task_id" ]]; then
632+
echo "ERROR: task_id required for task rollback" >&2
633+
return 1
634+
fi
635+
rollback_task "$feature_dir/tasks_meta.json" "$task_id" "true"
647636
;;
648-
"spec")
649-
echo "spec_mode_rollback"
637+
"feature")
638+
rollback_feature "$feature_dir" "true"
650639
;;
651640
*)
652-
echo "default_rollback"
653-
;;
654-
esac
655-
}
656-
657-
# Execute mode-aware rollback
658-
execute_mode_aware_rollback() {
659-
local feature_dir="$1"
660-
local rollback_type="$2"
661-
local mode="${3:-spec}"
662-
663-
local strategy
664-
strategy=$(get_mode_aware_rollback_strategy "$mode")
665-
666-
echo "Executing $strategy for $rollback_type in $mode mode"
667-
668-
case "$strategy" in
669-
"build_mode_rollback")
670-
# Lightweight rollback for build mode
671-
echo "Build mode: Minimal rollback preserving rapid iteration artifacts"
672-
case "$rollback_type" in
673-
"task")
674-
# Less aggressive task rollback in build mode
675-
echo "Task rollback completed with minimal cleanup"
676-
;;
677-
"feature")
678-
# Preserve more artifacts in build mode
679-
echo "Feature rollback completed, preserving iteration artifacts"
680-
;;
681-
esac
682-
;;
683-
684-
"spec_mode_rollback")
685-
# Comprehensive rollback for spec mode
686-
echo "Spec mode: Comprehensive rollback with full documentation preservation"
687-
case "$rollback_type" in
688-
"task")
689-
rollback_task "$feature_dir/tasks_meta.json" "$4" "true"
690-
;;
691-
"feature")
692-
rollback_feature "$feature_dir" "true"
693-
;;
694-
esac
641+
echo "ERROR: Unknown rollback type: $rollback_type" >&2
642+
return 1
695643
;;
696-
697-
"default_rollback")
698-
echo "Default rollback strategy applied"
699-
;;
700644
esac
701645
}
702646

@@ -717,37 +661,18 @@ get_framework_opinions() {
717661
local user_risk_tests
718662
user_risk_tests=$(jq -r ".options.risk_tests_enabled" "$config_file" 2>/dev/null || echo "null")
719663

720-
# Fill in defaults for unset options based on mode
721-
case "$mode" in
722-
"build")
723-
[[ "$user_tdd" == "null" ]] && user_tdd="false"
724-
[[ "$user_contracts" == "null" ]] && user_contracts="false"
725-
[[ "$user_data_models" == "null" ]] && user_data_models="false"
726-
[[ "$user_risk_tests" == "null" ]] && user_risk_tests="false"
727-
;;
728-
"spec")
729-
[[ "$user_tdd" == "null" ]] && user_tdd="true"
730-
[[ "$user_contracts" == "null" ]] && user_contracts="true"
731-
[[ "$user_data_models" == "null" ]] && user_data_models="true"
732-
[[ "$user_risk_tests" == "null" ]] && user_risk_tests="true"
733-
;;
734-
esac
664+
# Fill in defaults for unset options (spec mode defaults)
665+
[[ "$user_tdd" == "null" ]] && user_tdd="true"
666+
[[ "$user_contracts" == "null" ]] && user_contracts="true"
667+
[[ "$user_data_models" == "null" ]] && user_data_models="true"
668+
[[ "$user_risk_tests" == "null" ]] && user_risk_tests="true"
669+
735670
echo "tdd_enabled=$user_tdd contracts_enabled=$user_contracts data_models_enabled=$user_data_models risk_tests_enabled=$user_risk_tests"
736671
return
737672
fi
738673

739-
# Fallback to mode-based defaults
740-
case "$mode" in
741-
"build")
742-
echo "tdd_enabled=false contracts_enabled=false data_models_enabled=false risk_tests_enabled=false"
743-
;;
744-
"spec")
745-
echo "tdd_enabled=true contracts_enabled=true data_models_enabled=true risk_tests_enabled=true"
746-
;;
747-
*)
748-
echo "tdd_enabled=false contracts_enabled=false data_models_enabled=false risk_tests_enabled=false"
749-
;;
750-
esac
674+
# Fallback to spec mode defaults
675+
echo "tdd_enabled=true contracts_enabled=true data_models_enabled=true risk_tests_enabled=true"
751676
}
752677

753678
# Set framework opinion (legacy compatibility - now handled by per-spec mode)
@@ -856,12 +781,12 @@ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
856781
shift
857782
regenerate_tasks_after_rollback "$@"
858783
;;
859-
regenerate_plan|ensure_documentation_consistency| get_mode_aware_rollback_strategy|execute_mode_aware_rollback| get_framework_opinions|set_framework_opinion|is_opinion_enabled|generate_tasks_with_opinions)
784+
regenerate_plan|ensure_documentation_consistency| execute_rollback| get_framework_opinions|set_framework_opinion|is_opinion_enabled|generate_tasks_with_opinions)
860785
shift
861786
"$1" "$@"
862787
;;
863788
*)
864-
echo "Usage: $0 {generate_delegation_prompt|check_delegation_status|dispatch_async_task|analyze_implementation_changes|propose_documentation_updates|apply_documentation_updates|rollback_task|rollback_feature|regenerate_tasks_after_rollback|regenerate_plan|ensure_documentation_consistency|get_mode_aware_rollback_strategy|execute_mode_aware_rollback} [args...]"
789+
echo "Usage: $0 {generate_delegation_prompt|check_delegation_status|dispatch_async_task|analyze_implementation_changes|propose_documentation_updates|apply_documentation_updates|rollback_task|rollback_feature|regenerate_tasks_after_rollback|regenerate_plan|ensure_documentation_consistency|execute_rollback} [args...]"
865790
exit 1
866791
;;
867792
esac

spec-driven.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ Once a feature specification exists, this command creates a comprehensive implem
9797

9898
After a plan is created, this command analyzes the plan and related design documents to generate an executable task list:
9999

100-
1. **Inputs**: Reads `plan.md` (required in spec mode, optional in build mode) and, if present, `data-model.md`, `contracts/`, and `research.md`
100+
1. **Inputs**: Reads `plan.md` and, if present, `data-model.md`, `contracts/`, and `research.md`
101101
2. **Task Derivation**: Converts contracts, entities, and scenarios into specific tasks
102102
3. **Parallelization**: Marks independent tasks `[P]` and outlines safe parallel groups
103103
4. **Output**: Writes `tasks.md` in the feature directory, ready for execution by a Task agent

src/specify_cli/__init__.py

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -718,28 +718,6 @@ def get_default_config() -> dict:
718718
"data_models_enabled": False,
719719
"risk_tests_enabled": False,
720720
},
721-
"mode_defaults": {
722-
"build": {
723-
"tdd_enabled": False,
724-
"contracts_enabled": False,
725-
"data_models_enabled": False,
726-
"risk_tests_enabled": False,
727-
# GSD execution characteristics
728-
"atomic_commits": True,
729-
"skip_micro_review": True,
730-
"minimal_documentation": True,
731-
},
732-
"spec": {
733-
"tdd_enabled": True,
734-
"contracts_enabled": True,
735-
"data_models_enabled": True,
736-
"risk_tests_enabled": True,
737-
# Spec mode review characteristics
738-
"atomic_commits": False,
739-
"skip_micro_review": False,
740-
"minimal_documentation": False,
741-
},
742-
},
743721
"spec_sync": {
744722
"enabled": False,
745723
"queue": {"version": "1.0", "created": now, "pending": [], "processed": []},

0 commit comments

Comments
 (0)