centy 0.0.27 → 0.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/run +9 -0
- package/bin/run.cmd +8 -0
- package/bin/run.js +1 -1
- package/dist/commands/list/projects.d.ts +1 -0
- package/dist/commands/list/projects.d.ts.map +1 -1
- package/dist/commands/list/projects.js +6 -0
- package/dist/commands/list/projects.js.map +1 -1
- package/dist/commands/workspace/cleanup.d.ts +10 -0
- package/dist/commands/workspace/cleanup.d.ts.map +1 -0
- package/dist/commands/workspace/cleanup.js +31 -0
- package/dist/commands/workspace/cleanup.js.map +1 -0
- package/dist/commands/workspace/close.d.ts +16 -0
- package/dist/commands/workspace/close.d.ts.map +1 -0
- package/dist/commands/workspace/close.js +49 -0
- package/dist/commands/workspace/close.js.map +1 -0
- package/dist/commands/workspace/list.d.ts +15 -0
- package/dist/commands/workspace/list.d.ts.map +1 -0
- package/dist/commands/workspace/list.js +67 -0
- package/dist/commands/workspace/list.js.map +1 -0
- package/dist/commands/workspace/open.d.ts +19 -0
- package/dist/commands/workspace/open.d.ts.map +1 -0
- package/dist/commands/workspace/open.js +76 -0
- package/dist/commands/workspace/open.js.map +1 -0
- package/dist/daemon/daemon-cleanup-expired-workspaces.d.ts +6 -0
- package/dist/daemon/daemon-cleanup-expired-workspaces.d.ts.map +1 -0
- package/dist/daemon/daemon-cleanup-expired-workspaces.js +17 -0
- package/dist/daemon/daemon-cleanup-expired-workspaces.js.map +1 -0
- package/dist/daemon/daemon-close-temp-workspace.d.ts +6 -0
- package/dist/daemon/daemon-close-temp-workspace.d.ts.map +1 -0
- package/dist/daemon/daemon-close-temp-workspace.js +17 -0
- package/dist/daemon/daemon-close-temp-workspace.js.map +1 -0
- package/dist/daemon/daemon-list-temp-workspaces.d.ts +6 -0
- package/dist/daemon/daemon-list-temp-workspaces.d.ts.map +1 -0
- package/dist/daemon/daemon-list-temp-workspaces.js +17 -0
- package/dist/daemon/daemon-list-temp-workspaces.js.map +1 -0
- package/dist/daemon/daemon-open-in-temp-vscode.d.ts +6 -0
- package/dist/daemon/daemon-open-in-temp-vscode.d.ts.map +1 -0
- package/dist/daemon/daemon-open-in-temp-vscode.js +17 -0
- package/dist/daemon/daemon-open-in-temp-vscode.js.map +1 -0
- package/dist/daemon/load-proto.d.ts +5 -1
- package/dist/daemon/load-proto.d.ts.map +1 -1
- package/dist/daemon/load-proto.js.map +1 -1
- package/dist/daemon/types.d.ts +54 -0
- package/dist/daemon/types.d.ts.map +1 -1
- package/oclif.manifest.json +290 -107
- package/package.json +2 -2
- package/proto/centy.proto +265 -48
package/proto/centy.proto
CHANGED
|
@@ -28,6 +28,9 @@ service CentyDaemon {
|
|
|
28
28
|
// List all issues with optional filtering
|
|
29
29
|
rpc ListIssues(ListIssuesRequest) returns (ListIssuesResponse);
|
|
30
30
|
|
|
31
|
+
// Advanced issue search with query language
|
|
32
|
+
rpc AdvancedSearch(AdvancedSearchRequest) returns (AdvancedSearchResponse);
|
|
33
|
+
|
|
31
34
|
// Update an existing issue
|
|
32
35
|
rpc UpdateIssue(UpdateIssueRequest) returns (UpdateIssueResponse);
|
|
33
36
|
|
|
@@ -98,17 +101,6 @@ service CentyDaemon {
|
|
|
98
101
|
// List all shared assets
|
|
99
102
|
rpc ListSharedAssets(ListSharedAssetsRequest) returns (ListAssetsResponse);
|
|
100
103
|
|
|
101
|
-
// ============ Plan RPCs ============
|
|
102
|
-
|
|
103
|
-
// Get an issue's plan
|
|
104
|
-
rpc GetPlan(GetPlanRequest) returns (GetPlanResponse);
|
|
105
|
-
|
|
106
|
-
// Update (or create) an issue's plan
|
|
107
|
-
rpc UpdatePlan(UpdatePlanRequest) returns (UpdatePlanResponse);
|
|
108
|
-
|
|
109
|
-
// Delete an issue's plan
|
|
110
|
-
rpc DeletePlan(DeletePlanRequest) returns (DeletePlanResponse);
|
|
111
|
-
|
|
112
104
|
// ============ Project Registry RPCs ============
|
|
113
105
|
|
|
114
106
|
// List all tracked projects
|
|
@@ -132,6 +124,12 @@ service CentyDaemon {
|
|
|
132
124
|
// Set project organization
|
|
133
125
|
rpc SetProjectOrganization(SetProjectOrganizationRequest) returns (SetProjectOrganizationResponse);
|
|
134
126
|
|
|
127
|
+
// Set user-scope custom title (stored in ~/.centy/projects.json, only visible to current user)
|
|
128
|
+
rpc SetProjectUserTitle(SetProjectUserTitleRequest) returns (SetProjectUserTitleResponse);
|
|
129
|
+
|
|
130
|
+
// Set project-scope custom title (stored in .centy/project.json, visible to all users)
|
|
131
|
+
rpc SetProjectTitle(SetProjectTitleRequest) returns (SetProjectTitleResponse);
|
|
132
|
+
|
|
135
133
|
// ============ Organization RPCs ============
|
|
136
134
|
|
|
137
135
|
// Create a new organization
|
|
@@ -234,6 +232,20 @@ service CentyDaemon {
|
|
|
234
232
|
// Update local LLM configuration
|
|
235
233
|
rpc UpdateLocalLlmConfig(UpdateLocalLlmConfigRequest) returns (UpdateLocalLlmConfigResponse);
|
|
236
234
|
|
|
235
|
+
// ============ Temp Workspace RPCs ============
|
|
236
|
+
|
|
237
|
+
// Open a project in a temporary VS Code workspace
|
|
238
|
+
rpc OpenInTempVscode(OpenInTempVscodeRequest) returns (OpenInTempVscodeResponse);
|
|
239
|
+
|
|
240
|
+
// List all temp workspaces
|
|
241
|
+
rpc ListTempWorkspaces(ListTempWorkspacesRequest) returns (ListTempWorkspacesResponse);
|
|
242
|
+
|
|
243
|
+
// Close/cleanup a temp workspace
|
|
244
|
+
rpc CloseTempWorkspace(CloseTempWorkspaceRequest) returns (CloseTempWorkspaceResponse);
|
|
245
|
+
|
|
246
|
+
// Cleanup all expired workspaces
|
|
247
|
+
rpc CleanupExpiredWorkspaces(CleanupExpiredWorkspacesRequest) returns (CleanupExpiredWorkspacesResponse);
|
|
248
|
+
|
|
237
249
|
// ============ Link RPCs ============
|
|
238
250
|
|
|
239
251
|
// Create a link between two entities (bidirectional)
|
|
@@ -247,6 +259,26 @@ service CentyDaemon {
|
|
|
247
259
|
|
|
248
260
|
// Get all available link types (builtin + custom)
|
|
249
261
|
rpc GetAvailableLinkTypes(GetAvailableLinkTypesRequest) returns (GetAvailableLinkTypesResponse);
|
|
262
|
+
|
|
263
|
+
// ============ User RPCs ============
|
|
264
|
+
|
|
265
|
+
// Create a new user
|
|
266
|
+
rpc CreateUser(CreateUserRequest) returns (CreateUserResponse);
|
|
267
|
+
|
|
268
|
+
// Get a single user by ID
|
|
269
|
+
rpc GetUser(GetUserRequest) returns (User);
|
|
270
|
+
|
|
271
|
+
// List all users
|
|
272
|
+
rpc ListUsers(ListUsersRequest) returns (ListUsersResponse);
|
|
273
|
+
|
|
274
|
+
// Update an existing user
|
|
275
|
+
rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse);
|
|
276
|
+
|
|
277
|
+
// Delete a user
|
|
278
|
+
rpc DeleteUser(DeleteUserRequest) returns (DeleteUserResponse);
|
|
279
|
+
|
|
280
|
+
// Sync users from git history
|
|
281
|
+
rpc SyncUsers(SyncUsersRequest) returns (SyncUsersResponse);
|
|
250
282
|
}
|
|
251
283
|
|
|
252
284
|
// ============ Init Messages ============
|
|
@@ -274,6 +306,9 @@ message InitResponse {
|
|
|
274
306
|
|
|
275
307
|
// The updated manifest
|
|
276
308
|
Manifest manifest = 7;
|
|
309
|
+
|
|
310
|
+
// Organization inference result from git remote
|
|
311
|
+
OrgInferenceResult org_inference = 8;
|
|
277
312
|
}
|
|
278
313
|
|
|
279
314
|
message GetReconciliationPlanRequest {
|
|
@@ -368,7 +403,6 @@ message Issue {
|
|
|
368
403
|
string title = 4;
|
|
369
404
|
string description = 5;
|
|
370
405
|
IssueMetadata metadata = 6;
|
|
371
|
-
bool has_plan = 7; // Whether issue has a plan.md file
|
|
372
406
|
}
|
|
373
407
|
|
|
374
408
|
message IssueMetadata {
|
|
@@ -429,6 +463,32 @@ message ListIssuesResponse {
|
|
|
429
463
|
int32 total_count = 2;
|
|
430
464
|
}
|
|
431
465
|
|
|
466
|
+
// Advanced search request
|
|
467
|
+
message AdvancedSearchRequest {
|
|
468
|
+
string query = 1; // Query string (e.g., "status:open AND priority:1")
|
|
469
|
+
string sort_by = 2; // Field to sort by (e.g., "createdAt", "priority")
|
|
470
|
+
bool sort_descending = 3; // Sort order (true = descending)
|
|
471
|
+
bool multi_project = 4; // Search across all tracked projects
|
|
472
|
+
string project_path = 5; // Project path (required if multi_project is false)
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// Search result containing issue and project info
|
|
476
|
+
message SearchResultIssue {
|
|
477
|
+
Issue issue = 1;
|
|
478
|
+
string project_path = 2;
|
|
479
|
+
string project_name = 3;
|
|
480
|
+
string display_path = 4;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// Advanced search response
|
|
484
|
+
message AdvancedSearchResponse {
|
|
485
|
+
bool success = 1;
|
|
486
|
+
string error = 2;
|
|
487
|
+
repeated SearchResultIssue results = 3;
|
|
488
|
+
int32 total_count = 4;
|
|
489
|
+
string parsed_query = 5; // Debug: the parsed query representation
|
|
490
|
+
}
|
|
491
|
+
|
|
432
492
|
message UpdateIssueRequest {
|
|
433
493
|
string project_path = 1;
|
|
434
494
|
string issue_id = 2; // UUID or legacy issue number
|
|
@@ -779,42 +839,6 @@ message ListSharedAssetsRequest {
|
|
|
779
839
|
string project_path = 1;
|
|
780
840
|
}
|
|
781
841
|
|
|
782
|
-
// ============ Plan Messages ============
|
|
783
|
-
|
|
784
|
-
message GetPlanRequest {
|
|
785
|
-
string project_path = 1;
|
|
786
|
-
string issue_id = 2; // Issue ID or display number
|
|
787
|
-
}
|
|
788
|
-
|
|
789
|
-
message GetPlanResponse {
|
|
790
|
-
bool exists = 1; // Whether plan.md exists
|
|
791
|
-
string content = 2; // Plan content (empty if not exists)
|
|
792
|
-
string updated_at = 3; // ISO timestamp of last modification (empty if not exists)
|
|
793
|
-
}
|
|
794
|
-
|
|
795
|
-
message UpdatePlanRequest {
|
|
796
|
-
string project_path = 1;
|
|
797
|
-
string issue_id = 2; // Issue ID or display number
|
|
798
|
-
string content = 3; // New plan content
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
message UpdatePlanResponse {
|
|
802
|
-
bool success = 1;
|
|
803
|
-
string error = 2;
|
|
804
|
-
Manifest manifest = 3;
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
message DeletePlanRequest {
|
|
808
|
-
string project_path = 1;
|
|
809
|
-
string issue_id = 2; // Issue ID or display number
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
message DeletePlanResponse {
|
|
813
|
-
bool success = 1;
|
|
814
|
-
string error = 2;
|
|
815
|
-
Manifest manifest = 3;
|
|
816
|
-
}
|
|
817
|
-
|
|
818
842
|
// ============ Project Registry Messages ============
|
|
819
843
|
|
|
820
844
|
// Returned by API (enriched with live data from disk)
|
|
@@ -831,6 +855,8 @@ message ProjectInfo {
|
|
|
831
855
|
string display_path = 10; // Human-readable path with ~/ for home dir (use for display only)
|
|
832
856
|
string organization_slug = 11; // Organization slug (empty if ungrouped)
|
|
833
857
|
string organization_name = 12; // Organization display name (for convenience)
|
|
858
|
+
string user_title = 13; // User-scope custom title (from ~/.centy/projects.json)
|
|
859
|
+
string project_title = 14; // Project-scope custom title (from .centy/project.json)
|
|
834
860
|
}
|
|
835
861
|
|
|
836
862
|
message ListProjectsRequest {
|
|
@@ -839,6 +865,7 @@ message ListProjectsRequest {
|
|
|
839
865
|
bool include_archived = 3; // Include archived projects (default: false)
|
|
840
866
|
string organization_slug = 4; // Filter by organization (empty = all)
|
|
841
867
|
bool ungrouped_only = 5; // Only show projects without organization
|
|
868
|
+
bool include_temp = 6; // Include projects in system temp directory (default: false)
|
|
842
869
|
}
|
|
843
870
|
|
|
844
871
|
message ListProjectsResponse {
|
|
@@ -854,6 +881,7 @@ message RegisterProjectResponse {
|
|
|
854
881
|
bool success = 1;
|
|
855
882
|
string error = 2;
|
|
856
883
|
ProjectInfo project = 3; // The registered project info
|
|
884
|
+
OrgInferenceResult org_inference = 4; // Organization inference result from git remote
|
|
857
885
|
}
|
|
858
886
|
|
|
859
887
|
message UntrackProjectRequest {
|
|
@@ -907,6 +935,28 @@ message SetProjectOrganizationResponse {
|
|
|
907
935
|
ProjectInfo project = 3; // The updated project info
|
|
908
936
|
}
|
|
909
937
|
|
|
938
|
+
message SetProjectUserTitleRequest {
|
|
939
|
+
string project_path = 1;
|
|
940
|
+
string title = 2; // Custom title (empty to clear)
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
message SetProjectUserTitleResponse {
|
|
944
|
+
bool success = 1;
|
|
945
|
+
string error = 2;
|
|
946
|
+
ProjectInfo project = 3; // The updated project info
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
message SetProjectTitleRequest {
|
|
950
|
+
string project_path = 1;
|
|
951
|
+
string title = 2; // Custom title (empty to clear)
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
message SetProjectTitleResponse {
|
|
955
|
+
bool success = 1;
|
|
956
|
+
string error = 2;
|
|
957
|
+
ProjectInfo project = 3; // The updated project info
|
|
958
|
+
}
|
|
959
|
+
|
|
910
960
|
// ============ Organization Messages ============
|
|
911
961
|
|
|
912
962
|
message Organization {
|
|
@@ -918,6 +968,16 @@ message Organization {
|
|
|
918
968
|
uint32 project_count = 6; // Number of projects in this org
|
|
919
969
|
}
|
|
920
970
|
|
|
971
|
+
// Organization inference result from git remote
|
|
972
|
+
message OrgInferenceResult {
|
|
973
|
+
string inferred_org_slug = 1; // The inferred slug (empty if not found)
|
|
974
|
+
string inferred_org_name = 2; // The inferred display name
|
|
975
|
+
bool org_created = 3; // Whether a new org was created
|
|
976
|
+
string existing_org_slug = 4; // Existing org if already assigned
|
|
977
|
+
bool has_mismatch = 5; // True if inferred != existing
|
|
978
|
+
string message = 6; // Human-readable status message
|
|
979
|
+
}
|
|
980
|
+
|
|
921
981
|
message CreateOrganizationRequest {
|
|
922
982
|
string slug = 1; // Unique slug (auto-generated from name if empty)
|
|
923
983
|
string name = 2; // Display name (required)
|
|
@@ -1358,6 +1418,73 @@ message UpdateLocalLlmConfigResponse {
|
|
|
1358
1418
|
LocalLlmConfig config = 3;
|
|
1359
1419
|
}
|
|
1360
1420
|
|
|
1421
|
+
// ============ Temp Workspace Messages ============
|
|
1422
|
+
|
|
1423
|
+
// Request to open a project in a temporary VS Code workspace
|
|
1424
|
+
message OpenInTempVscodeRequest {
|
|
1425
|
+
string project_path = 1; // Source project path
|
|
1426
|
+
string issue_id = 2; // Issue UUID or display number
|
|
1427
|
+
LlmAction action = 3; // Plan or Implement
|
|
1428
|
+
string agent_name = 4; // Agent to use (empty = default)
|
|
1429
|
+
uint32 ttl_hours = 5; // Custom TTL in hours (0 = use default 12h)
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
message OpenInTempVscodeResponse {
|
|
1433
|
+
bool success = 1;
|
|
1434
|
+
string error = 2;
|
|
1435
|
+
string workspace_path = 3; // Path to the temp workspace
|
|
1436
|
+
string issue_id = 4; // Resolved issue UUID
|
|
1437
|
+
uint32 display_number = 5; // Issue display number
|
|
1438
|
+
string expires_at = 6; // ISO timestamp when workspace expires
|
|
1439
|
+
bool vscode_opened = 7; // Whether VS Code was successfully opened
|
|
1440
|
+
}
|
|
1441
|
+
|
|
1442
|
+
// A temporary workspace entry
|
|
1443
|
+
message TempWorkspace {
|
|
1444
|
+
string workspace_path = 1; // Absolute path to temp workspace
|
|
1445
|
+
string source_project_path = 2; // Original project path
|
|
1446
|
+
string issue_id = 3; // Issue UUID
|
|
1447
|
+
uint32 issue_display_number = 4; // Issue display number
|
|
1448
|
+
string issue_title = 5; // Issue title
|
|
1449
|
+
string agent_name = 6; // Agent being used
|
|
1450
|
+
LlmAction action = 7; // Plan or Implement
|
|
1451
|
+
string created_at = 8; // ISO timestamp
|
|
1452
|
+
string expires_at = 9; // ISO timestamp when workspace expires
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
message ListTempWorkspacesRequest {
|
|
1456
|
+
bool include_expired = 1; // Include expired workspaces (default: false)
|
|
1457
|
+
string source_project_path = 2; // Filter by source project (empty = all)
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
message ListTempWorkspacesResponse {
|
|
1461
|
+
repeated TempWorkspace workspaces = 1;
|
|
1462
|
+
uint32 total_count = 2;
|
|
1463
|
+
uint32 expired_count = 3; // Number of expired workspaces (not included unless include_expired)
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
message CloseTempWorkspaceRequest {
|
|
1467
|
+
string workspace_path = 1; // Path to the workspace to close
|
|
1468
|
+
bool force = 2; // Force removal even if VS Code may be open
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
message CloseTempWorkspaceResponse {
|
|
1472
|
+
bool success = 1;
|
|
1473
|
+
string error = 2;
|
|
1474
|
+
bool worktree_removed = 3; // Whether git worktree was removed
|
|
1475
|
+
bool directory_removed = 4; // Whether directory was removed
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
message CleanupExpiredWorkspacesRequest {}
|
|
1479
|
+
|
|
1480
|
+
message CleanupExpiredWorkspacesResponse {
|
|
1481
|
+
bool success = 1;
|
|
1482
|
+
string error = 2;
|
|
1483
|
+
uint32 cleaned_count = 3; // Number of workspaces cleaned up
|
|
1484
|
+
repeated string cleaned_paths = 4; // Paths that were cleaned
|
|
1485
|
+
repeated string failed_paths = 5; // Paths that failed to clean
|
|
1486
|
+
}
|
|
1487
|
+
|
|
1361
1488
|
// ============ Link Messages ============
|
|
1362
1489
|
|
|
1363
1490
|
// Target entity type for links
|
|
@@ -1437,3 +1564,93 @@ message LinkTypeInfo {
|
|
|
1437
1564
|
message GetAvailableLinkTypesResponse {
|
|
1438
1565
|
repeated LinkTypeInfo link_types = 1;
|
|
1439
1566
|
}
|
|
1567
|
+
|
|
1568
|
+
// ============ User Messages ============
|
|
1569
|
+
|
|
1570
|
+
// A project user/team member
|
|
1571
|
+
message User {
|
|
1572
|
+
string id = 1; // Unique identifier (slug format, e.g., "john-doe")
|
|
1573
|
+
string name = 2; // Display name
|
|
1574
|
+
string email = 3; // Email address (optional)
|
|
1575
|
+
repeated string git_usernames = 4; // Git usernames (e.g., GitHub handles)
|
|
1576
|
+
string created_at = 5; // ISO timestamp
|
|
1577
|
+
string updated_at = 6; // ISO timestamp
|
|
1578
|
+
}
|
|
1579
|
+
|
|
1580
|
+
message CreateUserRequest {
|
|
1581
|
+
string project_path = 1;
|
|
1582
|
+
string id = 2; // User ID (slug format)
|
|
1583
|
+
string name = 3; // Display name (required)
|
|
1584
|
+
string email = 4; // Email address (optional)
|
|
1585
|
+
repeated string git_usernames = 5; // Git usernames (optional)
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
message CreateUserResponse {
|
|
1589
|
+
bool success = 1;
|
|
1590
|
+
string error = 2;
|
|
1591
|
+
User user = 3; // The created user
|
|
1592
|
+
Manifest manifest = 4;
|
|
1593
|
+
}
|
|
1594
|
+
|
|
1595
|
+
message GetUserRequest {
|
|
1596
|
+
string project_path = 1;
|
|
1597
|
+
string user_id = 2; // User ID (slug format)
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
message ListUsersRequest {
|
|
1601
|
+
string project_path = 1;
|
|
1602
|
+
string git_username = 2; // Optional: filter by git username
|
|
1603
|
+
}
|
|
1604
|
+
|
|
1605
|
+
message ListUsersResponse {
|
|
1606
|
+
repeated User users = 1;
|
|
1607
|
+
int32 total_count = 2;
|
|
1608
|
+
}
|
|
1609
|
+
|
|
1610
|
+
message UpdateUserRequest {
|
|
1611
|
+
string project_path = 1;
|
|
1612
|
+
string user_id = 2; // User ID (slug format)
|
|
1613
|
+
string name = 3; // Empty = don't update
|
|
1614
|
+
string email = 4; // Empty = don't update
|
|
1615
|
+
repeated string git_usernames = 5; // Empty array = don't update
|
|
1616
|
+
}
|
|
1617
|
+
|
|
1618
|
+
message UpdateUserResponse {
|
|
1619
|
+
bool success = 1;
|
|
1620
|
+
string error = 2;
|
|
1621
|
+
User user = 3; // The updated user
|
|
1622
|
+
Manifest manifest = 4;
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1625
|
+
message DeleteUserRequest {
|
|
1626
|
+
string project_path = 1;
|
|
1627
|
+
string user_id = 2; // User ID (slug format)
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1630
|
+
message DeleteUserResponse {
|
|
1631
|
+
bool success = 1;
|
|
1632
|
+
string error = 2;
|
|
1633
|
+
Manifest manifest = 3;
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1636
|
+
// Git contributor found in history
|
|
1637
|
+
message GitContributor {
|
|
1638
|
+
string name = 1;
|
|
1639
|
+
string email = 2;
|
|
1640
|
+
}
|
|
1641
|
+
|
|
1642
|
+
message SyncUsersRequest {
|
|
1643
|
+
string project_path = 1;
|
|
1644
|
+
bool dry_run = 2; // If true, don't create users, just show what would be created
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
message SyncUsersResponse {
|
|
1648
|
+
bool success = 1;
|
|
1649
|
+
string error = 2;
|
|
1650
|
+
repeated string created = 3; // User IDs that were created
|
|
1651
|
+
repeated string skipped = 4; // Emails that were skipped (already exist)
|
|
1652
|
+
repeated string errors = 5; // Errors during creation
|
|
1653
|
+
repeated GitContributor would_create = 6; // For dry run: users that would be created
|
|
1654
|
+
repeated GitContributor would_skip = 7; // For dry run: users that would be skipped
|
|
1655
|
+
Manifest manifest = 8;
|
|
1656
|
+
}
|