Skip to content
Draft
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
932cb80
feat(beads): add backend API routes for beads issue tracker
Feb 22, 2026
b9a2c77
fix: make installation status endpoints public and register beads routes
Feb 22, 2026
2c6a3b5
feat(beads): add BeadsContext for state management
Feb 22, 2026
142dc2c
fix: prevent infinite loop in TaskMasterContext
Feb 22, 2026
27c1ad3
feat(beads): add beads installation check to settings context
Feb 22, 2026
e052560
feat(beads): add BeadsPanel with epics and dependencies view
Feb 22, 2026
1c8c5ae
feat(beads): add beads tab to main content area
Feb 22, 2026
b7ad7dd
feat(beads): integrate BeadsProvider in app
Feb 22, 2026
7b25148
i18n: add beads tab translation
Feb 22, 2026
2dbd901
added ignore for beads
Feb 22, 2026
1e28b63
reincluded gitattributes
Feb 22, 2026
87c8d5a
(fix) Command injection via shell: true — user-controlled input is pa…
Feb 22, 2026
c23a697
(fix) Epic expansion always shows "No children yet" — children are ne…
Feb 22, 2026
a636de3
fix: add missing api.post, api.put, api.delete methods to api utility
Feb 22, 2026
3495a9d
fix: use local variables for installation check condition in TasksSet…
Feb 22, 2026
4a762e2
fix: add configurable timeout to runBeadsCommand to prevent hanging p…
Feb 22, 2026
a985676
fix: prevent negative limit values from removing items in issues list
Feb 22, 2026
4b58bb1
Merge branch 'main' into main
tcsenpai Feb 22, 2026
769684d
Merge branch 'main' of https://github.com/siteboon/claudecodeui
Feb 23, 2026
6bf866c
chore: ignore repository semantic map
Feb 23, 2026
b2774ba
(enhancement) added parser for <INSTRUCTIONS> tag
Feb 23, 2026
c051152
Merge remote-tracking branch 'upstream'
Feb 23, 2026
d49e5b2
Update src/components/chat/utils/messageTransforms.ts
tcsenpai Feb 24, 2026
3e74b49
Merge branch 'main' into main
tcsenpai Feb 24, 2026
306680e
Merge branch 'main' into main
blackmammoth Feb 26, 2026
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
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

# Use bd merge for beads JSONL files
.beads/issues.jsonl merge=beads
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,8 @@ dev-debug.log
# Task files
tasks.json
tasks/
/.beads
/PROJECT_INDEX.md
/bun.lock
/PROJECT_INDEX.json
/AGENTS.md
46 changes: 46 additions & 0 deletions server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ import projectsRoutes, { WORKSPACES_ROOT, validateWorkspacePath } from './routes
import cliAuthRoutes from './routes/cli-auth.js';
import userRoutes from './routes/user.js';
import codexRoutes from './routes/codex.js';
import beadsRoutes from './routes/beads.js';
import { initializeDatabase } from './database/db.js';
import { validateApiKey, authenticateToken, authenticateWebSocket } from './middleware/auth.js';
import { IS_PLATFORM } from './constants/config.js';
Expand Down Expand Up @@ -343,6 +344,48 @@ app.use('/api', validateApiKey);
// Authentication routes (public)
app.use('/api/auth', authRoutes);

// Public routes for installation status checks (no auth required)
app.get('/api/taskmaster/installation-status', async (req, res) => {
try {
const { checkTaskMasterInstallation } = await import('./routes/taskmaster.js');
const installationStatus = await checkTaskMasterInstallation();
const mcpStatus = { hasMCPServer: false };
res.json({
success: true,
installation: installationStatus,
mcpServer: mcpStatus,
isReady: installationStatus.isInstalled
});
} catch (error) {
res.status(500).json({
success: false,
error: 'Failed to check TaskMaster installation status',
installation: { isInstalled: false, reason: `Server error: ${error.message}` },
mcpServer: { hasMCPServer: false },
isReady: false
});
}
});

app.get('/api/beads/installation-status', async (req, res) => {
try {
const { checkBeadsInstallation } = await import('./routes/beads.js');
const installationStatus = await checkBeadsInstallation();
res.json({
success: true,
installation: installationStatus,
isReady: installationStatus.isInstalled
});
} catch (error) {
res.status(500).json({
success: false,
error: 'Failed to check Beads installation status',
installation: { isInstalled: false, reason: `Server error: ${error.message}` },
isReady: false
});
}
});

// Projects API Routes (protected)
app.use('/api/projects', authenticateToken, projectsRoutes);

Expand Down Expand Up @@ -376,6 +419,9 @@ app.use('/api/user', authenticateToken, userRoutes);
// Codex API Routes (protected)
app.use('/api/codex', authenticateToken, codexRoutes);

// Beads API Routes (protected)
app.use('/api/beads', authenticateToken, beadsRoutes);

// Agent API Routes (uses API key authentication)
app.use('/api/agent', agentRoutes);

Expand Down
Loading