Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
e57549c
feat(ui): add React Query foundation and provider setup
Shironex Jan 15, 2026
2bc931a
feat(ui): add React Query hooks for data fetching
Shironex Jan 15, 2026
8456741
feat(ui): add React Query mutation hooks
Shironex Jan 15, 2026
d81997d
feat(ui): add WebSocket event to React Query cache bridge
Shironex Jan 15, 2026
d08ef47
feat(ui): add shared skeleton component and update CLI status
Shironex Jan 15, 2026
3411256
refactor(ui): migrate board view to React Query
Shironex Jan 15, 2026
d1219a2
refactor(ui): migrate worktree panel to React Query
Shironex Jan 15, 2026
c4e0a7c
refactor(ui): migrate GitHub views to React Query
Shironex Jan 15, 2026
20caa42
refactor(ui): migrate settings view to React Query
Shironex Jan 15, 2026
5fe7bcd
refactor(ui): migrate usage popovers and running agents to React Query
Shironex Jan 15, 2026
c2fed78
refactor(ui): migrate remaining components to React Query
Shironex Jan 15, 2026
9dbec72
fix: package lock file
Shironex Jan 15, 2026
3170e22
fix(ui): add missing cache invalidation for React Query
Shironex Jan 15, 2026
361cb06
fix(ui): improve React Query hooks and fix edge cases
Shironex Jan 15, 2026
4cd84a4
fix: add API proxy to Vite dev server for web mode CORS
DhanushSantosh Jan 17, 2026
7eae021
chore: update package-lock.json
DhanushSantosh Jan 17, 2026
4186b80
fix: use relative URLs in web mode to leverage Vite proxy
DhanushSantosh Jan 17, 2026
b8875f7
fix: improve CORS configuration to handle localhost and private IPs
DhanushSantosh Jan 17, 2026
e10cb83
debug: add CORS logging to diagnose origin rejection
DhanushSantosh Jan 17, 2026
b0b4976
fix: add localhost to CORS_ORIGIN for web mode development
DhanushSantosh Jan 17, 2026
fdad82b
fix: enable WebSocket proxying in Vite dev server
DhanushSantosh Jan 17, 2026
a7f7898
fix: persist session token to localStorage for web mode page reload s…
DhanushSantosh Jan 17, 2026
174c02c
fix: automatically remove projects with non-existent paths
DhanushSantosh Jan 17, 2026
2a8706e
fix: add session token to image URLs for web mode authentication
DhanushSantosh Jan 17, 2026
b66efae
fix: sync projects immediately instead of debouncing
DhanushSantosh Jan 17, 2026
9137f0e
fix: keep localStorage cache in sync with server settings
DhanushSantosh Jan 17, 2026
7b7ac72
fix: use shared data directory for Electron and web modes
DhanushSantosh Jan 17, 2026
832d10e
refactor: replace Loader2 with Spinner component across the application
webdevcody Jan 17, 2026
5b1e010
refactor: standardize PR state representation across the application
Shironex Jan 17, 2026
44e665f
fix: adress pr comments
Shironex Jan 17, 2026
327aef8
Merge pull request #562 from AutoMaker-Org/feature/v0.12.0rc-17686889…
Shironex Jan 18, 2026
484d4c6
fix: use shared data directory for Electron and web modes
DhanushSantosh Jan 18, 2026
f378122
fix: resolve data directory persistence between Electron and Web modes
DhanushSantosh Jan 18, 2026
2e57553
Merge remote-tracking branch 'upstream/v0.13.0rc' into patchcraft
DhanushSantosh Jan 18, 2026
505a2b1
docs: enhance docstrings to reach 80% coverage threshold
DhanushSantosh Jan 18, 2026
ef2dcba
fix: improve project-switcher data-testid for uniqueness and special …
stefandevo Jan 18, 2026
980006d
fix: use setItem helper and safer Playwright selector in tests
DhanushSantosh Jan 18, 2026
1ede7e7
refactor: extract sanitizeForTestId to shared utility
stefandevo Jan 18, 2026
0c053da
Merge pull request #578 from stefandevo/fix/v0.13.0rc-e2e-ci
DhanushSantosh Jan 18, 2026
7795d81
merge: resolve conflicts with upstream/v0.13.0rc
DhanushSantosh Jan 18, 2026
f68aee6
fix: prevent response disposal race condition in E2E test
DhanushSantosh Jan 18, 2026
96202d4
Merge pull request #573 from DhanushSantosh/patchcraft
DhanushSantosh Jan 18, 2026
8ab9dc5
fix: use user's terminal font settings for dev server logs
stefandevo Jan 18, 2026
75fe579
fix: prevent new projects from overriding global theme setting
stefandevo Jan 18, 2026
eb30ef7
fix: prevent response disposal race condition in E2E test
stefandevo Jan 18, 2026
b6cb926
fix: also remove theme calculation from dashboard-view
stefandevo Jan 18, 2026
dd26de9
fix: add authentication validation to image endpoint for web mode
DhanushSantosh Jan 18, 2026
749fb3a
fix: add token query parameter support to auth middleware for web mod…
DhanushSantosh Jan 18, 2026
da80729
feat: implement migration of settings from legacy Electron userData d…
webdevcody Jan 18, 2026
d0eaf0e
feat: enhance migration process to copy entire data directory from le…
webdevcody Jan 18, 2026
3faebfa
refactor: update migration process to selectively copy specific appli…
webdevcody Jan 18, 2026
1c1d9d3
Merge pull request #583 from stefandevo/fix/initial-theme
webdevcody Jan 18, 2026
af95dae
Merge pull request #574 from stefandevo/fix/v0.13.0rc
webdevcody Jan 18, 2026
c465219
feat: add three viewing modes for app specification (#566)
stefandevo Jan 18, 2026
55a34a9
feat: add auto-login for dev mode and fix log box formatting (#567)
stefandevo Jan 18, 2026
4b0d139
feat: implement cursor model migration and enhance auto mode function…
webdevcody Jan 18, 2026
d6300f3
fix: skip PR assignment for main worktree and refine metadata fallbac…
Shironex Jan 18, 2026
09151aa
Merge pull request #590 from AutoMaker-Org/automode-api
webdevcody Jan 18, 2026
e73c92b
Merge pull request #582 from stefandevo/fix/e2e-response-disposal-race
Shironex Jan 19, 2026
a52c046
feat: add external terminal support with cross-platform detection (#565)
stefandevo Jan 19, 2026
63b8eb0
chore: refresh package-lock
DhanushSantosh Jan 19, 2026
f987fc1
Merge branch 'v0.13.0rc' into feat/react-query
Shironex Jan 19, 2026
9bb52f1
perf(ui): smooth large lists and graphs
DhanushSantosh Jan 19, 2026
2fac2ca
Fix opencode auth error mapping and perf containment
DhanushSantosh Jan 19, 2026
d97c4b7
feat: unified Claude API key and profile system with z.AI, MiniMax, O…
stefandevo Jan 19, 2026
ea3930c
fix: convert OpenCode model format to CLI slash format (#605)
stefandevo Jan 19, 2026
0d92594
fix: prevent refresh button from overlapping close button in Dev Serv…
stefandevo Jan 19, 2026
82e22b4
feat: enhance auto mode functionality with worktree support
webdevcody Jan 19, 2026
d7f6e72
Merge branch 'v0.13.0rc' of github.com:AutoMaker-Org/automaker into v…
webdevcody Jan 19, 2026
43481c2
refactor: sanitize featureId for worktree paths across multiple handlers
webdevcody Jan 19, 2026
02a7a54
feat: auto-discover available ports when defaults are in use (#614)
stefandevo Jan 19, 2026
b039b74
feat: add discard changes functionality for worktrees
webdevcody Jan 19, 2026
5119ee4
Merge branch 'v0.13.0rc' of github.com:AutoMaker-Org/automaker into v…
webdevcody Jan 19, 2026
17d42e7
feat: enhance ANSI code stripping in ClaudeUsageService
webdevcody Jan 19, 2026
628e464
feat: update branch handling and UI components for worktree management
webdevcody Jan 19, 2026
d266c98
feat: add option to disable authentication for local/trusted networks
webdevcody Jan 19, 2026
47e6ed6
feat: add publish option to package.json for UI application
webdevcody Jan 19, 2026
cf60f84
Merge remote-tracking branch 'upstream/v0.13.0rc' into feat/react-query
DhanushSantosh Jan 20, 2026
a863dcc
fix(ui): handle review feedback
DhanushSantosh Jan 20, 2026
8c356d7
fix(ui): sync updated feature query
DhanushSantosh Jan 20, 2026
179c5ae
Merge pull request #499 from AutoMaker-Org/feat/react-query
DhanushSantosh Jan 20, 2026
76eb3a2
apply the patches
webdevcody Jan 20, 2026
8dd5858
docs: add SECURITY_TODO.md outlining critical security vulnerabilitie…
webdevcody Jan 20, 2026
c14a40f
Merge pull request #626 from AutoMaker-Org/include-the-patches
webdevcody Jan 20, 2026
2ab78dd
chore: update package-lock.json and enhance kanban-board component im…
webdevcody Jan 20, 2026
8facdc6
feat: enhance auto mode service and UI components for branch handling…
webdevcody Jan 20, 2026
a1f234c
feat: Claude Compatible Providers System (#629)
stefandevo Jan 20, 2026
47a6033
fix(opencode-provider): correct z.ai coding plan model mapping (#625)
USerik Jan 20, 2026
4f584f9
fix(ui): bulk update cache invalidation and model dropdown display (#…
stefandevo Jan 20, 2026
69ff8df
feat(ui): enhance BoardBackgroundModal with local state management fo…
Shironex Jan 20, 2026
900a312
fix(ui): add HMR fallback for FileBrowserContext to prevent crashes d…
Shironex Jan 20, 2026
3bde3d2
Merge branch 'main' into v0.13.0rc
webdevcody Jan 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,4 +172,5 @@ Use `resolveModelString()` from `@automaker/model-resolver` to convert model ali
- `DATA_DIR` - Data storage directory (default: ./data)
- `ALLOWED_ROOT_DIRECTORY` - Restrict file operations to specific directory
- `AUTOMAKER_MOCK_AGENT=true` - Enable mock agent mode for CI testing
- `AUTOMAKER_AUTO_LOGIN=true` - Skip login prompt in development (disabled when NODE_ENV=production)
- `VITE_HOSTNAME` - Hostname for frontend API URLs (default: localhost)
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,7 @@ npm run lint
- `VITE_SKIP_ELECTRON` - Skip Electron in dev mode
- `OPEN_DEVTOOLS` - Auto-open DevTools in Electron
- `AUTOMAKER_SKIP_SANDBOX_WARNING` - Skip sandbox warning dialog (useful for dev/CI)
- `AUTOMAKER_AUTO_LOGIN=true` - Skip login prompt in development (ignored when NODE_ENV=production)

### Authentication Setup

Expand Down
300 changes: 300 additions & 0 deletions SECURITY_TODO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,300 @@
# Security Audit Findings - v0.13.0rc Branch

**Date:** $(date)
**Audit Type:** Git diff security review against v0.13.0rc branch
**Status:** ⚠️ Security vulnerabilities found - requires fixes before release

## Executive Summary

No intentionally malicious code was detected in the changes. However, several **critical security vulnerabilities** were identified that could allow command injection attacks. These must be fixed before release.

---

## 🔴 Critical Security Issues

### 1. Command Injection in Merge Handler

**File:** `apps/server/src/routes/worktree/routes/merge.ts`
**Lines:** 43, 54, 65-66, 93
**Severity:** CRITICAL

**Issue:**
User-controlled inputs (`branchName`, `mergeTo`, `options?.message`) are directly interpolated into shell commands without validation, allowing command injection attacks.

**Vulnerable Code:**

```typescript
// Line 43 - branchName not validated
await execAsync(`git rev-parse --verify ${branchName}`, { cwd: projectPath });

// Line 54 - mergeTo not validated
await execAsync(`git rev-parse --verify ${mergeTo}`, { cwd: projectPath });

// Lines 65-66 - branchName and message not validated
const mergeCmd = options?.squash
? `git merge --squash ${branchName}`
: `git merge ${branchName} -m "${options?.message || `Merge ${branchName} into ${mergeTo}`}"`;

// Line 93 - message not sanitized
await execAsync(`git commit -m "${options?.message || `Merge ${branchName} (squash)`}"`, {
cwd: projectPath,
});
```

**Attack Vector:**
An attacker could inject shell commands via branch names or commit messages:

- Branch name: `main; rm -rf /`
- Commit message: `"; malicious_command; "`

**Fix Required:**

1. Validate `branchName` and `mergeTo` using `isValidBranchName()` before use
2. Sanitize commit messages or use `execGitCommand` with proper escaping
3. Replace `execAsync` template literals with `execGitCommand` array-based calls

**Note:** `isValidBranchName` is imported but only used AFTER deletion (line 119), not before execAsync calls.

---

### 2. Command Injection in Push Handler

**File:** `apps/server/src/routes/worktree/routes/push.ts`
**Lines:** 44, 49
**Severity:** CRITICAL

**Issue:**
User-controlled `remote` parameter and `branchName` are directly interpolated into shell commands without validation.

**Vulnerable Code:**

```typescript
// Line 38 - remote defaults to 'origin' but not validated
const targetRemote = remote || 'origin';

// Lines 44, 49 - targetRemote and branchName not validated
await execAsync(`git push -u ${targetRemote} ${branchName} ${forceFlag}`, {
cwd: worktreePath,
});
await execAsync(`git push --set-upstream ${targetRemote} ${branchName} ${forceFlag}`, {
cwd: worktreePath,
});
```

**Attack Vector:**
An attacker could inject commands via the remote name:

- Remote: `origin; malicious_command; #`

**Fix Required:**

1. Validate `targetRemote` parameter (alphanumeric + `-`, `_` only)
2. Validate `branchName` before use (even though it comes from git output)
3. Use `execGitCommand` with array arguments instead of template literals

---

### 3. Unsafe Environment Variable Export in Shell Script

**File:** `start-automaker.sh`
**Lines:** 5068, 5085
**Severity:** CRITICAL

**Issue:**
Unsafe parsing and export of `.env` file contents using `xargs` without proper handling of special characters.

**Vulnerable Code:**

```bash
export $(grep -v '^#' .env | xargs)
```

**Attack Vector:**
If `.env` file contains malicious content with spaces, special characters, or code, it could be executed:

- `.env` entry: `VAR="value; malicious_command"`
- Could lead to code execution during startup

**Fix Required:**
Replace with safer parsing method:

```bash
# Safer approach
set -a
source <(grep -v '^#' .env | sed 's/^/export /')
set +a

# Or even safer - validate each line
while IFS= read -r line; do
[[ "$line" =~ ^[[:space:]]*# ]] && continue
[[ -z "$line" ]] && continue
if [[ "$line" =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then
export "${BASH_REMATCH[1]}"="${BASH_REMATCH[2]}"
fi
done < .env
```

---

## 🟡 Moderate Security Concerns

### 4. Inconsistent Use of Secure Command Execution

**Issue:**
The codebase has `execGitCommand()` function available (which uses array arguments and is safer), but it's not consistently used. Some places still use `execAsync` with template literals.

**Files Affected:**

- `apps/server/src/routes/worktree/routes/merge.ts`
- `apps/server/src/routes/worktree/routes/push.ts`

**Recommendation:**

- Audit all `execAsync` calls with template literals
- Replace with `execGitCommand` where possible
- Document when `execAsync` is acceptable (only with fully validated inputs)

---

### 5. Missing Input Validation

**Issues:**

1. `targetRemote` in `push.ts` defaults to 'origin' but isn't validated
2. Commit messages in `merge.ts` aren't sanitized before use in shell commands
3. `worktreePath` validation relies on middleware but should be double-checked

**Recommendation:**

- Add validation functions for remote names
- Sanitize commit messages (remove shell metacharacters)
- Add defensive validation even when middleware exists

---

## ✅ Positive Security Findings

1. **No Hardcoded Credentials:** No API keys, passwords, or tokens found in the diff
2. **No Data Exfiltration:** No suspicious network requests or data transmission patterns
3. **No Backdoors:** No hidden functionality or unauthorized access patterns detected
4. **Safe Command Execution:** `execGitCommand` function properly uses array arguments in some places
5. **Environment Variable Handling:** `init-script-service.ts` properly sanitizes environment variables (lines 194-220)

---

## 📋 Action Items

### Immediate (Before Release)

- [ ] **Fix command injection in `merge.ts`**
- [ ] Validate `branchName` with `isValidBranchName()` before line 43
- [ ] Validate `mergeTo` with `isValidBranchName()` before line 54
- [ ] Sanitize commit messages or use `execGitCommand` for merge commands
- [ ] Replace `execAsync` template literals with `execGitCommand` array calls

- [ ] **Fix command injection in `push.ts`**
- [ ] Add validation function for remote names
- [ ] Validate `targetRemote` before use
- [ ] Validate `branchName` before use (defensive programming)
- [ ] Replace `execAsync` template literals with `execGitCommand`

- [ ] **Fix shell script security issue**
- [ ] Replace unsafe `export $(grep ... | xargs)` with safer parsing
- [ ] Add validation for `.env` file contents
- [ ] Test with edge cases (spaces, special chars, quotes)

### Short-term (Next Sprint)

- [ ] **Audit all `execAsync` calls**
- [ ] Create inventory of all `execAsync` calls with template literals
- [ ] Replace with `execGitCommand` where possible
- [ ] Document exceptions and why they're safe

- [ ] **Add input validation utilities**
- [ ] Create `isValidRemoteName()` function
- [ ] Create `sanitizeCommitMessage()` function
- [ ] Add validation for all user-controlled inputs

- [ ] **Security testing**
- [ ] Add unit tests for command injection prevention
- [ ] Add integration tests with malicious inputs
- [ ] Test shell script with malicious `.env` files

### Long-term (Security Hardening)

- [ ] **Code review process**
- [ ] Add security checklist for PR reviews
- [ ] Require security review for shell command execution changes
- [ ] Add automated security scanning

- [ ] **Documentation**
- [ ] Document secure coding practices for shell commands
- [ ] Create security guidelines for contributors
- [ ] Add security section to CONTRIBUTING.md

---

## 🔍 Testing Recommendations

### Command Injection Tests

```typescript
// Test cases for merge.ts
describe('merge handler security', () => {
it('should reject branch names with shell metacharacters', () => {
// Test: branchName = "main; rm -rf /"
// Expected: Validation error, command not executed
});

it('should sanitize commit messages', () => {
// Test: message = '"; malicious_command; "'
// Expected: Sanitized or rejected
});
});

// Test cases for push.ts
describe('push handler security', () => {
it('should reject remote names with shell metacharacters', () => {
// Test: remote = "origin; malicious_command; #"
// Expected: Validation error, command not executed
});
});
```

### Shell Script Tests

```bash
# Test with malicious .env content
echo 'VAR="value; echo PWNED"' > test.env
# Expected: Should not execute the command

# Test with spaces in values
echo 'VAR="value with spaces"' > test.env
# Expected: Should handle correctly

# Test with special characters
echo 'VAR="value\$with\$dollars"' > test.env
# Expected: Should handle correctly
```

---

## 📚 References

- [OWASP Command Injection](https://owasp.org/www-community/attacks/Command_Injection)
- [Node.js Child Process Security](https://nodejs.org/api/child_process.html#child_process_security_concerns)
- [Shell Script Security Best Practices](https://mywiki.wooledge.org/BashGuide/Practices)

---

## Notes

- All findings are based on code diff analysis
- No runtime testing was performed
- Assumes attacker has access to API endpoints (authenticated or unauthenticated)
- Fixes should be tested thoroughly before deployment

---

**Last Updated:** $(date)
**Next Review:** After fixes are implemented
8 changes: 8 additions & 0 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

- Setting the default model does not seem like it works.

# Performance (completed)

- [x] Graph performance mode for large graphs (compact nodes/edges + visible-only rendering)
- [x] Render containment on heavy scroll regions (kanban columns, chat history)
- [x] Reduce blur/shadow effects when lists get large
- [x] React Query tuning for heavy datasets (less refetch on focus/reconnect)
- [x] DnD/list rendering optimizations (virtualized kanban + memoized card sections)

# UX

- Consolidate all models to a single place in the settings instead of having AI profiles and all this other stuff
Expand Down
Loading