centy 0.0.24 → 0.0.26

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 (246) hide show
  1. package/dist/commands/add/plan.d.ts +18 -0
  2. package/dist/commands/add/plan.d.ts.map +1 -0
  3. package/dist/commands/add/plan.js +87 -0
  4. package/dist/commands/add/plan.js.map +1 -0
  5. package/dist/commands/assign/issue.d.ts +19 -0
  6. package/dist/commands/assign/issue.d.ts.map +1 -0
  7. package/dist/commands/assign/issue.js +79 -0
  8. package/dist/commands/assign/issue.js.map +1 -0
  9. package/dist/commands/close/issue.d.ts +16 -0
  10. package/dist/commands/close/issue.d.ts.map +1 -0
  11. package/dist/commands/close/issue.js +54 -0
  12. package/dist/commands/close/issue.js.map +1 -0
  13. package/dist/commands/close/org-issue.d.ts +17 -0
  14. package/dist/commands/close/org-issue.d.ts.map +1 -0
  15. package/dist/commands/close/org-issue.js +69 -0
  16. package/dist/commands/close/org-issue.js.map +1 -0
  17. package/dist/commands/close.d.ts +22 -0
  18. package/dist/commands/close.d.ts.map +1 -0
  19. package/dist/commands/close.js +198 -0
  20. package/dist/commands/close.js.map +1 -0
  21. package/dist/commands/create/issue.d.ts +1 -0
  22. package/dist/commands/create/issue.d.ts.map +1 -1
  23. package/dist/commands/create/issue.js +6 -0
  24. package/dist/commands/create/issue.js.map +1 -1
  25. package/dist/commands/create/user.d.ts +18 -0
  26. package/dist/commands/create/user.d.ts.map +1 -0
  27. package/dist/commands/create/user.js +85 -0
  28. package/dist/commands/create/user.js.map +1 -0
  29. package/dist/commands/delete/plan.d.ts +17 -0
  30. package/dist/commands/delete/plan.d.ts.map +1 -0
  31. package/dist/commands/delete/plan.js +74 -0
  32. package/dist/commands/delete/plan.js.map +1 -0
  33. package/dist/commands/delete/user.d.ts +17 -0
  34. package/dist/commands/delete/user.d.ts.map +1 -0
  35. package/dist/commands/delete/user.js +73 -0
  36. package/dist/commands/delete/user.js.map +1 -0
  37. package/dist/commands/duplicate/doc.d.ts +19 -0
  38. package/dist/commands/duplicate/doc.d.ts.map +1 -0
  39. package/dist/commands/duplicate/doc.js +87 -0
  40. package/dist/commands/duplicate/doc.js.map +1 -0
  41. package/dist/commands/duplicate/issue.d.ts +18 -0
  42. package/dist/commands/duplicate/issue.d.ts.map +1 -0
  43. package/dist/commands/duplicate/issue.js +82 -0
  44. package/dist/commands/duplicate/issue.js.map +1 -0
  45. package/dist/commands/get/issue.d.ts +1 -0
  46. package/dist/commands/get/issue.d.ts.map +1 -1
  47. package/dist/commands/get/issue.js +38 -1
  48. package/dist/commands/get/issue.js.map +1 -1
  49. package/dist/commands/get/plan.d.ts +18 -0
  50. package/dist/commands/get/plan.d.ts.map +1 -0
  51. package/dist/commands/get/plan.js +68 -0
  52. package/dist/commands/get/plan.js.map +1 -0
  53. package/dist/commands/get/user.d.ts +17 -0
  54. package/dist/commands/get/user.d.ts.map +1 -0
  55. package/dist/commands/get/user.js +75 -0
  56. package/dist/commands/get/user.js.map +1 -0
  57. package/dist/commands/init.d.ts +7 -0
  58. package/dist/commands/init.d.ts.map +1 -1
  59. package/dist/commands/init.js +43 -1
  60. package/dist/commands/init.js.map +1 -1
  61. package/dist/commands/list/issues.d.ts +1 -0
  62. package/dist/commands/list/issues.d.ts.map +1 -1
  63. package/dist/commands/list/issues.js +9 -1
  64. package/dist/commands/list/issues.js.map +1 -1
  65. package/dist/commands/list/users.d.ts +15 -0
  66. package/dist/commands/list/users.d.ts.map +1 -0
  67. package/dist/commands/list/users.js +67 -0
  68. package/dist/commands/list/users.js.map +1 -0
  69. package/dist/commands/move/doc.d.ts +18 -0
  70. package/dist/commands/move/doc.d.ts.map +1 -0
  71. package/dist/commands/move/doc.js +82 -0
  72. package/dist/commands/move/doc.js.map +1 -0
  73. package/dist/commands/move/issue.d.ts +17 -0
  74. package/dist/commands/move/issue.d.ts.map +1 -0
  75. package/dist/commands/move/issue.js +74 -0
  76. package/dist/commands/move/issue.js.map +1 -0
  77. package/dist/commands/project/title.d.ts +19 -0
  78. package/dist/commands/project/title.d.ts.map +1 -0
  79. package/dist/commands/project/title.js +76 -0
  80. package/dist/commands/project/title.js.map +1 -0
  81. package/dist/commands/sync/users.d.ts +17 -0
  82. package/dist/commands/sync/users.d.ts.map +1 -0
  83. package/dist/commands/sync/users.js +105 -0
  84. package/dist/commands/sync/users.js.map +1 -0
  85. package/dist/commands/unassign/issue.d.ts +19 -0
  86. package/dist/commands/unassign/issue.d.ts.map +1 -0
  87. package/dist/commands/unassign/issue.js +79 -0
  88. package/dist/commands/unassign/issue.js.map +1 -0
  89. package/dist/commands/update/issue.d.ts +1 -0
  90. package/dist/commands/update/issue.d.ts.map +1 -1
  91. package/dist/commands/update/issue.js +7 -1
  92. package/dist/commands/update/issue.js.map +1 -1
  93. package/dist/commands/update/user.d.ts +20 -0
  94. package/dist/commands/update/user.d.ts.map +1 -0
  95. package/dist/commands/update/user.js +88 -0
  96. package/dist/commands/update/user.js.map +1 -0
  97. package/dist/daemon/daemon-assign-issue.d.ts +6 -0
  98. package/dist/daemon/daemon-assign-issue.d.ts.map +1 -0
  99. package/dist/daemon/daemon-assign-issue.js +17 -0
  100. package/dist/daemon/daemon-assign-issue.js.map +1 -0
  101. package/dist/daemon/daemon-create-user.d.ts +6 -0
  102. package/dist/daemon/daemon-create-user.d.ts.map +1 -0
  103. package/dist/daemon/daemon-create-user.js +17 -0
  104. package/dist/daemon/daemon-create-user.js.map +1 -0
  105. package/dist/daemon/daemon-delete-plan.d.ts +6 -0
  106. package/dist/daemon/daemon-delete-plan.d.ts.map +1 -0
  107. package/dist/daemon/daemon-delete-plan.js +17 -0
  108. package/dist/daemon/daemon-delete-plan.js.map +1 -0
  109. package/dist/daemon/daemon-delete-user.d.ts +6 -0
  110. package/dist/daemon/daemon-delete-user.d.ts.map +1 -0
  111. package/dist/daemon/daemon-delete-user.js +17 -0
  112. package/dist/daemon/daemon-delete-user.js.map +1 -0
  113. package/dist/daemon/daemon-duplicate-doc.d.ts +6 -0
  114. package/dist/daemon/daemon-duplicate-doc.d.ts.map +1 -0
  115. package/dist/daemon/daemon-duplicate-doc.js +17 -0
  116. package/dist/daemon/daemon-duplicate-doc.js.map +1 -0
  117. package/dist/daemon/daemon-duplicate-issue.d.ts +6 -0
  118. package/dist/daemon/daemon-duplicate-issue.d.ts.map +1 -0
  119. package/dist/daemon/daemon-duplicate-issue.js +17 -0
  120. package/dist/daemon/daemon-duplicate-issue.js.map +1 -0
  121. package/dist/daemon/daemon-get-plan.d.ts +6 -0
  122. package/dist/daemon/daemon-get-plan.d.ts.map +1 -0
  123. package/dist/daemon/daemon-get-plan.js +17 -0
  124. package/dist/daemon/daemon-get-plan.js.map +1 -0
  125. package/dist/daemon/daemon-get-user.d.ts +6 -0
  126. package/dist/daemon/daemon-get-user.d.ts.map +1 -0
  127. package/dist/daemon/daemon-get-user.js +17 -0
  128. package/dist/daemon/daemon-get-user.js.map +1 -0
  129. package/dist/daemon/daemon-list-users.d.ts +6 -0
  130. package/dist/daemon/daemon-list-users.d.ts.map +1 -0
  131. package/dist/daemon/daemon-list-users.js +17 -0
  132. package/dist/daemon/daemon-list-users.js.map +1 -0
  133. package/dist/daemon/daemon-move-doc.d.ts +6 -0
  134. package/dist/daemon/daemon-move-doc.d.ts.map +1 -0
  135. package/dist/daemon/daemon-move-doc.js +17 -0
  136. package/dist/daemon/daemon-move-doc.js.map +1 -0
  137. package/dist/daemon/daemon-move-issue.d.ts +6 -0
  138. package/dist/daemon/daemon-move-issue.d.ts.map +1 -0
  139. package/dist/daemon/daemon-move-issue.js +17 -0
  140. package/dist/daemon/daemon-move-issue.js.map +1 -0
  141. package/dist/daemon/daemon-set-project-title.d.ts +7 -0
  142. package/dist/daemon/daemon-set-project-title.d.ts.map +1 -0
  143. package/dist/daemon/daemon-set-project-title.js +18 -0
  144. package/dist/daemon/daemon-set-project-title.js.map +1 -0
  145. package/dist/daemon/daemon-set-project-user-title.d.ts +7 -0
  146. package/dist/daemon/daemon-set-project-user-title.d.ts.map +1 -0
  147. package/dist/daemon/daemon-set-project-user-title.js +18 -0
  148. package/dist/daemon/daemon-set-project-user-title.js.map +1 -0
  149. package/dist/daemon/daemon-spawn-agent.d.ts +6 -0
  150. package/dist/daemon/daemon-spawn-agent.d.ts.map +1 -0
  151. package/dist/daemon/daemon-spawn-agent.js +17 -0
  152. package/dist/daemon/daemon-spawn-agent.js.map +1 -0
  153. package/dist/daemon/daemon-sync-users.d.ts +6 -0
  154. package/dist/daemon/daemon-sync-users.d.ts.map +1 -0
  155. package/dist/daemon/daemon-sync-users.js +17 -0
  156. package/dist/daemon/daemon-sync-users.js.map +1 -0
  157. package/dist/daemon/daemon-unassign-issue.d.ts +6 -0
  158. package/dist/daemon/daemon-unassign-issue.d.ts.map +1 -0
  159. package/dist/daemon/daemon-unassign-issue.js +17 -0
  160. package/dist/daemon/daemon-unassign-issue.js.map +1 -0
  161. package/dist/daemon/daemon-update-plan.d.ts +6 -0
  162. package/dist/daemon/daemon-update-plan.d.ts.map +1 -0
  163. package/dist/daemon/daemon-update-plan.js +17 -0
  164. package/dist/daemon/daemon-update-plan.js.map +1 -0
  165. package/dist/daemon/daemon-update-user.d.ts +6 -0
  166. package/dist/daemon/daemon-update-user.d.ts.map +1 -0
  167. package/dist/daemon/daemon-update-user.js +17 -0
  168. package/dist/daemon/daemon-update-user.js.map +1 -0
  169. package/dist/daemon/load-proto.d.ts +20 -1
  170. package/dist/daemon/load-proto.d.ts.map +1 -1
  171. package/dist/daemon/load-proto.js.map +1 -1
  172. package/dist/daemon/types.d.ts +242 -0
  173. package/dist/daemon/types.d.ts.map +1 -1
  174. package/dist/hooks/postrun.d.ts +4 -0
  175. package/dist/hooks/postrun.d.ts.map +1 -0
  176. package/dist/hooks/postrun.js +17 -0
  177. package/dist/hooks/postrun.js.map +1 -0
  178. package/dist/lib/create-issue/create-issue.d.ts.map +1 -1
  179. package/dist/lib/create-issue/create-issue.js +3 -0
  180. package/dist/lib/create-issue/create-issue.js.map +1 -1
  181. package/dist/lib/init/init.d.ts +7 -0
  182. package/dist/lib/init/init.d.ts.map +1 -1
  183. package/dist/lib/init/init.js +51 -1
  184. package/dist/lib/init/init.js.map +1 -1
  185. package/dist/lib/install-daemon/github-api.d.ts.map +1 -1
  186. package/dist/lib/install-daemon/github-api.js +50 -39
  187. package/dist/lib/install-daemon/github-api.js.map +1 -1
  188. package/dist/tui/components/domain/AssetList.js +1 -3
  189. package/dist/tui/components/domain/AssetList.js.map +1 -1
  190. package/dist/tui/components/domain/ConfigPanel.js +1 -3
  191. package/dist/tui/components/domain/ConfigPanel.js.map +1 -1
  192. package/dist/tui/components/domain/DocCreate.d.ts.map +1 -1
  193. package/dist/tui/components/domain/DocCreate.js +10 -43
  194. package/dist/tui/components/domain/DocCreate.js.map +1 -1
  195. package/dist/tui/components/domain/IssueCreate.d.ts.map +1 -1
  196. package/dist/tui/components/domain/IssueCreate.js +11 -55
  197. package/dist/tui/components/domain/IssueCreate.js.map +1 -1
  198. package/dist/tui/components/domain/IssueEdit.d.ts.map +1 -1
  199. package/dist/tui/components/domain/IssueEdit.js +15 -54
  200. package/dist/tui/components/domain/IssueEdit.js.map +1 -1
  201. package/dist/tui/components/domain/IssueList.js +1 -1
  202. package/dist/tui/components/domain/IssueList.js.map +1 -1
  203. package/dist/tui/components/domain/PRCreate.d.ts.map +1 -1
  204. package/dist/tui/components/domain/PRCreate.js +12 -47
  205. package/dist/tui/components/domain/PRCreate.js.map +1 -1
  206. package/dist/tui/components/domain/PREdit.d.ts.map +1 -1
  207. package/dist/tui/components/domain/PREdit.js +17 -51
  208. package/dist/tui/components/domain/PREdit.js.map +1 -1
  209. package/dist/tui/components/domain/PRList.js +1 -1
  210. package/dist/tui/components/domain/PRList.js.map +1 -1
  211. package/dist/tui/components/domain/ProjectCreate.d.ts.map +1 -1
  212. package/dist/tui/components/domain/ProjectCreate.js +5 -13
  213. package/dist/tui/components/domain/ProjectCreate.js.map +1 -1
  214. package/dist/tui/components/domain/ProjectList.js +1 -3
  215. package/dist/tui/components/domain/ProjectList.js.map +1 -1
  216. package/dist/tui/components/form/FormInput.d.ts +12 -0
  217. package/dist/tui/components/form/FormInput.d.ts.map +1 -0
  218. package/dist/tui/components/form/FormInput.js +6 -0
  219. package/dist/tui/components/form/FormInput.js.map +1 -0
  220. package/dist/tui/components/form/FormTextarea.d.ts +11 -0
  221. package/dist/tui/components/form/FormTextarea.d.ts.map +1 -0
  222. package/dist/tui/components/form/FormTextarea.js +13 -0
  223. package/dist/tui/components/form/FormTextarea.js.map +1 -0
  224. package/dist/tui/components/form/index.d.ts +3 -0
  225. package/dist/tui/components/form/index.d.ts.map +1 -0
  226. package/dist/tui/components/form/index.js +3 -0
  227. package/dist/tui/components/form/index.js.map +1 -0
  228. package/dist/tui/components/layout/Sidebar.js +1 -1
  229. package/dist/tui/components/layout/Sidebar.js.map +1 -1
  230. package/dist/tui/hooks/useNavigation.d.ts +1 -0
  231. package/dist/tui/hooks/useNavigation.d.ts.map +1 -1
  232. package/dist/tui/hooks/useNavigation.js +4 -0
  233. package/dist/tui/hooks/useNavigation.js.map +1 -1
  234. package/dist/tui/state/app-state.d.ts +4 -0
  235. package/dist/tui/state/app-state.d.ts.map +1 -1
  236. package/dist/tui/state/app-state.js +7 -0
  237. package/dist/tui/state/app-state.js.map +1 -1
  238. package/dist/types/create-issue-options.d.ts +2 -0
  239. package/dist/types/create-issue-options.d.ts.map +1 -1
  240. package/dist/types/init-options.d.ts +14 -0
  241. package/dist/types/init-options.d.ts.map +1 -1
  242. package/dist/utils/is-valid-uuid.js +2 -2
  243. package/dist/utils/is-valid-uuid.js.map +1 -1
  244. package/oclif.manifest.json +1270 -155
  245. package/package.json +9 -3
  246. package/proto/centy.proto +230 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "centy",
3
- "version": "0.0.24",
3
+ "version": "0.0.26",
4
4
  "description": "CLI for managing project issues and docs via code in the .centy folder",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -44,7 +44,8 @@
44
44
  "target": "./dist/commands"
45
45
  },
46
46
  "hooks": {
47
- "prerun": "./dist/hooks/prerun.js"
47
+ "prerun": "./dist/hooks/prerun.js",
48
+ "postrun": "./dist/hooks/postrun.js"
48
49
  },
49
50
  "plugins": [
50
51
  "@oclif/plugin-help"
@@ -57,6 +58,8 @@
57
58
  "@cspell/dict-he": "^4.0.5",
58
59
  "@types/node": "^24.10.1",
59
60
  "@types/react": "^19.2.7",
61
+ "@types/update-notifier": "^6.0.8",
62
+ "@types/uuid": "^11.0.0",
60
63
  "@vitest/coverage-v8": "^4.0.15",
61
64
  "bun-types": "^1.3.3",
62
65
  "cspell": "^9.4.0",
@@ -79,11 +82,14 @@
79
82
  "@grpc/proto-loader": "^0.7.13",
80
83
  "@oclif/core": "^4.8.0",
81
84
  "@oclif/plugin-help": "^6.2.36",
85
+ "@octokit/rest": "^22.0.1",
82
86
  "@opentui/core": "^0.1.56",
83
87
  "@opentui/react": "^0.1.56",
84
88
  "clipboardy": "^5.0.1",
85
89
  "react": "^19.2.1",
86
- "tar": "^7.5.2"
90
+ "tar": "^7.5.2",
91
+ "update-notifier": "^7.3.1",
92
+ "uuid": "^13.0.0"
87
93
  },
88
94
  "scripts": {
89
95
  "build": "pnpm run build:tsc && pnpm run manifest",
package/proto/centy.proto CHANGED
@@ -34,6 +34,12 @@ service CentyDaemon {
34
34
  // Delete an issue
35
35
  rpc DeleteIssue(DeleteIssueRequest) returns (DeleteIssueResponse);
36
36
 
37
+ // Move an issue to another project
38
+ rpc MoveIssue(MoveIssueRequest) returns (MoveIssueResponse);
39
+
40
+ // Duplicate an issue (same project or different project)
41
+ rpc DuplicateIssue(DuplicateIssueRequest) returns (DuplicateIssueResponse);
42
+
37
43
  // Get the next issue number
38
44
  rpc GetNextIssueNumber(GetNextIssueNumberRequest) returns (GetNextIssueNumberResponse);
39
45
 
@@ -69,6 +75,12 @@ service CentyDaemon {
69
75
  // Delete a doc
70
76
  rpc DeleteDoc(DeleteDocRequest) returns (DeleteDocResponse);
71
77
 
78
+ // Move a doc to another project
79
+ rpc MoveDoc(MoveDocRequest) returns (MoveDocResponse);
80
+
81
+ // Duplicate a doc (same project or different project)
82
+ rpc DuplicateDoc(DuplicateDocRequest) returns (DuplicateDocResponse);
83
+
72
84
  // ============ Asset RPCs ============
73
85
 
74
86
  // Add an asset to an issue or as a shared asset
@@ -86,6 +98,17 @@ service CentyDaemon {
86
98
  // List all shared assets
87
99
  rpc ListSharedAssets(ListSharedAssetsRequest) returns (ListAssetsResponse);
88
100
 
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
+
89
112
  // ============ Project Registry RPCs ============
90
113
 
91
114
  // List all tracked projects
@@ -106,6 +129,26 @@ service CentyDaemon {
106
129
  // Set project archived status
107
130
  rpc SetProjectArchived(SetProjectArchivedRequest) returns (SetProjectArchivedResponse);
108
131
 
132
+ // Set project organization
133
+ rpc SetProjectOrganization(SetProjectOrganizationRequest) returns (SetProjectOrganizationResponse);
134
+
135
+ // ============ Organization RPCs ============
136
+
137
+ // Create a new organization
138
+ rpc CreateOrganization(CreateOrganizationRequest) returns (CreateOrganizationResponse);
139
+
140
+ // List all organizations
141
+ rpc ListOrganizations(ListOrganizationsRequest) returns (ListOrganizationsResponse);
142
+
143
+ // Get a specific organization
144
+ rpc GetOrganization(GetOrganizationRequest) returns (GetOrganizationResponse);
145
+
146
+ // Update an organization
147
+ rpc UpdateOrganization(UpdateOrganizationRequest) returns (UpdateOrganizationResponse);
148
+
149
+ // Delete an organization
150
+ rpc DeleteOrganization(DeleteOrganizationRequest) returns (DeleteOrganizationResponse);
151
+
109
152
  // ============ Version RPCs ============
110
153
 
111
154
  // Get daemon version info
@@ -280,6 +323,7 @@ message CreateIssueRequest {
280
323
  string status = 5; // default: "open"
281
324
  map<string, string> custom_fields = 6;
282
325
  string template = 7; // Optional template name (without .md extension)
326
+ bool draft = 8; // Create as draft (default: false)
283
327
  }
284
328
 
285
329
  message CreateIssueResponse {
@@ -324,6 +368,7 @@ message Issue {
324
368
  string title = 4;
325
369
  string description = 5;
326
370
  IssueMetadata metadata = 6;
371
+ bool has_plan = 7; // Whether issue has a plan.md file
327
372
  }
328
373
 
329
374
  message IssueMetadata {
@@ -337,6 +382,7 @@ message IssueMetadata {
337
382
  string priority_label = 7; // Human-readable label (e.g., "high", "P1")
338
383
  bool compacted = 8; // Whether issue has been compacted into features
339
384
  string compacted_at = 9; // ISO timestamp when compacted (empty if not)
385
+ bool draft = 10; // Whether this issue is a draft
340
386
  }
341
387
 
342
388
  message GetIssueRequest {
@@ -360,6 +406,7 @@ message IssueWithProject {
360
406
  Issue issue = 1;
361
407
  string project_path = 2; // Absolute path to the project where this issue was found
362
408
  string project_name = 3; // Human-readable project name (directory name)
409
+ string display_path = 4; // Human-readable path with ~/ for home dir (use for display only)
363
410
  }
364
411
 
365
412
  message GetIssuesByUuidResponse {
@@ -374,6 +421,7 @@ message ListIssuesRequest {
374
421
  // Optional filters
375
422
  string status = 2; // Filter by status (empty = all)
376
423
  int32 priority = 3; // Filter by priority (0 = all)
424
+ optional bool draft = 4; // Filter by draft status (absent = all, true = drafts only, false = non-drafts only)
377
425
  }
378
426
 
379
427
  message ListIssuesResponse {
@@ -391,6 +439,7 @@ message UpdateIssueRequest {
391
439
  string status = 5;
392
440
  int32 priority = 6; // 0 = don't update, otherwise 1-N
393
441
  map<string, string> custom_fields = 7;
442
+ optional bool draft = 8; // Update draft status (absent = don't update)
394
443
  }
395
444
 
396
445
  message UpdateIssueResponse {
@@ -411,6 +460,38 @@ message DeleteIssueResponse {
411
460
  Manifest manifest = 3; // Updated manifest after deletion
412
461
  }
413
462
 
463
+ // ============ Issue Move/Duplicate Messages ============
464
+
465
+ message MoveIssueRequest {
466
+ string source_project_path = 1; // Project containing the issue
467
+ string issue_id = 2; // UUID of the issue to move
468
+ string target_project_path = 3; // Target project path
469
+ }
470
+
471
+ message MoveIssueResponse {
472
+ bool success = 1;
473
+ string error = 2;
474
+ Issue issue = 3; // The moved issue (same UUID, new display_number)
475
+ uint32 old_display_number = 4; // Original display number for reference
476
+ Manifest source_manifest = 5; // Updated source project manifest
477
+ Manifest target_manifest = 6; // Updated target project manifest
478
+ }
479
+
480
+ message DuplicateIssueRequest {
481
+ string source_project_path = 1; // Project containing the original issue
482
+ string issue_id = 2; // UUID of the issue to duplicate
483
+ string target_project_path = 3; // Target project (can be same as source)
484
+ string new_title = 4; // Optional: override title (default: "Copy of {original}")
485
+ }
486
+
487
+ message DuplicateIssueResponse {
488
+ bool success = 1;
489
+ string error = 2;
490
+ Issue issue = 3; // The new duplicate issue (new UUID, new display_number)
491
+ string original_issue_id = 4; // UUID of the original issue
492
+ Manifest manifest = 5; // Updated target project manifest
493
+ }
494
+
414
495
  // ============ Manifest Messages ============
415
496
 
416
497
  message GetManifestRequest {
@@ -533,6 +614,7 @@ message DocWithProject {
533
614
  Doc doc = 1;
534
615
  string project_path = 2; // Absolute path to the project where this doc was found
535
616
  string project_name = 3; // Human-readable project name (directory name)
617
+ string display_path = 4; // Human-readable path with ~/ for home dir (use for display only)
536
618
  }
537
619
 
538
620
  message GetDocsBySlugResponse {
@@ -591,6 +673,40 @@ message DeleteDocResponse {
591
673
  Manifest manifest = 3;
592
674
  }
593
675
 
676
+ // ============ Doc Move/Duplicate Messages ============
677
+
678
+ message MoveDocRequest {
679
+ string source_project_path = 1; // Project containing the doc
680
+ string slug = 2; // Slug of the doc to move
681
+ string target_project_path = 3; // Target project path
682
+ string new_slug = 4; // Optional: new slug if conflict exists
683
+ }
684
+
685
+ message MoveDocResponse {
686
+ bool success = 1;
687
+ string error = 2;
688
+ Doc doc = 3; // The moved doc
689
+ string old_slug = 4; // Original slug for reference
690
+ Manifest source_manifest = 5; // Updated source project manifest
691
+ Manifest target_manifest = 6; // Updated target project manifest
692
+ }
693
+
694
+ message DuplicateDocRequest {
695
+ string source_project_path = 1; // Project containing the original doc
696
+ string slug = 2; // Slug of the doc to duplicate
697
+ string target_project_path = 3; // Target project (can be same as source)
698
+ string new_slug = 4; // Optional: override slug (default: "{slug}-copy")
699
+ string new_title = 5; // Optional: override title (default: "Copy of {original}")
700
+ }
701
+
702
+ message DuplicateDocResponse {
703
+ bool success = 1;
704
+ string error = 2;
705
+ Doc doc = 3; // The new duplicate doc
706
+ string original_slug = 4; // Slug of the original doc
707
+ Manifest manifest = 5; // Updated target project manifest
708
+ }
709
+
594
710
  // ============ Asset Messages ============
595
711
 
596
712
  // Asset represents file metadata
@@ -663,6 +779,42 @@ message ListSharedAssetsRequest {
663
779
  string project_path = 1;
664
780
  }
665
781
 
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
+
666
818
  // ============ Project Registry Messages ============
667
819
 
668
820
  // Returned by API (enriched with live data from disk)
@@ -677,12 +829,16 @@ message ProjectInfo {
677
829
  bool is_favorite = 8; // User-marked favorite status
678
830
  bool is_archived = 9; // User-marked archived status
679
831
  string display_path = 10; // Human-readable path with ~/ for home dir (use for display only)
832
+ string organization_slug = 11; // Organization slug (empty if ungrouped)
833
+ string organization_name = 12; // Organization display name (for convenience)
680
834
  }
681
835
 
682
836
  message ListProjectsRequest {
683
837
  bool include_stale = 1; // Include projects where path no longer exists
684
838
  bool include_uninitialized = 2; // Include projects without .centy manifest
685
839
  bool include_archived = 3; // Include archived projects (default: false)
840
+ string organization_slug = 4; // Filter by organization (empty = all)
841
+ bool ungrouped_only = 5; // Only show projects without organization
686
842
  }
687
843
 
688
844
  message ListProjectsResponse {
@@ -740,6 +896,79 @@ message SetProjectArchivedResponse {
740
896
  ProjectInfo project = 3; // The updated project info
741
897
  }
742
898
 
899
+ message SetProjectOrganizationRequest {
900
+ string project_path = 1;
901
+ string organization_slug = 2; // Empty to remove from organization
902
+ }
903
+
904
+ message SetProjectOrganizationResponse {
905
+ bool success = 1;
906
+ string error = 2;
907
+ ProjectInfo project = 3; // The updated project info
908
+ }
909
+
910
+ // ============ Organization Messages ============
911
+
912
+ message Organization {
913
+ string slug = 1; // Unique identifier (kebab-case)
914
+ string name = 2; // Display name
915
+ string description = 3; // Optional description
916
+ string created_at = 4; // ISO timestamp
917
+ string updated_at = 5; // ISO timestamp
918
+ uint32 project_count = 6; // Number of projects in this org
919
+ }
920
+
921
+ message CreateOrganizationRequest {
922
+ string slug = 1; // Unique slug (auto-generated from name if empty)
923
+ string name = 2; // Display name (required)
924
+ string description = 3; // Optional description
925
+ }
926
+
927
+ message CreateOrganizationResponse {
928
+ bool success = 1;
929
+ string error = 2;
930
+ Organization organization = 3;
931
+ }
932
+
933
+ message ListOrganizationsRequest {}
934
+
935
+ message ListOrganizationsResponse {
936
+ repeated Organization organizations = 1;
937
+ int32 total_count = 2;
938
+ }
939
+
940
+ message GetOrganizationRequest {
941
+ string slug = 1;
942
+ }
943
+
944
+ message GetOrganizationResponse {
945
+ bool found = 1;
946
+ Organization organization = 2;
947
+ }
948
+
949
+ message UpdateOrganizationRequest {
950
+ string slug = 1; // Current slug
951
+ string name = 2; // New name (empty = don't change)
952
+ string description = 3; // New description (empty = don't change)
953
+ string new_slug = 4; // Rename slug (empty = keep current)
954
+ }
955
+
956
+ message UpdateOrganizationResponse {
957
+ bool success = 1;
958
+ string error = 2;
959
+ Organization organization = 3;
960
+ }
961
+
962
+ message DeleteOrganizationRequest {
963
+ string slug = 1;
964
+ }
965
+
966
+ message DeleteOrganizationResponse {
967
+ bool success = 1;
968
+ string error = 2;
969
+ uint32 unassigned_projects = 3; // Projects that are now ungrouped (should be 0 if block deletion)
970
+ }
971
+
743
972
  // ============ Version Messages ============
744
973
 
745
974
  message GetDaemonInfoRequest {}
@@ -891,6 +1120,7 @@ message PrWithProject {
891
1120
  PullRequest pr = 1;
892
1121
  string project_path = 2; // Absolute path to the project where this PR was found
893
1122
  string project_name = 3; // Human-readable project name (directory name)
1123
+ string display_path = 4; // Human-readable path with ~/ for home dir (use for display only)
894
1124
  }
895
1125
 
896
1126
  message GetPrsByUuidResponse {