From d37c921f2939e454dd3735e639ec8da1c8087ae4 Mon Sep 17 00:00:00 2001 From: Test User Date: Wed, 8 Apr 2026 16:32:37 +0800 Subject: [PATCH 1/2] Fix path regex and prevent backup file overwriting - Fix PATH_REGEX in validate.py: The regex was incorrectly matching relative paths like 'src/file.js' as 'rc/' instead of the full path. Changed to use non-capturing group with optional prefix. - Add safety check in compress.py: Prevent silent overwriting of existing .original.md backup files. Now aborts with a warning instead of overwriting potentially important backup content. - Add proper module initialization in __init__.py: Previously empty, now includes __all__ exports and __version__ for proper imports. Co-Authored-By: Claude Opus 4.6 (1M context) --- caveman-compress/scripts/__init__.py | 9 +++++++++ caveman-compress/scripts/compress.py | 7 +++++++ caveman-compress/scripts/validate.py | 3 ++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/caveman-compress/scripts/__init__.py b/caveman-compress/scripts/__init__.py index e69de29..16b8c53 100644 --- a/caveman-compress/scripts/__init__.py +++ b/caveman-compress/scripts/__init__.py @@ -0,0 +1,9 @@ +"""Caveman compress scripts. + +This package provides tools to compress natural language markdown files +into caveman format to save input tokens. +""" + +__all__ = ["cli", "compress", "detect", "validate"] + +__version__ = "1.0.0" diff --git a/caveman-compress/scripts/compress.py b/caveman-compress/scripts/compress.py index 2a19760..977a4ea 100644 --- a/caveman-compress/scripts/compress.py +++ b/caveman-compress/scripts/compress.py @@ -94,6 +94,13 @@ def compress_file(filepath: Path) -> bool: original_text = filepath.read_text(errors="ignore") backup_path = filepath.with_name(filepath.stem + ".original.md") + # Check if backup already exists to prevent accidental overwriting + if backup_path.exists(): + print(f"⚠️ Backup file already exists: {backup_path}") + print("The original backup may contain important content.") + print("Aborting to prevent data loss. Please remove or rename the backup file if you want to proceed.") + return False + # Step 1: Compress print("🧠 Compressing with Claude...") compressed = call_claude(build_compress_prompt(original_text)) diff --git a/caveman-compress/scripts/validate.py b/caveman-compress/scripts/validate.py index 361156b..090b5ed 100644 --- a/caveman-compress/scripts/validate.py +++ b/caveman-compress/scripts/validate.py @@ -8,7 +8,8 @@ HEADING_REGEX = re.compile(r"^(#{1,6})\s+(.*)", re.MULTILINE) BULLET_REGEX = re.compile(r"^\s*[-*+]\s+", re.MULTILINE) # crude but effective path detection -PATH_REGEX = re.compile(r"(\./|\../|/|[A-Za-z]:\\)[\w\-/\\\.]+") +# Fixed: use non-capturing group for prefix, and handle relative paths without leading ./ or / +PATH_REGEX = re.compile(r"(?:\./|\.\./|/|[A-Za-z]:)?[\w\-/\\\.]+") class ValidationResult: From 8195e1a4a04ecbe8bb39e67030624d023da5b6fb Mon Sep 17 00:00:00 2001 From: Julius Brussee Date: Thu, 9 Apr 2026 01:05:31 +0200 Subject: [PATCH 2/2] fix: PATH_REGEX must require path separator to avoid false positives Making the prefix optional matched every English word as a path. Now requires either a path prefix (./ ../ / drive:) or contains / or \. Co-Authored-By: Claude Opus 4.6 (1M context) --- caveman-compress/scripts/validate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/caveman-compress/scripts/validate.py b/caveman-compress/scripts/validate.py index 090b5ed..e9fff3f 100644 --- a/caveman-compress/scripts/validate.py +++ b/caveman-compress/scripts/validate.py @@ -8,8 +8,8 @@ HEADING_REGEX = re.compile(r"^(#{1,6})\s+(.*)", re.MULTILINE) BULLET_REGEX = re.compile(r"^\s*[-*+]\s+", re.MULTILINE) # crude but effective path detection -# Fixed: use non-capturing group for prefix, and handle relative paths without leading ./ or / -PATH_REGEX = re.compile(r"(?:\./|\.\./|/|[A-Za-z]:)?[\w\-/\\\.]+") +# Requires either a path prefix (./ ../ / or drive letter) or a slash/backslash within the match +PATH_REGEX = re.compile(r"(?:\./|\.\./|/|[A-Za-z]:\\)[\w\-/\\\.]+|[\w\-\.]+[/\\][\w\-/\\\.]+") class ValidationResult: