diff --git a/devloop b/devloop index 1b9d663..99a5e3d 100755 --- a/devloop +++ b/devloop @@ -810,13 +810,18 @@ EOF } list_spec_files() { - local dir + local dir path spec_search_dirs | while IFS= read -r dir; do if [ -d "$dir" ]; then find "$dir" -type f -name '*.md' fi - done | LC_ALL=C sort + done | + while IFS= read -r path; do + printf '%s\t%s\n' "${path##*/}" "$path" + done | + LC_ALL=C sort -t $'\t' -k1,1r -k2,2r | + cut -f2- } spec_dir_status() { diff --git a/scripts/devloop_test.sh b/scripts/devloop_test.sh index 895623c..62e61d7 100755 --- a/scripts/devloop_test.sh +++ b/scripts/devloop_test.sh @@ -1037,7 +1037,7 @@ printf '%s\n' "spec_dir=.specs" > "$clean_status_repo/.devloop/config" if ! has_user_dirty_paths "$clean_status_repo"; then fail "devloop config was not treated as user dirt"; fi equals "$(clean_candidate_status "$clean_status_track" "$clean_status_repo" "$work/source-repo")" "dirty" "clean candidate sees config dirt" -config_repo="$work/config-repo" +config_repo="$work/a-repo" config_home="$work/config-home" git init -q "$config_repo" config_repo_real="$(cd "$config_repo" && pwd -P)" @@ -1045,11 +1045,16 @@ config_default_specs="$config_repo_real/.devloop/specs" mkdir -p "$config_repo/.devloop/specs" "$config_home" equals "$(HOME="$config_home" devloop_config_file)" "$config_home/.devloop/config" "default config file" printf '%s\n' "# Devloop" > "$config_repo/.devloop/specs/devloop.md" +printf '%s\n' "# Older" > "$config_repo/.devloop/specs/2026-07-23-older.md" +printf '%s\n' "# Latest" > "$config_repo/.devloop/specs/2026-07-25-latest.md" config_specs="$(cd "$config_repo" && HOME="$config_home" list_spec_files)" [[ -f "$config_home/.devloop/config" ]] || fail "global config was not created" if grep -q "spec_dir=" "$config_home/.devloop/config"; then fail "global config seeded a default spec dir"; fi contains "$(cat "$config_home/.devloop/config")" "timeout_minutes=30" "global config default timeout" contains "$config_specs" "$config_default_specs/devloop.md" "default spec search uses repo .devloop/specs" +equals "$config_specs" "$config_default_specs/devloop.md +$config_default_specs/2026-07-25-latest.md +$config_default_specs/2026-07-23-older.md" "spec files sort descending with latest ISO date first" equals "$(cd "$config_repo" && HOME="$config_home" devloop_spec_dir)" "$config_default_specs" "default spec dir is repo .devloop/specs" equals "$(cd "$config_repo" && HOME="$config_home" spec_search_label)" "$config_default_specs" "spec search label is single default dir" if (cd "$config_repo" && HOME="$config_home" configured_spec_dir) >/dev/null 2>&1; then fail "default spec dir reported as custom"; fi @@ -1064,15 +1069,21 @@ contains "$configured_specs" "custom-specs/custom.md" "configured spec search in contains "$configured_specs" "$config_default_specs/devloop.md" "configured spec search still includes default" if (cd "$config_repo" && HOME="$config_home" write_config_spec_dir "../bad") >/dev/null 2>&1; then fail "write_config_spec_dir accepted path traversal"; fi -absolute_specs="$work/shared-specs" +absolute_specs="$work/z-shared" equals "$(cd "$config_repo" && HOME="$config_home" write_config_spec_dir local "$absolute_specs")" "$absolute_specs" "write absolute config spec dir" equals "$(cd "$config_repo" && HOME="$config_home" devloop_spec_dir)" "$absolute_specs" "absolute configured spec dir" equals "$(cd "$config_repo" && HOME="$config_home" configured_spec_dir)" "$absolute_specs" "absolute custom spec dir" [[ -d "$absolute_specs" ]] || fail "absolute configured spec dir was not created" printf '%s\n' "# Shared" > "$absolute_specs/shared.md" +printf '%s\n' "# Older shared" > "$absolute_specs/2026-07-01-older.md" absolute_configured_specs="$(cd "$config_repo" && HOME="$config_home" list_spec_files)" contains "$absolute_configured_specs" "$absolute_specs/shared.md" "configured spec search includes absolute dir" contains "$absolute_configured_specs" "$config_default_specs/devloop.md" "absolute spec search still includes default" +equals "$absolute_configured_specs" "$absolute_specs/shared.md +$config_default_specs/devloop.md +$config_default_specs/2026-07-25-latest.md +$config_default_specs/2026-07-23-older.md +$absolute_specs/2026-07-01-older.md" "spec files sort by basename across directories" equals "$(spec_dir_status "$absolute_specs")" "exists" "spec dir status exists" equals "$(spec_dir_status "$work/missing-specs")" "missing" "spec dir status missing" (cd "$config_repo" && HOME="$config_home" remove_config_spec_dir local)