Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
5481058
feat: Add user management API and UI
cursoragent Sep 24, 2025
774cf40
chore(web): add react-icons dependency to fix Vercel build
cursoragent Sep 24, 2025
f6c5685
ci: add Vercel auto-deploy GitHub Actions workflow and vercel.json
cursoragent Sep 24, 2025
c5613b5
fix(web): guard publishedUrl nullability for href/clipboard to satisf…
cursoragent Sep 24, 2025
f793789
feat(settings): add AI provider API key support (OpenAI, Anthropic, G…
cursoragent Sep 24, 2025
517e3d2
Merge feature: user add API, AI provider keys & settings UI
cursoragent Sep 24, 2025
9aff1f3
chore: trigger production deploy
cursoragent Sep 24, 2025
60ebb15
feat(web): proxy /api/* to backend via BACKEND_BASE_URL and use relat…
cursoragent Sep 24, 2025
e542d1c
Refactor: Remove hardcoded API_BASE, use relative paths
cursoragent Sep 24, 2025
7ad3f03
chore: trigger production deploy (prod)
cursoragent Sep 24, 2025
15e1216
ci(vercel): workflow to upsert BACKEND_BASE_URL via Vercel API (uses …
cursoragent Sep 24, 2025
6ed4fe8
feat(web): fallback BACKEND_BASE_URL from cookie; UI to set backend U…
cursoragent Sep 24, 2025
337e540
chore(vercel): simplify buildCommand to use apps/web workspace only
cursoragent Sep 24, 2025
87b9959
chore(vercel): run build by cd into apps/web (no npm workspaces)
cursoragent Sep 24, 2025
8033741
chore(vercel): build from repo root (apps/web is the only Next app)
cursoragent Sep 24, 2025
799215c
fix(web/api-proxy): return safe defaults for /api/projects and /api/s…
cursoragent Sep 24, 2025
366d91d
feat(auth-proxy): allow setting backend bearer token via settings; in…
cursoragent Sep 24, 2025
191e86d
fix(web/proxy): add safe fallbacks for GET /api/settings/global and t…
cursoragent Sep 24, 2025
bb7323a
ci: PR template, CODEOWNERS, PR build, auto-publish to Vercel on merg…
cursoragent Sep 24, 2025
a4bc834
chore: trigger production deploy
cursoragent Sep 24, 2025
cad8a0b
chore: trigger production deploy (claudable-web-pi)
cursoragent Sep 24, 2025
10da6b5
fix(meta): provide OpenGraph/Twitter images and favicon to avoid miss…
cursoragent Sep 24, 2025
5b7cedd
Checkpoint before follow-up message
cursoragent Sep 26, 2025
e226ac7
Checkpoint before follow-up message
cursoragent Sep 27, 2025
0fc4b4f
Add AI connectivity service and API endpoints
cursoragent Sep 27, 2025
65a6de0
Merge pull request #3 from you112ef/cursor/backend-app-with-automatic…
you112ef Sep 27, 2025
c75661d
feat: Implement API key management and MCP support
cursoragent Sep 27, 2025
a5e63b6
Merge pull request #4 from you112ef/cursor/automate-claudable-setup-a…
you112ef Sep 27, 2025
7eb26d8
fix: consolidate and fix automatic publishing workflows
cursoragent Sep 27, 2025
c742010
Refactor: Update env, deployment, and readme for production
cursoragent Sep 27, 2025
bac5d50
Merge pull request #5 from you112ef/cursor/automate-claudable-setup-a…
you112ef Sep 27, 2025
d88c45b
feat: Add user API key management endpoints
cursoragent Sep 29, 2025
280922f
Merge pull request #7 from you112ef/cursor/secure-api-key-management-…
you112ef Sep 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 32 additions & 49 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,55 +1,38 @@
# =============================================================================
# CC-LOVABLE ENVIRONMENT CONFIGURATION
# =============================================================================
# Copy this file to .env and configure the values below
# Required fields are marked with [REQUIRED]
# Optional fields have sensible defaults

# =============================================================================
# REQUIRED CONFIGURATION - USER MUST PROVIDE
# =============================================================================

# [REQUIRED] Anthropic API Key for Claude Code SDK
# Get your API key from: https://console.anthropic.com/
ANTHROPIC_API_KEY=your_anthropic_api_key_here

# =============================================================================
# OPTIONAL CONFIGURATION - ADVANCED USERS
# =============================================================================

# Encryption key for sensitive data (generate a random 32-character string)
# Leave empty to use default internal encryption
ENCRYPTION_KEY=

# =============================================================================
# DEFAULT CONFIGURATION - USUALLY NO CHANGES NEEDED
# =============================================================================

# API Server Configuration
API_PORT=8080

# Database Configuration (PostgreSQL via Docker)
POSTGRES_USER=cc
POSTGRES_PASSWORD=cc
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DB=cc
# Claudable Environment Configuration
# Copy this file to .env.local and fill in your values

# Alternative: Full database URL (overrides individual POSTGRES_* variables above)
# DATABASE_URL=postgresql+psycopg://cc:cc@localhost:5432/cc
# Database
DATABASE_URL=sqlite:///./data/cc.db

# Project Storage Paths
# Project Settings
PROJECTS_ROOT=./data/projects
PROJECTS_ROOT_HOST=./data/projects

# Preview Server Port Range
PREVIEW_PORT_START=3100
PREVIEW_PORT_END=3999

# Claude Model Configuration
CLAUDE_CODE_MODEL=claude-sonnet-4-20250514

# Frontend API Endpoints (automatically configured by Makefile)
# Note: These are set dynamically by 'make start' - no need to change manually
NEXT_PUBLIC_API_BASE=http://localhost:8080
NEXT_PUBLIC_WS_BASE=ws://localhost:8080
# API Configuration
API_PORT=8080
ENVIRONMENT=development

# AI Service API Keys (Optional - can be set via UI)
CLAUDE_API_KEY=your_claude_api_key_here
CURSOR_API_KEY=your_cursor_api_key_here
OPENAI_API_KEY=your_openai_api_key_here
GOOGLE_API_KEY=your_google_api_key_here
QWEN_API_KEY=your_qwen_api_key_here

# GitHub Integration (Optional)
GITHUB_TOKEN=your_github_token_here

# Supabase Integration (Optional)
SUPABASE_URL=your_supabase_url_here
SUPABASE_ANON_KEY=your_supabase_anon_key_here
SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key_here

# Vercel Integration (Optional)
VERCEL_TOKEN=your_vercel_token_here
VERCEL_ORG_ID=your_vercel_org_id_here
VERCEL_PROJECT_ID=your_vercel_project_id_here

# Security
JWT_SECRET=your_jwt_secret_here
ENCRYPTION_KEY=your_encryption_key_here
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* @you112ef

18 changes: 18 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
## Summary

- What does this PR change and why?

## Checklist

- [ ] Builds locally: `npm install && npm run build`
- [ ] Web proxy OK (uses /api/*)
- [ ] Added/updated tests (if applicable)
- [ ] Updated docs/README (if applicable)

## Deployment

- Merging to `main` will auto-deploy to production via Vercel
- PRs get preview deployments via CI

## Screenshots (optional)

39 changes: 39 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Deploy to Vercel

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

jobs:
deploy:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'

- name: Install dependencies
run: |
npm install
cd apps/web && npm install

- name: Build web app
run: |
cd apps/web && npm run build

- name: Deploy to Vercel
uses: amondnet/vercel-action@v25
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
vercel-args: '--prod'
working-directory: ./
49 changes: 49 additions & 0 deletions .github/workflows/pr-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: PR CI (Build & Test)

on:
pull_request:
branches: ["main"]

jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'

- name: Install dependencies
run: |
npm install
cd apps/web && npm install

- name: Type check
run: |
cd apps/web
npm run type-check || true

- name: Build web app
run: |
cd apps/web
npm run build

- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.10'

- name: Install Python dependencies
run: |
cd apps/api
pip install -r requirements.txt

- name: Test API imports
run: |
cd apps/api
python -c "import app.main; print('API imports successful')"

49 changes: 49 additions & 0 deletions .github/workflows/set-vercel-env.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Set Vercel BACKEND_BASE_URL Env

on:
workflow_dispatch:
inputs:
backend_base_url:
description: "Backend base URL (e.g., https://api.example.com)"
required: true
push:
branches: ["main"]

jobs:
set-env:
runs-on: ubuntu-latest
if: ${{ secrets.VERCEL_TOKEN && secrets.VERCEL_ORG_ID && secrets.VERCEL_PROJECT_ID }}
steps:
- name: Ensure inputs/secret value is available
id: input
run: |
if [ -n "${{ github.event.inputs.backend_base_url }}" ]; then
echo "val=${{ github.event.inputs.backend_base_url }}" >> $GITHUB_OUTPUT
elif [ -n "${{ secrets.BACKEND_BASE_URL }}" ]; then
echo "val=${{ secrets.BACKEND_BASE_URL }}" >> $GITHUB_OUTPUT
else
echo "No BACKEND_BASE_URL provided via dispatch input or secret. Skipping." && exit 0
- name: Upsert env var via Vercel API
if: steps.input.outputs.val != ''
env:
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
VAL: ${{ steps.input.outputs.val }}
run: |
set -euo pipefail
# Delete existing entries named BACKEND_BASE_URL (if any)
EXISTING=$(curl -sS -H "Authorization: Bearer $VERCEL_TOKEN" "https://api.vercel.com/v9/projects/$VERCEL_PROJECT_ID/env?decrypt=false" | jq -r '.envs[] | select(.key=="BACKEND_BASE_URL") | .id')
for id in $EXISTING; do
curl -sS -X DELETE -H "Authorization: Bearer $VERCEL_TOKEN" "https://api.vercel.com/v9/projects/$VERCEL_PROJECT_ID/env/$id" >/dev/null || true
done
# Create new env var for all targets
curl -sS -X POST \
-H "Authorization: Bearer $VERCEL_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"key\":\"BACKEND_BASE_URL\",\"value\":\"$VAL\",\"type\":\"encrypted\",\"target\":[\"production\",\"preview\",\"development\"]}" \
"https://api.vercel.com/v10/projects/$VERCEL_PROJECT_ID/env" | jq -r '.key' | grep BACKEND_BASE_URL
- name: Invalidate Preview Cache (optional)
if: steps.input.outputs.val != ''
run: echo "BACKEND_BASE_URL set. Next build will pick it up."

89 changes: 89 additions & 0 deletions .github/workflows/vercel-auto-deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
name: Vercel Auto Deploy (Preview & Production)

on:
push:
branches: ["**"]
pull_request:
types: [opened, synchronize, reopened]

jobs:
deploy-preview:
if: github.event_name == 'pull_request' || github.ref != 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18

- name: Install Vercel CLI
run: npm i -g vercel@latest

- name: Pull Vercel Environment Info (preview)
run: vercel pull --yes --environment=preview --token "$VERCEL_TOKEN"
env:
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}

- name: Build (preview)
run: vercel build --token "$VERCEL_TOKEN"
env:
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}

- name: Deploy (preview)
id: deploy_preview
run: |
url=$(vercel deploy --prebuilt --token "$VERCEL_TOKEN" --yes)
echo "preview_url=$url" >> $GITHUB_OUTPUT
env:
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}

- name: Output Preview URL
run: echo "Preview URL: ${{ steps.deploy_preview.outputs.preview_url }}"

deploy-production:
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18

- name: Install Vercel CLI
run: npm i -g vercel@latest

- name: Pull Vercel Environment Info (production)
run: vercel pull --yes --environment=production --token "$VERCEL_TOKEN"
env:
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}

- name: Build (production)
run: vercel build --prod --token "$VERCEL_TOKEN"
env:
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}

- name: Deploy (production)
id: deploy_prod
run: |
url=$(vercel deploy --prebuilt --prod --token "$VERCEL_TOKEN" --yes)
echo "prod_url=$url" >> $GITHUB_OUTPUT
env:
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}

- name: Output Production URL
run: echo "Production URL: ${{ steps.deploy_prod.outputs.prod_url }}"

Loading