mirror of
https://github.com/PR0M3TH3AN/RePrompt.git
synced 2025-09-08 15:08:43 +00:00
update
This commit is contained in:
136
src/app.py
136
src/app.py
@@ -14,32 +14,55 @@ if 'copied' not in st.session_state:
|
||||
|
||||
# Configuration
|
||||
CONFIG_FILE = "config.yaml"
|
||||
OUTPUT_FILE = "repo-context.txt"
|
||||
GLOBAL_FILES_DIR = Path(__file__).parent / "global_files"
|
||||
SAVED_CONFIG_FILE = Path(__file__).parent / "saved_config.yaml"
|
||||
SCRIPT_DIR = Path(__file__).parent
|
||||
|
||||
# Default exclusions
|
||||
DEFAULT_EXCLUDED_DIRS = ["node_modules", "venv", "__pycache__", ".git", "dist", "build", "logs", ".idea", ".vscode"]
|
||||
DEFAULT_EXCLUDED_FILES = ["repo-context.txt"]
|
||||
DEFAULT_EXCLUDED_FILES = [
|
||||
"repo-context.txt",
|
||||
"package-lock.json",
|
||||
"yarn.lock",
|
||||
".gitattributes",
|
||||
".gitignore",
|
||||
".dockerignore",
|
||||
".env",
|
||||
"*.pem",
|
||||
"*.crt",
|
||||
"*.key",
|
||||
".eslintrc",
|
||||
".prettierrc",
|
||||
".browserslistrc",
|
||||
".editorconfig",
|
||||
"client.crt",
|
||||
"client-key.pem",
|
||||
"docker-compose.yml",
|
||||
".env.local",
|
||||
".env.development",
|
||||
".env.production"
|
||||
]
|
||||
|
||||
# Ensure necessary directories exist
|
||||
GLOBAL_FILES_DIR.mkdir(exist_ok=True)
|
||||
# Load saved configuration from repository directory
|
||||
def load_saved_config(repo_path):
|
||||
saved_config_path = repo_path / "saved_config.yaml"
|
||||
try:
|
||||
if saved_config_path.exists():
|
||||
with open(saved_config_path, "r") as f:
|
||||
saved_config = yaml.safe_load(f)
|
||||
return saved_config if saved_config else {}
|
||||
return {}
|
||||
except Exception:
|
||||
return {}
|
||||
|
||||
# Load saved configuration
|
||||
def load_saved_config():
|
||||
if SAVED_CONFIG_FILE.exists():
|
||||
try:
|
||||
with open(SAVED_CONFIG_FILE, "r") as f:
|
||||
return yaml.safe_load(f)
|
||||
except yaml.YAMLError:
|
||||
return {}
|
||||
return {}
|
||||
|
||||
# Save configuration
|
||||
def save_config(config):
|
||||
with open(SAVED_CONFIG_FILE, "w") as f:
|
||||
yaml.dump(config, f)
|
||||
# Save configuration to repository directory
|
||||
def save_config(config, repo_path):
|
||||
try:
|
||||
if not config: # Don't save empty configs
|
||||
return
|
||||
saved_config_path = repo_path / "saved_config.yaml"
|
||||
with open(saved_config_path, "w") as f:
|
||||
yaml.dump(config, f, default_flow_style=False)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Load application configuration
|
||||
def load_config():
|
||||
@@ -54,9 +77,13 @@ def load_config():
|
||||
st.error(f"Error parsing configuration file: {e}")
|
||||
st.stop()
|
||||
|
||||
app_config = load_config()
|
||||
saved_config = load_saved_config()
|
||||
# Clear config.yaml
|
||||
def clear_config():
|
||||
config_path = SCRIPT_DIR / CONFIG_FILE
|
||||
with open(config_path, "w") as f:
|
||||
yaml.dump({}, f)
|
||||
|
||||
app_config = load_config()
|
||||
exclude_dirs = app_config.get("exclude_dirs", DEFAULT_EXCLUDED_DIRS)
|
||||
|
||||
# Initialize session state for selected_repo_path if not present
|
||||
@@ -100,6 +127,7 @@ selected_repo_path = st.session_state.get("selected_repo_path", None)
|
||||
if selected_repo_path:
|
||||
st.header(f"Selected Repository: {selected_repo_path}")
|
||||
repo_path = Path(selected_repo_path)
|
||||
current_config = load_saved_config(repo_path) # Load config from repo directory
|
||||
|
||||
st.subheader("File Filtering")
|
||||
# Retrieve directories and files in the repository
|
||||
@@ -109,31 +137,52 @@ if selected_repo_path:
|
||||
rel_root = Path(root_dir).relative_to(repo_path)
|
||||
# Exclude default directories
|
||||
dirs[:] = [d for d in dirs if d not in DEFAULT_EXCLUDED_DIRS]
|
||||
|
||||
# Add directories
|
||||
for d in dirs:
|
||||
all_directories.append(str(rel_root / d) + "/")
|
||||
|
||||
# Add files (including root files)
|
||||
for f in files:
|
||||
all_files.append(str(rel_root / f))
|
||||
# Skip files that match any of the default excluded patterns
|
||||
if any(f.endswith(excluded.replace('*', '')) for excluded in DEFAULT_EXCLUDED_FILES if '*' in excluded) or \
|
||||
f in DEFAULT_EXCLUDED_FILES:
|
||||
continue
|
||||
|
||||
file_path = str(rel_root / f)
|
||||
if file_path.startswith('.'): # Handle root files
|
||||
file_path = file_path[2:] # Remove './'
|
||||
all_files.append(file_path)
|
||||
|
||||
# Directory selection for Directory Tree
|
||||
# Filter out any saved directories that don't exist in current options
|
||||
saved_directories = current_config.get("selected_directories", [])
|
||||
valid_saved_directories = [d for d in saved_directories if d in all_directories]
|
||||
|
||||
selected_directories = st.multiselect(
|
||||
"Include in Directory Tree",
|
||||
options=all_directories,
|
||||
default=saved_config.get("selected_directories", [])
|
||||
default=valid_saved_directories
|
||||
)
|
||||
|
||||
# Automatically include files within selected directories unless explicitly excluded
|
||||
# Include all files in selected directories AND root files
|
||||
included_files = [
|
||||
f for f in all_files if any(str(Path(f).parent) in d for d in selected_directories)
|
||||
f for f in all_files if (
|
||||
any(str(Path(f).parent) in d for d in selected_directories) or # Files in selected directories
|
||||
str(Path(f).parent) == '.' or # Root files
|
||||
str(Path(f).parent) == '' # Also handles root files
|
||||
)
|
||||
]
|
||||
|
||||
# File exclusions
|
||||
available_files = [f for f in included_files if f not in DEFAULT_EXCLUDED_FILES]
|
||||
saved_exclusions = [f for f in current_config.get("excluded_files", [])
|
||||
if f in available_files and f not in DEFAULT_EXCLUDED_FILES]
|
||||
|
||||
excluded_files = st.multiselect(
|
||||
"Exclude Specific Files",
|
||||
options=[f for f in included_files if f not in DEFAULT_EXCLUDED_FILES],
|
||||
default=[
|
||||
f for f in saved_config.get("excluded_files", [])
|
||||
if f in included_files and f not in DEFAULT_EXCLUDED_FILES
|
||||
],
|
||||
options=available_files,
|
||||
default=saved_exclusions
|
||||
)
|
||||
|
||||
st.write("### Final Included Files")
|
||||
@@ -148,13 +197,13 @@ if selected_repo_path:
|
||||
"source_directory": str(repo_path),
|
||||
"exclude_dirs": DEFAULT_EXCLUDED_DIRS,
|
||||
"important_files": final_included_files,
|
||||
"custom_sections": app_config.get("custom_sections", []),
|
||||
"custom_sections": app_config.get("custom_sections", [])
|
||||
}
|
||||
|
||||
# Write updated config.yaml
|
||||
with open(SCRIPT_DIR / CONFIG_FILE, "w") as f:
|
||||
yaml.dump(updated_config, f)
|
||||
|
||||
|
||||
# Run the script as a subprocess
|
||||
result = subprocess.run(
|
||||
[sys.executable, str(SCRIPT_DIR / "generate_repo_context.py")],
|
||||
@@ -164,16 +213,27 @@ if selected_repo_path:
|
||||
text=True,
|
||||
)
|
||||
|
||||
# Clear config.yaml after generation
|
||||
clear_config()
|
||||
|
||||
st.success("Context file generated successfully.")
|
||||
st.write(f"Script output:\n{result.stdout}")
|
||||
|
||||
# Check if the file was created
|
||||
generated_file = SCRIPT_DIR / OUTPUT_FILE
|
||||
# Check if the file was created in script directory first
|
||||
generated_file = SCRIPT_DIR / "repo-context.txt"
|
||||
if generated_file.exists():
|
||||
# Read content
|
||||
with open(generated_file, "r", encoding="utf-8") as f:
|
||||
context_content = f.read()
|
||||
|
||||
# Replace the current copy button section with this:
|
||||
# Copy file to repository directory
|
||||
repo_context_file = repo_path / "repo-context.txt"
|
||||
with open(repo_context_file, "w", encoding="utf-8") as f:
|
||||
f.write(context_content)
|
||||
|
||||
# Delete the file from script directory
|
||||
generated_file.unlink()
|
||||
|
||||
if context_content.strip(): # Ensure content is not empty
|
||||
# Add Download Button with unique key
|
||||
st.download_button(
|
||||
@@ -193,6 +253,8 @@ if selected_repo_path:
|
||||
height=400,
|
||||
key="context_content"
|
||||
)
|
||||
|
||||
st.success(f"Context file saved to: {repo_context_file}")
|
||||
else:
|
||||
st.error("Generated content is empty. Please review your repository and configurations.")
|
||||
else:
|
||||
@@ -209,7 +271,7 @@ if selected_repo_path:
|
||||
save_config({
|
||||
"selected_directories": selected_directories,
|
||||
"excluded_files": excluded_files,
|
||||
})
|
||||
}, repo_path)
|
||||
st.success("Configuration saved successfully.")
|
||||
else:
|
||||
st.write("Please select a folder to begin.")
|
@@ -1,12 +1 @@
|
||||
custom_sections:
|
||||
- file: changelog.txt
|
||||
section_title: Changelog
|
||||
- file: LICENSE.txt
|
||||
section_title: License
|
||||
exclude_dirs:
|
||||
-
|
||||
|
||||
important_files:
|
||||
-
|
||||
|
||||
source_directory:
|
||||
{}
|
||||
|
@@ -1,39 +0,0 @@
|
||||
Present a complete plan to solve the problem and implement it in the codebase.
|
||||
|
||||
At the end of your response, respond with the following XML section (if applicable).
|
||||
|
||||
XML Section:
|
||||
- Do not get lazy. Always output the full code in the XML section.
|
||||
- Enclose this entire section in a markdown codeblock
|
||||
- Include all of the changed files
|
||||
- Specify each file operation with CREATE, UPDATE, or DELETE
|
||||
- For CREATE or UPDATE operations, include the full file code
|
||||
- Include the full file path (relative to the project directory, good: app/page.tsx, bad: /Users/mckaywrigley/Desktop/projects/new-chat-template/app/page.tsx)
|
||||
- Enclose the code with ![CDATA[__CODE HERE__]]
|
||||
- Use the following XML structure:
|
||||
|
||||
```xml
|
||||
<code_changes>
|
||||
<changed_files>
|
||||
<file>
|
||||
<file_operation>__FILE OPERATION HERE__</file_operation>
|
||||
<file_path>__FILE PATH HERE__</file_path>
|
||||
<file_code><![CDATA[
|
||||
__FULL FILE CODE HERE__
|
||||
]]></file_code>
|
||||
</file>
|
||||
__REMAINING FILES HERE__
|
||||
</changed_files>
|
||||
</code_changes>
|
||||
```
|
||||
|
||||
Other rules:
|
||||
- DO NOT remove <ai_context> sections. These are to provide you additional context about each file.
|
||||
- If you create a file, add an <ai_context> comment section at the top of the file.
|
||||
- If you update a file make sure its <ai_context> stays up-to-date
|
||||
- DO NOT add comments related to your edits
|
||||
- DO NOT remove my existing comments
|
||||
|
||||
We may go back and forth a few times. If we do, remember to continue to output the entirety of the code in an XML section (if applicable).
|
||||
|
||||
Take all the time you need.
|
Reference in New Issue
Block a user