centy 0.0.18 → 0.0.20

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 (121) hide show
  1. package/dist/commands/add/asset.d.ts +2 -1
  2. package/dist/commands/add/asset.d.ts.map +1 -1
  3. package/dist/commands/add/asset.js +14 -5
  4. package/dist/commands/add/asset.js.map +1 -1
  5. package/dist/commands/create/pr.d.ts +3 -3
  6. package/dist/commands/create/pr.d.ts.map +1 -1
  7. package/dist/commands/create/pr.js +11 -33
  8. package/dist/commands/create/pr.js.map +1 -1
  9. package/dist/commands/get/issue.d.ts.map +1 -1
  10. package/dist/commands/get/issue.js +4 -2
  11. package/dist/commands/get/issue.js.map +1 -1
  12. package/dist/daemon/types.d.ts +1 -0
  13. package/dist/daemon/types.d.ts.map +1 -1
  14. package/dist/lib/create-pr/create-pr.d.ts +8 -0
  15. package/dist/lib/create-pr/create-pr.d.ts.map +1 -0
  16. package/dist/lib/create-pr/create-pr.js +111 -0
  17. package/dist/lib/create-pr/create-pr.js.map +1 -0
  18. package/dist/lib/create-pr/gather-basic-fields.d.ts +8 -0
  19. package/dist/lib/create-pr/gather-basic-fields.d.ts.map +1 -0
  20. package/dist/lib/create-pr/gather-basic-fields.js +34 -0
  21. package/dist/lib/create-pr/gather-basic-fields.js.map +1 -0
  22. package/dist/lib/create-pr/gather-metadata-fields.d.ts +11 -0
  23. package/dist/lib/create-pr/gather-metadata-fields.d.ts.map +1 -0
  24. package/dist/lib/create-pr/gather-metadata-fields.js +34 -0
  25. package/dist/lib/create-pr/gather-metadata-fields.js.map +1 -0
  26. package/dist/lib/create-pr/gather-pr-input.d.ts +8 -0
  27. package/dist/lib/create-pr/gather-pr-input.d.ts.map +1 -0
  28. package/dist/lib/create-pr/gather-pr-input.js +33 -0
  29. package/dist/lib/create-pr/gather-pr-input.js.map +1 -0
  30. package/dist/lib/create-pr/index.d.ts +2 -0
  31. package/dist/lib/create-pr/index.d.ts.map +1 -0
  32. package/dist/lib/create-pr/index.js +2 -0
  33. package/dist/lib/create-pr/index.js.map +1 -0
  34. package/dist/lib/create-pr/prompt-for-description.d.ts +6 -0
  35. package/dist/lib/create-pr/prompt-for-description.d.ts.map +1 -0
  36. package/dist/lib/create-pr/prompt-for-description.js +12 -0
  37. package/dist/lib/create-pr/prompt-for-description.js.map +1 -0
  38. package/dist/lib/create-pr/prompt-for-linked-issues.d.ts +7 -0
  39. package/dist/lib/create-pr/prompt-for-linked-issues.d.ts.map +1 -0
  40. package/dist/lib/create-pr/prompt-for-linked-issues.js +22 -0
  41. package/dist/lib/create-pr/prompt-for-linked-issues.js.map +1 -0
  42. package/dist/lib/create-pr/prompt-for-priority.d.ts +9 -0
  43. package/dist/lib/create-pr/prompt-for-priority.d.ts.map +1 -0
  44. package/dist/lib/create-pr/prompt-for-priority.js +25 -0
  45. package/dist/lib/create-pr/prompt-for-priority.js.map +1 -0
  46. package/dist/lib/create-pr/prompt-for-reviewers.d.ts +7 -0
  47. package/dist/lib/create-pr/prompt-for-reviewers.d.ts.map +1 -0
  48. package/dist/lib/create-pr/prompt-for-reviewers.js +22 -0
  49. package/dist/lib/create-pr/prompt-for-reviewers.js.map +1 -0
  50. package/dist/lib/create-pr/prompt-for-source-branch.d.ts +7 -0
  51. package/dist/lib/create-pr/prompt-for-source-branch.d.ts.map +1 -0
  52. package/dist/lib/create-pr/prompt-for-source-branch.js +20 -0
  53. package/dist/lib/create-pr/prompt-for-source-branch.js.map +1 -0
  54. package/dist/lib/create-pr/prompt-for-status.d.ts +9 -0
  55. package/dist/lib/create-pr/prompt-for-status.d.ts.map +1 -0
  56. package/dist/lib/create-pr/prompt-for-status.js +25 -0
  57. package/dist/lib/create-pr/prompt-for-status.js.map +1 -0
  58. package/dist/lib/create-pr/prompt-for-target-branch.d.ts +7 -0
  59. package/dist/lib/create-pr/prompt-for-target-branch.d.ts.map +1 -0
  60. package/dist/lib/create-pr/prompt-for-target-branch.js +15 -0
  61. package/dist/lib/create-pr/prompt-for-target-branch.js.map +1 -0
  62. package/dist/lib/create-pr/prompt-for-title.d.ts +6 -0
  63. package/dist/lib/create-pr/prompt-for-title.d.ts.map +1 -0
  64. package/dist/lib/create-pr/prompt-for-title.js +12 -0
  65. package/dist/lib/create-pr/prompt-for-title.js.map +1 -0
  66. package/dist/lib/create-pr/types.d.ts +14 -0
  67. package/dist/lib/create-pr/types.d.ts.map +1 -0
  68. package/dist/lib/create-pr/types.js +2 -0
  69. package/dist/lib/create-pr/types.js.map +1 -0
  70. package/dist/tui/App.d.ts.map +1 -1
  71. package/dist/tui/App.js +30 -0
  72. package/dist/tui/App.js.map +1 -1
  73. package/dist/tui/components/domain/PRCreate.d.ts +2 -0
  74. package/dist/tui/components/domain/PRCreate.d.ts.map +1 -0
  75. package/dist/tui/components/domain/PRCreate.js +195 -0
  76. package/dist/tui/components/domain/PRCreate.js.map +1 -0
  77. package/dist/tui/components/domain/PRDetail.d.ts +2 -0
  78. package/dist/tui/components/domain/PRDetail.d.ts.map +1 -0
  79. package/dist/tui/components/domain/PRDetail.js +119 -0
  80. package/dist/tui/components/domain/PRDetail.js.map +1 -0
  81. package/dist/tui/components/domain/PREdit.d.ts +2 -0
  82. package/dist/tui/components/domain/PREdit.d.ts.map +1 -0
  83. package/dist/tui/components/domain/PREdit.js +259 -0
  84. package/dist/tui/components/domain/PREdit.js.map +1 -0
  85. package/dist/tui/components/domain/PRList.d.ts +2 -0
  86. package/dist/tui/components/domain/PRList.d.ts.map +1 -0
  87. package/dist/tui/components/domain/PRList.js +178 -0
  88. package/dist/tui/components/domain/PRList.js.map +1 -0
  89. package/dist/tui/hooks/usePullRequests.d.ts +8 -0
  90. package/dist/tui/hooks/usePullRequests.d.ts.map +1 -0
  91. package/dist/tui/hooks/usePullRequests.js +36 -0
  92. package/dist/tui/hooks/usePullRequests.js.map +1 -0
  93. package/dist/tui/index.d.ts.map +1 -1
  94. package/dist/tui/index.js +5 -3
  95. package/dist/tui/index.js.map +1 -1
  96. package/dist/tui/services/daemon-service.d.ts +29 -1
  97. package/dist/tui/services/daemon-service.d.ts.map +1 -1
  98. package/dist/tui/services/daemon-service.js +87 -0
  99. package/dist/tui/services/daemon-service.js.map +1 -1
  100. package/dist/tui/state/app-state.d.ts +22 -2
  101. package/dist/tui/state/app-state.d.ts.map +1 -1
  102. package/dist/tui/state/app-state.js +23 -1
  103. package/dist/tui/state/app-state.js.map +1 -1
  104. package/dist/tui/types/views.d.ts +2 -1
  105. package/dist/tui/types/views.d.ts.map +1 -1
  106. package/dist/tui/types/views.js +6 -0
  107. package/dist/tui/types/views.js.map +1 -1
  108. package/dist/tui/utils/local-config.d.ts +4 -1
  109. package/dist/tui/utils/local-config.d.ts.map +1 -1
  110. package/dist/tui/utils/local-config.js +10 -1
  111. package/dist/tui/utils/local-config.js.map +1 -1
  112. package/dist/types/create-pr-options.d.ts +30 -0
  113. package/dist/types/create-pr-options.d.ts.map +1 -0
  114. package/dist/types/create-pr-options.js +2 -0
  115. package/dist/types/create-pr-options.js.map +1 -0
  116. package/dist/types/create-pr-result.d.ts +16 -0
  117. package/dist/types/create-pr-result.d.ts.map +1 -0
  118. package/dist/types/create-pr-result.js +2 -0
  119. package/dist/types/create-pr-result.js.map +1 -0
  120. package/oclif.manifest.json +164 -157
  121. package/package.json +1 -1
@@ -0,0 +1,195 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ import { useState, useCallback } from 'react';
3
+ import { useKeyboard } from '@opentui/react';
4
+ import { MainPanel } from '../layout/MainPanel.js';
5
+ import { useNavigation } from '../../hooks/useNavigation.js';
6
+ import { useAppState } from '../../state/app-state.js';
7
+ import { useConfig } from '../../hooks/useConfig.js';
8
+ import { daemonService } from '../../services/daemon-service.js';
9
+ const FIELDS = [
10
+ 'title',
11
+ 'description',
12
+ 'sourceBranch',
13
+ 'targetBranch',
14
+ 'priority',
15
+ 'status',
16
+ ];
17
+ const STATUS_OPTIONS = ['draft', 'open'];
18
+ function getPriorityColor(priority) {
19
+ if (priority === 1)
20
+ return 'red';
21
+ if (priority === 2)
22
+ return 'yellow';
23
+ return 'green';
24
+ }
25
+ function getPriorityLabel(priority) {
26
+ if (priority === 1)
27
+ return 'High';
28
+ if (priority === 2)
29
+ return 'Medium';
30
+ return 'Low';
31
+ }
32
+ function getStatusColor(status) {
33
+ return status === 'draft' ? 'gray' : 'blue';
34
+ }
35
+ export function PRCreate() {
36
+ const { goBack, navigate } = useNavigation();
37
+ const { state, dispatch } = useAppState();
38
+ const { config } = useConfig();
39
+ const [title, setTitle] = useState('');
40
+ const [description, setDescription] = useState('');
41
+ const [sourceBranch, setSourceBranch] = useState('');
42
+ const [targetBranch, setTargetBranch] = useState('main');
43
+ const [priority, setPriority] = useState(3); // Default to low
44
+ const [status, setStatus] = useState('draft');
45
+ const [activeField, setActiveField] = useState('title');
46
+ const [isSubmitting, setIsSubmitting] = useState(false);
47
+ const [error, setError] = useState(null);
48
+ const priorityLevels = config?.priorityLevels ?? 3;
49
+ const handleSubmit = useCallback(async () => {
50
+ if (!state.selectedProjectPath)
51
+ return;
52
+ if (!title.trim()) {
53
+ setError('Title is required');
54
+ return;
55
+ }
56
+ setIsSubmitting(true);
57
+ setError(null);
58
+ const result = await daemonService.createPr(state.selectedProjectPath, {
59
+ title: title.trim(),
60
+ description: description.trim(),
61
+ sourceBranch: sourceBranch.trim() || undefined,
62
+ targetBranch: targetBranch.trim() || undefined,
63
+ priority,
64
+ status,
65
+ });
66
+ setIsSubmitting(false);
67
+ if (result.success) {
68
+ // Refresh PRs list and navigate back
69
+ dispatch({ type: 'SET_PRS', prs: [] }); // Clear to force reload
70
+ navigate('prs');
71
+ }
72
+ else {
73
+ setError(result.error || 'Failed to create PR');
74
+ }
75
+ }, [
76
+ state.selectedProjectPath,
77
+ title,
78
+ description,
79
+ sourceBranch,
80
+ targetBranch,
81
+ priority,
82
+ status,
83
+ dispatch,
84
+ navigate,
85
+ ]);
86
+ const moveToNextField = useCallback(() => {
87
+ const currentIndex = FIELDS.indexOf(activeField);
88
+ if (currentIndex < FIELDS.length - 1) {
89
+ setActiveField(FIELDS[currentIndex + 1]);
90
+ }
91
+ }, [activeField]);
92
+ const moveToPrevField = useCallback(() => {
93
+ const currentIndex = FIELDS.indexOf(activeField);
94
+ if (currentIndex > 0) {
95
+ setActiveField(FIELDS[currentIndex - 1]);
96
+ }
97
+ }, [activeField]);
98
+ const cyclePriority = useCallback((direction) => {
99
+ if (direction === 'up') {
100
+ setPriority(prev => (prev > 1 ? prev - 1 : priorityLevels));
101
+ }
102
+ else {
103
+ setPriority(prev => (prev < priorityLevels ? prev + 1 : 1));
104
+ }
105
+ }, [priorityLevels]);
106
+ const cycleStatus = useCallback(() => {
107
+ setStatus(prev => (prev === 'draft' ? 'open' : 'draft'));
108
+ }, []);
109
+ useKeyboard((event) => {
110
+ // Cancel with Escape
111
+ if (event.name === 'escape') {
112
+ goBack();
113
+ return;
114
+ }
115
+ // Submit with Ctrl+S
116
+ if (event.ctrl && event.name === 's') {
117
+ handleSubmit();
118
+ return;
119
+ }
120
+ // Navigate between fields with Tab/Shift+Tab
121
+ if (event.name === 'tab') {
122
+ if (event.shift) {
123
+ moveToPrevField();
124
+ }
125
+ else {
126
+ moveToNextField();
127
+ }
128
+ return;
129
+ }
130
+ // Handle input based on active field
131
+ if (activeField === 'priority') {
132
+ if (event.name === 'up' ||
133
+ event.name === 'k' ||
134
+ event.name === 'left' ||
135
+ event.name === 'h') {
136
+ cyclePriority('up');
137
+ }
138
+ else if (event.name === 'down' ||
139
+ event.name === 'j' ||
140
+ event.name === 'right' ||
141
+ event.name === 'l') {
142
+ cyclePriority('down');
143
+ }
144
+ }
145
+ else if (activeField === 'status') {
146
+ if (event.name === 'up' ||
147
+ event.name === 'k' ||
148
+ event.name === 'down' ||
149
+ event.name === 'j' ||
150
+ event.name === 'left' ||
151
+ event.name === 'h' ||
152
+ event.name === 'right' ||
153
+ event.name === 'l') {
154
+ cycleStatus();
155
+ }
156
+ }
157
+ else {
158
+ // Handle text input for title, description, sourceBranch, targetBranch
159
+ const setters = {
160
+ title: setTitle,
161
+ description: setDescription,
162
+ sourceBranch: setSourceBranch,
163
+ targetBranch: setTargetBranch,
164
+ };
165
+ const setter = setters[activeField];
166
+ if (event.name === 'backspace') {
167
+ setter(prev => prev.slice(0, -1));
168
+ }
169
+ else if (event.name === 'return') {
170
+ if (activeField === 'description') {
171
+ setter(prev => prev + '\n');
172
+ }
173
+ else {
174
+ moveToNextField();
175
+ }
176
+ }
177
+ else if (event.name === 'space') {
178
+ setter(prev => prev + ' ');
179
+ }
180
+ else if (event.name.length === 1 && !event.ctrl && !event.meta) {
181
+ const char = event.shift ? event.name.toUpperCase() : event.name;
182
+ setter(prev => prev + char);
183
+ }
184
+ }
185
+ });
186
+ const projectName = state.selectedProjectPath?.split('/').pop() || 'Project';
187
+ if (!state.selectedProjectPath) {
188
+ return (_jsx(MainPanel, { title: "New PR", children: _jsx("text", { fg: "gray", children: "Select a project first." }) }));
189
+ }
190
+ if (isSubmitting) {
191
+ return (_jsx(MainPanel, { title: `New PR - ${projectName}`, children: _jsx("text", { fg: "cyan", children: "Creating PR..." }) }));
192
+ }
193
+ return (_jsx(MainPanel, { title: `New PR - ${projectName}`, children: _jsxs("box", { flexDirection: "column", flexGrow: 1, children: [_jsx("box", { marginBottom: 1, children: _jsx("text", { fg: "gray", children: "Tab: next field | Shift+Tab: prev | Ctrl+S: save | Esc: cancel" }) }), error && (_jsx("box", { marginBottom: 1, children: _jsx("text", { fg: "red", children: error }) })), _jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsx("text", { fg: activeField === 'title' ? 'cyan' : 'white', children: _jsxs("b", { children: ["Title ", activeField === 'title' ? '▸' : ' '] }) }), _jsxs("box", { paddingLeft: 2, borderStyle: activeField === 'title' ? 'single' : undefined, children: [_jsx("text", { children: title || (activeField === 'title' ? '│' : '') }), activeField === 'title' && _jsx("text", { fg: "cyan", children: "_" })] })] }), _jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsx("text", { fg: activeField === 'description' ? 'cyan' : 'white', children: _jsxs("b", { children: ["Description ", activeField === 'description' ? '▸' : ' '] }) }), _jsxs("box", { paddingLeft: 2, borderStyle: activeField === 'description' ? 'single' : undefined, height: 3, children: [_jsx("text", { children: description || (activeField === 'description' ? '' : '') }), activeField === 'description' && _jsx("text", { fg: "cyan", children: "_" })] })] }), _jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsxs("text", { fg: activeField === 'sourceBranch' ? 'cyan' : 'white', children: [_jsxs("b", { children: ["Source Branch ", activeField === 'sourceBranch' ? '▸' : ' '] }), _jsx("text", { fg: "gray", children: " (auto-detected if empty)" })] }), _jsxs("box", { paddingLeft: 2, borderStyle: activeField === 'sourceBranch' ? 'single' : undefined, children: [_jsx("text", { children: sourceBranch || (activeField === 'sourceBranch' ? '│' : '') }), activeField === 'sourceBranch' && _jsx("text", { fg: "cyan", children: "_" })] })] }), _jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsx("text", { fg: activeField === 'targetBranch' ? 'cyan' : 'white', children: _jsxs("b", { children: ["Target Branch ", activeField === 'targetBranch' ? '▸' : ' '] }) }), _jsxs("box", { paddingLeft: 2, borderStyle: activeField === 'targetBranch' ? 'single' : undefined, children: [_jsx("text", { children: targetBranch || (activeField === 'targetBranch' ? '│' : '') }), activeField === 'targetBranch' && _jsx("text", { fg: "cyan", children: "_" })] })] }), _jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsx("text", { fg: activeField === 'priority' ? 'cyan' : 'white', children: _jsxs("b", { children: ["Priority ", activeField === 'priority' ? '▸' : ' '] }) }), _jsxs("box", { paddingLeft: 2, flexDirection: "row", children: [activeField === 'priority' && _jsx("text", { fg: "gray", children: "\u25C0 " }), _jsxs("text", { fg: getPriorityColor(priority), children: [getPriorityLabel(priority), " (", priority, "/", priorityLevels, ")"] }), activeField === 'priority' && _jsx("text", { fg: "gray", children: " \u25B6" })] })] }), _jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsx("text", { fg: activeField === 'status' ? 'cyan' : 'white', children: _jsxs("b", { children: ["Status ", activeField === 'status' ? '▸' : ' '] }) }), _jsxs("box", { paddingLeft: 2, flexDirection: "row", children: [activeField === 'status' && _jsx("text", { fg: "gray", children: "\u25C0 " }), _jsx("text", { fg: getStatusColor(status), children: status }), activeField === 'status' && _jsx("text", { fg: "gray", children: " \u25B6" })] })] }), _jsx("box", { marginTop: 1, children: _jsx("text", { fg: "green", children: "Press Ctrl+S to create PR" }) })] }) }));
194
+ }
195
+ //# sourceMappingURL=PRCreate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PRCreate.js","sourceRoot":"","sources":["../../../../src/tui/components/domain/PRCreate.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function PRDetail(): import("react").ReactNode;
2
+ //# sourceMappingURL=PRDetail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PRDetail.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/domain/PRDetail.tsx"],"names":[],"mappings":"AAuDA,wBAAgB,QAAQ,8BA4LvB"}
@@ -0,0 +1,119 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ import { useEffect, useRef, useState, useCallback } from 'react';
3
+ import { useKeyboard } from '@opentui/react';
4
+ import { MainPanel } from '../layout/MainPanel.js';
5
+ import { useNavigation } from '../../hooks/useNavigation.js';
6
+ import { useAppState } from '../../state/app-state.js';
7
+ import { daemonService } from '../../services/daemon-service.js';
8
+ function getPriorityColor(priority) {
9
+ if (priority === 1)
10
+ return 'red';
11
+ if (priority === 2)
12
+ return 'yellow';
13
+ return 'green';
14
+ }
15
+ function getPriorityLabel(priority, label) {
16
+ if (label)
17
+ return label;
18
+ if (priority === 1)
19
+ return 'High';
20
+ if (priority === 2)
21
+ return 'Medium';
22
+ return 'Low';
23
+ }
24
+ function getStatusColor(status) {
25
+ switch (status) {
26
+ case 'draft':
27
+ return 'gray';
28
+ case 'open':
29
+ return 'blue';
30
+ case 'merged':
31
+ return 'magenta';
32
+ case 'closed':
33
+ return 'red';
34
+ default:
35
+ return 'gray';
36
+ }
37
+ }
38
+ function PRSection({ title, children }) {
39
+ return (_jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsx("text", { fg: "cyan", children: _jsx("b", { children: title }) }), _jsx("box", { paddingLeft: 2, flexDirection: "column", children: children })] }));
40
+ }
41
+ export function PRDetail() {
42
+ const { viewParams, goBack, navigate } = useNavigation();
43
+ const { state, dispatch } = useAppState();
44
+ const [pr, setPr] = useState(null);
45
+ const [isLoading, setIsLoading] = useState(true);
46
+ const scrollBoxRef = useRef(null);
47
+ const loadPr = useCallback(async () => {
48
+ if (!state.daemonConnected || !state.selectedProjectPath)
49
+ return;
50
+ const prId = viewParams.prId || state.selectedPrId;
51
+ if (!prId)
52
+ return;
53
+ setIsLoading(true);
54
+ const result = await daemonService.getPr(state.selectedProjectPath, prId);
55
+ setIsLoading(false);
56
+ if (result.success && result.data) {
57
+ setPr(result.data);
58
+ }
59
+ else if (result.error) {
60
+ dispatch({ type: 'SET_ERROR', error: result.error });
61
+ }
62
+ }, [
63
+ state.daemonConnected,
64
+ state.selectedProjectPath,
65
+ state.selectedPrId,
66
+ viewParams.prId,
67
+ dispatch,
68
+ ]);
69
+ useEffect(() => {
70
+ loadPr();
71
+ }, [loadPr]);
72
+ useKeyboard((event) => {
73
+ if (event.name === 'escape' || event.name === 'backspace') {
74
+ goBack();
75
+ }
76
+ else if (event.name === 'e') {
77
+ // Edit PR
78
+ const prId = viewParams.prId || state.selectedPrId;
79
+ if (prId) {
80
+ navigate('pr-edit', { prId });
81
+ }
82
+ }
83
+ else if (event.name === 'j' || event.name === 'down') {
84
+ if (scrollBoxRef.current) {
85
+ scrollBoxRef.current.scrollBy(1);
86
+ }
87
+ }
88
+ else if (event.name === 'k' || event.name === 'up') {
89
+ if (scrollBoxRef.current) {
90
+ scrollBoxRef.current.scrollBy(-1);
91
+ }
92
+ }
93
+ else if (event.name === 'pagedown' || event.name === 'd') {
94
+ if (scrollBoxRef.current) {
95
+ scrollBoxRef.current.scrollBy(10);
96
+ }
97
+ }
98
+ else if (event.name === 'pageup' || event.name === 'u') {
99
+ if (scrollBoxRef.current) {
100
+ scrollBoxRef.current.scrollBy(-10);
101
+ }
102
+ }
103
+ });
104
+ if (!state.selectedProjectPath) {
105
+ return (_jsx(MainPanel, { title: "Pull Request", children: _jsx("text", { fg: "gray", children: "Select a project first." }) }));
106
+ }
107
+ if (isLoading || !pr) {
108
+ return (_jsx(MainPanel, { title: "Pull Request", children: _jsx("text", { fg: "gray", children: "Loading PR..." }) }));
109
+ }
110
+ const createdDate = new Date(pr.metadata.createdAt).toLocaleString();
111
+ const updatedDate = new Date(pr.metadata.updatedAt).toLocaleString();
112
+ const priorityColor = getPriorityColor(pr.metadata.priority);
113
+ const priorityLabel = getPriorityLabel(pr.metadata.priority, pr.metadata.priorityLabel);
114
+ const statusColor = getStatusColor(pr.metadata.status);
115
+ return (_jsx(MainPanel, { title: `PR #${pr.displayNumber} ${pr.title}`, children: _jsx("scrollbox", { ref: scrollBoxRef, flexGrow: 1, scrollY: true, children: _jsxs("box", { flexDirection: "column", children: [_jsxs("box", { flexDirection: "row", marginBottom: 1, children: [_jsx("text", { children: "Status: " }), _jsx("text", { fg: statusColor, children: pr.metadata.status }), _jsx("text", { children: " | Priority: " }), _jsx("text", { fg: priorityColor, children: priorityLabel })] }), _jsxs("box", { flexDirection: "row", marginBottom: 1, children: [_jsx("text", { fg: "gray", children: "UUID: " }), _jsx("text", { fg: "gray", children: pr.id })] }), _jsx(PRSection, { title: "Branches", children: _jsxs("box", { flexDirection: "row", children: [_jsx("text", { fg: "cyan", children: pr.metadata.sourceBranch }), _jsx("text", { fg: "gray", children: " \u2192 " }), _jsx("text", { fg: "green", children: pr.metadata.targetBranch })] }) }), pr.metadata.linkedIssues.length > 0 && (_jsx(PRSection, { title: "Linked Issues", children: pr.metadata.linkedIssues.map((issueId, index) => (_jsxs("text", { fg: "yellow", children: ["#", issueId] }, index))) })), pr.metadata.reviewers.length > 0 && (_jsx(PRSection, { title: "Reviewers", children: pr.metadata.reviewers.map((reviewer, index) => (_jsx("text", { children: reviewer }, index))) })), _jsxs(PRSection, { title: "Timeline", children: [_jsxs("box", { flexDirection: "row", children: [_jsx("text", { fg: "gray", children: "Created: " }), _jsx("text", { children: createdDate })] }), _jsxs("box", { flexDirection: "row", children: [_jsx("text", { fg: "gray", children: "Updated: " }), _jsx("text", { children: updatedDate })] }), pr.metadata.mergedAt && (_jsxs("box", { flexDirection: "row", children: [_jsx("text", { fg: "magenta", children: "Merged: " }), _jsx("text", { children: new Date(pr.metadata.mergedAt).toLocaleString() })] })), pr.metadata.closedAt && (_jsxs("box", { flexDirection: "row", children: [_jsx("text", { fg: "red", children: "Closed: " }), _jsx("text", { children: new Date(pr.metadata.closedAt).toLocaleString() })] }))] }), Object.keys(pr.metadata.customFields).length > 0 && (_jsx(PRSection, { title: "Custom Fields", children: Object.entries(pr.metadata.customFields).map(([key, value]) => (_jsxs("box", { flexDirection: "row", children: [_jsxs("text", { fg: "yellow", children: [key, ": "] }), _jsx("text", { children: value })] }, key))) })), _jsx("box", { marginBottom: 1, children: _jsx("text", { fg: "gray", children: '─'.repeat(40) }) }), _jsx(PRSection, { title: "Description", children: pr.description ? (pr.description
116
+ .split('\n')
117
+ .map((line, index) => _jsx("text", { children: line || ' ' }, index))) : (_jsx("text", { fg: "gray", children: "No description provided." })) })] }) }) }));
118
+ }
119
+ //# sourceMappingURL=PRDetail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PRDetail.js","sourceRoot":"","sources":["../../../../src/tui/components/domain/PRDetail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function PREdit(): import("react").ReactNode;
2
+ //# sourceMappingURL=PREdit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PREdit.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/domain/PREdit.tsx"],"names":[],"mappings":"AAwDA,wBAAgB,MAAM,8BAmXrB"}
@@ -0,0 +1,259 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ import { useState, useCallback, useEffect } from 'react';
3
+ import { useKeyboard } from '@opentui/react';
4
+ import { MainPanel } from '../layout/MainPanel.js';
5
+ import { useNavigation } from '../../hooks/useNavigation.js';
6
+ import { useAppState } from '../../state/app-state.js';
7
+ import { useConfig } from '../../hooks/useConfig.js';
8
+ import { daemonService } from '../../services/daemon-service.js';
9
+ const FIELDS = [
10
+ 'title',
11
+ 'description',
12
+ 'sourceBranch',
13
+ 'targetBranch',
14
+ 'priority',
15
+ 'status',
16
+ ];
17
+ const STATUS_OPTIONS = ['draft', 'open', 'merged', 'closed'];
18
+ function getPriorityColor(priority) {
19
+ if (priority === 1)
20
+ return 'red';
21
+ if (priority === 2)
22
+ return 'yellow';
23
+ return 'green';
24
+ }
25
+ function getPriorityLabel(priority) {
26
+ if (priority === 1)
27
+ return 'High';
28
+ if (priority === 2)
29
+ return 'Medium';
30
+ return 'Low';
31
+ }
32
+ function getStatusColor(status) {
33
+ switch (status) {
34
+ case 'draft':
35
+ return 'gray';
36
+ case 'open':
37
+ return 'blue';
38
+ case 'merged':
39
+ return 'magenta';
40
+ case 'closed':
41
+ return 'red';
42
+ default:
43
+ return 'gray';
44
+ }
45
+ }
46
+ export function PREdit() {
47
+ const { viewParams, goBack, navigate } = useNavigation();
48
+ const { state, dispatch } = useAppState();
49
+ const { config } = useConfig();
50
+ const [pr, setPr] = useState(null);
51
+ const [isLoading, setIsLoading] = useState(true);
52
+ const [title, setTitle] = useState('');
53
+ const [description, setDescription] = useState('');
54
+ const [sourceBranch, setSourceBranch] = useState('');
55
+ const [targetBranch, setTargetBranch] = useState('');
56
+ const [priority, setPriority] = useState(3);
57
+ const [status, setStatus] = useState('draft');
58
+ const [activeField, setActiveField] = useState('title');
59
+ const [isSubmitting, setIsSubmitting] = useState(false);
60
+ const [error, setError] = useState(null);
61
+ const priorityLevels = config?.priorityLevels ?? 3;
62
+ // Load PR data
63
+ const loadPr = useCallback(async () => {
64
+ if (!state.daemonConnected || !state.selectedProjectPath)
65
+ return;
66
+ const prId = viewParams.prId || state.selectedPrId;
67
+ if (!prId)
68
+ return;
69
+ setIsLoading(true);
70
+ const result = await daemonService.getPr(state.selectedProjectPath, prId);
71
+ setIsLoading(false);
72
+ if (result.success && result.data) {
73
+ const loadedPr = result.data;
74
+ setPr(loadedPr);
75
+ setTitle(loadedPr.title);
76
+ setDescription(loadedPr.description || '');
77
+ setSourceBranch(loadedPr.metadata.sourceBranch);
78
+ setTargetBranch(loadedPr.metadata.targetBranch);
79
+ setPriority(loadedPr.metadata.priority);
80
+ setStatus(loadedPr.metadata.status || 'draft');
81
+ }
82
+ else if (result.error) {
83
+ setError(result.error);
84
+ }
85
+ }, [
86
+ state.daemonConnected,
87
+ state.selectedProjectPath,
88
+ state.selectedPrId,
89
+ viewParams.prId,
90
+ ]);
91
+ useEffect(() => {
92
+ loadPr();
93
+ }, [loadPr]);
94
+ const handleSubmit = useCallback(async () => {
95
+ if (!state.selectedProjectPath || !pr)
96
+ return;
97
+ if (!title.trim()) {
98
+ setError('Title is required');
99
+ return;
100
+ }
101
+ setIsSubmitting(true);
102
+ setError(null);
103
+ const result = await daemonService.updatePr(state.selectedProjectPath, pr.id, {
104
+ title: title.trim(),
105
+ description: description.trim(),
106
+ sourceBranch: sourceBranch.trim(),
107
+ targetBranch: targetBranch.trim(),
108
+ priority,
109
+ status,
110
+ });
111
+ setIsSubmitting(false);
112
+ if (result.success) {
113
+ // Refresh PRs list and navigate back to detail
114
+ dispatch({ type: 'SET_PRS', prs: [] }); // Clear to force reload
115
+ navigate('pr-detail', { prId: pr.id });
116
+ }
117
+ else {
118
+ setError(result.error || 'Failed to update PR');
119
+ }
120
+ }, [
121
+ state.selectedProjectPath,
122
+ pr,
123
+ title,
124
+ description,
125
+ sourceBranch,
126
+ targetBranch,
127
+ priority,
128
+ status,
129
+ dispatch,
130
+ navigate,
131
+ ]);
132
+ const moveToNextField = useCallback(() => {
133
+ const currentIndex = FIELDS.indexOf(activeField);
134
+ if (currentIndex < FIELDS.length - 1) {
135
+ setActiveField(FIELDS[currentIndex + 1]);
136
+ }
137
+ }, [activeField]);
138
+ const moveToPrevField = useCallback(() => {
139
+ const currentIndex = FIELDS.indexOf(activeField);
140
+ if (currentIndex > 0) {
141
+ setActiveField(FIELDS[currentIndex - 1]);
142
+ }
143
+ }, [activeField]);
144
+ const cyclePriority = useCallback((direction) => {
145
+ if (direction === 'up') {
146
+ setPriority(prev => (prev > 1 ? prev - 1 : priorityLevels));
147
+ }
148
+ else {
149
+ setPriority(prev => (prev < priorityLevels ? prev + 1 : 1));
150
+ }
151
+ }, [priorityLevels]);
152
+ const cycleStatus = useCallback((direction) => {
153
+ setStatus(prev => {
154
+ const currentIndex = STATUS_OPTIONS.indexOf(prev);
155
+ if (direction === 'up') {
156
+ const prevIndex = currentIndex > 0 ? currentIndex - 1 : STATUS_OPTIONS.length - 1;
157
+ return STATUS_OPTIONS[prevIndex];
158
+ }
159
+ else {
160
+ const nextIndex = (currentIndex + 1) % STATUS_OPTIONS.length;
161
+ return STATUS_OPTIONS[nextIndex];
162
+ }
163
+ });
164
+ }, []);
165
+ useKeyboard((event) => {
166
+ // Cancel with Escape
167
+ if (event.name === 'escape') {
168
+ goBack();
169
+ return;
170
+ }
171
+ // Submit with Ctrl+S
172
+ if (event.ctrl && event.name === 's') {
173
+ handleSubmit();
174
+ return;
175
+ }
176
+ // Navigate between fields with Tab/Shift+Tab
177
+ if (event.name === 'tab') {
178
+ if (event.shift) {
179
+ moveToPrevField();
180
+ }
181
+ else {
182
+ moveToNextField();
183
+ }
184
+ return;
185
+ }
186
+ // Handle input based on active field
187
+ if (activeField === 'priority') {
188
+ if (event.name === 'up' ||
189
+ event.name === 'k' ||
190
+ event.name === 'left' ||
191
+ event.name === 'h') {
192
+ cyclePriority('up');
193
+ }
194
+ else if (event.name === 'down' ||
195
+ event.name === 'j' ||
196
+ event.name === 'right' ||
197
+ event.name === 'l') {
198
+ cyclePriority('down');
199
+ }
200
+ }
201
+ else if (activeField === 'status') {
202
+ if (event.name === 'up' ||
203
+ event.name === 'k' ||
204
+ event.name === 'left' ||
205
+ event.name === 'h') {
206
+ cycleStatus('up');
207
+ }
208
+ else if (event.name === 'down' ||
209
+ event.name === 'j' ||
210
+ event.name === 'right' ||
211
+ event.name === 'l') {
212
+ cycleStatus('down');
213
+ }
214
+ }
215
+ else {
216
+ // Handle text input for title, description, sourceBranch, targetBranch
217
+ const setters = {
218
+ title: setTitle,
219
+ description: setDescription,
220
+ sourceBranch: setSourceBranch,
221
+ targetBranch: setTargetBranch,
222
+ };
223
+ const setter = setters[activeField];
224
+ if (event.name === 'backspace') {
225
+ setter(prev => prev.slice(0, -1));
226
+ }
227
+ else if (event.name === 'return') {
228
+ if (activeField === 'description') {
229
+ setter(prev => prev + '\n');
230
+ }
231
+ else {
232
+ moveToNextField();
233
+ }
234
+ }
235
+ else if (event.name === 'space') {
236
+ setter(prev => prev + ' ');
237
+ }
238
+ else if (event.name.length === 1 && !event.ctrl && !event.meta) {
239
+ const char = event.shift ? event.name.toUpperCase() : event.name;
240
+ setter(prev => prev + char);
241
+ }
242
+ }
243
+ });
244
+ const projectName = state.selectedProjectPath?.split('/').pop() || 'Project';
245
+ if (!state.selectedProjectPath) {
246
+ return (_jsx(MainPanel, { title: "Edit PR", children: _jsx("text", { fg: "gray", children: "Select a project first." }) }));
247
+ }
248
+ if (isLoading) {
249
+ return (_jsx(MainPanel, { title: `Edit PR - ${projectName}`, children: _jsx("text", { fg: "cyan", children: "Loading PR..." }) }));
250
+ }
251
+ if (!pr) {
252
+ return (_jsx(MainPanel, { title: `Edit PR - ${projectName}`, children: _jsx("text", { fg: "red", children: "PR not found." }) }));
253
+ }
254
+ if (isSubmitting) {
255
+ return (_jsx(MainPanel, { title: `Edit PR #${pr.displayNumber} - ${projectName}`, children: _jsx("text", { fg: "cyan", children: "Saving changes..." }) }));
256
+ }
257
+ return (_jsx(MainPanel, { title: `Edit PR #${pr.displayNumber} - ${projectName}`, children: _jsxs("box", { flexDirection: "column", flexGrow: 1, children: [_jsx("box", { marginBottom: 1, children: _jsx("text", { fg: "gray", children: "Tab: next field | Shift+Tab: prev | Ctrl+S: save | Esc: cancel" }) }), error && (_jsx("box", { marginBottom: 1, children: _jsx("text", { fg: "red", children: error }) })), _jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsx("text", { fg: activeField === 'title' ? 'cyan' : 'white', children: _jsxs("b", { children: ["Title ", activeField === 'title' ? '▸' : ' '] }) }), _jsxs("box", { paddingLeft: 2, borderStyle: activeField === 'title' ? 'single' : undefined, children: [_jsx("text", { children: title || (activeField === 'title' ? '│' : '') }), activeField === 'title' && _jsx("text", { fg: "cyan", children: "_" })] })] }), _jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsx("text", { fg: activeField === 'description' ? 'cyan' : 'white', children: _jsxs("b", { children: ["Description ", activeField === 'description' ? '▸' : ' '] }) }), _jsxs("box", { paddingLeft: 2, borderStyle: activeField === 'description' ? 'single' : undefined, height: 3, children: [_jsx("text", { children: description || (activeField === 'description' ? '' : '') }), activeField === 'description' && _jsx("text", { fg: "cyan", children: "_" })] })] }), _jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsx("text", { fg: activeField === 'sourceBranch' ? 'cyan' : 'white', children: _jsxs("b", { children: ["Source Branch ", activeField === 'sourceBranch' ? '▸' : ' '] }) }), _jsxs("box", { paddingLeft: 2, borderStyle: activeField === 'sourceBranch' ? 'single' : undefined, children: [_jsx("text", { children: sourceBranch || (activeField === 'sourceBranch' ? '│' : '') }), activeField === 'sourceBranch' && _jsx("text", { fg: "cyan", children: "_" })] })] }), _jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsx("text", { fg: activeField === 'targetBranch' ? 'cyan' : 'white', children: _jsxs("b", { children: ["Target Branch ", activeField === 'targetBranch' ? '▸' : ' '] }) }), _jsxs("box", { paddingLeft: 2, borderStyle: activeField === 'targetBranch' ? 'single' : undefined, children: [_jsx("text", { children: targetBranch || (activeField === 'targetBranch' ? '│' : '') }), activeField === 'targetBranch' && _jsx("text", { fg: "cyan", children: "_" })] })] }), _jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsx("text", { fg: activeField === 'priority' ? 'cyan' : 'white', children: _jsxs("b", { children: ["Priority ", activeField === 'priority' ? '▸' : ' '] }) }), _jsxs("box", { paddingLeft: 2, flexDirection: "row", children: [activeField === 'priority' && _jsx("text", { fg: "gray", children: "\u25C0 " }), _jsxs("text", { fg: getPriorityColor(priority), children: [getPriorityLabel(priority), " (", priority, "/", priorityLevels, ")"] }), activeField === 'priority' && _jsx("text", { fg: "gray", children: " \u25B6" })] })] }), _jsxs("box", { flexDirection: "column", marginBottom: 1, children: [_jsx("text", { fg: activeField === 'status' ? 'cyan' : 'white', children: _jsxs("b", { children: ["Status ", activeField === 'status' ? '▸' : ' '] }) }), _jsxs("box", { paddingLeft: 2, flexDirection: "row", children: [activeField === 'status' && _jsx("text", { fg: "gray", children: "\u25C0 " }), _jsx("text", { fg: getStatusColor(status), children: status }), activeField === 'status' && _jsx("text", { fg: "gray", children: " \u25B6" })] })] }), _jsx("box", { marginTop: 1, children: _jsx("text", { fg: "green", children: "Press Ctrl+S to save changes" }) })] }) }));
258
+ }
259
+ //# sourceMappingURL=PREdit.js.map