Skip to content

Commit 82c058c

Browse files
committed
feat: OpenCodeHub v1.1.0 - Enterprise Features & Storage Adapters
Major release including multiple storage backends, advanced project management, and enhanced CI/CD capabilities. **New Features:** - **Storage Adapters:** Added support for S3, GCS, Azure, Dropbox, and FTP. - **Advanced Issues:** Introduced Epics, Tasks, and Cross-Repository linking. - **Merge Queue:** Implemented speculative execution and distributed locking. - **Security:** Added Secret Scanning integration and improved 2FA/MFA setup. - **Authentication:** Integrated 'arctic' and 'openid-client' for robust OAuth flows; added User Following. - **Templates:** Repository templates and custom issue fields support. - **Webhooks:** Native support for Discord and Teams notifications. **Improvements:** - **UI/UX:** Redesigned Admin Dashboard, enhanced Issue/PR views, and new Insights charts. - **CLI:** Improved stack management (sync, log, rebase) and repo creation. - **Performance:** Optimized rate limiting middleware and database queries. **Refactoring:** - Reorganized database schema with new tables for custom fields, automation rules, and more. - modularized API routes and library functions. **Chores:** - Updated dependencies (aws-sdk, drizzle-orm, lucide-react). - Added comprehensive scripts for maintenance and testing.
1 parent ea038be commit 82c058c

348 files changed

Lines changed: 43408 additions & 2384 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.astro/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"_variables": {
3-
"lastUpdateCheck": 1769015135620
3+
"lastUpdateCheck": 1770408834603
44
}
55
}

.env.example

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ SESSION_SECRET=change-this-session-secret-too
5252
# This secret protects git hooks from unauthorized access
5353
# Generate with: openssl rand -hex 32
5454
INTERNAL_HOOK_SECRET=change-this-internal-hook-secret-in-production
55+
# CRITICAL: Secret for cron endpoints (gc, mirror sync, etc.)
56+
# Generate with: openssl rand -hex 32
57+
CRON_SECRET=change-this-cron-secret-in-production
58+
# CRITICAL: Encryption key for sensitive config blobs (AI provider keys, etc.)
59+
# Generate with: openssl rand -hex 32
60+
AI_CONFIG_ENCRYPTION_KEY=change-this-ai-config-encryption-key-in-production
5561

5662
# OAuth Providers (optional)
5763
OAUTH_GOOGLE_CLIENT_ID=
@@ -100,6 +106,9 @@ RUNNER_WORKSPACE_PATH=./data/runner/workspaces
100106
RUNNER_ARTIFACTS_PATH=./data/runner/artifacts
101107
RUNNER_CONCURRENT_JOBS=2
102108
RUNNER_TIMEOUT=3600
109+
# CRITICAL: Secret shared between server and runners. Must be the same.
110+
# Generate with: openssl rand -hex 32
111+
RUNNER_SECRET=change-this-runner-secret-in-production
103112

104113
# Email Configuration (optional)
105114
SMTP_HOST=
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
name: Sync Roadmap Issues
2+
3+
on:
4+
workflow_dispatch:
5+
push:
6+
paths:
7+
- github-roadmap-issues.json
8+
- .github/workflows/sync-roadmap-issues.yml
9+
10+
permissions:
11+
contents: read
12+
issues: write
13+
14+
jobs:
15+
sync:
16+
runs-on: ubuntu-latest
17+
steps:
18+
- name: Checkout
19+
uses: actions/checkout@v4
20+
21+
- name: Create Missing Roadmap Issues
22+
uses: actions/github-script@v7
23+
with:
24+
script: |
25+
const fs = require('node:fs');
26+
const path = require('node:path');
27+
28+
const issuesPath = path.join(process.env.GITHUB_WORKSPACE, 'github-roadmap-issues.json');
29+
const payload = JSON.parse(fs.readFileSync(issuesPath, 'utf8'));
30+
31+
const owner = context.repo.owner;
32+
const repo = context.repo.repo;
33+
34+
const labelColors = {
35+
'roadmap/ws1': '0e8a16',
36+
'roadmap/ws2': '1d76db',
37+
'roadmap/ws3': 'b60205',
38+
'roadmap/ws4': '5319e7',
39+
'roadmap/ws5': 'fbca04',
40+
'roadmap/ws6': '0052cc',
41+
'status/partial': 'fbca04',
42+
'status/missing': 'd93f0b',
43+
'priority/high': 'b60205',
44+
'priority/medium': 'fbca04',
45+
'priority/low': '0e8a16',
46+
'docs-required': '0052cc',
47+
};
48+
49+
const ensureLabel = async (name) => {
50+
try {
51+
await github.rest.issues.getLabel({ owner, repo, name });
52+
} catch (error) {
53+
if (error.status !== 404) throw error;
54+
await github.rest.issues.createLabel({
55+
owner,
56+
repo,
57+
name,
58+
color: labelColors[name] || '6e7781',
59+
});
60+
}
61+
};
62+
63+
const existingIssues = await github.paginate(github.rest.issues.listForRepo, {
64+
owner,
65+
repo,
66+
state: 'all',
67+
per_page: 100,
68+
});
69+
70+
const existingTitleSet = new Set(
71+
existingIssues
72+
.filter((issue) => !issue.pull_request)
73+
.map((issue) => issue.title)
74+
);
75+
76+
let created = 0;
77+
let skipped = 0;
78+
79+
for (const item of payload) {
80+
if (existingTitleSet.has(item.title)) {
81+
skipped += 1;
82+
continue;
83+
}
84+
85+
for (const label of item.labels) {
86+
await ensureLabel(label);
87+
}
88+
89+
await github.rest.issues.create({
90+
owner,
91+
repo,
92+
title: item.title,
93+
body: item.body,
94+
labels: item.labels,
95+
});
96+
97+
created += 1;
98+
}
99+
100+
core.notice(`Roadmap issue sync complete. Created: ${created}, Skipped existing: ${skipped}`);

.gitignore

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,16 @@ coverage/
3434
tmp/
3535
temp/
3636
*.tmp
37+
*_debug.txt
38+
*_output.txt
39+
*_report.txt
40+
lint_output*
41+
lint_report*
42+
cookies.txt
43+
fix_get_calls.sh
44+
45+
# Artifacts
46+
pci/
3747

3848
# SSH keys (generated)
3949
*.pem
@@ -49,4 +59,3 @@ drizzle/meta/
4959
# Monaco Editor cache
5060
.monaco/
5161
.vercel
52-
scripts/

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,17 @@ Click buttons to:
611611
- Add to merge queue
612612
- View full PR
613613

614+
#### Discord & Microsoft Teams
615+
616+
OpenCodeHub also supports incoming webhooks for Discord and Microsoft Teams.
617+
618+
**Setup:**
619+
1. **Repository → Settings → Webhooks**
620+
2. Create a new webhook
621+
3. Select **Discord** or **Microsoft Teams** as the type
622+
4. Paste your webhook URL
623+
5. Select triggers (PR events, Push events, etc.)
624+
614625
---
615626

616627
## 💡 Workflow Examples
@@ -740,6 +751,10 @@ INTERNAL_HOOK_SECRET=<run: openssl rand -hex 32>
740751
SITE_URL=https://your-domain.com # Must be HTTPS in production
741752
PORT=3000
742753
HOST=0.0.0.0
754+
755+
# CI/CD Runner Security (CRITICAL)
756+
# Must match the secret used by your runners
757+
RUNNER_SECRET=<run: openssl rand -hex 32>
743758
```
744759

745760
### Database Configuration

0 commit comments

Comments
 (0)