Skip to content

Commit 4b5eb17

Browse files
committed
feat: run tasks in dedicated terminals
Route both provider-generated tasks (toTask) and tasks resolved from tasks.json (resolveTask) through a shared useDedicatedTerminal helper so each task gets its own panel, while letting user-defined presentation options in tasks.json take precedence. Also fixes resolveTask, which previously hardcoded `task <name>` and ran with no cwd: it now honors the configured task binary path, sets the workspace as cwd, and forwards CLI args. Command-string construction is shared via buildTaskCommand to keep the two paths in sync.
1 parent 6599f13 commit 4b5eb17

3 files changed

Lines changed: 51 additions & 12 deletions

File tree

src/models/taskDefinition.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as vscode from 'vscode';
22
import { Location, Task } from './models.js';
33
import { settings } from '../utils/settings.js';
4+
import { useDedicatedTerminal, buildTaskCommand } from '../utils/taskPresentation.js';
45

56
export class TaskDefinition implements vscode.TaskDefinition {
67
private _task: Task;
@@ -37,17 +38,27 @@ export class TaskDefinition implements vscode.TaskDefinition {
3738
cliArgs = cliArgs?.filter(x => x !== "") || [];
3839
const uri = vscode.Uri.file(this.workspace);
3940
const workspaceFolder = vscode.workspace.getWorkspaceFolder(uri) || vscode.TaskScope.Workspace;
41+
const taskLabel = cliArgs.length > 0 ? `${this.name} ${cliArgs.join(' ')}` : this.name;
42+
const definition: vscode.TaskDefinition = {
43+
type: this.type,
44+
task: this.task,
45+
workspace: this.workspace,
46+
file: this.location.taskfile
47+
};
48+
if (cliArgs.length > 0) {
49+
definition.args = cliArgs;
50+
}
4051
const task = new vscode.Task(
41-
this,
52+
definition,
4253
workspaceFolder,
43-
this.name,
54+
taskLabel,
4455
this.type,
4556
new vscode.ShellExecution(
46-
`${settings.path} ${this.task}${cliArgs && cliArgs.length > 0 ? " -- " + cliArgs.join(' ') : ''}`,
57+
buildTaskCommand(settings.path, this.task, cliArgs),
4758
{cwd: this.workspace}
4859
)
4960
);
5061
task.detail = this.description;
51-
return task;
62+
return useDedicatedTerminal(task);
5263
}
5364
}

src/providers/taskProvider.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
import * as vscode from 'vscode';
66
import { Taskfile } from '../models/taskfile.js';
7-
import { TaskDefinition } from '../models/taskDefinition.js';
7+
import { useDedicatedTerminal, buildTaskCommand } from '../utils/taskPresentation.js';
8+
import { settings } from '../utils/settings.js';
89

910
export class TaskProvider implements vscode.TaskProvider<vscode.Task> {
1011
private _taskfiles: Taskfile[] = [];
@@ -22,16 +23,24 @@ export class TaskProvider implements vscode.TaskProvider<vscode.Task> {
2223
}
2324

2425
public resolveTask(_task: vscode.Task): vscode.Task | undefined {
25-
const task = _task.definition.task;
26-
if (task) {
27-
const definition: TaskDefinition = <any>_task.definition;
28-
return new vscode.Task(
26+
const taskName = _task.definition.task;
27+
if (taskName) {
28+
const definition = _task.definition;
29+
const cliArgs = Array.isArray(definition.args)
30+
? definition.args.filter((arg: unknown): arg is string => typeof arg === 'string' && arg !== "")
31+
: [];
32+
const workspace = typeof definition.workspace === 'string' ? definition.workspace : undefined;
33+
const executionOptions = workspace ? {cwd: workspace} : undefined;
34+
return useDedicatedTerminal(new vscode.Task(
2935
definition,
3036
_task.scope ?? vscode.TaskScope.Workspace,
31-
definition.task,
37+
taskName,
3238
'taskfile',
33-
new vscode.ShellExecution(`task ${definition.task}`)
34-
);
39+
new vscode.ShellExecution(
40+
buildTaskCommand(settings.path, taskName, cliArgs),
41+
executionOptions
42+
)
43+
), _task.presentationOptions);
3544
}
3645
return undefined;
3746
}

src/utils/taskPresentation.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import * as vscode from 'vscode';
2+
3+
const dedicatedTerminalDefaults: vscode.TaskPresentationOptions = {
4+
panel: vscode.TaskPanelKind.Dedicated,
5+
reveal: vscode.TaskRevealKind.Always,
6+
clear: false,
7+
showReuseMessage: false
8+
};
9+
10+
// Applies our dedicated-terminal presentation defaults, while letting any
11+
// user-supplied options (e.g. from tasks.json) take precedence.
12+
export function useDedicatedTerminal(task: vscode.Task, overrides?: vscode.TaskPresentationOptions): vscode.Task {
13+
task.presentationOptions = { ...dedicatedTerminalDefaults, ...overrides };
14+
return task;
15+
}
16+
17+
export function buildTaskCommand(taskBin: string, taskName: string, cliArgs: string[]): string {
18+
return `${taskBin} ${taskName}${cliArgs.length > 0 ? " -- " + cliArgs.join(' ') : ''}`;
19+
}

0 commit comments

Comments
 (0)