Document how to launch tools/ai/repo-structure.sh from anywhere

This commit is contained in:
Enrico Ros
2025-04-03 11:49:43 -07:00
parent ac1b3d7938
commit 4a7b4fbabf
2 changed files with 91 additions and 25 deletions
+41 -19
View File
@@ -1,26 +1,48 @@
# repo-structure.sh
## `repo-structure.sh`
Quick utility to generate a repository file structure in a format optimized for AI assistants. The output uses XML-style context tags with proper indentation for easy understanding of the directory hierarchy.
This tool creates a compact, hierarchical representation of your Git repository that you can
paste directly into an assistant prompt to provide immediate context. Uses the XML format of
Claude Code.
## Why?
Ever tried explaining a codebase to an AI assistant? This tool creates a compact, hierarchical representation of your Git repository that you can paste directly into an assistant prompt to provide immediate context.
## Usage
You need to be inside a Git repository to run this:
### Direct execution (recommended)
### Remote Execution
```bash
# From the repository root:
./tools/ai/repo-structure.sh
# Run this from the ROOT of your git repository
curl -fsSL https://raw.githubusercontent.com/enricoros/big-AGI/v2-dev/tools/ai/repo-structure.sh | sh
```
# Include hidden files (starting with .)
./tools/ai/repo-structure.sh --all
## Options
# Copy directly to clipboard
./tools/ai/repo-structure.sh --clipboard
- `-a, --all`: Include hidden files and directories
- `-o, --output FILE`: Save output to a file
- `-h, --help`: Show help message
# Save to a file
./tools/ai/repo-structure.sh --output repo-structure.xml
Example with options (include hidden files):
- `curl -fsSL https://raw.githubusercontent.com/enricoros/big-AGI/v2-dev/tools/ai/repo-structure.sh | sh -s -- -a`
## Requirements
- Bash 4+ (for associative arrays)
- Git (the repository must be initialized)
- For clipboard functionality:
- macOS: pbcopy (built-in)
- Linux: xclip or xsel
- Windows: clip (Git Bash)
## How does the output look?
The output is specifically formatted for easy consumption by AI assistants:
```xml
<context name="directoryStructure" description="Below is a snapshot of this project root file structure (git ls-files) at the start of the conversation. This snapshot will NOT update during the conversation.">
- README.md
- src/
- app/
- components/
- Button.tsx
...
</context>
```
Just paste this into your AI assistant's prompt for instant context about the codebase structure.
+50 -6
View File
@@ -3,16 +3,17 @@
# Wraps output in <context name="directoryStructure"> tags.
# Hides dotfiles by default, use -a/--all to show them.
# Default: exclude hidden files/dirs
# Default settings
INCLUDE_HIDDEN=false
COPY_TO_CLIPBOARD=true
# Function to print usage
print_usage() {
echo "Usage: $0 [options]"
echo "Options:"
echo " -a, --all Include hidden files and directories (starting with '.')"
echo " -o, --output Output to a file instead of stdout (e.g., -o structure.xml)"
echo " -h, --help Show this help message"
echo " -a, --all Include hidden files and directories (starting with '.')"
echo " -o, --output Output to a file instead of stdout (e.g., -o structure.xml)"
echo " -h, --help Show this help message"
}
# Parse arguments
@@ -27,7 +28,33 @@ while [[ "$#" -gt 0 ]]; do
shift
done
# Start the output generation
# Check if we're in a git repository
if ! git rev-parse --is-inside-work-tree &>/dev/null; then
echo "Error: This script must be run from within a Git repository." >&2
echo "Please navigate to your cloned Big-AGI repository and try again." >&2
exit 1
fi
# Try to find the clipboard command for the current OS
clipboard_cmd=""
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
clipboard_cmd="pbcopy"
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
# Linux with X11
if command -v xclip &>/dev/null; then
clipboard_cmd="xclip -selection clipboard"
elif command -v xsel &>/dev/null; then
clipboard_cmd="xsel --clipboard --input"
fi
elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then
# Windows Git Bash or similar
clipboard_cmd="clip"
fi
# Generate the structure
generate_structure() {
# Use XML-like tags instead of markdown code fences
echo '<context name="directoryStructure" description="Below is a snapshot of this project root file structure (git ls-files) at the start of the conversation. This snapshot will NOT update during the conversation.">'
@@ -104,10 +131,27 @@ if (( BASH_VERSINFO[0] < 4 )); then
exit 1
fi
# Either output to file or stdout
# Handle output to file, clipboard, or stdout
if [[ -n "$OUTPUT_FILE" ]]; then
generate_structure > "$OUTPUT_FILE"
echo "Repository structure saved to $OUTPUT_FILE"
if [[ "$COPY_TO_CLIPBOARD" == true ]]; then
if [[ -n "$clipboard_cmd" ]]; then
cat "$OUTPUT_FILE" | eval "$clipboard_cmd"
echo "Also copied to clipboard!"
else
echo "Warning: Clipboard copy requested but no clipboard command found for your OS." >&2
fi
fi
elif [[ "$COPY_TO_CLIPBOARD" == true ]]; then
if [[ -n "$clipboard_cmd" ]]; then
generate_structure | tee >(eval "$clipboard_cmd" > /dev/null)
echo -e "\nStructure copied to clipboard!"
else
echo "Warning: No clipboard command found for your OS. Displaying output instead." >&2
generate_structure
fi
else
generate_structure
fi