-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathai-code-github-copilot-cli.el
More file actions
136 lines (119 loc) · 5.24 KB
/
ai-code-github-copilot-cli.el
File metadata and controls
136 lines (119 loc) · 5.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
;;; ai-code-github-copilot-cli.el --- Thin wrapper for GitHub Copilot CLI -*- lexical-binding: t; -*-
;; Author: Kang Tu <tninja@gmail.com>
;; SPDX-License-Identifier: Apache-2.0
;;; Commentary:
;;
;; Thin wrapper that reuses `ai-code-backends-infra' to run GitHub Copilot CLI.
;; Provides interactive commands and aliases for the AI Code suite.
;;
;;; Code:
(require 'ai-code-backends)
(require 'ai-code-backends-infra)
(require 'ai-code-mcp-agent)
(defgroup ai-code-github-copilot-cli nil
"GitHub Copilot CLI integration via `ai-code-backends-infra'."
:group 'tools
:prefix "ai-code-github-copilot-cli-")
(defcustom ai-code-github-copilot-cli-program "copilot"
"Path to the GitHub Copilot CLI executable."
:type 'string
:group 'ai-code-github-copilot-cli)
(defcustom ai-code-github-copilot-cli-program-switches nil
"Command line switches to pass to GitHub Copilot CLI on startup."
:type '(repeat string)
:group 'ai-code-github-copilot-cli)
(defcustom ai-code-github-copilot-cli-extra-env-vars '("TERM_PROGRAM=vscode")
"Extra environment variables passed to the GitHub Copilot CLI terminal session.
By default, `TERM_PROGRAM=vscode' is set so that Copilot CLI recognizes the
terminal as VS Code-compatible and enables multiline input support via
`/terminal-setup' (Shift+Enter and Ctrl+Enter)."
:type '(repeat string)
:group 'ai-code-github-copilot-cli)
(defcustom ai-code-github-copilot-cli-multiline-input-sequence "\r\n"
"Terminal sequence used for multiline input in GitHub Copilot CLI sessions.
This mirrors the VS Code `workbench.action.terminal.sendSequence' binding
that `/terminal-setup' installs for Shift+Enter and Ctrl+Enter."
:type 'string
:group 'ai-code-github-copilot-cli)
(defconst ai-code-github-copilot-cli--session-prefix "copilot"
"Session prefix used in GitHub Copilot CLI buffer names.")
(defvar ai-code-github-copilot-cli--processes (make-hash-table :test 'equal)
"Hash table mapping Copilot session keys to processes.")
;;;###autoload
(defun ai-code-github-copilot-cli (&optional arg)
"Start GitHub Copilot CLI (uses `ai-code-backends-infra' logic).
With prefix ARG, prompt for CLI args using
`ai-code-github-copilot-cli-program-switches' as the default input."
(interactive "P")
(let* ((working-dir (ai-code-backends-infra--session-working-directory))
(resolved (ai-code-backends-infra--resolve-start-command
ai-code-github-copilot-cli-program
ai-code-github-copilot-cli-program-switches
arg
"Copilot"))
(command (plist-get resolved :command))
(mcp-launch (ai-code-mcp-agent-prepare-launch 'github-copilot-cli
working-dir
command))
(launch-command (or (plist-get mcp-launch :command) command))
(cleanup-fn (plist-get mcp-launch :cleanup-fn))
(post-start-fn (plist-get mcp-launch :post-start-fn)))
(ai-code-backends-infra--toggle-or-create-session
working-dir
nil
ai-code-github-copilot-cli--processes
launch-command
#'ai-code-github-copilot-cli-send-escape
cleanup-fn
nil
ai-code-github-copilot-cli--session-prefix
nil
ai-code-github-copilot-cli-extra-env-vars
ai-code-github-copilot-cli-multiline-input-sequence
post-start-fn)))
;;;###autoload
(defun ai-code-github-copilot-cli-switch-to-buffer (&optional force-prompt)
"Switch to the GitHub Copilot CLI buffer.
When FORCE-PROMPT is non-nil, prompt to select a session."
(interactive "P")
(let ((working-dir (ai-code-backends-infra--session-working-directory)))
(ai-code-backends-infra--switch-to-session-buffer
nil
"No Copilot session for this project"
ai-code-github-copilot-cli--session-prefix
working-dir
force-prompt)))
;;;###autoload
(defun ai-code-github-copilot-cli-send-command (line)
"Send LINE to GitHub Copilot CLI."
(interactive "sCopilot> ")
(let ((working-dir (ai-code-backends-infra--session-working-directory)))
(ai-code-backends-infra--send-line-to-session
nil
"No Copilot session for this project"
line
ai-code-github-copilot-cli--session-prefix
working-dir)))
;;;###autoload
(defun ai-code-github-copilot-cli-send-escape ()
"Send escape key to GitHub Copilot CLI."
(interactive)
(ai-code-backends-infra--terminal-send-escape))
;;;###autoload
(defun ai-code-github-copilot-cli-resume (&optional arg)
"Resume a previous GitHub Copilot CLI session."
(interactive "P")
(let ((ai-code-github-copilot-cli-program-switches (append ai-code-github-copilot-cli-program-switches '("--resume"))))
(ai-code-github-copilot-cli arg)
;; Send empty string to trigger terminal processing and ensure CLI session picker appears
(let* ((working-dir (ai-code-backends-infra--session-working-directory))
(buffer (ai-code-backends-infra--select-session-buffer
ai-code-github-copilot-cli--session-prefix
working-dir)))
(when buffer
(with-current-buffer buffer
(sit-for 0.5)
(ai-code-backends-infra--terminal-send-string "")
(goto-char (point-min)))))))
(provide 'ai-code-github-copilot-cli)
;;; ai-code-github-copilot-cli.el ends here