@k1e1n04/mav 0.1.6 → 0.1.7

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/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k1e1n04/mav",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Multi-agent view — manage multiple AI CLI sessions in one terminal",
5
5
  "type": "module",
6
6
  "bin": {
@@ -20,10 +20,14 @@ export function loadConfig(configPath) {
20
20
  const cmd = typeof a.cmd === 'string' && a.cmd.trim().length > 0
21
21
  ? a.cmd
22
22
  : defaults.cmd;
23
+ const cwd = typeof a.cwd === 'string' && a.cwd.trim().length > 0
24
+ ? a.cwd.replace(/^~/, process.env.HOME ?? '~')
25
+ : undefined;
23
26
  return {
24
27
  type: a.type,
25
28
  cmd,
26
29
  args: Array.isArray(a.args) ? a.args : defaults.args,
30
+ cwd,
27
31
  resumeArgs: Array.isArray(a.resumeArgs) ? a.resumeArgs : defaults.resumeArgs,
28
32
  };
29
33
  });
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAcpD,MAAM,cAAc,GAAc;IAChC,MAAM,EAAE,EAAE;CACX,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAwE,CAAA;IAEnG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,MAAM,MAAM,GAAkB,MAAM,CAAC,MAAM;SACxC,MAAM,CAAC,CAAC,CAAC,EAA+E,EAAE,CACzF,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CACjD;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC9D,CAAC,CAAC,CAAC,CAAC,GAAG;YACP,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAA;QAChB,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG;YACH,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;YACpD,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU;SAC7E,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO,EAAE,MAAM,EAAE,CAAA;AACnB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAcpD,MAAM,cAAc,GAAc;IAChC,MAAM,EAAE,EAAE;CACX,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAwE,CAAA;IAEnG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,MAAM,MAAM,GAAkB,MAAM,CAAC,MAAM;SACxC,MAAM,CAAC,CAAC,CAAC,EAA6F,EAAE,CACvG,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CACjD;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC9D,CAAC,CAAC,CAAC,CAAC,GAAG;YACP,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAA;QAChB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC9D,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;YAC9C,CAAC,CAAC,SAAS,CAAA;QACb,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG;YACH,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;YACpD,GAAG;YACH,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU;SAC7E,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO,EAAE,MAAM,EAAE,CAAA;AACnB,CAAC"}
@@ -11,8 +11,12 @@ export declare class OverviewUI {
11
11
  constructor(screen: Widgets.Screen, manager: SessionManager, onSessionCreated?: (session: SessionManager['selectedSession']) => void);
12
12
  private bindKeys;
13
13
  private showAddPrompt;
14
+ private showCwdPrompt;
15
+ private spawnAgent;
14
16
  private showError;
15
17
  private syncList;
18
+ private groupByCwd;
19
+ private shortenPath;
16
20
  private getOrderedSessions;
17
21
  private moveSelection;
18
22
  private getStatusLabel;
@@ -1,5 +1,6 @@
1
1
  import blessed from 'neo-blessed';
2
2
  import { getAgentDefaults, resolveSessionArgs } from '../agent-launch.js';
3
+ import { completePath } from './path-completion.js';
3
4
  export class OverviewUI {
4
5
  static STATUS_GROUPS = [
5
6
  { status: 'running', label: 'Working' },
@@ -116,33 +117,115 @@ export class OverviewUI {
116
117
  prompt.key('enter', () => {
117
118
  const selectedIdx = prompt.selected ?? 0;
118
119
  const selected = agentTypes[selectedIdx];
119
- close();
120
- const defaults = getAgentDefaults(selected);
121
- const { args, newSessionId } = resolveSessionArgs(selected, defaults.args, undefined, false);
122
- const session = this.manager.addSession({
123
- type: selected,
124
- cmd: defaults.cmd,
125
- args,
126
- cwd: process.cwd(),
127
- });
128
- session.baseArgs = defaults.args;
129
- if (newSessionId != null) {
130
- session.sessionId = newSessionId;
131
- }
132
- if (session.status === 'error') {
133
- this.manager.removeSession(session.id);
134
- this.showError(`'${defaults.cmd}' command not found.\nIs ${selected} installed?`);
135
- this.syncList();
136
- return;
137
- }
138
- this.manager.selectSession(this.manager.sessions.length - 1);
139
- this.syncList();
140
- this.onSessionCreated?.(session);
120
+ prompt.destroy();
121
+ this.screen.render();
122
+ this.showCwdPrompt(selected);
141
123
  });
142
124
  prompt.key('escape', close);
143
125
  prompt.focus();
144
126
  this.screen.render();
145
127
  }
128
+ showCwdPrompt(agentType) {
129
+ let value = process.cwd();
130
+ let candidateList = null;
131
+ const box = blessed.box({
132
+ parent: this.screen,
133
+ top: 'center',
134
+ left: 'center',
135
+ width: 60,
136
+ height: 3,
137
+ border: { type: 'line' },
138
+ label: ' cwd Tab:補完 Enter:確定 Esc:キャンセル ',
139
+ style: { border: { fg: 'green' } },
140
+ });
141
+ const renderInput = () => {
142
+ box.setContent(value);
143
+ this.screen.render();
144
+ };
145
+ const closeCandidates = () => {
146
+ if (candidateList) {
147
+ candidateList.destroy();
148
+ candidateList = null;
149
+ }
150
+ };
151
+ const cleanup = () => {
152
+ this.screen.removeListener('keypress', onKeypress);
153
+ closeCandidates();
154
+ this.promptOpen = false;
155
+ box.destroy();
156
+ this.listBox.focus();
157
+ this.screen.render();
158
+ };
159
+ const onKeypress = (_ch, key) => {
160
+ if (!key)
161
+ return;
162
+ closeCandidates();
163
+ if (key.name === 'enter' || key.name === 'return') {
164
+ const expanded = value.trim().replace(/^~/, process.env.HOME ?? '~') || process.cwd();
165
+ cleanup();
166
+ this.spawnAgent(agentType, expanded);
167
+ }
168
+ else if (key.name === 'escape') {
169
+ cleanup();
170
+ }
171
+ else if (key.name === 'tab') {
172
+ const { completed, candidates } = completePath(value);
173
+ value = completed;
174
+ if (candidates.length > 1) {
175
+ const maxVisible = Math.min(candidates.length, 8);
176
+ candidateList = blessed.list({
177
+ parent: this.screen,
178
+ top: '50%',
179
+ left: 'center',
180
+ width: 60,
181
+ height: maxVisible + 2,
182
+ border: { type: 'line' },
183
+ items: candidates,
184
+ keys: false,
185
+ style: { border: { fg: 'cyan' } },
186
+ });
187
+ }
188
+ renderInput();
189
+ }
190
+ else if (key.name === 'backspace') {
191
+ value = value.slice(0, -1);
192
+ renderInput();
193
+ }
194
+ else if (!key.ctrl && !key.meta && key.sequence?.length === 1) {
195
+ value += key.sequence;
196
+ renderInput();
197
+ }
198
+ };
199
+ // 現在のキーイベント(enter)がこのリスナーに届かないよう1tick遅らせる
200
+ setImmediate(() => {
201
+ this.screen.on('keypress', onKeypress);
202
+ });
203
+ box.focus();
204
+ renderInput();
205
+ }
206
+ spawnAgent(agentType, cwd) {
207
+ const defaults = getAgentDefaults(agentType);
208
+ const { args, newSessionId } = resolveSessionArgs(agentType, defaults.args, undefined, false);
209
+ const session = this.manager.addSession({
210
+ type: agentType,
211
+ cmd: defaults.cmd,
212
+ args,
213
+ cwd,
214
+ });
215
+ session.baseArgs = defaults.args;
216
+ if (newSessionId != null) {
217
+ session.sessionId = newSessionId;
218
+ }
219
+ if (session.status === 'error') {
220
+ this.manager.removeSession(session.id);
221
+ this.showError(`'${defaults.cmd}' command not found.\nIs ${agentType} installed?`);
222
+ this.syncList();
223
+ return;
224
+ }
225
+ this.manager.selectSession(this.manager.sessions.length - 1);
226
+ this.syncList();
227
+ this.onSessionCreated?.(session);
228
+ }
146
229
  showError(message) {
147
230
  const overlay = blessed.box({
148
231
  parent: this.screen,
@@ -170,23 +253,27 @@ export class OverviewUI {
170
253
  const items = [];
171
254
  const selectedId = this.manager.selectedSession?.id;
172
255
  let selectedDisplayIndex = -1;
173
- for (const group of OverviewUI.STATUS_GROUPS) {
174
- const sessions = orderedSessions.filter((session) => session.status === group.status);
175
- if (sessions.length === 0)
176
- continue;
177
- items.push(` ${group.label}`);
178
- for (const session of sessions) {
179
- const statusIcon = session.status === 'running' ? '⣾'
180
- : session.status === 'idle' ? '○'
181
- : session.status === 'done' ? '✓'
182
- : '';
183
- const sessionTitle = session.displayName ?? session.id;
184
- const sessionLabel = session.type ? `${sessionTitle} (${session.type})` : sessionTitle;
185
- const content = `${statusIcon} ${sessionLabel} ${this.getStatusLabel(session.status)}`;
186
- const color = OverviewUI.STATUS_COLORS[session.status];
187
- items.push(` {${color}-fg}${content}{/${color}-fg}`);
188
- if (session.id === selectedId) {
189
- selectedDisplayIndex = items.length - 1;
256
+ const cwdGroups = this.groupByCwd(orderedSessions);
257
+ for (const [cwd, sessions] of cwdGroups) {
258
+ items.push(` {bold}${this.shortenPath(cwd)}{/bold}`);
259
+ for (const group of OverviewUI.STATUS_GROUPS) {
260
+ const groupSessions = sessions.filter((s) => s.status === group.status);
261
+ if (groupSessions.length === 0)
262
+ continue;
263
+ items.push(` ${group.label}`);
264
+ for (const session of groupSessions) {
265
+ const statusIcon = session.status === 'running' ? '⣾'
266
+ : session.status === 'idle' ? '○'
267
+ : session.status === 'done' ? '✓'
268
+ : '✗';
269
+ const sessionTitle = session.displayName ?? session.id;
270
+ const sessionLabel = session.type ? `${sessionTitle} (${session.type})` : sessionTitle;
271
+ const content = `${statusIcon} ${sessionLabel} ${this.getStatusLabel(session.status)}`;
272
+ const color = OverviewUI.STATUS_COLORS[session.status];
273
+ items.push(` {${color}-fg}${content}{/${color}-fg}`);
274
+ if (session.id === selectedId) {
275
+ selectedDisplayIndex = items.length - 1;
276
+ }
190
277
  }
191
278
  }
192
279
  }
@@ -195,8 +282,30 @@ export class OverviewUI {
195
282
  this.listBox.select(selectedDisplayIndex);
196
283
  }
197
284
  }
285
+ groupByCwd(sessions) {
286
+ const map = new Map();
287
+ for (const session of sessions) {
288
+ const key = session.cwd ?? process.cwd();
289
+ if (!map.has(key))
290
+ map.set(key, []);
291
+ map.get(key).push(session);
292
+ }
293
+ return map;
294
+ }
295
+ shortenPath(p) {
296
+ const home = process.env.HOME;
297
+ if (home && p.startsWith(home)) {
298
+ return '~' + p.slice(home.length);
299
+ }
300
+ return p;
301
+ }
198
302
  getOrderedSessions() {
199
303
  return [...this.manager.sessions].sort((a, b) => {
304
+ const cwdA = a.cwd ?? process.cwd();
305
+ const cwdB = b.cwd ?? process.cwd();
306
+ const cwdDiff = cwdA.localeCompare(cwdB);
307
+ if (cwdDiff !== 0)
308
+ return cwdDiff;
200
309
  const rankDiff = this.getStatusRank(a.status) - this.getStatusRank(b.status);
201
310
  if (rankDiff !== 0)
202
311
  return rankDiff;
@@ -1 +1 @@
1
- {"version":3,"file":"overview.js","sourceRoot":"","sources":["../../../src/ui/overview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"overview.js","sourceRoot":"","sources":["../../../src/ui/overview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface CompletionResult {
2
+ completed: string;
3
+ candidates: string[];
4
+ }
5
+ export declare function completePath(input: string): CompletionResult;
@@ -0,0 +1,51 @@
1
+ import { readdirSync } from 'node:fs';
2
+ import { join, dirname, basename } from 'node:path';
3
+ export function completePath(input) {
4
+ const expanded = input.replace(/^~/, process.env.HOME ?? '~');
5
+ const isAbsolute = expanded.startsWith('/');
6
+ const dir = isAbsolute || expanded.includes('/')
7
+ ? dirname(expanded)
8
+ : process.cwd();
9
+ const prefix = basename(expanded);
10
+ let entries;
11
+ try {
12
+ entries = readdirSync(dir, { withFileTypes: true })
13
+ .filter((e) => e.isDirectory() && e.name.startsWith(prefix))
14
+ .map((e) => join(dir, e.name) + '/');
15
+ }
16
+ catch {
17
+ return { completed: input, candidates: [] };
18
+ }
19
+ if (entries.length === 0) {
20
+ return { completed: input, candidates: [] };
21
+ }
22
+ if (entries.length === 1) {
23
+ return { completed: restoreHome(entries[0], input), candidates: [] };
24
+ }
25
+ const lcp = longestCommonPrefix(entries);
26
+ return {
27
+ completed: restoreHome(lcp, input),
28
+ candidates: entries.map((e) => restoreHome(e, input)),
29
+ };
30
+ }
31
+ function longestCommonPrefix(strs) {
32
+ if (strs.length === 0)
33
+ return '';
34
+ let prefix = strs[0];
35
+ for (let i = 1; i < strs.length; i++) {
36
+ while (!strs[i].startsWith(prefix)) {
37
+ prefix = prefix.slice(0, -1);
38
+ if (prefix === '')
39
+ return '';
40
+ }
41
+ }
42
+ return prefix;
43
+ }
44
+ function restoreHome(path, original) {
45
+ const home = process.env.HOME;
46
+ if (home && original.startsWith('~') && path.startsWith(home)) {
47
+ return '~' + path.slice(home.length);
48
+ }
49
+ return path;
50
+ }
51
+ //# sourceMappingURL=path-completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-completion.js","sourceRoot":"","sources":["../../../src/ui/path-completion.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k1e1n04/mav",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Multi-agent view — manage multiple AI CLI sessions in one terminal",
5
5
  "type": "module",
6
6
  "bin": {
package/src/config.ts CHANGED
@@ -31,7 +31,7 @@ export function loadConfig(configPath: string): MavConfig {
31
31
  }
32
32
 
33
33
  const agents: AgentConfig[] = parsed.agents
34
- .filter((a): a is { type: string; cmd?: string; args?: string[]; resumeArgs?: string[] } =>
34
+ .filter((a): a is { type: string; cmd?: string; args?: string[]; cwd?: string; resumeArgs?: string[] } =>
35
35
  typeof a?.type === 'string' && a.type.length > 0
36
36
  )
37
37
  .map((a) => {
@@ -39,10 +39,14 @@ export function loadConfig(configPath: string): MavConfig {
39
39
  const cmd = typeof a.cmd === 'string' && a.cmd.trim().length > 0
40
40
  ? a.cmd
41
41
  : defaults.cmd
42
+ const cwd = typeof a.cwd === 'string' && a.cwd.trim().length > 0
43
+ ? a.cwd.replace(/^~/, process.env.HOME ?? '~')
44
+ : undefined
42
45
  return {
43
46
  type: a.type,
44
47
  cmd,
45
48
  args: Array.isArray(a.args) ? a.args : defaults.args,
49
+ cwd,
46
50
  resumeArgs: Array.isArray(a.resumeArgs) ? a.resumeArgs : defaults.resumeArgs,
47
51
  }
48
52
  })
@@ -3,6 +3,7 @@ import type { Widgets } from 'neo-blessed'
3
3
  import type { SessionManager } from '../session-manager.js'
4
4
  import type { AgentSession } from '../agent.js'
5
5
  import { getAgentDefaults, resolveSessionArgs } from '../agent-launch.js'
6
+ import { completePath } from './path-completion.js'
6
7
 
7
8
  export class OverviewUI {
8
9
  private static readonly STATUS_GROUPS = [
@@ -138,37 +139,122 @@ export class OverviewUI {
138
139
  prompt.key('enter', () => {
139
140
  const selectedIdx = (prompt as unknown as { selected: number }).selected ?? 0
140
141
  const selected = agentTypes[selectedIdx]!
141
- close()
142
-
143
- const defaults = getAgentDefaults(selected)
144
- const { args, newSessionId } = resolveSessionArgs(selected, defaults.args, undefined, false)
145
- const session = this.manager.addSession({
146
- type: selected,
147
- cmd: defaults.cmd,
148
- args,
149
- cwd: process.cwd(),
150
- }) as AgentSession & { sessionId?: string }
151
- session.baseArgs = defaults.args
152
- if (newSessionId != null) {
153
- session.sessionId = newSessionId
142
+ prompt.destroy()
143
+ this.screen.render()
144
+ this.showCwdPrompt(selected)
145
+ })
146
+
147
+ prompt.key('escape', close)
148
+
149
+ prompt.focus()
150
+ this.screen.render()
151
+ }
152
+
153
+ private showCwdPrompt(agentType: string): void {
154
+ let value = process.cwd()
155
+ let candidateList: Widgets.ListElement | null = null
156
+
157
+ const box = blessed.box({
158
+ parent: this.screen,
159
+ top: 'center',
160
+ left: 'center',
161
+ width: 60,
162
+ height: 3,
163
+ border: { type: 'line' },
164
+ label: ' cwd Tab:補完 Enter:確定 Esc:キャンセル ',
165
+ style: { border: { fg: 'green' } },
166
+ })
167
+
168
+ const renderInput = () => {
169
+ box.setContent(value)
170
+ this.screen.render()
171
+ }
172
+
173
+ const closeCandidates = () => {
174
+ if (candidateList) {
175
+ candidateList.destroy()
176
+ candidateList = null
154
177
  }
178
+ }
155
179
 
156
- if (session.status === 'error') {
157
- this.manager.removeSession(session.id)
158
- this.showError(`'${defaults.cmd}' command not found.\nIs ${selected} installed?`)
159
- this.syncList()
160
- return
180
+ const cleanup = () => {
181
+ this.screen.removeListener('keypress', onKeypress)
182
+ closeCandidates()
183
+ this.promptOpen = false
184
+ box.destroy()
185
+ this.listBox.focus()
186
+ this.screen.render()
187
+ }
188
+
189
+ const onKeypress = (_ch: string, key: { name: string; ctrl?: boolean; meta?: boolean; sequence?: string }) => {
190
+ if (!key) return
191
+ closeCandidates()
192
+
193
+ if (key.name === 'enter' || key.name === 'return') {
194
+ const expanded = value.trim().replace(/^~/, process.env.HOME ?? '~') || process.cwd()
195
+ cleanup()
196
+ this.spawnAgent(agentType, expanded)
197
+ } else if (key.name === 'escape') {
198
+ cleanup()
199
+ } else if (key.name === 'tab') {
200
+ const { completed, candidates } = completePath(value)
201
+ value = completed
202
+ if (candidates.length > 1) {
203
+ const maxVisible = Math.min(candidates.length, 8)
204
+ candidateList = blessed.list({
205
+ parent: this.screen,
206
+ top: '50%',
207
+ left: 'center',
208
+ width: 60,
209
+ height: maxVisible + 2,
210
+ border: { type: 'line' },
211
+ items: candidates,
212
+ keys: false,
213
+ style: { border: { fg: 'cyan' } },
214
+ }) as Widgets.ListElement
215
+ }
216
+ renderInput()
217
+ } else if (key.name === 'backspace') {
218
+ value = value.slice(0, -1)
219
+ renderInput()
220
+ } else if (!key.ctrl && !key.meta && key.sequence?.length === 1) {
221
+ value += key.sequence
222
+ renderInput()
161
223
  }
224
+ }
162
225
 
163
- this.manager.selectSession(this.manager.sessions.length - 1)
164
- this.syncList()
165
- this.onSessionCreated?.(session)
226
+ // 現在のキーイベント(enter)がこのリスナーに届かないよう1tick遅らせる
227
+ setImmediate(() => {
228
+ this.screen.on('keypress', onKeypress)
166
229
  })
230
+ box.focus()
231
+ renderInput()
232
+ }
167
233
 
168
- prompt.key('escape', close)
234
+ private spawnAgent(agentType: string, cwd: string): void {
235
+ const defaults = getAgentDefaults(agentType)
236
+ const { args, newSessionId } = resolveSessionArgs(agentType, defaults.args, undefined, false)
237
+ const session = this.manager.addSession({
238
+ type: agentType,
239
+ cmd: defaults.cmd,
240
+ args,
241
+ cwd,
242
+ }) as AgentSession & { sessionId?: string }
243
+ session.baseArgs = defaults.args
244
+ if (newSessionId != null) {
245
+ session.sessionId = newSessionId
246
+ }
169
247
 
170
- prompt.focus()
171
- this.screen.render()
248
+ if (session.status === 'error') {
249
+ this.manager.removeSession(session.id)
250
+ this.showError(`'${defaults.cmd}' command not found.\nIs ${agentType} installed?`)
251
+ this.syncList()
252
+ return
253
+ }
254
+
255
+ this.manager.selectSession(this.manager.sessions.length - 1)
256
+ this.syncList()
257
+ this.onSessionCreated?.(session)
172
258
  }
173
259
 
174
260
  private showError(message: string): void {
@@ -201,24 +287,29 @@ export class OverviewUI {
201
287
  const selectedId = this.manager.selectedSession?.id
202
288
  let selectedDisplayIndex = -1
203
289
 
204
- for (const group of OverviewUI.STATUS_GROUPS) {
205
- const sessions = orderedSessions.filter((session) => session.status === group.status)
206
- if (sessions.length === 0) continue
207
-
208
- items.push(` ${group.label}`)
209
- for (const session of sessions) {
210
- const statusIcon =
211
- session.status === 'running' ? '⣾'
212
- : session.status === 'idle' ? '○'
213
- : session.status === 'done' ? '✓'
214
- : '✗'
215
- const sessionTitle = session.displayName ?? session.id
216
- const sessionLabel = session.type ? `${sessionTitle} (${session.type})` : sessionTitle
217
- const content = `${statusIcon} ${sessionLabel} ${this.getStatusLabel(session.status)}`
218
- const color = OverviewUI.STATUS_COLORS[session.status]
219
- items.push(` {${color}-fg}${content}{/${color}-fg}`)
220
- if (session.id === selectedId) {
221
- selectedDisplayIndex = items.length - 1
290
+ const cwdGroups = this.groupByCwd(orderedSessions)
291
+ for (const [cwd, sessions] of cwdGroups) {
292
+ items.push(` {bold}${this.shortenPath(cwd)}{/bold}`)
293
+
294
+ for (const group of OverviewUI.STATUS_GROUPS) {
295
+ const groupSessions = sessions.filter((s) => s.status === group.status)
296
+ if (groupSessions.length === 0) continue
297
+
298
+ items.push(` ${group.label}`)
299
+ for (const session of groupSessions) {
300
+ const statusIcon =
301
+ session.status === 'running' ? '⣾'
302
+ : session.status === 'idle' ? '○'
303
+ : session.status === 'done' ? '✓'
304
+ : '✗'
305
+ const sessionTitle = session.displayName ?? session.id
306
+ const sessionLabel = session.type ? `${sessionTitle} (${session.type})` : sessionTitle
307
+ const content = `${statusIcon} ${sessionLabel} ${this.getStatusLabel(session.status)}`
308
+ const color = OverviewUI.STATUS_COLORS[session.status]
309
+ items.push(` {${color}-fg}${content}{/${color}-fg}`)
310
+ if (session.id === selectedId) {
311
+ selectedDisplayIndex = items.length - 1
312
+ }
222
313
  }
223
314
  }
224
315
  }
@@ -229,8 +320,30 @@ export class OverviewUI {
229
320
  }
230
321
  }
231
322
 
323
+ private groupByCwd(sessions: SessionManager['sessions']): Map<string, SessionManager['sessions']> {
324
+ const map = new Map<string, SessionManager['sessions']>()
325
+ for (const session of sessions) {
326
+ const key = session.cwd ?? process.cwd()
327
+ if (!map.has(key)) map.set(key, [])
328
+ map.get(key)!.push(session)
329
+ }
330
+ return map
331
+ }
332
+
333
+ private shortenPath(p: string): string {
334
+ const home = process.env.HOME
335
+ if (home && p.startsWith(home)) {
336
+ return '~' + p.slice(home.length)
337
+ }
338
+ return p
339
+ }
340
+
232
341
  private getOrderedSessions(): SessionManager['sessions'] {
233
342
  return [...this.manager.sessions].sort((a, b) => {
343
+ const cwdA = a.cwd ?? process.cwd()
344
+ const cwdB = b.cwd ?? process.cwd()
345
+ const cwdDiff = cwdA.localeCompare(cwdB)
346
+ if (cwdDiff !== 0) return cwdDiff
234
347
  const rankDiff = this.getStatusRank(a.status) - this.getStatusRank(b.status)
235
348
  if (rankDiff !== 0) return rankDiff
236
349
  return a.id.localeCompare(b.id)
@@ -0,0 +1,59 @@
1
+ import { readdirSync } from 'node:fs'
2
+ import { join, dirname, basename } from 'node:path'
3
+
4
+ export interface CompletionResult {
5
+ completed: string
6
+ candidates: string[]
7
+ }
8
+
9
+ export function completePath(input: string): CompletionResult {
10
+ const expanded = input.replace(/^~/, process.env.HOME ?? '~')
11
+ const isAbsolute = expanded.startsWith('/')
12
+ const dir = isAbsolute || expanded.includes('/')
13
+ ? dirname(expanded)
14
+ : process.cwd()
15
+ const prefix = basename(expanded)
16
+
17
+ let entries: string[]
18
+ try {
19
+ entries = readdirSync(dir, { withFileTypes: true })
20
+ .filter((e) => e.isDirectory() && e.name.startsWith(prefix))
21
+ .map((e) => join(dir, e.name) + '/')
22
+ } catch {
23
+ return { completed: input, candidates: [] }
24
+ }
25
+
26
+ if (entries.length === 0) {
27
+ return { completed: input, candidates: [] }
28
+ }
29
+
30
+ if (entries.length === 1) {
31
+ return { completed: restoreHome(entries[0]!, input), candidates: [] }
32
+ }
33
+
34
+ const lcp = longestCommonPrefix(entries)
35
+ return {
36
+ completed: restoreHome(lcp, input),
37
+ candidates: entries.map((e) => restoreHome(e, input)),
38
+ }
39
+ }
40
+
41
+ function longestCommonPrefix(strs: string[]): string {
42
+ if (strs.length === 0) return ''
43
+ let prefix = strs[0]!
44
+ for (let i = 1; i < strs.length; i++) {
45
+ while (!strs[i]!.startsWith(prefix)) {
46
+ prefix = prefix.slice(0, -1)
47
+ if (prefix === '') return ''
48
+ }
49
+ }
50
+ return prefix
51
+ }
52
+
53
+ function restoreHome(path: string, original: string): string {
54
+ const home = process.env.HOME
55
+ if (home && original.startsWith('~') && path.startsWith(home)) {
56
+ return '~' + path.slice(home.length)
57
+ }
58
+ return path
59
+ }