@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.
- package/LICENSE +203 -0
- package/NOTICE +6 -0
- package/README.md +181 -0
- package/dist/api/client.d.ts +24 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +168 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/confluence-client.d.ts +133 -0
- package/dist/api/confluence-client.d.ts.map +1 -0
- package/dist/api/confluence-client.js +224 -0
- package/dist/api/confluence-client.js.map +1 -0
- package/dist/api/jira-client.d.ts +94 -0
- package/dist/api/jira-client.d.ts.map +1 -0
- package/dist/api/jira-client.js +151 -0
- package/dist/api/jira-client.js.map +1 -0
- package/dist/app.d.ts +2 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +135 -0
- package/dist/app.js.map +1 -0
- package/dist/components/common/Badge.d.ts +7 -0
- package/dist/components/common/Badge.d.ts.map +1 -0
- package/dist/components/common/Badge.js +15 -0
- package/dist/components/common/Badge.js.map +1 -0
- package/dist/components/common/Breadcrumbs.d.ts +5 -0
- package/dist/components/common/Breadcrumbs.d.ts.map +1 -0
- package/dist/components/common/Breadcrumbs.js +9 -0
- package/dist/components/common/Breadcrumbs.js.map +1 -0
- package/dist/components/common/Divider.d.ts +7 -0
- package/dist/components/common/Divider.d.ts.map +1 -0
- package/dist/components/common/Divider.js +13 -0
- package/dist/components/common/Divider.js.map +1 -0
- package/dist/components/common/EditableTextBox.d.ts +30 -0
- package/dist/components/common/EditableTextBox.d.ts.map +1 -0
- package/dist/components/common/EditableTextBox.js +512 -0
- package/dist/components/common/EditableTextBox.js.map +1 -0
- package/dist/components/common/Footer.d.ts +9 -0
- package/dist/components/common/Footer.d.ts.map +1 -0
- package/dist/components/common/Footer.js +7 -0
- package/dist/components/common/Footer.js.map +1 -0
- package/dist/components/common/FuzzySelect.d.ts +17 -0
- package/dist/components/common/FuzzySelect.d.ts.map +1 -0
- package/dist/components/common/FuzzySelect.js +72 -0
- package/dist/components/common/FuzzySelect.js.map +1 -0
- package/dist/components/common/Header.d.ts +7 -0
- package/dist/components/common/Header.d.ts.map +1 -0
- package/dist/components/common/Header.js +18 -0
- package/dist/components/common/Header.js.map +1 -0
- package/dist/components/common/HelpModal.d.ts +13 -0
- package/dist/components/common/HelpModal.d.ts.map +1 -0
- package/dist/components/common/HelpModal.js +9 -0
- package/dist/components/common/HelpModal.js.map +1 -0
- package/dist/components/common/KeyHint.d.ts +15 -0
- package/dist/components/common/KeyHint.d.ts.map +1 -0
- package/dist/components/common/KeyHint.js +10 -0
- package/dist/components/common/KeyHint.js.map +1 -0
- package/dist/components/common/MenuList.d.ts +15 -0
- package/dist/components/common/MenuList.d.ts.map +1 -0
- package/dist/components/common/MenuList.js +31 -0
- package/dist/components/common/MenuList.js.map +1 -0
- package/dist/components/common/Panel.d.ts +12 -0
- package/dist/components/common/Panel.d.ts.map +1 -0
- package/dist/components/common/Panel.js +6 -0
- package/dist/components/common/Panel.js.map +1 -0
- package/dist/components/common/ProgressBar.d.ts +11 -0
- package/dist/components/common/ProgressBar.d.ts.map +1 -0
- package/dist/components/common/ProgressBar.js +11 -0
- package/dist/components/common/ProgressBar.js.map +1 -0
- package/dist/components/common/SavedList.d.ts +16 -0
- package/dist/components/common/SavedList.d.ts.map +1 -0
- package/dist/components/common/SavedList.js +37 -0
- package/dist/components/common/SavedList.js.map +1 -0
- package/dist/components/common/ScrollBox.d.ts +9 -0
- package/dist/components/common/ScrollBox.d.ts.map +1 -0
- package/dist/components/common/ScrollBox.js +105 -0
- package/dist/components/common/ScrollBox.js.map +1 -0
- package/dist/components/common/SearchBar.d.ts +10 -0
- package/dist/components/common/SearchBar.d.ts.map +1 -0
- package/dist/components/common/SearchBar.js +7 -0
- package/dist/components/common/SearchBar.js.map +1 -0
- package/dist/components/common/SelectableItem.d.ts +14 -0
- package/dist/components/common/SelectableItem.d.ts.map +1 -0
- package/dist/components/common/SelectableItem.js +14 -0
- package/dist/components/common/SelectableItem.js.map +1 -0
- package/dist/components/common/Spinner.d.ts +7 -0
- package/dist/components/common/Spinner.d.ts.map +1 -0
- package/dist/components/common/Spinner.js +23 -0
- package/dist/components/common/Spinner.js.map +1 -0
- package/dist/components/common/SplitPane.d.ts +8 -0
- package/dist/components/common/SplitPane.d.ts.map +1 -0
- package/dist/components/common/SplitPane.js +10 -0
- package/dist/components/common/SplitPane.js.map +1 -0
- package/dist/components/common/StatusBar.d.ts +9 -0
- package/dist/components/common/StatusBar.d.ts.map +1 -0
- package/dist/components/common/StatusBar.js +6 -0
- package/dist/components/common/StatusBar.js.map +1 -0
- package/dist/components/common/TabBar.d.ts +9 -0
- package/dist/components/common/TabBar.d.ts.map +1 -0
- package/dist/components/common/TabBar.js +12 -0
- package/dist/components/common/TabBar.js.map +1 -0
- package/dist/components/common/Table.d.ts +19 -0
- package/dist/components/common/Table.d.ts.map +1 -0
- package/dist/components/common/Table.js +24 -0
- package/dist/components/common/Table.js.map +1 -0
- package/dist/components/common/TextEditor.d.ts +10 -0
- package/dist/components/common/TextEditor.d.ts.map +1 -0
- package/dist/components/common/TextEditor.js +17 -0
- package/dist/components/common/TextEditor.js.map +1 -0
- package/dist/components/common/Toast.d.ts +8 -0
- package/dist/components/common/Toast.d.ts.map +1 -0
- package/dist/components/common/Toast.js +32 -0
- package/dist/components/common/Toast.js.map +1 -0
- package/dist/components/common/index.d.ts +38 -0
- package/dist/components/common/index.d.ts.map +1 -0
- package/dist/components/common/index.js +22 -0
- package/dist/components/common/index.js.map +1 -0
- package/dist/components/confluence/ConfluenceView.d.ts +6 -0
- package/dist/components/confluence/ConfluenceView.d.ts.map +1 -0
- package/dist/components/confluence/ConfluenceView.js +184 -0
- package/dist/components/confluence/ConfluenceView.js.map +1 -0
- package/dist/components/confluence/DocTree.d.ts +10 -0
- package/dist/components/confluence/DocTree.d.ts.map +1 -0
- package/dist/components/confluence/DocTree.js +125 -0
- package/dist/components/confluence/DocTree.js.map +1 -0
- package/dist/components/confluence/PageAttachments.d.ts +8 -0
- package/dist/components/confluence/PageAttachments.d.ts.map +1 -0
- package/dist/components/confluence/PageAttachments.js +108 -0
- package/dist/components/confluence/PageAttachments.js.map +1 -0
- package/dist/components/confluence/PageBrowser.d.ts +8 -0
- package/dist/components/confluence/PageBrowser.d.ts.map +1 -0
- package/dist/components/confluence/PageBrowser.js +93 -0
- package/dist/components/confluence/PageBrowser.js.map +1 -0
- package/dist/components/confluence/PageComments.d.ts +8 -0
- package/dist/components/confluence/PageComments.d.ts.map +1 -0
- package/dist/components/confluence/PageComments.js +75 -0
- package/dist/components/confluence/PageComments.js.map +1 -0
- package/dist/components/confluence/PageEditor.d.ts +13 -0
- package/dist/components/confluence/PageEditor.d.ts.map +1 -0
- package/dist/components/confluence/PageEditor.js +37 -0
- package/dist/components/confluence/PageEditor.js.map +1 -0
- package/dist/components/confluence/PageLabels.d.ts +8 -0
- package/dist/components/confluence/PageLabels.d.ts.map +1 -0
- package/dist/components/confluence/PageLabels.js +92 -0
- package/dist/components/confluence/PageLabels.js.map +1 -0
- package/dist/components/confluence/PageList.d.ts +8 -0
- package/dist/components/confluence/PageList.d.ts.map +1 -0
- package/dist/components/confluence/PageList.js +95 -0
- package/dist/components/confluence/PageList.js.map +1 -0
- package/dist/components/confluence/PageViewer.d.ts +14 -0
- package/dist/components/confluence/PageViewer.d.ts.map +1 -0
- package/dist/components/confluence/PageViewer.js +160 -0
- package/dist/components/confluence/PageViewer.js.map +1 -0
- package/dist/components/confluence/SpaceTree.d.ts +10 -0
- package/dist/components/confluence/SpaceTree.d.ts.map +1 -0
- package/dist/components/confluence/SpaceTree.js +220 -0
- package/dist/components/confluence/SpaceTree.js.map +1 -0
- package/dist/components/jira/CommentForm.d.ts +7 -0
- package/dist/components/jira/CommentForm.d.ts.map +1 -0
- package/dist/components/jira/CommentForm.js +24 -0
- package/dist/components/jira/CommentForm.js.map +1 -0
- package/dist/components/jira/CreateTicket.d.ts +9 -0
- package/dist/components/jira/CreateTicket.d.ts.map +1 -0
- package/dist/components/jira/CreateTicket.js +106 -0
- package/dist/components/jira/CreateTicket.js.map +1 -0
- package/dist/components/jira/IssueList.d.ts +9 -0
- package/dist/components/jira/IssueList.d.ts.map +1 -0
- package/dist/components/jira/IssueList.js +43 -0
- package/dist/components/jira/IssueList.js.map +1 -0
- package/dist/components/jira/JiraIssueRow.d.ts +7 -0
- package/dist/components/jira/JiraIssueRow.d.ts.map +1 -0
- package/dist/components/jira/JiraIssueRow.js +49 -0
- package/dist/components/jira/JiraIssueRow.js.map +1 -0
- package/dist/components/jira/JiraView.d.ts +7 -0
- package/dist/components/jira/JiraView.d.ts.map +1 -0
- package/dist/components/jira/JiraView.js +283 -0
- package/dist/components/jira/JiraView.js.map +1 -0
- package/dist/components/jira/JqlSearch.d.ts +8 -0
- package/dist/components/jira/JqlSearch.d.ts.map +1 -0
- package/dist/components/jira/JqlSearch.js +51 -0
- package/dist/components/jira/JqlSearch.js.map +1 -0
- package/dist/components/jira/QuickFilters.d.ts +8 -0
- package/dist/components/jira/QuickFilters.d.ts.map +1 -0
- package/dist/components/jira/QuickFilters.js +61 -0
- package/dist/components/jira/QuickFilters.js.map +1 -0
- package/dist/components/jira/StatusSelector.d.ts +9 -0
- package/dist/components/jira/StatusSelector.d.ts.map +1 -0
- package/dist/components/jira/StatusSelector.js +11 -0
- package/dist/components/jira/StatusSelector.js.map +1 -0
- package/dist/components/jira/TicketDetail.d.ts +23 -0
- package/dist/components/jira/TicketDetail.d.ts.map +1 -0
- package/dist/components/jira/TicketDetail.js +409 -0
- package/dist/components/jira/TicketDetail.js.map +1 -0
- package/dist/components/jira/TicketEditor.d.ts +9 -0
- package/dist/components/jira/TicketEditor.d.ts.map +1 -0
- package/dist/components/jira/TicketEditor.js +21 -0
- package/dist/components/jira/TicketEditor.js.map +1 -0
- package/dist/components/jira/TicketList.d.ts +8 -0
- package/dist/components/jira/TicketList.d.ts.map +1 -0
- package/dist/components/jira/TicketList.js +89 -0
- package/dist/components/jira/TicketList.js.map +1 -0
- package/dist/config/config-manager.d.ts +11 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +65 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/types.d.ts +81 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +16 -0
- package/dist/config/types.js.map +1 -0
- package/dist/formatters/adf-converter.d.ts +21 -0
- package/dist/formatters/adf-converter.d.ts.map +1 -0
- package/dist/formatters/adf-converter.js +73 -0
- package/dist/formatters/adf-converter.js.map +1 -0
- package/dist/formatters/confluence-converter.d.ts +25 -0
- package/dist/formatters/confluence-converter.d.ts.map +1 -0
- package/dist/formatters/confluence-converter.js +77 -0
- package/dist/formatters/confluence-converter.js.map +1 -0
- package/dist/formatters/glow-renderer.d.ts +39 -0
- package/dist/formatters/glow-renderer.d.ts.map +1 -0
- package/dist/formatters/glow-renderer.js +136 -0
- package/dist/formatters/glow-renderer.js.map +1 -0
- package/dist/formatters/markdown-ansi-renderer.d.ts +24 -0
- package/dist/formatters/markdown-ansi-renderer.d.ts.map +1 -0
- package/dist/formatters/markdown-ansi-renderer.js +240 -0
- package/dist/formatters/markdown-ansi-renderer.js.map +1 -0
- package/dist/formatters/mdcat-renderer.d.ts +29 -0
- package/dist/formatters/mdcat-renderer.d.ts.map +1 -0
- package/dist/formatters/mdcat-renderer.js +106 -0
- package/dist/formatters/mdcat-renderer.js.map +1 -0
- package/dist/hooks/useConfluencePage.d.ts +9 -0
- package/dist/hooks/useConfluencePage.d.ts.map +1 -0
- package/dist/hooks/useConfluencePage.js +53 -0
- package/dist/hooks/useConfluencePage.js.map +1 -0
- package/dist/hooks/useJiraIssue.d.ts +9 -0
- package/dist/hooks/useJiraIssue.d.ts.map +1 -0
- package/dist/hooks/useJiraIssue.js +52 -0
- package/dist/hooks/useJiraIssue.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +214 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/bookmarks.d.ts +16 -0
- package/dist/storage/bookmarks.d.ts.map +1 -0
- package/dist/storage/bookmarks.js +49 -0
- package/dist/storage/bookmarks.js.map +1 -0
- package/dist/storage/cache.d.ts +12 -0
- package/dist/storage/cache.d.ts.map +1 -0
- package/dist/storage/cache.js +57 -0
- package/dist/storage/cache.js.map +1 -0
- package/dist/storage/db.d.ts +4 -0
- package/dist/storage/db.d.ts.map +1 -0
- package/dist/storage/db.js +63 -0
- package/dist/storage/db.js.map +1 -0
- package/dist/storage/recents.d.ts +13 -0
- package/dist/storage/recents.d.ts.map +1 -0
- package/dist/storage/recents.js +40 -0
- package/dist/storage/recents.js.map +1 -0
- package/dist/theme/te.d.ts +12 -0
- package/dist/theme/te.d.ts.map +1 -0
- package/dist/theme/te.js +13 -0
- package/dist/theme/te.js.map +1 -0
- package/dist/utils/cache.d.ts +15 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +34 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/errors.d.ts +16 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +32 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/external-editor.d.ts +32 -0
- package/dist/utils/external-editor.d.ts.map +1 -0
- package/dist/utils/external-editor.js +173 -0
- package/dist/utils/external-editor.js.map +1 -0
- package/dist/utils/jira-colors.d.ts +4 -0
- package/dist/utils/jira-colors.d.ts.map +1 -0
- package/dist/utils/jira-colors.js +47 -0
- package/dist/utils/jira-colors.js.map +1 -0
- package/dist/utils/links.d.ts +5 -0
- package/dist/utils/links.d.ts.map +1 -0
- package/dist/utils/links.js +43 -0
- package/dist/utils/links.js.map +1 -0
- package/dist/utils/markdown-highlighter.d.ts +49 -0
- package/dist/utils/markdown-highlighter.d.ts.map +1 -0
- package/dist/utils/markdown-highlighter.js +282 -0
- package/dist/utils/markdown-highlighter.js.map +1 -0
- package/dist/utils/paths.d.ts +3 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +15 -0
- package/dist/utils/paths.js.map +1 -0
- 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 @@
|
|
|
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"}
|