mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-08 16:39:42 +02:00
fix: COD-153 match new session case from palette query
This commit is contained in:
committed by
Aamer Akhter
parent
3d4444ad78
commit
03192d9980
@@ -374,22 +374,61 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
sessionItems.push(this._buildCommandPaletteNewSessionItem());
|
sessionItems.push(this._buildCommandPaletteNewSessionItem(query));
|
||||||
return sessionItems;
|
return sessionItems;
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildCommandPaletteNewSessionItem() {
|
_buildCommandPaletteNewSessionItem(query = '') {
|
||||||
const mode = this.runMode || this._runMode || 'claude';
|
const mode = this.runMode || this._runMode || 'claude';
|
||||||
const labels = { claude: 'Claude', opencode: 'OpenCode', codex: 'Codex', gemini: 'Gemini' };
|
const labels = { claude: 'Claude', opencode: 'OpenCode', codex: 'Codex', gemini: 'Gemini' };
|
||||||
const caseName = document.getElementById('quickStartCase')?.value || 'testcase';
|
const caseName = this._findCommandPaletteCaseMatch(query) || document.getElementById('quickStartCase')?.value || 'testcase';
|
||||||
return {
|
return {
|
||||||
id: 'new-session',
|
id: 'new-session',
|
||||||
type: 'new-session',
|
type: 'new-session',
|
||||||
|
caseName,
|
||||||
title: 'New session',
|
title: 'New session',
|
||||||
subtitle: `Run ${labels[mode] || mode} in ${caseName}`,
|
subtitle: `Run ${labels[mode] || mode} in ${caseName}`,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_findCommandPaletteCaseMatch(query = '') {
|
||||||
|
const needle = query.trim().toLowerCase();
|
||||||
|
if (!needle || !Array.isArray(this.cases)) return null;
|
||||||
|
|
||||||
|
const scoreCase = (caseItem) => {
|
||||||
|
const name = String(caseItem?.name || '').trim();
|
||||||
|
if (!name) return 0;
|
||||||
|
const haystack = [
|
||||||
|
name,
|
||||||
|
caseItem?.path,
|
||||||
|
caseItem?.casePath,
|
||||||
|
caseItem?.workingDir,
|
||||||
|
caseItem?.remote?.path,
|
||||||
|
caseItem?.remote?.hostId,
|
||||||
|
]
|
||||||
|
.filter(Boolean)
|
||||||
|
.join(' ')
|
||||||
|
.toLowerCase();
|
||||||
|
const lowerName = name.toLowerCase();
|
||||||
|
if (lowerName === needle) return 100;
|
||||||
|
if (lowerName.startsWith(needle)) return 90;
|
||||||
|
if (lowerName.includes(needle)) return 80;
|
||||||
|
if (haystack.includes(needle)) return 60;
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
let best = null;
|
||||||
|
let bestScore = 0;
|
||||||
|
for (const caseItem of this.cases) {
|
||||||
|
const score = scoreCase(caseItem);
|
||||||
|
if (score > bestScore) {
|
||||||
|
best = caseItem;
|
||||||
|
bestScore = score;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return best?.name || null;
|
||||||
|
},
|
||||||
|
|
||||||
renderCommandPalette() {
|
renderCommandPalette() {
|
||||||
const search = document.getElementById('commandPaletteSearch');
|
const search = document.getElementById('commandPaletteSearch');
|
||||||
const list = document.getElementById('commandPaletteList');
|
const list = document.getElementById('commandPaletteList');
|
||||||
@@ -434,6 +473,10 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (item.type === 'new-session') {
|
if (item.type === 'new-session') {
|
||||||
|
const caseSelect = document.getElementById('quickStartCase');
|
||||||
|
if (caseSelect && item.caseName) {
|
||||||
|
caseSelect.value = item.caseName;
|
||||||
|
}
|
||||||
await this.run();
|
await this.run();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -43,6 +43,9 @@ function loadPaletteHarness(overrides: Record<string, any> = {}) {
|
|||||||
listeners[`list:${event}`] = handler;
|
listeners[`list:${event}`] = handler;
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
elements.quickStartCase = {
|
||||||
|
value: 'plex-previews',
|
||||||
|
};
|
||||||
|
|
||||||
const context = vm.createContext({
|
const context = vm.createContext({
|
||||||
CodemanApp,
|
CodemanApp,
|
||||||
@@ -87,6 +90,7 @@ function loadPaletteHarness(overrides: Record<string, any> = {}) {
|
|||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
app.sessionOrder = ['sess-beta', 'sess-alpha'];
|
app.sessionOrder = ['sess-beta', 'sess-alpha'];
|
||||||
|
app.cases = [{ name: 'plex-previews' }, { name: 'flux-player' }, { name: 'api-tools' }];
|
||||||
app.selectSession = vi.fn();
|
app.selectSession = vi.fn();
|
||||||
app.run = vi.fn();
|
app.run = vi.fn();
|
||||||
app.closeMobileHeaderUtilities = vi.fn();
|
app.closeMobileHeaderUtilities = vi.fn();
|
||||||
@@ -176,6 +180,26 @@ describe('Command-K session palette', () => {
|
|||||||
expect(results[1]).toMatchObject({ type: 'new-session', title: 'New session' });
|
expect(results[1]).toMatchObject({ type: 'new-session', title: 'New session' });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('uses the best matching case for the new-session action', async () => {
|
||||||
|
const { app, elements } = loadPaletteHarness();
|
||||||
|
|
||||||
|
const results = app.buildCommandPaletteItems('flux');
|
||||||
|
const newSession = results.find((item: any) => item.type === 'new-session');
|
||||||
|
|
||||||
|
expect(newSession).toMatchObject({
|
||||||
|
type: 'new-session',
|
||||||
|
caseName: 'flux-player',
|
||||||
|
subtitle: 'Run Claude in flux-player',
|
||||||
|
});
|
||||||
|
|
||||||
|
app.commandPaletteItems = [newSession];
|
||||||
|
app.commandPaletteActiveIndex = 0;
|
||||||
|
await app.activateCommandPaletteItem();
|
||||||
|
|
||||||
|
expect(elements.quickStartCase.value).toBe('flux-player');
|
||||||
|
expect(app.run).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
it('activates the highlighted session result', async () => {
|
it('activates the highlighted session result', async () => {
|
||||||
const { app } = loadPaletteHarness();
|
const { app } = loadPaletteHarness();
|
||||||
app.openCommandPalette();
|
app.openCommandPalette();
|
||||||
|
|||||||
Reference in New Issue
Block a user