+ View and manage Slack messages that have been processed by Wingman.
+ Messages are automatically indexed when the bot is mentioned or receives a DM.
+
+
+
+ )}
+
+
+
+
+ )
+}
diff --git a/frontend/next.config.js b/frontend/next.config.js
new file mode 100644
index 0000000..008bb49
--- /dev/null
+++ b/frontend/next.config.js
@@ -0,0 +1,9 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ output: 'standalone',
+ env: {
+ NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000',
+ },
+}
+
+module.exports = nextConfig
diff --git a/frontend/package.json b/frontend/package.json
new file mode 100644
index 0000000..6853865
--- /dev/null
+++ b/frontend/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "wingman-dashboard",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint"
+ },
+ "dependencies": {
+ "next": "14.0.4",
+ "react": "^18",
+ "react-dom": "^18",
+ "axios": "^1.6.2",
+ "swr": "^2.2.4",
+ "@types/node": "^20",
+ "@types/react": "^18",
+ "@types/react-dom": "^18",
+ "typescript": "^5"
+ },
+ "devDependencies": {
+ "eslint": "^8",
+ "eslint-config-next": "14.0.4",
+ "autoprefixer": "^10.4.16",
+ "postcss": "^8.4.32",
+ "tailwindcss": "^3.3.6"
+ }
+}
diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js
new file mode 100644
index 0000000..33ad091
--- /dev/null
+++ b/frontend/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts
new file mode 100644
index 0000000..da6176d
--- /dev/null
+++ b/frontend/tailwind.config.ts
@@ -0,0 +1,29 @@
+import type { Config } from 'tailwindcss'
+
+const config: Config = {
+ content: [
+ './pages/**/*.{js,ts,jsx,tsx,mdx}',
+ './components/**/*.{js,ts,jsx,tsx,mdx}',
+ './app/**/*.{js,ts,jsx,tsx,mdx}',
+ ],
+ theme: {
+ extend: {
+ colors: {
+ primary: {
+ 50: '#f0f9ff',
+ 100: '#e0f2fe',
+ 200: '#bae6fd',
+ 300: '#7dd3fc',
+ 400: '#38bdf8',
+ 500: '#0ea5e9',
+ 600: '#0284c7',
+ 700: '#0369a1',
+ 800: '#075985',
+ 900: '#0c4a6e',
+ },
+ },
+ },
+ },
+ plugins: [],
+}
+export default config
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
new file mode 100644
index 0000000..c714696
--- /dev/null
+++ b/frontend/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/*": ["./*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
+}
From c5b71c3bc10069b4be15f683ed328bb5d917a64a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 6 Dec 2025 13:17:06 +0000
Subject: [PATCH 3/5] Add additional project files: LICENSE, Makefile,
CONTRIBUTING, QUICKSTART, tests, and validation script
Co-authored-by: johnnyhuy <27847622+johnnyhuy@users.noreply.github.com>
---
CONTRIBUTING.md | 292 ++++++++++++++++++++++++++++++++++++++
LICENSE | 21 +++
Makefile | 72 ++++++++++
QUICKSTART.md | 171 ++++++++++++++++++++++
backend/pytest.ini | 6 +
backend/requirements.txt | 4 +
backend/tests/__init__.py | 1 +
backend/tests/test_api.py | 32 +++++
scripts/validate.sh | 112 +++++++++++++++
9 files changed, 711 insertions(+)
create mode 100644 CONTRIBUTING.md
create mode 100644 LICENSE
create mode 100644 Makefile
create mode 100644 QUICKSTART.md
create mode 100644 backend/pytest.ini
create mode 100644 backend/tests/__init__.py
create mode 100644 backend/tests/test_api.py
create mode 100755 scripts/validate.sh
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..acd8d8c
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,292 @@
+# Contributing to Wingman
+
+Thank you for your interest in contributing to Wingman! This document provides guidelines and instructions for contributing.
+
+## Table of Contents
+
+- [Code of Conduct](#code-of-conduct)
+- [Getting Started](#getting-started)
+- [Development Setup](#development-setup)
+- [Making Changes](#making-changes)
+- [Testing](#testing)
+- [Submitting Changes](#submitting-changes)
+- [Style Guidelines](#style-guidelines)
+
+## Code of Conduct
+
+By participating in this project, you agree to maintain a respectful and inclusive environment for everyone.
+
+## Getting Started
+
+1. Fork the repository
+2. Clone your fork: `git clone https://github.com/YOUR_USERNAME/wingman.git`
+3. Add upstream remote: `git remote add upstream https://github.com/echohello-dev/wingman.git`
+
+## Development Setup
+
+### Prerequisites
+
+- Docker and Docker Compose
+- Python 3.11+
+- Node.js 18+
+- Git
+
+### Initial Setup
+
+```bash
+# Clone the repository
+git clone https://github.com/echohello-dev/wingman.git
+cd wingman
+
+# Copy environment file
+cp .env.example .env
+
+# Install dependencies
+make install
+
+# Start services
+make up
+```
+
+### Backend Development
+
+```bash
+cd backend
+
+# Create virtual environment
+python -m venv venv
+source venv/bin/activate # Windows: venv\Scripts\activate
+
+# Install dependencies
+pip install -r requirements.txt
+
+# Run tests
+pytest
+
+# Run backend
+uvicorn app.main:app --reload
+```
+
+### Frontend Development
+
+```bash
+cd frontend
+
+# Install dependencies
+npm install
+
+# Run development server
+npm run dev
+
+# Run tests
+npm test
+
+# Build
+npm run build
+```
+
+## Making Changes
+
+### Branch Naming
+
+Use descriptive branch names:
+- `feature/add-slack-reactions`
+- `fix/database-connection-issue`
+- `docs/update-setup-guide`
+
+### Commit Messages
+
+Follow conventional commits:
+```
+feat: add reaction-based feedback
+fix: resolve database connection timeout
+docs: update SETUP.md with new instructions
+test: add tests for RAG engine
+refactor: simplify vector store initialization
+```
+
+### Pull Request Process
+
+1. Create a feature branch from `main`
+2. Make your changes
+3. Write/update tests
+4. Update documentation if needed
+5. Run tests and linting
+6. Submit a pull request
+
+## Testing
+
+### Backend Tests
+
+```bash
+cd backend
+pytest
+
+# With coverage
+pytest --cov=app --cov-report=html
+
+# Specific test
+pytest tests/test_api.py -v
+```
+
+### Frontend Tests
+
+```bash
+cd frontend
+npm test
+
+# With coverage
+npm test -- --coverage
+
+# Watch mode
+npm test -- --watch
+```
+
+### Integration Tests
+
+```bash
+# Start all services
+make up
+
+# Run integration tests
+make test
+```
+
+## Style Guidelines
+
+### Python (Backend)
+
+- Follow PEP 8
+- Use type hints
+- Maximum line length: 100 characters
+- Use docstrings for functions and classes
+
+```python
+def generate_response(question: str, channel_id: str = None) -> Dict[str, Any]:
+ """
+ Generate a response using RAG
+
+ Args:
+ question: The user's question
+ channel_id: Optional channel ID to filter context
+
+ Returns:
+ Dictionary with response and metadata
+ """
+ pass
+```
+
+### TypeScript (Frontend)
+
+- Follow ESLint configuration
+- Use TypeScript strict mode
+- Prefer functional components
+- Use meaningful variable names
+
+```typescript
+interface QuestionResponse {
+ answer: string
+ sources: Array>
+ confidence: string
+}
+
+export async function askQuestion(
+ question: string,
+ channelId?: string
+): Promise {
+ // Implementation
+}
+```
+
+### Documentation
+
+- Use Markdown format
+- Include code examples
+- Keep language clear and concise
+- Update docs with code changes
+
+## Project Structure
+
+```
+wingman/
+âââ backend/ # Python backend
+â âââ app/
+â â âââ main.py # FastAPI app
+â â âââ slack_bot.py # Slack integration
+â â âââ rag.py # RAG engine
+â â âââ ...
+â âââ tests/ # Backend tests
+âââ frontend/ # Next.js frontend
+â âââ app/ # Next.js app directory
+â âââ components/ # React components
+â âââ lib/ # Utilities
+â âââ ...
+âââ docs/ # Documentation
+âââ docker-compose.yml # Docker setup
+```
+
+## Common Tasks
+
+### Adding a New API Endpoint
+
+1. Add route in `backend/app/main.py`
+2. Add request/response models
+3. Implement handler function
+4. Add tests in `backend/tests/`
+5. Update API documentation
+
+### Adding a New Slack Event
+
+1. Add handler in `backend/app/slack_bot.py`
+2. Register event in `_register_handlers`
+3. Update Slack app event subscriptions
+4. Add tests
+
+### Adding a Frontend Component
+
+1. Create component in `frontend/components/`
+2. Add TypeScript types
+3. Import and use in pages
+4. Add styling with Tailwind
+5. Add tests if applicable
+
+## Debugging
+
+### Backend Debugging
+
+```bash
+# View logs
+make logs-backend
+
+# Access container
+make shell-backend
+
+# Check database
+make shell-db
+```
+
+### Frontend Debugging
+
+```bash
+# View logs
+make logs-frontend
+
+# Run with verbose logging
+cd frontend
+npm run dev -- --verbose
+```
+
+## Getting Help
+
+- Open an issue for bugs
+- Start a discussion for questions
+- Check existing issues/PRs first
+- Provide detailed information
+
+## License
+
+By contributing, you agree that your contributions will be licensed under the MIT License.
+
+## Thank You!
+
+Your contributions make Wingman better for everyone. Thank you for taking the time to contribute! đ
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..15414f6
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Wingman Contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..9fc6865
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,72 @@
+.PHONY: help up down logs build clean test-backend test-frontend test
+
+help: ## Show this help message
+ @echo "Wingman - Slack Support Assistant"
+ @echo ""
+ @echo "Available commands:"
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}'
+
+up: ## Start all services
+ docker-compose up -d
+
+down: ## Stop all services
+ docker-compose down
+
+logs: ## View logs from all services
+ docker-compose logs -f
+
+logs-backend: ## View backend logs
+ docker-compose logs -f backend
+
+logs-bot: ## View bot logs
+ docker-compose logs -f bot
+
+logs-frontend: ## View frontend logs
+ docker-compose logs -f frontend
+
+build: ## Build all Docker images
+ docker-compose build
+
+clean: ## Remove all containers and volumes
+ docker-compose down -v
+
+restart: ## Restart all services
+ docker-compose restart
+
+ps: ## Show running services
+ docker-compose ps
+
+test-backend: ## Run backend tests
+ cd backend && pytest
+
+test-frontend: ## Run frontend tests
+ cd frontend && npm test
+
+test: test-backend ## Run all tests
+
+shell-backend: ## Open shell in backend container
+ docker-compose exec backend /bin/sh
+
+shell-db: ## Open PostgreSQL shell
+ docker-compose exec postgres psql -U wingman -d wingman
+
+init: ## Initialize project (copy .env.example to .env)
+ cp .env.example .env
+ @echo "â Created .env file. Please edit it with your credentials."
+
+install-backend: ## Install backend dependencies locally
+ cd backend && pip install -r requirements.txt
+
+install-frontend: ## Install frontend dependencies locally
+ cd frontend && npm install
+
+install: install-backend install-frontend ## Install all dependencies locally
+
+dev-backend: ## Run backend in development mode
+ cd backend && uvicorn app.main:app --reload
+
+dev-frontend: ## Run frontend in development mode
+ cd frontend && npm run dev
+
+dev-bot: ## Run bot in development mode
+ cd backend && python run_bot.py
diff --git a/QUICKSTART.md b/QUICKSTART.md
new file mode 100644
index 0000000..427d962
--- /dev/null
+++ b/QUICKSTART.md
@@ -0,0 +1,171 @@
+# Quick Start Guide
+
+Get Wingman up and running in 5 minutes!
+
+## Prerequisites
+
+- Docker and Docker Compose installed
+- Slack workspace admin access
+- OpenRouter or OpenAI API key
+
+## Step 1: Get Your Slack Tokens
+
+1. Go to [api.slack.com/apps](https://api.slack.com/apps)
+2. Click **"Create New App"** â **"From scratch"**
+3. Name it "Wingman" and select your workspace
+4. In **OAuth & Permissions**, add these scopes:
+ - `app_mentions:read`
+ - `channels:history`
+ - `channels:read`
+ - `chat:write`
+ - `im:history`
+ - `im:read`
+ - `im:write`
+ - `users:read`
+5. Click **"Install to Workspace"** and copy the **Bot Token** (xoxb-*)
+6. In **Socket Mode**, enable it and generate an **App Token** (xapp-*)
+7. In **Basic Information**, copy the **Signing Secret**
+
+## Step 2: Get Your AI API Key
+
+**Option A: OpenRouter (Recommended)**
+- Visit [openrouter.ai](https://openrouter.ai/)
+- Sign up and get your API key
+
+**Option B: OpenAI**
+- Visit [platform.openai.com](https://platform.openai.com/)
+- Sign up and get your API key
+
+## Step 3: Configure Wingman
+
+```bash
+# Clone the repo
+git clone https://github.com/echohello-dev/wingman.git
+cd wingman
+
+# Copy the environment template
+cp .env.example .env
+
+# Edit .env with your tokens
+# Required:
+# - SLACK_BOT_TOKEN=xoxb-...
+# - SLACK_APP_TOKEN=xapp-...
+# - SLACK_SIGNING_SECRET=...
+# - OPENROUTER_API_KEY=... (or OPENAI_API_KEY)
+```
+
+## Step 4: Start Wingman
+
+```bash
+docker-compose up -d
+```
+
+This starts:
+- Backend API: http://localhost:8000
+- Frontend Dashboard: http://localhost:3000
+- PostgreSQL database
+- ChromaDB vector store
+- Slack bot
+
+## Step 5: Test It!
+
+### In Slack:
+1. Send a DM to Wingman: `Hello!`
+2. Or mention in a channel: `@Wingman How can you help me?`
+3. Or use slash command: `/wingman What are you?`
+
+### In Dashboard:
+1. Open http://localhost:3000
+2. Type a question in the "Ask Question" tab
+3. Click "Ask Wingman"
+
+### Via API:
+```bash
+curl -X POST http://localhost:8000/api/ask \
+ -H "Content-Type: application/json" \
+ -d '{"question": "Hello, who are you?"}'
+```
+
+## Troubleshooting
+
+### Bot not responding?
+```bash
+# Check logs
+docker-compose logs -f bot
+
+# Verify environment
+docker-compose exec bot env | grep SLACK
+```
+
+### Can't access dashboard?
+```bash
+# Check if services are running
+docker-compose ps
+
+# Check frontend logs
+docker-compose logs -f frontend
+```
+
+### Database issues?
+```bash
+# Restart all services
+docker-compose restart
+
+# Or recreate everything
+docker-compose down -v
+docker-compose up -d
+```
+
+## What's Next?
+
+1. **Add Documents**: Index your documentation for better answers
+ ```bash
+ curl -X POST http://localhost:8000/api/documents \
+ -H "Content-Type: application/json" \
+ -d '{
+ "title": "My Guide",
+ "content": "Content here...",
+ "source": "docs"
+ }'
+ ```
+
+2. **Customize Prompts**: Edit `backend/app/rag.py` to customize responses
+
+3. **Monitor Usage**: Check API docs at http://localhost:8000/docs
+
+4. **Read Full Docs**:
+ - [SETUP.md](docs/SETUP.md) - Detailed setup guide
+ - [SLACK_AUTH.md](docs/SLACK_AUTH.md) - Authentication details
+ - [README.md](README.md) - Full documentation
+
+## Common Commands
+
+```bash
+# View all logs
+docker-compose logs -f
+
+# Stop everything
+docker-compose down
+
+# Restart a service
+docker-compose restart backend
+
+# Access database
+docker-compose exec postgres psql -U wingman -d wingman
+
+# Run backend tests
+cd backend && pytest
+
+# Update dependencies
+docker-compose build
+```
+
+## Getting Help
+
+- đ Read the [full documentation](README.md)
+- đ [Open an issue](https://github.com/echohello-dev/wingman/issues)
+- đŦ Check [Slack API docs](https://api.slack.com/)
+
+---
+
+Happy chatting! đŠī¸
diff --git a/backend/pytest.ini b/backend/pytest.ini
new file mode 100644
index 0000000..9855d94
--- /dev/null
+++ b/backend/pytest.ini
@@ -0,0 +1,6 @@
+[pytest]
+testpaths = tests
+python_files = test_*.py
+python_classes = Test*
+python_functions = test_*
+addopts = -v --tb=short
diff --git a/backend/requirements.txt b/backend/requirements.txt
index f9123ca..1f684a8 100644
--- a/backend/requirements.txt
+++ b/backend/requirements.txt
@@ -26,3 +26,7 @@ alembic==1.13.1
# Additional utilities
httpx==0.25.2
tenacity==8.2.3
+
+# Testing
+pytest==7.4.3
+pytest-asyncio==0.21.1
diff --git a/backend/tests/__init__.py b/backend/tests/__init__.py
new file mode 100644
index 0000000..f41d634
--- /dev/null
+++ b/backend/tests/__init__.py
@@ -0,0 +1 @@
+# Tests for Wingman backend
diff --git a/backend/tests/test_api.py b/backend/tests/test_api.py
new file mode 100644
index 0000000..5e344e5
--- /dev/null
+++ b/backend/tests/test_api.py
@@ -0,0 +1,32 @@
+"""
+Basic API tests for Wingman backend
+"""
+import pytest
+from fastapi.testclient import TestClient
+from app.main import app
+
+client = TestClient(app)
+
+
+def test_root_endpoint():
+ """Test the root endpoint"""
+ response = client.get("/")
+ assert response.status_code == 200
+ data = response.json()
+ assert data["name"] == "Wingman"
+ assert "version" in data
+ assert data["status"] == "running"
+
+
+def test_health_endpoint():
+ """Test the health check endpoint"""
+ response = client.get("/health")
+ assert response.status_code == 200
+ data = response.json()
+ assert data["status"] == "healthy"
+
+
+def test_ask_endpoint_missing_question():
+ """Test ask endpoint with missing question"""
+ response = client.post("/api/ask", json={})
+ assert response.status_code == 422 # Validation error
diff --git a/scripts/validate.sh b/scripts/validate.sh
new file mode 100755
index 0000000..0c1caf0
--- /dev/null
+++ b/scripts/validate.sh
@@ -0,0 +1,112 @@
+#!/bin/bash
+# Validation script for Wingman project structure
+
+set -e
+
+echo "đ Validating Wingman Project Structure..."
+echo ""
+
+# Check if we're in the right directory
+if [ ! -f "docker-compose.yml" ]; then
+ echo "â Error: Run this script from the project root directory"
+ exit 1
+fi
+
+# Validate Python syntax
+echo "đ Validating Python files..."
+find backend/app -name "*.py" -exec python3 -m py_compile {} \;
+echo "â Python syntax valid"
+echo ""
+
+# Validate YAML syntax
+echo "đ Validating YAML files..."
+python3 -c "import yaml; yaml.safe_load(open('docker-compose.yml'))"
+echo "â YAML syntax valid"
+echo ""
+
+# Validate JSON files
+echo "đ Validating JSON files..."
+python3 -c "import json; json.load(open('frontend/package.json'))"
+python3 -c "import json; json.load(open('frontend/tsconfig.json'))"
+echo "â JSON syntax valid"
+echo ""
+
+# Check required files
+echo "đ Checking required files..."
+required_files=(
+ "README.md"
+ "docker-compose.yml"
+ ".env.example"
+ ".gitignore"
+ "backend/requirements.txt"
+ "backend/Dockerfile"
+ "backend/app/main.py"
+ "backend/app/slack_bot.py"
+ "backend/app/rag.py"
+ "backend/app/config.py"
+ "backend/app/database.py"
+ "backend/app/vector_store.py"
+ "frontend/package.json"
+ "frontend/Dockerfile"
+ "frontend/tsconfig.json"
+ "frontend/app/page.tsx"
+ "docs/SETUP.md"
+ "docs/SLACK_AUTH.md"
+)
+
+for file in "${required_files[@]}"; do
+ if [ ! -f "$file" ]; then
+ echo "â Missing: $file"
+ exit 1
+ fi
+done
+echo "â All required files present"
+echo ""
+
+# Check directory structure
+echo "đ Checking directory structure..."
+required_dirs=(
+ "backend"
+ "backend/app"
+ "backend/tests"
+ "frontend"
+ "frontend/app"
+ "frontend/lib"
+ "docs"
+)
+
+for dir in "${required_dirs[@]}"; do
+ if [ ! -d "$dir" ]; then
+ echo "â Missing directory: $dir"
+ exit 1
+ fi
+done
+echo "â Directory structure valid"
+echo ""
+
+# Check .env.example has required variables
+echo "đ Checking environment configuration..."
+required_vars=(
+ "SLACK_BOT_TOKEN"
+ "SLACK_APP_TOKEN"
+ "SLACK_SIGNING_SECRET"
+ "OPENROUTER_API_KEY"
+ "DATABASE_URL"
+ "CHROMA_HOST"
+)
+
+for var in "${required_vars[@]}"; do
+ if ! grep -q "^$var=" .env.example; then
+ echo "â Missing environment variable in .env.example: $var"
+ exit 1
+ fi
+done
+echo "â Environment configuration valid"
+echo ""
+
+echo "⨠All validations passed!"
+echo ""
+echo "Next steps:"
+echo " 1. Copy .env.example to .env and configure"
+echo " 2. Run: docker-compose up -d"
+echo " 3. Visit http://localhost:3000"
From 4dc951db5003558bc098d5de969db877abfce5b8 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 7 Dec 2025 06:49:36 +0000
Subject: [PATCH 4/5] Modernize project: use mise.toml, compose.yaml, Python
3.14, Node 24, Tailwind v4.1, and env_file
Co-authored-by: johnnyhuy <27847622+johnnyhuy@users.noreply.github.com>
---
.env.backend | 11 +++
.env.chroma | 1 +
.env.frontend | 1 +
.env.postgres | 3 +
.gitignore | 2 +
CONTRIBUTING.md | 20 ++--
README.md | 14 +--
backend/Dockerfile | 12 ++-
docker-compose.yml => compose.yaml | 64 +++----------
docs/SETUP.md | 42 ++++-----
QUICKSTART.md => docs/getting-started.md | 26 +++---
frontend/Dockerfile | 2 +-
frontend/app/globals.css | 19 +++-
frontend/package.json | 4 +-
frontend/postcss.config.js | 6 --
frontend/tailwind.config.ts | 29 ------
frontend/tsconfig.json | 2 +-
mise.toml | 94 +++++++++++++++++++
scripts/validate.sh | 112 -----------------------
19 files changed, 200 insertions(+), 264 deletions(-)
create mode 100644 .env.backend
create mode 100644 .env.chroma
create mode 100644 .env.frontend
create mode 100644 .env.postgres
rename docker-compose.yml => compose.yaml (54%)
rename QUICKSTART.md => docs/getting-started.md (90%)
delete mode 100644 frontend/postcss.config.js
delete mode 100644 frontend/tailwind.config.ts
create mode 100644 mise.toml
delete mode 100755 scripts/validate.sh
diff --git a/.env.backend b/.env.backend
new file mode 100644
index 0000000..ad713e2
--- /dev/null
+++ b/.env.backend
@@ -0,0 +1,11 @@
+# Application
+DEBUG=false
+HOST=0.0.0.0
+PORT=8000
+
+# Database
+DATABASE_URL=postgresql://wingman:wingman@postgres:5432/wingman
+
+# Chroma
+CHROMA_HOST=chroma
+CHROMA_PORT=8000
diff --git a/.env.chroma b/.env.chroma
new file mode 100644
index 0000000..9460e3a
--- /dev/null
+++ b/.env.chroma
@@ -0,0 +1 @@
+IS_PERSISTENT=TRUE
diff --git a/.env.frontend b/.env.frontend
new file mode 100644
index 0000000..600de8d
--- /dev/null
+++ b/.env.frontend
@@ -0,0 +1 @@
+NEXT_PUBLIC_API_URL=http://localhost:8000
diff --git a/.env.postgres b/.env.postgres
new file mode 100644
index 0000000..f4d7952
--- /dev/null
+++ b/.env.postgres
@@ -0,0 +1,3 @@
+POSTGRES_DB=wingman
+POSTGRES_USER=wingman
+POSTGRES_PASSWORD=wingman
diff --git a/.gitignore b/.gitignore
index 33b152b..fcffb8a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,8 @@
.env.development.local
.env.test.local
.env.production.local
+# Keep .env.* templates but ignore local overrides
+.env.*.local
# Python
__pycache__/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index acd8d8c..c27d6b0 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -42,10 +42,10 @@ cd wingman
cp .env.example .env
# Install dependencies
-make install
+mise run install
# Start services
-make up
+mise run up
```
### Backend Development
@@ -146,10 +146,10 @@ npm test -- --watch
```bash
# Start all services
-make up
+mise run up
# Run integration tests
-make test
+mise run test
```
## Style Guidelines
@@ -222,7 +222,7 @@ wingman/
â âââ lib/ # Utilities
â âââ ...
âââ docs/ # Documentation
-âââ docker-compose.yml # Docker setup
+âââ docker compose.yml # Docker setup
```
## Common Tasks
@@ -256,20 +256,20 @@ wingman/
```bash
# View logs
-make logs-backend
+mise run logs-backend
# Access container
-make shell-backend
+mise run shell-backend
# Check database
-make shell-db
+mise run shell-db
```
### Frontend Debugging
```bash
# View logs
-make logs-frontend
+mise run logs-frontend
# Run with verbose logging
cd frontend
@@ -289,4 +289,4 @@ By contributing, you agree that your contributions will be licensed under the MI
## Thank You!
-Your contributions make Wingman better for everyone. Thank you for taking the time to contribute! đ
+Your contributions mise run Wingman better for everyone. Thank you for taking the time to contribute! đ
diff --git a/README.md b/README.md
index 64a52da..ded2040 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ An AI-powered Slack support assistant with RAG (Retrieval Augmented Generation)
- **đž Vector Storage**: ChromaDB for efficient semantic search
- **đī¸ PostgreSQL Database**: Persistent storage for messages and documents
- **đ Next.js Dashboard**: Modern TypeScript dashboard for managing the assistant
-- **đŗ Docker Ready**: Complete docker-compose setup for local development
+- **đŗ Docker Ready**: Complete docker compose setup for local development
## đī¸ Architecture
@@ -35,7 +35,7 @@ wingman/
âââ docs/ # Documentation
â âââ SETUP.md
â âââ SLACK_AUTH.md
-âââ docker-compose.yml
+âââ docker compose.yml
âââ .env.example
```
@@ -72,7 +72,7 @@ See [SLACK_AUTH.md](docs/SLACK_AUTH.md) for detailed Slack setup instructions.
### 3. Start Services
```bash
-docker-compose up -d
+docker compose up -d
```
This will start:
@@ -86,11 +86,11 @@ This will start:
```bash
# Check service health
-docker-compose ps
+docker compose ps
# View logs
-docker-compose logs -f backend
-docker-compose logs -f bot
+docker compose logs -f backend
+docker compose logs -f bot
```
Visit http://localhost:3000 to access the dashboard.
@@ -141,7 +141,7 @@ source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
# Start PostgreSQL and Chroma separately or use Docker for them
-docker-compose up -d postgres chroma
+docker compose up -d postgres chroma
# Run backend
python -m uvicorn app.main:app --reload
diff --git a/backend/Dockerfile b/backend/Dockerfile
index 5cbd13f..28e93e7 100644
--- a/backend/Dockerfile
+++ b/backend/Dockerfile
@@ -1,17 +1,21 @@
# Backend Dockerfile for Wingman
-FROM python:3.11-slim
+FROM python:3.14-slim
WORKDIR /app
-# Install system dependencies
+# Install system dependencies and uv
RUN apt-get update && apt-get install -y \
gcc \
postgresql-client \
- && rm -rf /var/lib/apt/lists/*
+ curl \
+ && rm -rf /var/lib/apt/lists/* \
+ && curl -LsSf https://astral.sh/uv/install.sh | sh
+
+ENV PATH="/root/.cargo/bin:${PATH}"
# Copy requirements and install dependencies
COPY requirements.txt .
-RUN pip install --no-cache-dir -r requirements.txt
+RUN uv pip install --system --no-cache -r requirements.txt
# Copy application code
COPY . .
diff --git a/docker-compose.yml b/compose.yaml
similarity index 54%
rename from docker-compose.yml
rename to compose.yaml
index c706d89..ad6b482 100644
--- a/docker-compose.yml
+++ b/compose.yaml
@@ -5,10 +5,8 @@ services:
postgres:
image: postgres:16-alpine
container_name: wingman-postgres
- environment:
- POSTGRES_DB: wingman
- POSTGRES_USER: wingman
- POSTGRES_PASSWORD: wingman
+ env_file:
+ - .env.postgres
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
@@ -27,8 +25,8 @@ services:
container_name: wingman-chroma
volumes:
- chroma_data:/chroma/chroma
- environment:
- - IS_PERSISTENT=TRUE
+ env_file:
+ - .env.chroma
ports:
- "8001:8000"
healthcheck:
@@ -45,31 +43,9 @@ services:
context: ./backend
dockerfile: Dockerfile
container_name: wingman-backend
- environment:
- # Application
- DEBUG: "false"
- HOST: "0.0.0.0"
- PORT: "8000"
-
- # Slack (load from .env)
- SLACK_BOT_TOKEN: ${SLACK_BOT_TOKEN}
- SLACK_APP_TOKEN: ${SLACK_APP_TOKEN}
- SLACK_SIGNING_SECRET: ${SLACK_SIGNING_SECRET}
- SLACK_USER_TOKEN: ${SLACK_USER_TOKEN:-}
- SLACK_CLIENT_ID: ${SLACK_CLIENT_ID:-}
- SLACK_CLIENT_SECRET: ${SLACK_CLIENT_SECRET:-}
-
- # OpenRouter/OpenAI
- OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}
- OPENAI_API_KEY: ${OPENAI_API_KEY:-}
- LLM_MODEL: ${LLM_MODEL:-openai/gpt-4-turbo-preview}
-
- # Database
- DATABASE_URL: "postgresql://wingman:wingman@postgres:5432/wingman"
-
- # Chroma
- CHROMA_HOST: "chroma"
- CHROMA_PORT: "8000"
+ env_file:
+ - .env
+ - .env.backend
ports:
- "8000:8000"
depends_on:
@@ -90,23 +66,9 @@ services:
dockerfile: Dockerfile
container_name: wingman-bot
command: python run_bot.py
- environment:
- # Slack
- SLACK_BOT_TOKEN: ${SLACK_BOT_TOKEN}
- SLACK_APP_TOKEN: ${SLACK_APP_TOKEN}
- SLACK_SIGNING_SECRET: ${SLACK_SIGNING_SECRET}
-
- # OpenRouter/OpenAI
- OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}
- OPENAI_API_KEY: ${OPENAI_API_KEY:-}
- LLM_MODEL: ${LLM_MODEL:-openai/gpt-4-turbo-preview}
-
- # Database
- DATABASE_URL: "postgresql://wingman:wingman@postgres:5432/wingman"
-
- # Chroma
- CHROMA_HOST: "chroma"
- CHROMA_PORT: "8000"
+ env_file:
+ - .env
+ - .env.backend
depends_on:
postgres:
condition: service_healthy
@@ -123,11 +85,9 @@ services:
build:
context: ./frontend
dockerfile: Dockerfile
- args:
- NEXT_PUBLIC_API_URL: http://localhost:8000
container_name: wingman-frontend
- environment:
- NEXT_PUBLIC_API_URL: http://localhost:8000
+ env_file:
+ - .env.frontend
ports:
- "3000:3000"
depends_on:
diff --git a/docs/SETUP.md b/docs/SETUP.md
index 7b9a7cf..24471d6 100644
--- a/docs/SETUP.md
+++ b/docs/SETUP.md
@@ -164,7 +164,7 @@ See [SLACK_AUTH.md](SLACK_AUTH.md) for more details on token types.
### Start All Services
```bash
-docker-compose up -d
+docker compose up -d
```
This starts:
@@ -178,12 +178,12 @@ This starts:
```bash
# Check service status
-docker-compose ps
+docker compose ps
# View logs
-docker-compose logs -f backend
-docker-compose logs -f bot
-docker-compose logs -f frontend
+docker compose logs -f backend
+docker compose logs -f bot
+docker compose logs -f frontend
# Check backend health
curl http://localhost:8000/health
@@ -192,10 +192,10 @@ curl http://localhost:8000/health
### Stop Services
```bash
-docker-compose down
+docker compose down
# To also remove volumes (data)
-docker-compose down -v
+docker compose down -v
```
## Local Development
@@ -215,7 +215,7 @@ source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
# Start dependencies (or use local Postgres/Chroma)
-docker-compose up -d postgres chroma
+docker compose up -d postgres chroma
# Run backend API
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
@@ -295,7 +295,7 @@ curl http://localhost:8000/api/messages
### Bot Not Responding in Slack
**Check:**
-1. Bot is running: `docker-compose logs bot`
+1. Bot is running: `docker compose logs bot`
2. Socket Mode is enabled in Slack app settings
3. `SLACK_APP_TOKEN` is set correctly (starts with `xapp-`)
4. Bot is invited to the channel (for mentions)
@@ -310,10 +310,10 @@ curl http://localhost:8000/api/messages
```bash
# Check PostgreSQL
-docker-compose logs postgres
+docker compose logs postgres
# Connect to database
-docker-compose exec postgres psql -U wingman -d wingman
+docker compose exec postgres psql -U wingman -d wingman
# Verify connection string in .env
DATABASE_URL=postgresql://wingman:wingman@postgres:5432/wingman
@@ -323,14 +323,14 @@ DATABASE_URL=postgresql://wingman:wingman@postgres:5432/wingman
```bash
# Check Chroma
-docker-compose logs chroma
+docker compose logs chroma
# Verify Chroma is running
curl http://localhost:8001/api/v1/heartbeat
# Reset Chroma data
-docker-compose down -v
-docker-compose up -d chroma
+docker compose down -v
+docker compose up -d chroma
```
### LLM/API Issues
@@ -350,7 +350,7 @@ docker-compose up -d chroma
If ports are already in use:
```bash
-# Edit docker-compose.yml to change ports
+# Edit docker compose.yml to change ports
services:
backend:
ports:
@@ -364,14 +364,14 @@ services:
```bash
# All services
-docker-compose logs -f
+docker compose logs -f
# Specific service
-docker-compose logs -f backend
-docker-compose logs -f bot
-docker-compose logs -f frontend
-docker-compose logs -f postgres
-docker-compose logs -f chroma
+docker compose logs -f backend
+docker compose logs -f bot
+docker compose logs -f frontend
+docker compose logs -f postgres
+docker compose logs -f chroma
```
## Next Steps
diff --git a/QUICKSTART.md b/docs/getting-started.md
similarity index 90%
rename from QUICKSTART.md
rename to docs/getting-started.md
index 427d962..ec1a8a2 100644
--- a/QUICKSTART.md
+++ b/docs/getting-started.md
@@ -57,7 +57,7 @@ cp .env.example .env
## Step 4: Start Wingman
```bash
-docker-compose up -d
+docker compose up -d
```
This starts:
@@ -91,29 +91,29 @@ curl -X POST http://localhost:8000/api/ask \
### Bot not responding?
```bash
# Check logs
-docker-compose logs -f bot
+docker compose logs -f bot
# Verify environment
-docker-compose exec bot env | grep SLACK
+docker compose exec bot env | grep SLACK
```
### Can't access dashboard?
```bash
# Check if services are running
-docker-compose ps
+docker compose ps
# Check frontend logs
-docker-compose logs -f frontend
+docker compose logs -f frontend
```
### Database issues?
```bash
# Restart all services
-docker-compose restart
+docker compose restart
# Or recreate everything
-docker-compose down -v
-docker-compose up -d
+docker compose down -v
+docker compose up -d
```
## What's Next?
@@ -142,22 +142,22 @@ docker-compose up -d
```bash
# View all logs
-docker-compose logs -f
+docker compose logs -f
# Stop everything
-docker-compose down
+docker compose down
# Restart a service
-docker-compose restart backend
+docker compose restart backend
# Access database
-docker-compose exec postgres psql -U wingman -d wingman
+docker compose exec postgres psql -U wingman -d wingman
# Run backend tests
cd backend && pytest
# Update dependencies
-docker-compose build
+docker compose build
```
## Getting Help
diff --git a/frontend/Dockerfile b/frontend/Dockerfile
index 093aa9e..39dd6e0 100644
--- a/frontend/Dockerfile
+++ b/frontend/Dockerfile
@@ -1,5 +1,5 @@
# Frontend Dockerfile for Wingman
-FROM node:20-alpine AS base
+FROM node:24-alpine AS base
# Install dependencies only when needed
FROM base AS deps
diff --git a/frontend/app/globals.css b/frontend/app/globals.css
index fd81e88..9c47f09 100644
--- a/frontend/app/globals.css
+++ b/frontend/app/globals.css
@@ -1,15 +1,24 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
+@import "tailwindcss";
-:root {
+@theme {
+ --color-primary-50: #f0f9ff;
+ --color-primary-100: #e0f2fe;
+ --color-primary-200: #bae6fd;
+ --color-primary-300: #7dd3fc;
+ --color-primary-400: #38bdf8;
+ --color-primary-500: #0ea5e9;
+ --color-primary-600: #0284c7;
+ --color-primary-700: #0369a1;
+ --color-primary-800: #075985;
+ --color-primary-900: #0c4a6e;
+
--foreground-rgb: 0, 0, 0;
--background-start-rgb: 214, 219, 220;
--background-end-rgb: 255, 255, 255;
}
@media (prefers-color-scheme: dark) {
- :root {
+ @theme {
--foreground-rgb: 255, 255, 255;
--background-start-rgb: 0, 0, 0;
--background-end-rgb: 0, 0, 0;
diff --git a/frontend/package.json b/frontend/package.json
index 6853865..39c1fb0 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -22,8 +22,6 @@
"devDependencies": {
"eslint": "^8",
"eslint-config-next": "14.0.4",
- "autoprefixer": "^10.4.16",
- "postcss": "^8.4.32",
- "tailwindcss": "^3.3.6"
+ "tailwindcss": "^4.1.0"
}
}
diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js
deleted file mode 100644
index 33ad091..0000000
--- a/frontend/postcss.config.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
- plugins: {
- tailwindcss: {},
- autoprefixer: {},
- },
-}
diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts
deleted file mode 100644
index da6176d..0000000
--- a/frontend/tailwind.config.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import type { Config } from 'tailwindcss'
-
-const config: Config = {
- content: [
- './pages/**/*.{js,ts,jsx,tsx,mdx}',
- './components/**/*.{js,ts,jsx,tsx,mdx}',
- './app/**/*.{js,ts,jsx,tsx,mdx}',
- ],
- theme: {
- extend: {
- colors: {
- primary: {
- 50: '#f0f9ff',
- 100: '#e0f2fe',
- 200: '#bae6fd',
- 300: '#7dd3fc',
- 400: '#38bdf8',
- 500: '#0ea5e9',
- 600: '#0284c7',
- 700: '#0369a1',
- 800: '#075985',
- 900: '#0c4a6e',
- },
- },
- },
- },
- plugins: [],
-}
-export default config
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
index c714696..5ddf5a5 100644
--- a/frontend/tsconfig.json
+++ b/frontend/tsconfig.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "target": "es5",
+ "target": "ES2022",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
diff --git a/mise.toml b/mise.toml
new file mode 100644
index 0000000..7b29dc2
--- /dev/null
+++ b/mise.toml
@@ -0,0 +1,94 @@
+[tools]
+python = "3.14"
+node = "24"
+
+[tasks.up]
+description = "Start all services"
+run = "docker compose up -d"
+
+[tasks.down]
+description = "Stop all services"
+run = "docker compose down"
+
+[tasks.logs]
+description = "View logs from all services"
+run = "docker compose logs -f"
+
+[tasks.logs-backend]
+description = "View backend logs"
+run = "docker compose logs -f backend"
+
+[tasks.logs-bot]
+description = "View bot logs"
+run = "docker compose logs -f bot"
+
+[tasks.logs-frontend]
+description = "View frontend logs"
+run = "docker compose logs -f frontend"
+
+[tasks.build]
+description = "Build all Docker images"
+run = "docker compose build"
+
+[tasks.clean]
+description = "Remove all containers and volumes"
+run = "docker compose down -v"
+
+[tasks.restart]
+description = "Restart all services"
+run = "docker compose restart"
+
+[tasks.ps]
+description = "Show running services"
+run = "docker compose ps"
+
+[tasks.test-backend]
+description = "Run backend tests"
+run = "cd backend && pytest"
+
+[tasks.test-frontend]
+description = "Run frontend tests"
+run = "cd frontend && npm test"
+
+[tasks.test]
+description = "Run all tests"
+depends = ["test-backend"]
+
+[tasks.shell-backend]
+description = "Open shell in backend container"
+run = "docker compose exec backend /bin/sh"
+
+[tasks.shell-db]
+description = "Open PostgreSQL shell"
+run = "docker compose exec postgres psql -U wingman -d wingman"
+
+[tasks.init]
+description = "Initialize project (copy .env.example to .env)"
+run = """
+cp .env.example .env
+echo "â Created .env file. Please edit it with your credentials."
+"""
+
+[tasks.install-backend]
+description = "Install backend dependencies locally"
+run = "cd backend && uv sync"
+
+[tasks.install-frontend]
+description = "Install frontend dependencies locally"
+run = "cd frontend && npm install"
+
+[tasks.install]
+description = "Install all dependencies locally"
+depends = ["install-backend", "install-frontend"]
+
+[tasks.dev-backend]
+description = "Run backend in development mode"
+run = "cd backend && uvicorn app.main:app --reload"
+
+[tasks.dev-frontend]
+description = "Run frontend in development mode"
+run = "cd frontend && npm run dev"
+
+[tasks.dev-bot]
+description = "Run bot in development mode"
+run = "cd backend && python run_bot.py"
diff --git a/scripts/validate.sh b/scripts/validate.sh
deleted file mode 100755
index 0c1caf0..0000000
--- a/scripts/validate.sh
+++ /dev/null
@@ -1,112 +0,0 @@
-#!/bin/bash
-# Validation script for Wingman project structure
-
-set -e
-
-echo "đ Validating Wingman Project Structure..."
-echo ""
-
-# Check if we're in the right directory
-if [ ! -f "docker-compose.yml" ]; then
- echo "â Error: Run this script from the project root directory"
- exit 1
-fi
-
-# Validate Python syntax
-echo "đ Validating Python files..."
-find backend/app -name "*.py" -exec python3 -m py_compile {} \;
-echo "â Python syntax valid"
-echo ""
-
-# Validate YAML syntax
-echo "đ Validating YAML files..."
-python3 -c "import yaml; yaml.safe_load(open('docker-compose.yml'))"
-echo "â YAML syntax valid"
-echo ""
-
-# Validate JSON files
-echo "đ Validating JSON files..."
-python3 -c "import json; json.load(open('frontend/package.json'))"
-python3 -c "import json; json.load(open('frontend/tsconfig.json'))"
-echo "â JSON syntax valid"
-echo ""
-
-# Check required files
-echo "đ Checking required files..."
-required_files=(
- "README.md"
- "docker-compose.yml"
- ".env.example"
- ".gitignore"
- "backend/requirements.txt"
- "backend/Dockerfile"
- "backend/app/main.py"
- "backend/app/slack_bot.py"
- "backend/app/rag.py"
- "backend/app/config.py"
- "backend/app/database.py"
- "backend/app/vector_store.py"
- "frontend/package.json"
- "frontend/Dockerfile"
- "frontend/tsconfig.json"
- "frontend/app/page.tsx"
- "docs/SETUP.md"
- "docs/SLACK_AUTH.md"
-)
-
-for file in "${required_files[@]}"; do
- if [ ! -f "$file" ]; then
- echo "â Missing: $file"
- exit 1
- fi
-done
-echo "â All required files present"
-echo ""
-
-# Check directory structure
-echo "đ Checking directory structure..."
-required_dirs=(
- "backend"
- "backend/app"
- "backend/tests"
- "frontend"
- "frontend/app"
- "frontend/lib"
- "docs"
-)
-
-for dir in "${required_dirs[@]}"; do
- if [ ! -d "$dir" ]; then
- echo "â Missing directory: $dir"
- exit 1
- fi
-done
-echo "â Directory structure valid"
-echo ""
-
-# Check .env.example has required variables
-echo "đ Checking environment configuration..."
-required_vars=(
- "SLACK_BOT_TOKEN"
- "SLACK_APP_TOKEN"
- "SLACK_SIGNING_SECRET"
- "OPENROUTER_API_KEY"
- "DATABASE_URL"
- "CHROMA_HOST"
-)
-
-for var in "${required_vars[@]}"; do
- if ! grep -q "^$var=" .env.example; then
- echo "â Missing environment variable in .env.example: $var"
- exit 1
- fi
-done
-echo "â Environment configuration valid"
-echo ""
-
-echo "⨠All validations passed!"
-echo ""
-echo "Next steps:"
-echo " 1. Copy .env.example to .env and configure"
-echo " 2. Run: docker-compose up -d"
-echo " 3. Visit http://localhost:3000"
From b4febf7862c41ee7438702635126c2a6593f6d3d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 7 Dec 2025 06:52:11 +0000
Subject: [PATCH 5/5] Fix typo in CONTRIBUTING.md
Co-authored-by: johnnyhuy <27847622+johnnyhuy@users.noreply.github.com>
---
CONTRIBUTING.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index c27d6b0..d4bedb4 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -289,4 +289,4 @@ By contributing, you agree that your contributions will be licensed under the MI
## Thank You!
-Your contributions mise run Wingman better for everyone. Thank you for taking the time to contribute! đ
+Your contributions make Wingman better for everyone. Thank you for taking the time to contribute! đ