diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionTreeEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionTreeEndpoint.cs
new file mode 100644
index 0000000..e5533b2
--- /dev/null
+++ b/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionTreeEndpoint.cs
@@ -0,0 +1,25 @@
+using BuildFlow.Platform.Application.Permissions.DTOs;
+using BuildFlow.Platform.Application.Permissions.Queries;
+using MediatR;
+
+namespace BuildFlow.Host.Endpoints.rag.Permissions;
+
+///
+/// 获取权限分组树。按 Group 聚合,供管理端树形表格展示。
+/// 需 permission:read 权限——权限码本身是敏感信息,仅授权用户可见。
+///
+public class GetPermissionTreeEndpoint(IMediator mediator)
+ : EndpointWithoutRequest>
+{
+ public override void Configure()
+ {
+ Get("/permission/tree");
+ Permissions("permission:read");
+ }
+
+ public override async Task HandleAsync(CancellationToken ct)
+ {
+ var tree = await mediator.Send(new GetPermissionTreeQuery(), ct);
+ await Send.OkAsync(tree, ct);
+ }
+}
diff --git a/src/modules/platform/Application/Permissions/DTOs/PermissionGroupNodeDto.cs b/src/modules/platform/Application/Permissions/DTOs/PermissionGroupNodeDto.cs
new file mode 100644
index 0000000..1b94ea1
--- /dev/null
+++ b/src/modules/platform/Application/Permissions/DTOs/PermissionGroupNodeDto.cs
@@ -0,0 +1,15 @@
+namespace BuildFlow.Platform.Application.Permissions.DTOs;
+
+///
+/// 权限分组树节点。按 Group 字段聚合,供管理端树形表格展示。
+/// 第一层为分组,其下 Children 为该分组内的权限。
+/// Group 为空的权限归入“未分组”。
+///
+public record PermissionGroupNodeDto
+{
+ /// 分组名称(为空时归入“未分组”)。
+ public required string Group { get; init; }
+
+ /// 该分组下的权限列表。
+ public List Permissions { get; init; } = [];
+}
diff --git a/src/modules/platform/Application/Permissions/Handlers/GetPermissionTreeQueryHandler.cs b/src/modules/platform/Application/Permissions/Handlers/GetPermissionTreeQueryHandler.cs
new file mode 100644
index 0000000..56096b1
--- /dev/null
+++ b/src/modules/platform/Application/Permissions/Handlers/GetPermissionTreeQueryHandler.cs
@@ -0,0 +1,37 @@
+using MediatR;
+using BuildFlow.Platform.Application.Permissions.DTOs;
+using BuildFlow.Platform.Infrastructure.Persistence;
+using BuildFlow.Platform.Application.Permissions.Queries;
+
+namespace BuildFlow.Platform.Application.Permissions.Handlers;
+
+///
+/// 权限分组树查询处理器。按 Group 聚合,一次查询后在内存分组,避免多次往返。
+/// Group 为空的统一归入“未分组”,便于管理端一并展示。
+///
+public class GetPermissionTreeQueryHandler(PlatformDbContext db)
+ : IRequestHandler>
+{
+ public async Task> Handle(
+ GetPermissionTreeQuery request,
+ CancellationToken ct)
+ {
+ // 一次查出全部权限,避免按分组逐组查询造成 N 次往返。
+ var permissions = await db.Permissions
+ .OrderBy(p => p.Group)
+ .ThenBy(p => p.Code)
+ .Select(p => new PermissionDto(p.Id, p.Name, p.Code, p.Description, p.Group))
+ .ToListAsync(ct);
+
+ // 按 Group 聚合;null/空 Group 统一归入“未分组”。
+ return permissions
+ .GroupBy(p => string.IsNullOrWhiteSpace(p.Group) ? "未分组" : p.Group!)
+ .OrderBy(g => g.Key)
+ .Select(g => new PermissionGroupNodeDto
+ {
+ Group = g.Key,
+ Permissions = g.ToList(),
+ })
+ .ToList();
+ }
+}
diff --git a/src/modules/platform/Application/Permissions/Queries/GetPermissionTreeQuery.cs b/src/modules/platform/Application/Permissions/Queries/GetPermissionTreeQuery.cs
new file mode 100644
index 0000000..306eb92
--- /dev/null
+++ b/src/modules/platform/Application/Permissions/Queries/GetPermissionTreeQuery.cs
@@ -0,0 +1,9 @@
+using MediatR;
+using BuildFlow.Platform.Application.Permissions.DTOs;
+
+namespace BuildFlow.Platform.Application.Permissions.Queries;
+
+///
+/// 查询权限分组树。按 Group 聚合返回树结构,供管理端树形展示。
+///
+public record GetPermissionTreeQuery : IRequest>;