Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
53 changes: 53 additions & 0 deletions .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
{
"permissions": {
"allow": [
"Bash(q:*)",
"Bash(opencode:*)",
"Bash(claude --version)",
"Bash(cursor-agent status:*)",
"Bash(gemini:*)",
"Bash(codex:*)",
"Bash(cursor-agent:*)",
"Read(//usr/local/bin/**)",
"Read(//root/.local/bin/**)",
"Read(//usr/**)",
"Bash(mkdir:*)",
"Bash(npm run build:*)",
"Bash(npm test)",
"Bash(npm install:*)",
"Bash(npx vitest run:*)",
"Read(//root/.bob/**)",
"Bash(git add:*)",
"Bash(chmod:*)",
"Bash(bash:*)",
"Bash(sudo:*)",
"Bash(certbot certonly:*)",
"Bash(ln:*)",
"Bash(nginx:*)",
"Bash(systemctl reload:*)",
"Bash(curl:*)",
"Bash(systemctl restart:*)",
"Bash(iptables:*)",
"Bash(systemctl stop:*)",
"Bash(lsof:*)",
"Bash(ss:*)",
"Bash(systemctl start:*)",
"Bash(systemctl:*)",
"Read(//etc/nginx/sites-available/**)",
"Bash(cat:*)",
"Bash(certbot:*)",
"Bash(pkill:*)",
"Bash(kill:*)",
"Bash(npx shadcn@latest init:*)",
"Bash(npx tailwindcss init:*)",
"Bash(npm uninstall:*)",
"Bash(git rebase:*)"
],
"deny": [],
"ask": [],
"additionalDirectories": [
"/var/www/html/.well-known/acme-challenge",
"/etc/nginx/sites-enabled"
]
}
}
24 changes: 24 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Backend Environment Variables

# GitHub OAuth Configuration
# To set up GitHub OAuth:
# 1. Go to GitHub Settings > Developer settings > OAuth Apps
# 2. Click "New OAuth App"
# 3. Fill in the following:
# - Application name: Bob Development Tool
# - Homepage URL: https://claude.gmac.io
# - Authorization callback URL: https://api.claude.gmac.io/api/auth/github/callback
# 4. Copy the Client ID and Client Secret below

GITHUB_CLIENT_ID=your_github_client_id_here
GITHUB_CLIENT_SECRET=your_github_client_secret_here
GITHUB_CALLBACK_URL=https://api.claude.gmac.io/api/auth/github/callback

# Session secret for Express sessions (change this in production)
SESSION_SECRET=change-this-secret-in-production-use-a-long-random-string

# Node environment (production or development)
NODE_ENV=production

# Port configuration (optional, defaults shown)
PORT=43829
80 changes: 80 additions & 0 deletions backend/config/agents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
{
"agents": {
"claude": {
"enabled": true,
"default": true,
"priority": 1,
"settings": {
"autoStart": true,
"restartOnCrash": true,
"maxRestarts": 3
}
},
"codex": {
"enabled": true,
"default": false,
"priority": 2,
"settings": {
"autoStart": true,
"restartOnCrash": true,
"maxRestarts": 3,
"sandbox": true,
"autoApproval": false
}
},
"gemini": {
"enabled": true,
"default": false,
"priority": 3,
"settings": {
"autoStart": true,
"restartOnCrash": true,
"maxRestarts": 3
}
},
"amazon-q": {
"enabled": true,
"default": false,
"priority": 4,
"settings": {
"autoStart": true,
"restartOnCrash": false,
"maxRestarts": 1
}
},
"cursor-agent": {
"enabled": true,
"default": false,
"priority": 5,
"settings": {
"autoStart": false,
"restartOnCrash": false,
"maxRestarts": 1
}
},
"opencode": {
"enabled": true,
"default": false,
"priority": 6,
"settings": {
"autoStart": false,
"restartOnCrash": false,
"maxRestarts": 1
}
}
},
"preferences": {
"defaultAgent": "claude",
"fallbackOrder": ["claude", "codex", "gemini", "amazon-q", "cursor-agent", "opencode"],
"autoSelectAvailable": true,
"showUnavailableAgents": true,
"persistAgentSelection": true
},
"ui": {
"showAgentBadges": true,
"compactBadges": true,
"showAgentTooltips": true,
"showAgentStatus": true,
"groupByAvailability": false
}
}
20 changes: 17 additions & 3 deletions backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,36 @@
"migrate:up": "tsx src/cli/migrate.ts up",
"migrate:down": "tsx src/cli/migrate.ts down",
"migrate:reset": "tsx src/cli/migrate.ts reset",
"migrate:create": "tsx src/cli/migrate.ts create"
"migrate:create": "tsx src/cli/migrate.ts create",
"test": "npx vitest run",
"test:ui": "vitest"
},
"dependencies": {
"@types/better-sqlite3": "^7.6.13",
"@types/express-session": "^1.18.2",
"@types/passport": "^1.0.17",
"@types/passport-github2": "^1.2.9",
"better-sqlite3": "^12.4.1",
"cors": "^2.8.5",
"dotenv": "^17.2.2",
"express": "^4.18.2",
"express-session": "^1.18.2",
"node-pty": "^1.0.0",
"passport": "^0.7.0",
"passport-github2": "^0.1.12",
"sqlite3": "^5.1.6",
"ws": "^8.16.0"
},
"devDependencies": {
"@types/cors": "^2.8.19",
"@types/express": "^4.17.23",
"@types/node": "^20.19.15",
"@types/node": "^20.19.19",
"@types/sqlite3": "^3.1.11",
"@types/supertest": "^6.0.3",
"@types/ws": "^8.18.1",
"supertest": "^7.1.4",
"tsx": "^4.7.0",
"typescript": "^5.3.3"
"typescript": "^5.3.3",
"vitest": "^2.1.9"
}
}
Loading