Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
17e141b
feat: working version of integrations framework
Marfuen Dec 2, 2025
32f68c6
feat: make integrations more robust
Marfuen Dec 2, 2025
0fcfeef
feat(google-workspace): add integration manifest and checks for Googl…
Marfuen Dec 2, 2025
5c994b3
feat(integration-platform): add custom settings to OAuth app and plat…
Marfuen Dec 3, 2025
78562bb
feat(integration-platform): add Google Workspace sync functionality a…
Marfuen Dec 3, 2025
45b6d46
feat(integration-platform): add scheduled task for syncing employees …
Marfuen Dec 3, 2025
97e37dc
feat(integration-platform): add AWS SDK clients and update integratio…
Marfuen Dec 3, 2025
44c5371
refactor(integration-platform): integrate AWS Security Hub and update…
Marfuen Dec 3, 2025
c88356e
feat(integration-platform): add Rippling integration for employee syn…
Marfuen Dec 3, 2025
dbe64d2
feat(integration-platform): implement employee sync provider manageme…
Marfuen Dec 3, 2025
42331ca
feat(integration-platform): add employee access review check for Goog…
Marfuen Dec 3, 2025
be2f0df
chore: merge main into release for new releases
Marfuen Dec 4, 2025
2de8e21
feat(gcp): add GCP integration with IAM access and monitoring checks
Marfuen Dec 4, 2025
8046aaf
Merge branch 'mariano/integrations-architecture' of https://github.co…
Marfuen Dec 4, 2025
99ae6b5
feat(gcp): add GCP integration with IAM access and monitoring checks
Marfuen Dec 4, 2025
a3f0e0a
feat: working version of integrations framework
Marfuen Dec 2, 2025
16eb04f
feat: make integrations more robust
Marfuen Dec 2, 2025
197ab73
feat(google-workspace): add integration manifest and checks for Googl…
Marfuen Dec 2, 2025
900ff14
feat(integration-platform): add custom settings to OAuth app and plat…
Marfuen Dec 3, 2025
b164e09
feat(integration-platform): add Google Workspace sync functionality a…
Marfuen Dec 3, 2025
21b3009
feat(integration-platform): add scheduled task for syncing employees …
Marfuen Dec 3, 2025
064ea3a
feat(integration-platform): add AWS SDK clients and update integratio…
Marfuen Dec 3, 2025
f24e97e
refactor(integration-platform): integrate AWS Security Hub and update…
Marfuen Dec 3, 2025
f2b50e0
feat(integration-platform): add Rippling integration for employee syn…
Marfuen Dec 3, 2025
56a94fe
feat(integration-platform): implement employee sync provider manageme…
Marfuen Dec 3, 2025
38e6f75
feat(integration-platform): add employee access review check for Goog…
Marfuen Dec 3, 2025
6dbe9ca
Merge branch 'mariano/integrations-architecture' of https://github.co…
Marfuen Dec 4, 2025
a3907fe
chore: remove deprecated vector tasks and update openapi.json
Marfuen Dec 5, 2025
bf2e782
Merge branch 'main' of https://github.com/trycompai/comp into mariano…
Marfuen Dec 5, 2025
78858d1
feat(integration-platform): add Azure integration with credential man…
Marfuen Dec 5, 2025
4383934
feat(integrations): unify integrations list and add task card component
Marfuen Dec 5, 2025
c386831
feat(integration-platform): add auto-check runner service and related…
Marfuen Dec 5, 2025
1ed19b8
feat(integration-platform): implement GCP OAuth integration with cred…
Marfuen Dec 8, 2025
e132c34
feat(integrations): add combobox support for credential fields and up…
Marfuen Dec 8, 2025
44e4567
Merge branch 'main' of https://github.com/trycompai/comp into mariano…
Marfuen Dec 8, 2025
7f788c3
refactor(db): fix integrations order
Marfuen Dec 8, 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
38 changes: 38 additions & 0 deletions .cursor/rules/after-changes.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
description: Always run typecheck and lint after making code changes
globs: **/*.{ts,tsx}
alwaysApply: true
---

# After Code Changes

After making any code changes, **always run these checks**:

```bash
# TypeScript type checking
bun run typecheck

# ESLint linting
bun run lint
```

## Fix Errors Before Committing

If either check fails:

1. Fix all TypeScript errors first (they break the build)
2. Fix ESLint errors/warnings
3. Re-run checks until both pass
4. Only then commit or deploy

## Common TypeScript Fixes

- **Property does not exist**: Check interface/type definitions, ensure correct property names
- **Type mismatch**: Verify the expected type vs actual type being passed
- **Empty interface extends**: Use `type X = SomeType` instead of `interface X extends SomeType {}`

## Common ESLint Fixes

- **Unused variables**: Remove or prefix with `_`
- **Any type**: Add proper typing
- **Empty object type**: Use `type` instead of `interface` for type aliases
28 changes: 0 additions & 28 deletions .cursor/rules/better-auth.mdc

This file was deleted.

186 changes: 186 additions & 0 deletions .cursor/rules/code-standards.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
---
description: General code quality standards and file size limits
globs: **/*.{ts,tsx}
alwaysApply: true
---

# Code Standards

## File Size Limits

**Files must not exceed 300 lines.** When a file approaches this limit, split it.

### ✅ How to Split Large Files

```
# Before: One 400-line file
components/TaskList.tsx (400 lines)

# After: Multiple focused files
components/
├── TaskList.tsx # Main component (~100 lines)
├── TaskListItem.tsx # Individual item (~80 lines)
├── TaskListFilters.tsx # Filter controls (~60 lines)
└── TaskListEmpty.tsx # Empty state (~40 lines)
```

### Splitting Strategies

| File Type | Split By |
| --------- | -------------------------------------------- |
| Component | Extract sub-components, hooks, utils |
| Hook | Extract helper functions, split by concern |
| Utils | Group by domain (dates, strings, validation) |
| Types | Split by entity (Task, User, Organization) |

### ❌ Warning Signs

```tsx
// ❌ File is too long
// TaskList.tsx - 450 lines with inline helpers, multiple components

// ❌ Multiple components in one file
export function TaskList() { ... }
export function TaskCard() { ... } // Should be separate file
export function TaskBadge() { ... } // Should be separate file
```

## Code Quality

### ✅ Always Do This

```tsx
// Early returns for readability
function processTask(task: Task | null) {
if (!task) return null;
if (task.deleted) return null;

return <TaskCard task={task} />;
}

// Descriptive names
const handleTaskComplete = (taskId: string) => { ... };
const isTaskOverdue = (task: Task) => task.dueDate < new Date();

// Const arrow functions with types
const formatDate = (date: Date): string => {
return date.toLocaleDateString();
};
```

### ❌ Never Do This

```tsx
// No early returns - deeply nested
function processTask(task) {
if (task) {
if (!task.deleted) {
return <TaskCard task={task} />;
}
}
return null;
}

// Vague names
const handleClick = () => { ... }; // Click on what?
const data = fetchStuff(); // What data?

// Function keyword when const works
function formatDate(date) { ... }
```

## Function Parameters

**Use named parameters (object destructuring) for functions with 2+ parameters.**

### ✅ Always Do This

```tsx
// Named parameters - clear at call site
const createTask = ({ title, assigneeId, dueDate }: CreateTaskParams) => { ... };
createTask({ title: 'Review PR', assigneeId: user.id, dueDate: tomorrow });

// Hook with options object
const useTasks = ({ organizationId, initialData }: UseTasksOptions) => { ... };
const { tasks } = useTasks({ organizationId: orgId, initialData: serverTasks });

// Component props (always named)
function TaskCard({ task, onComplete, showDetails }: TaskCardProps) { ... }
<TaskCard task={task} onComplete={handleComplete} showDetails={true} />
```

### ❌ Never Do This

```tsx
// Positional parameters - unclear at call site
const createTask = (title: string, assigneeId: string, dueDate: Date) => { ... };
createTask('Review PR', user.id, tomorrow); // What's the 2nd param?

// Multiple positional args are confusing
const formatRange = (start: Date, end: Date, format: string, timezone: string) => { ... };
formatRange(startDate, endDate, 'MM/dd', 'UTC'); // Hard to read

// Boolean positional params are the worst
fetchTasks(orgId, true, false, true); // What do these booleans mean?
```

### Exception: Single Parameter

```tsx
// Single param is fine as positional
const getTask = (taskId: string) => { ... };
const formatDate = (date: Date) => { ... };
const isOverdue = (task: Task) => { ... };
```

## Accessibility

### ✅ Always Include

```tsx
// Interactive elements need keyboard support
<div
role="button"
tabIndex={0}
onClick={handleClick}
onKeyDown={(e) => e.key === 'Enter' && handleClick()}
aria-label="Delete task"
>
<TrashIcon />
</div>

// Form inputs need labels
<label htmlFor="task-name">Task Name</label>
<input id="task-name" type="text" />

// Images need alt text
<img src={avatar} alt={`${user.name}'s avatar`} />
```

## DRY Principle

### ✅ Extract Repeated Logic

```tsx
// Before: Duplicated validation
if (email && email.includes('@') && email.length > 5) { ... }
if (email && email.includes('@') && email.length > 5) { ... }

// After: Extracted helper
const isValidEmail = (email: string) =>
email?.includes('@') && email.length > 5;

if (isValidEmail(email)) { ... }
```

## Checklist

Before committing:

- [ ] No file exceeds 300 lines
- [ ] Uses early returns for conditionals
- [ ] Variable/function names are descriptive
- [ ] Functions with 2+ params use named parameters
- [ ] Interactive elements have keyboard support
- [ ] No duplicated logic (DRY)
- [ ] Const arrow functions with types
Loading