@arnavpisces/sutra 1.0.0

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 (288) hide show
  1. package/LICENSE +203 -0
  2. package/NOTICE +6 -0
  3. package/README.md +181 -0
  4. package/dist/api/client.d.ts +24 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +168 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/api/confluence-client.d.ts +133 -0
  9. package/dist/api/confluence-client.d.ts.map +1 -0
  10. package/dist/api/confluence-client.js +224 -0
  11. package/dist/api/confluence-client.js.map +1 -0
  12. package/dist/api/jira-client.d.ts +94 -0
  13. package/dist/api/jira-client.d.ts.map +1 -0
  14. package/dist/api/jira-client.js +151 -0
  15. package/dist/api/jira-client.js.map +1 -0
  16. package/dist/app.d.ts +2 -0
  17. package/dist/app.d.ts.map +1 -0
  18. package/dist/app.js +135 -0
  19. package/dist/app.js.map +1 -0
  20. package/dist/components/common/Badge.d.ts +7 -0
  21. package/dist/components/common/Badge.d.ts.map +1 -0
  22. package/dist/components/common/Badge.js +15 -0
  23. package/dist/components/common/Badge.js.map +1 -0
  24. package/dist/components/common/Breadcrumbs.d.ts +5 -0
  25. package/dist/components/common/Breadcrumbs.d.ts.map +1 -0
  26. package/dist/components/common/Breadcrumbs.js +9 -0
  27. package/dist/components/common/Breadcrumbs.js.map +1 -0
  28. package/dist/components/common/Divider.d.ts +7 -0
  29. package/dist/components/common/Divider.d.ts.map +1 -0
  30. package/dist/components/common/Divider.js +13 -0
  31. package/dist/components/common/Divider.js.map +1 -0
  32. package/dist/components/common/EditableTextBox.d.ts +30 -0
  33. package/dist/components/common/EditableTextBox.d.ts.map +1 -0
  34. package/dist/components/common/EditableTextBox.js +512 -0
  35. package/dist/components/common/EditableTextBox.js.map +1 -0
  36. package/dist/components/common/Footer.d.ts +9 -0
  37. package/dist/components/common/Footer.d.ts.map +1 -0
  38. package/dist/components/common/Footer.js +7 -0
  39. package/dist/components/common/Footer.js.map +1 -0
  40. package/dist/components/common/FuzzySelect.d.ts +17 -0
  41. package/dist/components/common/FuzzySelect.d.ts.map +1 -0
  42. package/dist/components/common/FuzzySelect.js +72 -0
  43. package/dist/components/common/FuzzySelect.js.map +1 -0
  44. package/dist/components/common/Header.d.ts +7 -0
  45. package/dist/components/common/Header.d.ts.map +1 -0
  46. package/dist/components/common/Header.js +18 -0
  47. package/dist/components/common/Header.js.map +1 -0
  48. package/dist/components/common/HelpModal.d.ts +13 -0
  49. package/dist/components/common/HelpModal.d.ts.map +1 -0
  50. package/dist/components/common/HelpModal.js +9 -0
  51. package/dist/components/common/HelpModal.js.map +1 -0
  52. package/dist/components/common/KeyHint.d.ts +15 -0
  53. package/dist/components/common/KeyHint.d.ts.map +1 -0
  54. package/dist/components/common/KeyHint.js +10 -0
  55. package/dist/components/common/KeyHint.js.map +1 -0
  56. package/dist/components/common/MenuList.d.ts +15 -0
  57. package/dist/components/common/MenuList.d.ts.map +1 -0
  58. package/dist/components/common/MenuList.js +31 -0
  59. package/dist/components/common/MenuList.js.map +1 -0
  60. package/dist/components/common/Panel.d.ts +12 -0
  61. package/dist/components/common/Panel.d.ts.map +1 -0
  62. package/dist/components/common/Panel.js +6 -0
  63. package/dist/components/common/Panel.js.map +1 -0
  64. package/dist/components/common/ProgressBar.d.ts +11 -0
  65. package/dist/components/common/ProgressBar.d.ts.map +1 -0
  66. package/dist/components/common/ProgressBar.js +11 -0
  67. package/dist/components/common/ProgressBar.js.map +1 -0
  68. package/dist/components/common/SavedList.d.ts +16 -0
  69. package/dist/components/common/SavedList.d.ts.map +1 -0
  70. package/dist/components/common/SavedList.js +37 -0
  71. package/dist/components/common/SavedList.js.map +1 -0
  72. package/dist/components/common/ScrollBox.d.ts +9 -0
  73. package/dist/components/common/ScrollBox.d.ts.map +1 -0
  74. package/dist/components/common/ScrollBox.js +105 -0
  75. package/dist/components/common/ScrollBox.js.map +1 -0
  76. package/dist/components/common/SearchBar.d.ts +10 -0
  77. package/dist/components/common/SearchBar.d.ts.map +1 -0
  78. package/dist/components/common/SearchBar.js +7 -0
  79. package/dist/components/common/SearchBar.js.map +1 -0
  80. package/dist/components/common/SelectableItem.d.ts +14 -0
  81. package/dist/components/common/SelectableItem.d.ts.map +1 -0
  82. package/dist/components/common/SelectableItem.js +14 -0
  83. package/dist/components/common/SelectableItem.js.map +1 -0
  84. package/dist/components/common/Spinner.d.ts +7 -0
  85. package/dist/components/common/Spinner.d.ts.map +1 -0
  86. package/dist/components/common/Spinner.js +23 -0
  87. package/dist/components/common/Spinner.js.map +1 -0
  88. package/dist/components/common/SplitPane.d.ts +8 -0
  89. package/dist/components/common/SplitPane.d.ts.map +1 -0
  90. package/dist/components/common/SplitPane.js +10 -0
  91. package/dist/components/common/SplitPane.js.map +1 -0
  92. package/dist/components/common/StatusBar.d.ts +9 -0
  93. package/dist/components/common/StatusBar.d.ts.map +1 -0
  94. package/dist/components/common/StatusBar.js +6 -0
  95. package/dist/components/common/StatusBar.js.map +1 -0
  96. package/dist/components/common/TabBar.d.ts +9 -0
  97. package/dist/components/common/TabBar.d.ts.map +1 -0
  98. package/dist/components/common/TabBar.js +12 -0
  99. package/dist/components/common/TabBar.js.map +1 -0
  100. package/dist/components/common/Table.d.ts +19 -0
  101. package/dist/components/common/Table.d.ts.map +1 -0
  102. package/dist/components/common/Table.js +24 -0
  103. package/dist/components/common/Table.js.map +1 -0
  104. package/dist/components/common/TextEditor.d.ts +10 -0
  105. package/dist/components/common/TextEditor.d.ts.map +1 -0
  106. package/dist/components/common/TextEditor.js +17 -0
  107. package/dist/components/common/TextEditor.js.map +1 -0
  108. package/dist/components/common/Toast.d.ts +8 -0
  109. package/dist/components/common/Toast.d.ts.map +1 -0
  110. package/dist/components/common/Toast.js +32 -0
  111. package/dist/components/common/Toast.js.map +1 -0
  112. package/dist/components/common/index.d.ts +38 -0
  113. package/dist/components/common/index.d.ts.map +1 -0
  114. package/dist/components/common/index.js +22 -0
  115. package/dist/components/common/index.js.map +1 -0
  116. package/dist/components/confluence/ConfluenceView.d.ts +6 -0
  117. package/dist/components/confluence/ConfluenceView.d.ts.map +1 -0
  118. package/dist/components/confluence/ConfluenceView.js +184 -0
  119. package/dist/components/confluence/ConfluenceView.js.map +1 -0
  120. package/dist/components/confluence/DocTree.d.ts +10 -0
  121. package/dist/components/confluence/DocTree.d.ts.map +1 -0
  122. package/dist/components/confluence/DocTree.js +125 -0
  123. package/dist/components/confluence/DocTree.js.map +1 -0
  124. package/dist/components/confluence/PageAttachments.d.ts +8 -0
  125. package/dist/components/confluence/PageAttachments.d.ts.map +1 -0
  126. package/dist/components/confluence/PageAttachments.js +108 -0
  127. package/dist/components/confluence/PageAttachments.js.map +1 -0
  128. package/dist/components/confluence/PageBrowser.d.ts +8 -0
  129. package/dist/components/confluence/PageBrowser.d.ts.map +1 -0
  130. package/dist/components/confluence/PageBrowser.js +93 -0
  131. package/dist/components/confluence/PageBrowser.js.map +1 -0
  132. package/dist/components/confluence/PageComments.d.ts +8 -0
  133. package/dist/components/confluence/PageComments.d.ts.map +1 -0
  134. package/dist/components/confluence/PageComments.js +75 -0
  135. package/dist/components/confluence/PageComments.js.map +1 -0
  136. package/dist/components/confluence/PageEditor.d.ts +13 -0
  137. package/dist/components/confluence/PageEditor.d.ts.map +1 -0
  138. package/dist/components/confluence/PageEditor.js +37 -0
  139. package/dist/components/confluence/PageEditor.js.map +1 -0
  140. package/dist/components/confluence/PageLabels.d.ts +8 -0
  141. package/dist/components/confluence/PageLabels.d.ts.map +1 -0
  142. package/dist/components/confluence/PageLabels.js +92 -0
  143. package/dist/components/confluence/PageLabels.js.map +1 -0
  144. package/dist/components/confluence/PageList.d.ts +8 -0
  145. package/dist/components/confluence/PageList.d.ts.map +1 -0
  146. package/dist/components/confluence/PageList.js +95 -0
  147. package/dist/components/confluence/PageList.js.map +1 -0
  148. package/dist/components/confluence/PageViewer.d.ts +14 -0
  149. package/dist/components/confluence/PageViewer.d.ts.map +1 -0
  150. package/dist/components/confluence/PageViewer.js +160 -0
  151. package/dist/components/confluence/PageViewer.js.map +1 -0
  152. package/dist/components/confluence/SpaceTree.d.ts +10 -0
  153. package/dist/components/confluence/SpaceTree.d.ts.map +1 -0
  154. package/dist/components/confluence/SpaceTree.js +220 -0
  155. package/dist/components/confluence/SpaceTree.js.map +1 -0
  156. package/dist/components/jira/CommentForm.d.ts +7 -0
  157. package/dist/components/jira/CommentForm.d.ts.map +1 -0
  158. package/dist/components/jira/CommentForm.js +24 -0
  159. package/dist/components/jira/CommentForm.js.map +1 -0
  160. package/dist/components/jira/CreateTicket.d.ts +9 -0
  161. package/dist/components/jira/CreateTicket.d.ts.map +1 -0
  162. package/dist/components/jira/CreateTicket.js +106 -0
  163. package/dist/components/jira/CreateTicket.js.map +1 -0
  164. package/dist/components/jira/IssueList.d.ts +9 -0
  165. package/dist/components/jira/IssueList.d.ts.map +1 -0
  166. package/dist/components/jira/IssueList.js +43 -0
  167. package/dist/components/jira/IssueList.js.map +1 -0
  168. package/dist/components/jira/JiraIssueRow.d.ts +7 -0
  169. package/dist/components/jira/JiraIssueRow.d.ts.map +1 -0
  170. package/dist/components/jira/JiraIssueRow.js +49 -0
  171. package/dist/components/jira/JiraIssueRow.js.map +1 -0
  172. package/dist/components/jira/JiraView.d.ts +7 -0
  173. package/dist/components/jira/JiraView.d.ts.map +1 -0
  174. package/dist/components/jira/JiraView.js +283 -0
  175. package/dist/components/jira/JiraView.js.map +1 -0
  176. package/dist/components/jira/JqlSearch.d.ts +8 -0
  177. package/dist/components/jira/JqlSearch.d.ts.map +1 -0
  178. package/dist/components/jira/JqlSearch.js +51 -0
  179. package/dist/components/jira/JqlSearch.js.map +1 -0
  180. package/dist/components/jira/QuickFilters.d.ts +8 -0
  181. package/dist/components/jira/QuickFilters.d.ts.map +1 -0
  182. package/dist/components/jira/QuickFilters.js +61 -0
  183. package/dist/components/jira/QuickFilters.js.map +1 -0
  184. package/dist/components/jira/StatusSelector.d.ts +9 -0
  185. package/dist/components/jira/StatusSelector.d.ts.map +1 -0
  186. package/dist/components/jira/StatusSelector.js +11 -0
  187. package/dist/components/jira/StatusSelector.js.map +1 -0
  188. package/dist/components/jira/TicketDetail.d.ts +23 -0
  189. package/dist/components/jira/TicketDetail.d.ts.map +1 -0
  190. package/dist/components/jira/TicketDetail.js +409 -0
  191. package/dist/components/jira/TicketDetail.js.map +1 -0
  192. package/dist/components/jira/TicketEditor.d.ts +9 -0
  193. package/dist/components/jira/TicketEditor.d.ts.map +1 -0
  194. package/dist/components/jira/TicketEditor.js +21 -0
  195. package/dist/components/jira/TicketEditor.js.map +1 -0
  196. package/dist/components/jira/TicketList.d.ts +8 -0
  197. package/dist/components/jira/TicketList.d.ts.map +1 -0
  198. package/dist/components/jira/TicketList.js +89 -0
  199. package/dist/components/jira/TicketList.js.map +1 -0
  200. package/dist/config/config-manager.d.ts +11 -0
  201. package/dist/config/config-manager.d.ts.map +1 -0
  202. package/dist/config/config-manager.js +65 -0
  203. package/dist/config/config-manager.js.map +1 -0
  204. package/dist/config/types.d.ts +81 -0
  205. package/dist/config/types.d.ts.map +1 -0
  206. package/dist/config/types.js +16 -0
  207. package/dist/config/types.js.map +1 -0
  208. package/dist/formatters/adf-converter.d.ts +21 -0
  209. package/dist/formatters/adf-converter.d.ts.map +1 -0
  210. package/dist/formatters/adf-converter.js +73 -0
  211. package/dist/formatters/adf-converter.js.map +1 -0
  212. package/dist/formatters/confluence-converter.d.ts +25 -0
  213. package/dist/formatters/confluence-converter.d.ts.map +1 -0
  214. package/dist/formatters/confluence-converter.js +77 -0
  215. package/dist/formatters/confluence-converter.js.map +1 -0
  216. package/dist/formatters/glow-renderer.d.ts +39 -0
  217. package/dist/formatters/glow-renderer.d.ts.map +1 -0
  218. package/dist/formatters/glow-renderer.js +136 -0
  219. package/dist/formatters/glow-renderer.js.map +1 -0
  220. package/dist/formatters/markdown-ansi-renderer.d.ts +24 -0
  221. package/dist/formatters/markdown-ansi-renderer.d.ts.map +1 -0
  222. package/dist/formatters/markdown-ansi-renderer.js +240 -0
  223. package/dist/formatters/markdown-ansi-renderer.js.map +1 -0
  224. package/dist/formatters/mdcat-renderer.d.ts +29 -0
  225. package/dist/formatters/mdcat-renderer.d.ts.map +1 -0
  226. package/dist/formatters/mdcat-renderer.js +106 -0
  227. package/dist/formatters/mdcat-renderer.js.map +1 -0
  228. package/dist/hooks/useConfluencePage.d.ts +9 -0
  229. package/dist/hooks/useConfluencePage.d.ts.map +1 -0
  230. package/dist/hooks/useConfluencePage.js +53 -0
  231. package/dist/hooks/useConfluencePage.js.map +1 -0
  232. package/dist/hooks/useJiraIssue.d.ts +9 -0
  233. package/dist/hooks/useJiraIssue.d.ts.map +1 -0
  234. package/dist/hooks/useJiraIssue.js +52 -0
  235. package/dist/hooks/useJiraIssue.js.map +1 -0
  236. package/dist/index.d.ts +3 -0
  237. package/dist/index.d.ts.map +1 -0
  238. package/dist/index.js +214 -0
  239. package/dist/index.js.map +1 -0
  240. package/dist/storage/bookmarks.d.ts +16 -0
  241. package/dist/storage/bookmarks.d.ts.map +1 -0
  242. package/dist/storage/bookmarks.js +49 -0
  243. package/dist/storage/bookmarks.js.map +1 -0
  244. package/dist/storage/cache.d.ts +12 -0
  245. package/dist/storage/cache.d.ts.map +1 -0
  246. package/dist/storage/cache.js +57 -0
  247. package/dist/storage/cache.js.map +1 -0
  248. package/dist/storage/db.d.ts +4 -0
  249. package/dist/storage/db.d.ts.map +1 -0
  250. package/dist/storage/db.js +63 -0
  251. package/dist/storage/db.js.map +1 -0
  252. package/dist/storage/recents.d.ts +13 -0
  253. package/dist/storage/recents.d.ts.map +1 -0
  254. package/dist/storage/recents.js +40 -0
  255. package/dist/storage/recents.js.map +1 -0
  256. package/dist/theme/te.d.ts +12 -0
  257. package/dist/theme/te.d.ts.map +1 -0
  258. package/dist/theme/te.js +13 -0
  259. package/dist/theme/te.js.map +1 -0
  260. package/dist/utils/cache.d.ts +15 -0
  261. package/dist/utils/cache.d.ts.map +1 -0
  262. package/dist/utils/cache.js +34 -0
  263. package/dist/utils/cache.js.map +1 -0
  264. package/dist/utils/errors.d.ts +16 -0
  265. package/dist/utils/errors.d.ts.map +1 -0
  266. package/dist/utils/errors.js +32 -0
  267. package/dist/utils/errors.js.map +1 -0
  268. package/dist/utils/external-editor.d.ts +32 -0
  269. package/dist/utils/external-editor.d.ts.map +1 -0
  270. package/dist/utils/external-editor.js +173 -0
  271. package/dist/utils/external-editor.js.map +1 -0
  272. package/dist/utils/jira-colors.d.ts +4 -0
  273. package/dist/utils/jira-colors.d.ts.map +1 -0
  274. package/dist/utils/jira-colors.js +47 -0
  275. package/dist/utils/jira-colors.js.map +1 -0
  276. package/dist/utils/links.d.ts +5 -0
  277. package/dist/utils/links.d.ts.map +1 -0
  278. package/dist/utils/links.js +43 -0
  279. package/dist/utils/links.js.map +1 -0
  280. package/dist/utils/markdown-highlighter.d.ts +49 -0
  281. package/dist/utils/markdown-highlighter.d.ts.map +1 -0
  282. package/dist/utils/markdown-highlighter.js +282 -0
  283. package/dist/utils/markdown-highlighter.js.map +1 -0
  284. package/dist/utils/paths.d.ts +3 -0
  285. package/dist/utils/paths.d.ts.map +1 -0
  286. package/dist/utils/paths.js +15 -0
  287. package/dist/utils/paths.js.map +1 -0
  288. package/package.json +74 -0
@@ -0,0 +1,32 @@
1
+ export class AtlassianError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'AtlassianError';
5
+ }
6
+ }
7
+ export class JiraError extends AtlassianError {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = 'JiraError';
11
+ }
12
+ }
13
+ export class ConfluenceError extends AtlassianError {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = 'ConfluenceError';
17
+ }
18
+ }
19
+ export class AuthenticationError extends AtlassianError {
20
+ constructor(service = 'Atlassian') {
21
+ super(`Authentication failed for ${service}. Check your email and API token. ` +
22
+ `Generate an API token at: https://id.atlassian.com/manage-profile/security/api-tokens`);
23
+ this.name = 'AuthenticationError';
24
+ }
25
+ }
26
+ export class ConfigurationError extends AtlassianError {
27
+ constructor(message) {
28
+ super(message);
29
+ this.name = 'ConfigurationError';
30
+ }
31
+ }
32
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,cAAc;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IACrD,YAAY,UAAkB,WAAW;QACvC,KAAK,CACH,6BAA6B,OAAO,oCAAoC;YACxE,uFAAuF,CACxF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ export interface ExternalEditorOptions {
2
+ /** Initial content to edit */
3
+ content: string;
4
+ /** File extension for temp file (e.g., 'md', 'txt') */
5
+ extension?: string;
6
+ /** Custom editor command (defaults to GUI editor like Cursor/VS Code) */
7
+ editor?: string;
8
+ }
9
+ export interface ExternalEditorResult {
10
+ /** Whether the edit was successful */
11
+ success: boolean;
12
+ /** The edited content (if successful) */
13
+ content?: string;
14
+ /** Error message (if failed) */
15
+ error?: string;
16
+ /** Whether file was modified */
17
+ modified: boolean;
18
+ }
19
+ /**
20
+ * Opens content in an external editor and returns the edited result.
21
+ * Prefers GUI editors (Cursor/VS Code) for a smoother TUI workflow.
22
+ */
23
+ export declare function openExternalEditor(options: ExternalEditorOptions): Promise<ExternalEditorResult>;
24
+ /**
25
+ * Check if an editor is available
26
+ */
27
+ export declare function isEditorAvailable(): boolean;
28
+ /**
29
+ * Get the name of the configured editor
30
+ */
31
+ export declare function getEditorName(): string;
32
+ //# sourceMappingURL=external-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-editor.d.ts","sourceRoot":"","sources":["../../src/utils/external-editor.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,qBAAqB;IAClC,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACjC,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACpC,OAAO,EAAE,qBAAqB,GAC/B,OAAO,CAAC,oBAAoB,CAAC,CAkG/B;AA4ED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAG3C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAGtC"}
@@ -0,0 +1,173 @@
1
+ import { spawn, execSync } from 'child_process';
2
+ import { writeFileSync, readFileSync, unlinkSync, existsSync } from 'fs';
3
+ import { tmpdir } from 'os';
4
+ import { join } from 'path';
5
+ const GUI_EDITOR_CANDIDATES = ['cursor --wait', 'code --wait', 'code-insiders --wait'];
6
+ const TERMINAL_EDITORS = new Set(['vim', 'vi', 'nvim', 'nano', 'emacs', 'hx', 'kak']);
7
+ /**
8
+ * Opens content in an external editor and returns the edited result.
9
+ * Prefers GUI editors (Cursor/VS Code) for a smoother TUI workflow.
10
+ */
11
+ export async function openExternalEditor(options) {
12
+ const { content, extension = 'md' } = options;
13
+ // Determine editor command
14
+ const editor = options.editor || getDefaultEditor();
15
+ // Create temp file
16
+ const tempPath = join(tmpdir(), `confluence-edit-${Date.now()}.${extension}`);
17
+ const stdin = process.stdin;
18
+ const canManageStdin = Boolean(stdin && stdin.isTTY && stdin.setRawMode);
19
+ const wasRaw = Boolean(canManageStdin && stdin.isRaw);
20
+ const wasPaused = Boolean(stdin && stdin.isPaused && stdin.isPaused());
21
+ try {
22
+ // Write initial content
23
+ writeFileSync(tempPath, content, 'utf-8');
24
+ const originalContent = content;
25
+ // Reset terminal state before opening editor
26
+ // Disable mouse tracking modes that might interfere with vim
27
+ process.stdout.write('\x1b[?1000l\x1b[?1002l\x1b[?1003l\x1b[?1006l');
28
+ // Reset cursor and clear screen for clean handoff
29
+ process.stdout.write('\x1b[?25h'); // Show cursor
30
+ // Temporarily hand stdin control to the external editor.
31
+ // This prevents Ink input handlers from processing editor keystrokes.
32
+ if (canManageStdin) {
33
+ stdin.setRawMode?.(false);
34
+ }
35
+ if (stdin && !wasPaused) {
36
+ stdin.pause();
37
+ }
38
+ // Open editor and wait for it to close
39
+ await openEditor(editor, tempPath);
40
+ // Restore terminal state after editor closes
41
+ // Re-enable raw mode for Ink and let components re-enable mouse tracking.
42
+ if (stdin && !wasPaused) {
43
+ stdin.resume();
44
+ }
45
+ if (canManageStdin && wasRaw) {
46
+ stdin.setRawMode?.(true);
47
+ }
48
+ process.stdout.write('\x1b[2J\x1b[H\x1b[?25l'); // Clear/home and hide cursor for Ink
49
+ // Read back the content
50
+ if (!existsSync(tempPath)) {
51
+ return {
52
+ success: false,
53
+ error: 'Temp file was deleted',
54
+ modified: false,
55
+ };
56
+ }
57
+ const editedContent = readFileSync(tempPath, 'utf-8');
58
+ const modified = editedContent !== originalContent;
59
+ // Clean up
60
+ try {
61
+ unlinkSync(tempPath);
62
+ }
63
+ catch {
64
+ // Ignore cleanup errors
65
+ }
66
+ return {
67
+ success: true,
68
+ content: editedContent,
69
+ modified,
70
+ };
71
+ }
72
+ catch (error) {
73
+ // Clean up on error
74
+ try {
75
+ if (existsSync(tempPath)) {
76
+ unlinkSync(tempPath);
77
+ }
78
+ }
79
+ catch {
80
+ // Ignore cleanup errors
81
+ }
82
+ // Ensure terminal input mode is restored even if editor launch fails.
83
+ if (stdin && !wasPaused) {
84
+ stdin.resume();
85
+ }
86
+ if (canManageStdin && wasRaw) {
87
+ stdin.setRawMode?.(true);
88
+ }
89
+ return {
90
+ success: false,
91
+ error: error instanceof Error ? error.message : 'Unknown error',
92
+ modified: false,
93
+ };
94
+ }
95
+ }
96
+ /**
97
+ * Gets the default editor from environment
98
+ */
99
+ function getDefaultEditor() {
100
+ const envEditor = process.env.EDITOR || process.env.VISUAL;
101
+ const preferredGui = GUI_EDITOR_CANDIDATES.find(candidate => commandExists(getCommandName(candidate)));
102
+ if (envEditor) {
103
+ const envCmd = getCommandName(envEditor);
104
+ const isTerminalEditor = TERMINAL_EDITORS.has(envCmd);
105
+ // Respect non-terminal custom editors from env when available.
106
+ if (!isTerminalEditor && commandExists(envCmd)) {
107
+ return envEditor;
108
+ }
109
+ // For terminal defaults like vim, prefer a GUI editor for Ctrl+E.
110
+ if (preferredGui) {
111
+ return preferredGui;
112
+ }
113
+ }
114
+ if (preferredGui) {
115
+ return preferredGui;
116
+ }
117
+ // Last fallback if no GUI editor command is available.
118
+ return 'nano';
119
+ }
120
+ function getCommandName(editor) {
121
+ return editor.trim().split(/\s+/)[0] || '';
122
+ }
123
+ function commandExists(cmd) {
124
+ if (!cmd || !/^[A-Za-z0-9._-]+$/.test(cmd))
125
+ return false;
126
+ try {
127
+ execSync(`command -v ${cmd}`, { stdio: 'ignore' });
128
+ return true;
129
+ }
130
+ catch {
131
+ return false;
132
+ }
133
+ }
134
+ /**
135
+ * Opens the editor and waits for it to close
136
+ */
137
+ function openEditor(editor, filePath) {
138
+ return new Promise((resolve, reject) => {
139
+ const parts = editor.split(' ');
140
+ const cmd = parts[0];
141
+ const args = [...parts.slice(1), filePath];
142
+ const proc = spawn(cmd, args, {
143
+ stdio: 'inherit',
144
+ shell: true,
145
+ });
146
+ proc.on('error', (error) => {
147
+ reject(new Error(`Failed to open editor: ${error.message}`));
148
+ });
149
+ proc.on('close', (code) => {
150
+ if (code === 0) {
151
+ resolve();
152
+ }
153
+ else {
154
+ reject(new Error(`Editor exited with code ${code}`));
155
+ }
156
+ });
157
+ });
158
+ }
159
+ /**
160
+ * Check if an editor is available
161
+ */
162
+ export function isEditorAvailable() {
163
+ const editor = getDefaultEditor();
164
+ return commandExists(getCommandName(editor));
165
+ }
166
+ /**
167
+ * Get the name of the configured editor
168
+ */
169
+ export function getEditorName() {
170
+ const editor = getDefaultEditor();
171
+ return getCommandName(editor);
172
+ }
173
+ //# sourceMappingURL=external-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-editor.js","sourceRoot":"","sources":["../../src/utils/external-editor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function getJiraStatusColor(status?: string): string;
2
+ export declare function getJiraTypeColor(type?: string): string;
3
+ export declare function getJiraPriorityColor(priority?: string): string;
4
+ //# sourceMappingURL=jira-colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-colors.d.ts","sourceRoot":"","sources":["../../src/utils/jira-colors.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAStD;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ9D"}
@@ -0,0 +1,47 @@
1
+ export function getJiraStatusColor(status) {
2
+ if (!status)
3
+ return 'gray';
4
+ const s = status.toLowerCase();
5
+ if (s.includes('done') || s.includes('closed') || s.includes('resolved'))
6
+ return 'green';
7
+ if (s.includes('in progress') || s.includes('doing'))
8
+ return 'cyan';
9
+ if (s.includes('review') || s.includes('qa') || s.includes('testing'))
10
+ return 'yellow';
11
+ if (s.includes('blocked'))
12
+ return 'red';
13
+ if (s.includes('to do') || s.includes('open') || s.includes('backlog'))
14
+ return 'blue';
15
+ return 'white';
16
+ }
17
+ export function getJiraTypeColor(type) {
18
+ if (!type)
19
+ return 'gray';
20
+ const t = type.toLowerCase();
21
+ if (t.includes('bug'))
22
+ return 'red';
23
+ if (t.includes('task'))
24
+ return 'cyan';
25
+ if (t.includes('story'))
26
+ return 'green';
27
+ if (t.includes('epic'))
28
+ return 'magenta';
29
+ if (t.includes('sub-task') || t.includes('subtask'))
30
+ return 'gray';
31
+ return 'white';
32
+ }
33
+ export function getJiraPriorityColor(priority) {
34
+ if (!priority)
35
+ return 'gray';
36
+ const p = priority.toLowerCase();
37
+ if (p.includes('blocker') || p.includes('critical') || p.includes('highest'))
38
+ return 'red';
39
+ if (p.includes('high'))
40
+ return 'yellow';
41
+ if (p.includes('medium'))
42
+ return 'cyan';
43
+ if (p.includes('low') || p.includes('lowest'))
44
+ return 'green';
45
+ return 'white';
46
+ }
47
+ //# sourceMappingURL=jira-colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-colors.js","sourceRoot":"","sources":["../../src/utils/jira-colors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,MAAe;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,OAAO,CAAC;IACzF,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IACpE,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvF,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,MAAM,CAAC;IACtF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC;IACzB,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACxC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,MAAM,CAAC;IACnE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAiB;IACpD,IAAI,CAAC,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC7B,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3F,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9D,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function buildJiraIssueUrl(baseUrl: string, issueKey: string): string;
2
+ export declare function resolveUrl(baseUrl: string, pathOrUrl: string): string;
3
+ export declare function copyToClipboard(text: string): Promise<boolean>;
4
+ export declare function openInBrowser(url: string): void;
5
+ //# sourceMappingURL=links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/utils/links.ts"],"names":[],"mappings":"AAGA,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG3E;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CASrE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOpE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAe/C"}
@@ -0,0 +1,43 @@
1
+ import { spawn } from 'child_process';
2
+ import clipboard from 'clipboardy';
3
+ export function buildJiraIssueUrl(baseUrl, issueKey) {
4
+ const cleanBase = baseUrl.replace(/\/+$/, '');
5
+ return `${cleanBase}/browse/${issueKey}`;
6
+ }
7
+ export function resolveUrl(baseUrl, pathOrUrl) {
8
+ if (!pathOrUrl)
9
+ return baseUrl;
10
+ if (/^https?:\/\//i.test(pathOrUrl))
11
+ return pathOrUrl;
12
+ const cleanBase = baseUrl.replace(/\/+$/, '');
13
+ let cleanPath = pathOrUrl.startsWith('/') ? pathOrUrl : `/${pathOrUrl}`;
14
+ if (cleanBase.endsWith('/wiki') && cleanPath.startsWith('/wiki/')) {
15
+ cleanPath = cleanPath.replace(/^\/wiki/, '');
16
+ }
17
+ return `${cleanBase}${cleanPath}`;
18
+ }
19
+ export async function copyToClipboard(text) {
20
+ try {
21
+ await clipboard.write(text);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ export function openInBrowser(url) {
29
+ const platform = process.platform;
30
+ let cmd = 'xdg-open';
31
+ let args = [url];
32
+ if (platform === 'darwin') {
33
+ cmd = 'open';
34
+ args = [url];
35
+ }
36
+ else if (platform === 'win32') {
37
+ cmd = 'cmd';
38
+ args = ['/c', 'start', '', url];
39
+ }
40
+ const child = spawn(cmd, args, { stdio: 'ignore', detached: true });
41
+ child.unref();
42
+ }
43
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/utils/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,QAAgB;IACjE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,OAAO,GAAG,SAAS,WAAW,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,SAAiB;IAC3D,IAAI,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC;IAC/B,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,IAAI,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;IACxE,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,GAAG,GAAG,UAAU,CAAC;IACrB,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAEjB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,GAAG,GAAG,MAAM,CAAC;QACb,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,GAAG,GAAG,KAAK,CAAC;QACZ,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ /**
3
+ * Markdown syntax highlighter for terminal display
4
+ * Inspired by md-tui's approach: parse markdown elements and apply terminal colors
5
+ */
6
+ export declare const MarkdownColors: {
7
+ readonly h1: "cyanBright";
8
+ readonly h2: "cyan";
9
+ readonly h3: "blue";
10
+ readonly h4: "green";
11
+ readonly h5: "yellow";
12
+ readonly h6: "magenta";
13
+ readonly bold: "white";
14
+ readonly italic: "cyan";
15
+ readonly boldItalic: "cyan";
16
+ readonly code: "yellow";
17
+ readonly codeBg: "gray";
18
+ readonly strikethrough: "gray";
19
+ readonly link: "blueBright";
20
+ readonly linkBrackets: "gray";
21
+ readonly listMarker: "cyan";
22
+ readonly taskDone: "green";
23
+ readonly taskPending: "yellow";
24
+ readonly quote: "gray";
25
+ readonly quoteTip: "green";
26
+ readonly quoteWarning: "yellow";
27
+ readonly quoteCaution: "magenta";
28
+ readonly quoteImportant: "red";
29
+ readonly quoteNote: "blue";
30
+ readonly codeBlockBorder: "gray";
31
+ readonly codeBlockLang: "cyan";
32
+ readonly horizontalRule: "gray";
33
+ };
34
+ /**
35
+ * Parse and highlight a single line of markdown
36
+ * Returns an array of styled Text components
37
+ */
38
+ export declare function highlightMarkdownLine(line: string, lineIndex: number): React.ReactNode;
39
+ /**
40
+ * Detect if we're inside a code block based on line context
41
+ * Returns the language if inside a code block, null otherwise
42
+ */
43
+ export declare function detectCodeBlock(lines: string[], currentLine: number): string | null;
44
+ /**
45
+ * Apply simple syntax highlighting to code based on language
46
+ * This is a simplified version - md-tui uses tree-sitter for full parsing
47
+ */
48
+ export declare function highlightCodeLine(line: string, language: string): React.ReactNode;
49
+ //# sourceMappingURL=markdown-highlighter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-highlighter.d.ts","sourceRoot":"","sources":["../../src/utils/markdown-highlighter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;;GAGG;AAGH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCjB,CAAC;AAYX;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAoGtF;AA2ID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBnF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAqFjF"}