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.
Files changed (47) hide show
  1. package/bin/run +9 -0
  2. package/bin/run.cmd +8 -0
  3. package/bin/run.js +1 -1
  4. package/dist/commands/list/projects.d.ts +1 -0
  5. package/dist/commands/list/projects.d.ts.map +1 -1
  6. package/dist/commands/list/projects.js +6 -0
  7. package/dist/commands/list/projects.js.map +1 -1
  8. package/dist/commands/workspace/cleanup.d.ts +10 -0
  9. package/dist/commands/workspace/cleanup.d.ts.map +1 -0
  10. package/dist/commands/workspace/cleanup.js +31 -0
  11. package/dist/commands/workspace/cleanup.js.map +1 -0
  12. package/dist/commands/workspace/close.d.ts +16 -0
  13. package/dist/commands/workspace/close.d.ts.map +1 -0
  14. package/dist/commands/workspace/close.js +49 -0
  15. package/dist/commands/workspace/close.js.map +1 -0
  16. package/dist/commands/workspace/list.d.ts +15 -0
  17. package/dist/commands/workspace/list.d.ts.map +1 -0
  18. package/dist/commands/workspace/list.js +67 -0
  19. package/dist/commands/workspace/list.js.map +1 -0
  20. package/dist/commands/workspace/open.d.ts +19 -0
  21. package/dist/commands/workspace/open.d.ts.map +1 -0
  22. package/dist/commands/workspace/open.js +76 -0
  23. package/dist/commands/workspace/open.js.map +1 -0
  24. package/dist/daemon/daemon-cleanup-expired-workspaces.d.ts +6 -0
  25. package/dist/daemon/daemon-cleanup-expired-workspaces.d.ts.map +1 -0
  26. package/dist/daemon/daemon-cleanup-expired-workspaces.js +17 -0
  27. package/dist/daemon/daemon-cleanup-expired-workspaces.js.map +1 -0
  28. package/dist/daemon/daemon-close-temp-workspace.d.ts +6 -0
  29. package/dist/daemon/daemon-close-temp-workspace.d.ts.map +1 -0
  30. package/dist/daemon/daemon-close-temp-workspace.js +17 -0
  31. package/dist/daemon/daemon-close-temp-workspace.js.map +1 -0
  32. package/dist/daemon/daemon-list-temp-workspaces.d.ts +6 -0
  33. package/dist/daemon/daemon-list-temp-workspaces.d.ts.map +1 -0
  34. package/dist/daemon/daemon-list-temp-workspaces.js +17 -0
  35. package/dist/daemon/daemon-list-temp-workspaces.js.map +1 -0
  36. package/dist/daemon/daemon-open-in-temp-vscode.d.ts +6 -0
  37. package/dist/daemon/daemon-open-in-temp-vscode.d.ts.map +1 -0
  38. package/dist/daemon/daemon-open-in-temp-vscode.js +17 -0
  39. package/dist/daemon/daemon-open-in-temp-vscode.js.map +1 -0
  40. package/dist/daemon/load-proto.d.ts +5 -1
  41. package/dist/daemon/load-proto.d.ts.map +1 -1
  42. package/dist/daemon/load-proto.js.map +1 -1
  43. package/dist/daemon/types.d.ts +54 -0
  44. package/dist/daemon/types.d.ts.map +1 -1
  45. package/oclif.manifest.json +290 -107
  46. package/package.json +2 -2
  47. 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
+ }