Skip to content

feat: Add AgilePlus Agent and Worktrees modules with CRUD API and UI#1

Merged
KooshaPari merged 230 commits intomasterfrom
feat/agileplus-agents
Mar 29, 2026
Merged

feat: Add AgilePlus Agent and Worktrees modules with CRUD API and UI#1
KooshaPari merged 230 commits intomasterfrom
feat/agileplus-agents

Conversation

@KooshaPari
Copy link
Copy Markdown
Owner

@KooshaPari KooshaPari commented Mar 29, 2026

Summary

This PR adds the AgilePlus Agent and Worktrees modules to Plane.

Changes

Backend (Django)

  • Agent Model - New model with workspace relationship, status, configuration
  • AgentSerializer - JSON serialization
  • AgentViewSet - Full CRUD operations
  • API Endpoints - /api/v1/workspaces/:id/agents/

Frontend (React)

  • Extended Routes - /agents, /agents/:id, /worktrees
  • Agents Page - List view with cards, status badges
  • Create Agent Modal - Form with name, description, status
  • Agent Detail Page - Tabs: Overview, Configuration, Activity
  • Worktrees Page - AgilePlus API integration with CRUD
  • Custom Sidebar - Navigation integration

Features

  • Create agents with name, description, status
  • View agent details and configuration
  • Update agent status and configuration
  • Delete agents with confirmation
  • List and manage worktrees
  • Agent status polling

API Endpoints

Method Endpoint Description
GET /api/v1/workspaces/:id/agents/ List agents
POST /api/v1/workspaces/:id/agents/ Create agent
GET /api/v1/workspaces/:id/agents/:id/ Get agent
PATCH /api/v1/workspaces/:id/agents/:id/ Update agent
DELETE /api/v1/workspaces/:id/agents/:id/ Delete agent

Testing

Navigate to:

pratapalakshmi and others added 30 commits December 9, 2025 20:57
…own management (makeplane#8202)

* feat: enhance CustomSelect component with context for dropdown management

* refactor: streamline CustomSelect component structure and improve dropdown options rendering
…akeplane#8266)

* feat: enhance workspace settings layout and members page with new components

* refactor: update workspace settings layout and members page to use default exports

* refactor: settings layout import changes

* refactor: simplify workspaceSlug usage in settings layout
…upport (makeplane#8251)

* chore: add static files collection and update settings for static files support

* chore: add WhiteNoise middleware for static file handling

* chore(deps): upgrade WhiteNoise to version 6.11.0 and add static file reverse proxy in Caddyfile
* chore: quick actions refactor

* chore: lint fix

* chore: unified factory for actions

* chore: lint fix

* * chore: removed redundant files
* chore: updated imports

* chore: updated interfaces to types

* chore: updated undefined handling
…akeplane#8232)

* feat: add placeholderOnEmpty functionality to editor components

* Update packages/editor/src/core/extensions/placeholder.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* refactor: rename placeholderOnEmpty to showPlaceholderOnEmpty across editor components

* chore : make optional

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…#8229)

* feat: enhance clipboard functionality for markdown and HTML content

* fix: improve error handling and state management in CustomImageNodeView component

* fix: correct asset retrieval query by removing workspace filter in DuplicateAssetEndpoint

* fix: update meta tag creation in PasteAssetPlugin for clipboard HTML content

* feat: implement copyMarkdownToClipboard utility for enhanced clipboard functionality

* refactor: replace copyMarkdownToClipboard utility with copyTextToClipboard for simplified clipboard operations

* refactor: streamline clipboard operations by replacing copyTextToClipboard with copyMarkdownToClipboard in editor components

* refactor: simplify PasteAssetPlugin by removing unnecessary meta tag handling and streamlining HTML processing

* feat: implement asset duplication processing on paste for enhanced clipboard functionality

* chore:remove async from copy markdown method

* chore: add paste html

* remove:prevent default

* refactor: remove hasChanges from processAssetDuplication return type for simplified asset processing

* fix: format options-dropdown.tsx
* feat: add timezone selection to workspace onboarding, creation and settings

* refactor: remove timezone selection from workspace creation and onboarding forms
… on save (makeplane#8270)

- Added an override for the save method in ChangeTrackerMixin to store changed fields before resetting tracking.
- Implemented a new method, _reset_tracked_fields, to ensure subsequent saves detect changes relative to the last saved state.
- Updated IssueComment to utilize _changes_on_save for determining changed fields, improving accuracy in tracking modifications.
* chore: timeline chart refactor

* fix: format
…ongoDB (makeplane#8241)

* feat: enhance APITokenLogMiddleware to support logging to MongoDB

- Added functionality to log external API requests to MongoDB, with a fallback to PostgreSQL if MongoDB is unavailable.
- Implemented error handling for MongoDB connection and logging operations.
- Introduced additional fields for MongoDB logs, including timestamps and user identifiers.
- Refactored request logging logic to streamline the process and improve maintainability.

* fix: improve MongoDB availability checks in APITokenLogMiddleware

- Enhanced the logic for determining MongoDB availability by checking if the collection is not None.
- Added a check for MongoDB configuration before attempting to retrieve the collection.
- Updated error handling to ensure the middleware correctly reflects the state of MongoDB connectivity.

* feat: implement logging functionality in logger_task for API activity

- Added a new logger_task module to handle logging of API activity to MongoDB and PostgreSQL.
- Introduced functions for safely decoding request/response bodies and processing logs based on MongoDB availability.
- Refactored APITokenLogMiddleware to utilize the new logging functions, improving code organization and maintainability.

* refactor: simplify MongoDB logging in logger_task and middleware

- Removed direct dependency on MongoDB collection in log_to_mongo function, now retrieving it internally.
- Updated process_logs to check MongoDB configuration before logging, enhancing error handling.
- Cleaned up logger.py by removing unused imports related to MongoDB.

* feat: add Celery task decorator to process_logs function in logger_task

- Introduced the @shared_task decorator to the process_logs function, enabling asynchronous processing of log data.
- Updated function signature to include a return type of None for clarity.
…#8288)

* chore: Hide "Pro" Features in Community Edition

* refactor: remove time tracking feature and simplify project features list
…ync and indexed db access (makeplane#8294)

* fix: robust way to handle socket connection and read from indexeddb cache when reqd

* fix: realtime sync working with failure handling

* fix: title editor added

* merge preview into fix/realtime-sync

* check

* page renderer props

* lint errors

* lint errors

* lint errors

* sanitize html

* sanitize html

* format fix

* fix lint
…n rapid succession (makeplane#8298)

- Replace advisory lock with transaction-level lock in Issue model save method
- Updated the save method in the Issue model to use a transaction-level advisory lock for better concurrency control.
- Simplified the locking mechanism by removing the explicit unlock step, as the lock is automatically released at the end of the transaction.
- Maintained existing functionality for sequence and sort order management while improving code clarity.
* chore: upate function declarations

* chore: formatted files
Co-authored-by: Pushya Mitra Thiruvooru <pushya@Pushyas-MacBook-Pro.local>
vihar and others added 23 commits February 23, 2026 17:11
* Update README to remove Discord and add Forum link

Removed Discord badge and replaced Releases link with Forum link.

* Fix forum link in README.md
* fix: add scroll in heading layout

* chore: remove visible scroll  bar

* fix :format

* chore: fix outline scroll

* chore: fix format

* chore: fix translation

---------

Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
* fix: replace eslint with oxlint

* chore: adding max warning

* fix: formatting
…8675)

* fix: package updates

* fix: package upgrades

* fix: minimatch package vulnerabilities

* fix: ajv package vulnerabilities

* fix: lint

* fix: format
* add project summary endpoint

* update response structure
* chore: updated the logic for page version task

* chore: updated the html variable

* chore: handled the exception

* chore: changed the function name

* chore: added a custom variable
…nd info message (makeplane#7998)

* feat: enhance authentication logging with detailed error and info messages

- Added logging for various authentication events in the Adapter and its subclasses, including email validation, user existence checks, and password strength validation.
- Implemented error handling for GitHub OAuth email retrieval, ensuring proper logging of unexpected responses and missing primary emails.
- Updated logging configuration in local and production settings to include a dedicated logger for authentication events.

* chore: address copilot comments

* chore: addressed some additional comments

* chore: update log

* fix: lint
…akeplane#8657)

* chore: replace Discord references with Forum links

* chore: migrate help and community CTAs from Discord to Forum

* refactor: replace Discord icons with lucide MessageSquare

* chore: rename Discord labels and keys to Forum

* chore: remove obsolete Discord icon component

* chore: update Discord references to Forum in templates

* chore: code refactoring
After makeplane#8677 replaced ESLint with OxLint, the react-in-jsx-scope rule
was not disabled. This causes all commits touching JSX files to fail
the pre-commit hook (oxlint --deny-warnings).

React 17+ uses automatic JSX runtime so explicit React imports are
not required.

Fixes makeplane#8681
* chore: change the space folders structure

* fix: format
…akeplane#8718)

* chore: add self-hosted social icon assets for email templates

* chore: pass current_site to project invitation email context

* chore: replace mailinblue CDN icons with self-hosted static assets
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 29, 2026

Important

Review skipped

Too many files!

This PR contains 298 files, which is 148 over the limit of 150.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 4444599d-30c1-4f67-ab62-f2502938be5e

📥 Commits

Reviewing files that changed from the base of the PR and between 71210c8 and ed0a1c8.

⛔ Files ignored due to path filters (2)
  • apps/admin/app/assets/logos/oidc-logo.svg is excluded by !**/*.svg
  • apps/admin/app/assets/logos/saml-logo.svg is excluded by !**/*.svg
📒 Files selected for processing (298)
  • .github/ISSUE_TEMPLATE/--bug-report.yaml
  • .github/ISSUE_TEMPLATE/--feature-request.yaml
  • .github/ISSUE_TEMPLATE/config.yaml
  • .github/dependabot.yml
  • .github/workflows/codeql.yml
  • .github/workflows/copyright-check.yml
  • .github/workflows/pull-request-build-lint-api.yml
  • .github/workflows/pull-request-build-lint-web-apps.yml
  • .gitignore
  • .oxfmtrc.json
  • .oxlintrc.json
  • AGENTS.md
  • CONTRIBUTING.md
  • COPYRIGHT.txt
  • COPYRIGHT_CHECK.md
  • README.md
  • apps/admin/Dockerfile.admin
  • apps/admin/app/(all)/(dashboard)/ai/form.tsx
  • apps/admin/app/(all)/(dashboard)/ai/page.tsx
  • apps/admin/app/(all)/(dashboard)/authentication/gitea/form.tsx
  • apps/admin/app/(all)/(dashboard)/authentication/gitea/page.tsx
  • apps/admin/app/(all)/(dashboard)/authentication/github/form.tsx
  • apps/admin/app/(all)/(dashboard)/authentication/github/page.tsx
  • apps/admin/app/(all)/(dashboard)/authentication/gitlab/form.tsx
  • apps/admin/app/(all)/(dashboard)/authentication/gitlab/page.tsx
  • apps/admin/app/(all)/(dashboard)/authentication/google/form.tsx
  • apps/admin/app/(all)/(dashboard)/authentication/google/page.tsx
  • apps/admin/app/(all)/(dashboard)/authentication/page.tsx
  • apps/admin/app/(all)/(dashboard)/email/email-config-form.tsx
  • apps/admin/app/(all)/(dashboard)/email/page.tsx
  • apps/admin/app/(all)/(dashboard)/email/test-email-modal.tsx
  • apps/admin/app/(all)/(dashboard)/general/form.tsx
  • apps/admin/app/(all)/(dashboard)/general/intercom.tsx
  • apps/admin/app/(all)/(dashboard)/general/page.tsx
  • apps/admin/app/(all)/(dashboard)/image/form.tsx
  • apps/admin/app/(all)/(dashboard)/image/page.tsx
  • apps/admin/app/(all)/(dashboard)/layout.tsx
  • apps/admin/app/(all)/(dashboard)/sidebar-dropdown.tsx
  • apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx
  • apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx
  • apps/admin/app/(all)/(dashboard)/sidebar.tsx
  • apps/admin/app/(all)/(dashboard)/workspace/create/form.tsx
  • apps/admin/app/(all)/(dashboard)/workspace/create/page.tsx
  • apps/admin/app/(all)/(dashboard)/workspace/page.tsx
  • apps/admin/app/(all)/(home)/auth-banner.tsx
  • apps/admin/app/(all)/(home)/auth-header.tsx
  • apps/admin/app/(all)/(home)/auth-helpers.tsx
  • apps/admin/app/(all)/(home)/layout.tsx
  • apps/admin/app/(all)/(home)/page.tsx
  • apps/admin/app/(all)/(home)/sign-in-form.tsx
  • apps/admin/app/compat/next/helper.ts
  • apps/admin/app/compat/next/image.tsx
  • apps/admin/app/compat/next/link.tsx
  • apps/admin/app/compat/next/navigation.ts
  • apps/admin/app/components/404.tsx
  • apps/admin/app/entry.client.tsx
  • apps/admin/app/root.tsx
  • apps/admin/app/routes.ts
  • apps/admin/ce/components/authentication/index.ts
  • apps/admin/ce/components/common/index.ts
  • apps/admin/ce/components/common/upgrade-button.tsx
  • apps/admin/ce/store/root.store.ts
  • apps/admin/components/authentication/authentication-method-card.tsx
  • apps/admin/components/authentication/email-config-switch.tsx
  • apps/admin/components/authentication/gitea-config.tsx
  • apps/admin/components/authentication/github-config.tsx
  • apps/admin/components/authentication/gitlab-config.tsx
  • apps/admin/components/authentication/google-config.tsx
  • apps/admin/components/authentication/password-config-switch.tsx
  • apps/admin/components/common/banner.tsx
  • apps/admin/components/common/breadcrumb-link.tsx
  • apps/admin/components/common/code-block.tsx
  • apps/admin/components/common/confirm-discard-modal.tsx
  • apps/admin/components/common/controller-input.tsx
  • apps/admin/components/common/controller-switch.tsx
  • apps/admin/components/common/copy-field.tsx
  • apps/admin/components/common/empty-state.tsx
  • apps/admin/components/common/header/core.ts
  • apps/admin/components/common/header/extended.ts
  • apps/admin/components/common/header/index.tsx
  • apps/admin/components/common/logo-spinner.tsx
  • apps/admin/components/common/new-user-popup.tsx
  • apps/admin/components/common/page-header.tsx
  • apps/admin/components/common/page-wrapper.tsx
  • apps/admin/components/instance/failure.tsx
  • apps/admin/components/instance/form-header.tsx
  • apps/admin/components/instance/instance-not-ready.tsx
  • apps/admin/components/instance/loading.tsx
  • apps/admin/components/instance/setup-form.tsx
  • apps/admin/components/workspace/list-item.tsx
  • apps/admin/core/components/common/banner.tsx
  • apps/admin/core/components/instance/form-header.tsx
  • apps/admin/core/components/instance/instance-not-ready.tsx
  • apps/admin/core/hooks/store/index.ts
  • apps/admin/core/lib/b-progress/index.tsx
  • apps/admin/core/utils/public-asset.ts
  • apps/admin/ee/components/authentication/authentication-modes.tsx
  • apps/admin/ee/components/authentication/index.ts
  • apps/admin/ee/components/common/index.ts
  • apps/admin/ee/store/root.store.ts
  • apps/admin/helpers/authentication.ts
  • apps/admin/hooks/oauth/core.tsx
  • apps/admin/hooks/oauth/index.ts
  • apps/admin/hooks/oauth/types.ts
  • apps/admin/hooks/store/index.ts
  • apps/admin/hooks/store/use-instance.tsx
  • apps/admin/hooks/store/use-theme.tsx
  • apps/admin/hooks/store/use-user.tsx
  • apps/admin/hooks/store/use-workspace.tsx
  • apps/admin/hooks/use-sidebar-menu/core.ts
  • apps/admin/hooks/use-sidebar-menu/index.ts
  • apps/admin/hooks/use-sidebar-menu/types.ts
  • apps/admin/lib/b-progress/AppProgressBar.tsx
  • apps/admin/lib/b-progress/index.tsx
  • apps/admin/nginx/nginx.conf
  • apps/admin/package.json
  • apps/admin/postcss.config.cjs
  • apps/admin/postcss.config.js
  • apps/admin/providers/core.tsx
  • apps/admin/providers/extended.tsx
  • apps/admin/providers/index.tsx
  • apps/admin/providers/instance.provider.tsx
  • apps/admin/providers/store.provider.tsx
  • apps/admin/providers/toast.tsx
  • apps/admin/providers/user.provider.tsx
  • apps/admin/store/instance.store.ts
  • apps/admin/store/root.store.ts
  • apps/admin/store/theme.store.ts
  • apps/admin/store/user.store.ts
  • apps/admin/store/workspace.store.ts
  • apps/admin/styles/globals.css
  • apps/admin/tailwind.config.cjs
  • apps/admin/tsconfig.json
  • apps/admin/utils/public-asset.ts
  • apps/api/bin/docker-entrypoint-api.sh
  • apps/api/manage.py
  • apps/api/plane/__init__.py
  • apps/api/plane/analytics/__init__.py
  • apps/api/plane/analytics/apps.py
  • apps/api/plane/api/__init__.py
  • apps/api/plane/api/apps.py
  • apps/api/plane/api/middleware/__init__.py
  • apps/api/plane/api/middleware/api_authentication.py
  • apps/api/plane/api/rate_limit.py
  • apps/api/plane/api/serializers/__init__.py
  • apps/api/plane/api/serializers/asset.py
  • apps/api/plane/api/serializers/base.py
  • apps/api/plane/api/serializers/cycle.py
  • apps/api/plane/api/serializers/estimate.py
  • apps/api/plane/api/serializers/intake.py
  • apps/api/plane/api/serializers/invite.py
  • apps/api/plane/api/serializers/issue.py
  • apps/api/plane/api/serializers/member.py
  • apps/api/plane/api/serializers/module.py
  • apps/api/plane/api/serializers/project.py
  • apps/api/plane/api/serializers/state.py
  • apps/api/plane/api/serializers/sticky.py
  • apps/api/plane/api/serializers/user.py
  • apps/api/plane/api/serializers/workspace.py
  • apps/api/plane/api/urls/__init__.py
  • apps/api/plane/api/urls/asset.py
  • apps/api/plane/api/urls/cycle.py
  • apps/api/plane/api/urls/intake.py
  • apps/api/plane/api/urls/invite.py
  • apps/api/plane/api/urls/label.py
  • apps/api/plane/api/urls/member.py
  • apps/api/plane/api/urls/module.py
  • apps/api/plane/api/urls/project.py
  • apps/api/plane/api/urls/schema.py
  • apps/api/plane/api/urls/state.py
  • apps/api/plane/api/urls/sticky.py
  • apps/api/plane/api/urls/user.py
  • apps/api/plane/api/urls/work_item.py
  • apps/api/plane/api/views/__init__.py
  • apps/api/plane/api/views/asset.py
  • apps/api/plane/api/views/base.py
  • apps/api/plane/api/views/cycle.py
  • apps/api/plane/api/views/intake.py
  • apps/api/plane/api/views/invite.py
  • apps/api/plane/api/views/issue.py
  • apps/api/plane/api/views/member.py
  • apps/api/plane/api/views/module.py
  • apps/api/plane/api/views/project.py
  • apps/api/plane/api/views/state.py
  • apps/api/plane/api/views/sticky.py
  • apps/api/plane/api/views/user.py
  • apps/api/plane/app/__init__.py
  • apps/api/plane/app/apps.py
  • apps/api/plane/app/middleware/__init__.py
  • apps/api/plane/app/middleware/api_authentication.py
  • apps/api/plane/app/permissions/__init__.py
  • apps/api/plane/app/permissions/base.py
  • apps/api/plane/app/permissions/page.py
  • apps/api/plane/app/permissions/project.py
  • apps/api/plane/app/permissions/workspace.py
  • apps/api/plane/app/serializers/__init__.py
  • apps/api/plane/app/serializers/analytic.py
  • apps/api/plane/app/serializers/api.py
  • apps/api/plane/app/serializers/asset.py
  • apps/api/plane/app/serializers/base.py
  • apps/api/plane/app/serializers/cycle.py
  • apps/api/plane/app/serializers/draft.py
  • apps/api/plane/app/serializers/estimate.py
  • apps/api/plane/app/serializers/exporter.py
  • apps/api/plane/app/serializers/favorite.py
  • apps/api/plane/app/serializers/importer.py
  • apps/api/plane/app/serializers/intake.py
  • apps/api/plane/app/serializers/issue.py
  • apps/api/plane/app/serializers/module.py
  • apps/api/plane/app/serializers/notification.py
  • apps/api/plane/app/serializers/page.py
  • apps/api/plane/app/serializers/project.py
  • apps/api/plane/app/serializers/state.py
  • apps/api/plane/app/serializers/user.py
  • apps/api/plane/app/serializers/view.py
  • apps/api/plane/app/serializers/webhook.py
  • apps/api/plane/app/serializers/workspace.py
  • apps/api/plane/app/urls/__init__.py
  • apps/api/plane/app/urls/analytic.py
  • apps/api/plane/app/urls/api.py
  • apps/api/plane/app/urls/asset.py
  • apps/api/plane/app/urls/cycle.py
  • apps/api/plane/app/urls/estimate.py
  • apps/api/plane/app/urls/exporter.py
  • apps/api/plane/app/urls/external.py
  • apps/api/plane/app/urls/intake.py
  • apps/api/plane/app/urls/issue.py
  • apps/api/plane/app/urls/module.py
  • apps/api/plane/app/urls/notification.py
  • apps/api/plane/app/urls/page.py
  • apps/api/plane/app/urls/project.py
  • apps/api/plane/app/urls/search.py
  • apps/api/plane/app/urls/state.py
  • apps/api/plane/app/urls/timezone.py
  • apps/api/plane/app/urls/user.py
  • apps/api/plane/app/urls/views.py
  • apps/api/plane/app/urls/webhook.py
  • apps/api/plane/app/urls/workspace.py
  • apps/api/plane/app/views/__init__.py
  • apps/api/plane/app/views/analytic/advance.py
  • apps/api/plane/app/views/analytic/base.py
  • apps/api/plane/app/views/analytic/project_analytics.py
  • apps/api/plane/app/views/api.py
  • apps/api/plane/app/views/asset/base.py
  • apps/api/plane/app/views/asset/v2.py
  • apps/api/plane/app/views/base.py
  • apps/api/plane/app/views/cycle/archive.py
  • apps/api/plane/app/views/cycle/base.py
  • apps/api/plane/app/views/cycle/issue.py
  • apps/api/plane/app/views/error_404.py
  • apps/api/plane/app/views/estimate/base.py
  • apps/api/plane/app/views/exporter/base.py
  • apps/api/plane/app/views/external/base.py
  • apps/api/plane/app/views/intake/base.py
  • apps/api/plane/app/views/issue/activity.py
  • apps/api/plane/app/views/issue/archive.py
  • apps/api/plane/app/views/issue/attachment.py
  • apps/api/plane/app/views/issue/base.py
  • apps/api/plane/app/views/issue/comment.py
  • apps/api/plane/app/views/issue/label.py
  • apps/api/plane/app/views/issue/link.py
  • apps/api/plane/app/views/issue/reaction.py
  • apps/api/plane/app/views/issue/relation.py
  • apps/api/plane/app/views/issue/sub_issue.py
  • apps/api/plane/app/views/issue/subscriber.py
  • apps/api/plane/app/views/issue/version.py
  • apps/api/plane/app/views/module/archive.py
  • apps/api/plane/app/views/module/base.py
  • apps/api/plane/app/views/module/issue.py
  • apps/api/plane/app/views/notification/base.py
  • apps/api/plane/app/views/page/base.py
  • apps/api/plane/app/views/page/version.py
  • apps/api/plane/app/views/project/base.py
  • apps/api/plane/app/views/project/invite.py
  • apps/api/plane/app/views/project/member.py
  • apps/api/plane/app/views/search/base.py
  • apps/api/plane/app/views/search/issue.py
  • apps/api/plane/app/views/state/base.py
  • apps/api/plane/app/views/timezone/base.py
  • apps/api/plane/app/views/user/base.py
  • apps/api/plane/app/views/view/base.py
  • apps/api/plane/app/views/webhook/base.py
  • apps/api/plane/app/views/workspace/base.py
  • apps/api/plane/app/views/workspace/cycle.py
  • apps/api/plane/app/views/workspace/draft.py
  • apps/api/plane/app/views/workspace/estimate.py
  • apps/api/plane/app/views/workspace/favorite.py
  • apps/api/plane/app/views/workspace/home.py
  • apps/api/plane/app/views/workspace/invite.py
  • apps/api/plane/app/views/workspace/label.py
  • apps/api/plane/app/views/workspace/member.py
  • apps/api/plane/app/views/workspace/module.py
  • apps/api/plane/app/views/workspace/quick_link.py
  • apps/api/plane/app/views/workspace/recent_visit.py
  • apps/api/plane/app/views/workspace/state.py
  • apps/api/plane/app/views/workspace/sticky.py
  • apps/api/plane/app/views/workspace/user.py
  • apps/api/plane/app/views/workspace/user_preference.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/agileplus-agents

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request migrates the admin application from Next.js to React Router, updates the UI to a new design system, and introduces AI Agent management features. On the backend, it enhances project summaries, renames user property models, and adds event tracking for workspace activities. Review feedback identifies a high-severity security vulnerability in the asset duplication logic where a missing workspace filter could allow unauthorized data access. Additionally, it is recommended to implement a Content Security Policy (CSP) in the Nginx configuration to replace deprecated security headers.

original_asset = FileAsset.objects.filter(
workspace=workspace, id=asset_id, is_uploaded=True
).first()
original_asset = FileAsset.objects.filter(id=asset_id, is_uploaded=True).first()
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

There seems to be a potential security vulnerability here. The filter for workspace has been removed when querying for the original_asset. This could allow a user who is a member of the current workspace to duplicate an asset from another workspace if they know the asset's ID, potentially leading to unauthorized data access.

I recommend re-adding the workspace filter to ensure assets can only be duplicated within the same workspace.

Suggested change
original_asset = FileAsset.objects.filter(id=asset_id, is_uploaded=True).first()
original_asset = FileAsset.objects.filter(workspace=workspace, id=asset_id, is_uploaded=True).first()

Comment on lines +24 to +27
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-XSS-Protection "1; mode=block" always;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

While adding these security headers is a good step, the X-XSS-Protection header is deprecated in modern browsers. For more robust protection against Cross-Site Scripting (XSS) and other injection attacks, I recommend implementing a Content-Security-Policy (CSP) header.

A strict CSP can significantly enhance security by controlling which resources the browser is allowed to load.

Example of a basic CSP:

add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self'; font-src 'self';";

You would need to adjust the policy based on your application's specific needs (e.g., allowing scripts from a CDN).

@KooshaPari KooshaPari changed the title feat: Add AgilePlus Agent module with CRUD API and UI feat: Add AgilePlus Agent and Worktrees modules with CRUD API and UI Mar 29, 2026
- Add Agent CRUD API and frontend
- Add Worktrees page with CRUD
- Add extended routes for /agents and /worktrees
- Add custom sidebar navigation
@KooshaPari KooshaPari force-pushed the feat/agileplus-agents branch from 2211d1c to 51c09a7 Compare March 29, 2026 03:23
@KooshaPari KooshaPari merged commit a166b69 into master Mar 29, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.