@proletariat/cli 0.3.56 → 0.3.57

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/README.md CHANGED
@@ -697,7 +697,7 @@ Claude Code handles its own authentication via `claude login`.
697
697
 
698
698
  ## Requirements
699
699
 
700
- - **Node.js 18+**
700
+ - **Node.js 20+** (22 LTS recommended)
701
701
  - **Git**
702
702
  - **Claude Code** (`claude login` to authenticate)
703
703
  - **SQLite**
@@ -706,6 +706,74 @@ Claude Code handles its own authentication via `claude login`.
706
706
 
707
707
  ---
708
708
 
709
+ ## Troubleshooting Installation
710
+
711
+ ### `bun install` fails on better-sqlite3
712
+
713
+ **Symptom**: `bun install -g @proletariat/cli` fails with `isexe` or `node-gyp` errors during the `better-sqlite3` native module build.
714
+
715
+ **Cause**: Bun's node-gyp compatibility is limited. The `which` dependency inside node-gyp uses `isexe`, which is incompatible with Bun's runtime shims.
716
+
717
+ **Fix**: Use `npm` or Homebrew instead:
718
+
719
+ ```bash
720
+ # Option 1: Homebrew (macOS, recommended)
721
+ brew install chrismcdermut/proletariat/prlt
722
+
723
+ # Option 2: npm (all platforms)
724
+ npm install -g @proletariat/cli
725
+
726
+ # Option 3: pnpm
727
+ pnpm install -g @proletariat/cli
728
+ ```
729
+
730
+ If you must use Bun, ensure Node.js 22 (LTS) is also installed and set `better-sqlite3` to use its prebuilt binaries:
731
+
732
+ ```bash
733
+ npm rebuild better-sqlite3
734
+ ```
735
+
736
+ ### npm `EACCES: permission denied`
737
+
738
+ **Symptom**: `npm install -g @proletariat/cli` fails with `EACCES: permission denied` on `/opt/homebrew/lib/node_modules` or `/usr/local/lib/node_modules`.
739
+
740
+ **Fix**: Configure npm to use a user-writable directory:
741
+
742
+ ```bash
743
+ mkdir -p ~/.npm-global
744
+ npm config set prefix '~/.npm-global'
745
+ export PATH="$HOME/.npm-global/bin:$PATH"
746
+ # Add the export line to your ~/.zshrc or ~/.bashrc
747
+ npm install -g @proletariat/cli
748
+ ```
749
+
750
+ Or use Homebrew instead (macOS):
751
+
752
+ ```bash
753
+ brew install chrismcdermut/proletariat/prlt
754
+ ```
755
+
756
+ ### Native module errors after install
757
+
758
+ **Symptom**: `prlt` runs but crashes with `better_sqlite3.node` or ABI mismatch errors.
759
+
760
+ **Fix**:
761
+
762
+ ```bash
763
+ # Rebuild for the current Node version
764
+ npm rebuild better-sqlite3
765
+
766
+ # Verify it works
767
+ node -e "require('better-sqlite3')"
768
+
769
+ # If still failing, reinstall
770
+ npm install -g @proletariat/cli --force
771
+ ```
772
+
773
+ See the [full troubleshooting guide](../../docs/troubleshooting.md) for more details.
774
+
775
+ ---
776
+
709
777
  ## Support
710
778
 
711
779
  - **Discord**: [discord.gg/tmZyjNNSvw](https://discord.gg/tmZyjNNSvw)
@@ -7,6 +7,11 @@ function parseNodeMajor(version) {
7
7
  return match ? Number.parseInt(match[1], 10) : null
8
8
  }
9
9
 
10
+ function isBunRuntime() {
11
+ return typeof process.versions.bun === 'string'
12
+ || typeof globalThis.Bun !== 'undefined'
13
+ }
14
+
10
15
  function runtimeInfo() {
11
16
  return {
12
17
  nodeVersion: process.version,
@@ -14,24 +19,32 @@ function runtimeInfo() {
14
19
  abi: process.versions.modules,
15
20
  platform: process.platform,
16
21
  arch: process.arch,
22
+ isBun: isBunRuntime(),
17
23
  }
18
24
  }
19
25
 
26
+ function isBunNodeGypError(error) {
27
+ if (!(error instanceof Error)) return false
28
+ const msg = error.message.toLowerCase()
29
+ return msg.includes('isexe') || msg.includes('which.js') || msg.includes('node-gyp')
30
+ }
31
+
20
32
  function buildMessage(error, context) {
21
33
  const info = runtimeInfo()
34
+ const runtimeLabel = info.isBun ? 'bun' : 'node'
22
35
  const nodeMajorHint = info.nodeMajor === null || SUPPORTED_NODE_MAJORS.includes(info.nodeMajor)
23
36
  ? ''
24
37
  : `\n- Unsupported Node major for this CLI: ${info.nodeMajor} (supported: ${SUPPORTED_NODE_MAJORS.join(', ')})`
25
38
  const reason = error instanceof Error ? error.message : String(error)
26
39
 
27
- return [
40
+ const lines = [
28
41
  '',
29
42
  '╔══════════════════════════════════════════════════════════════════╗',
30
43
  '║ better-sqlite3 native module validation failed ║',
31
44
  '╚══════════════════════════════════════════════════════════════════╝',
32
45
  '',
33
46
  `Context: ${context}`,
34
- `Runtime: node ${info.nodeVersion} (ABI ${info.abi}) on ${info.platform}-${info.arch}${nodeMajorHint}`,
47
+ `Runtime: ${runtimeLabel} ${info.nodeVersion} (ABI ${info.abi}) on ${info.platform}-${info.arch}${nodeMajorHint}`,
35
48
  `Error: ${reason}`,
36
49
  '',
37
50
  'Fix steps:',
@@ -43,8 +56,22 @@ function buildMessage(error, context) {
43
56
  'If the problem persists, ensure you have build tools installed:',
44
57
  ' macOS: xcode-select --install',
45
58
  ' Linux: sudo apt-get install build-essential python3',
46
- '',
47
- ].join('\n')
59
+ ]
60
+
61
+ if (info.isBun || isBunNodeGypError(error)) {
62
+ lines.push(
63
+ '',
64
+ 'Bun users:',
65
+ ' Bun\'s node-gyp compatibility is limited and may fail to compile',
66
+ ' better-sqlite3. Recommended alternatives:',
67
+ ' - Install with npm instead: npm install -g @proletariat/cli',
68
+ ' - Install with Homebrew (macOS): brew install chrismcdermut/proletariat/prlt',
69
+ ' - Use Node.js 22 (LTS) for best compatibility',
70
+ )
71
+ }
72
+
73
+ lines.push('')
74
+ return lines.join('\n')
48
75
  }
49
76
 
50
77
  function validate(context) {
@@ -61,6 +88,18 @@ function validate(context) {
61
88
  try {
62
89
  validate('postinstall')
63
90
  } catch (error) {
64
- console.error(error instanceof Error ? error.message : String(error))
91
+ const info = runtimeInfo()
92
+ const message = error instanceof Error ? error.message : String(error)
93
+ // Under bun, native module build failures are expected — warn instead of
94
+ // hard-failing so the install can complete. The user will get a clear error
95
+ // at runtime with actionable fix steps.
96
+ if (info.isBun) {
97
+ console.warn(message)
98
+ console.warn('\n[warn] Continuing installation despite validation failure (bun detected).')
99
+ console.warn('[warn] Run prlt with Node.js, or reinstall with npm/Homebrew for full support.\n')
100
+ process.exit(0)
101
+ }
102
+
103
+ console.error(message)
65
104
  process.exit(1)
66
105
  }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * prlt dashboard — unified TUI dashboard
3
+ *
4
+ * Combines kanban board, agent list, and session status
5
+ * into a single auto-refreshing terminal view.
6
+ */
7
+ import { PMOCommand } from '../lib/pmo/index.js';
8
+ export default class Dashboard extends PMOCommand {
9
+ static description: string;
10
+ static examples: string[];
11
+ static flags: {
12
+ refresh: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
13
+ compact: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ };
18
+ execute(): Promise<void>;
19
+ /**
20
+ * Gather all dashboard data from board, agents, and sessions.
21
+ */
22
+ private gatherData;
23
+ /**
24
+ * Auto-refresh loop: clear screen and redraw on interval.
25
+ */
26
+ private runWithRefresh;
27
+ /**
28
+ * Output all dashboard data as JSON for AI agents.
29
+ */
30
+ private outputJson;
31
+ private renderDashboard;
32
+ private renderBoardSection;
33
+ private renderTicketCompact;
34
+ private renderTicketFull;
35
+ private progressBar;
36
+ private renderAgentsSection;
37
+ private renderSessionsSection;
38
+ }
@@ -0,0 +1,352 @@
1
+ /**
2
+ * prlt dashboard — unified TUI dashboard
3
+ *
4
+ * Combines kanban board, agent list, and session status
5
+ * into a single auto-refreshing terminal view.
6
+ */
7
+ import { Flags } from '@oclif/core';
8
+ import { PMOCommand, pmoBaseFlags, } from '../lib/pmo/index.js';
9
+ import { styles, formatPriority, formatCategory, getColumnStyle, getColumnEmoji, } from '../lib/styles.js';
10
+ import { shouldOutputJson, outputSuccessAsJson, createMetadata, } from '../lib/prompt-json.js';
11
+ import { SessionStore } from '../lib/session-store.js';
12
+ import { getWorkspaceInfo, getAllAgentsStatus, getAgentTmuxSessions, } from '../lib/agents/commands.js';
13
+ function formatDuration(ms) {
14
+ const seconds = Math.floor(ms / 1000);
15
+ if (seconds < 60)
16
+ return `${seconds}s`;
17
+ const minutes = Math.floor(seconds / 60);
18
+ if (minutes < 60)
19
+ return `${minutes}m ${seconds % 60}s`;
20
+ const hours = Math.floor(minutes / 60);
21
+ return `${hours}h ${minutes % 60}m`;
22
+ }
23
+ function padEnd(str, len) {
24
+ return str.length >= len ? str.substring(0, len) : str + ' '.repeat(len - str.length);
25
+ }
26
+ function truncate(str, maxLen) {
27
+ if (str.length <= maxLen)
28
+ return str;
29
+ return str.substring(0, maxLen - 3) + '...';
30
+ }
31
+ export default class Dashboard extends PMOCommand {
32
+ static description = 'Unified TUI dashboard with board, agents, and sessions';
33
+ static examples = [
34
+ '<%= config.bin %> dashboard',
35
+ '<%= config.bin %> dashboard --refresh 10',
36
+ '<%= config.bin %> dashboard --compact',
37
+ '<%= config.bin %> dashboard --json',
38
+ ];
39
+ static flags = {
40
+ ...pmoBaseFlags,
41
+ refresh: Flags.integer({
42
+ char: 'r',
43
+ description: 'Auto-refresh interval in seconds (0 to disable)',
44
+ default: 0,
45
+ }),
46
+ compact: Flags.boolean({
47
+ char: 'c',
48
+ description: 'Compact ticket view (ID and title only)',
49
+ default: false,
50
+ }),
51
+ };
52
+ async execute() {
53
+ const { flags } = await this.parse(Dashboard);
54
+ const jsonMode = shouldOutputJson(flags);
55
+ const projectId = await this.requireProject();
56
+ if (flags.refresh > 0 && !jsonMode) {
57
+ await this.runWithRefresh(projectId, flags.refresh, flags.compact);
58
+ }
59
+ else {
60
+ const data = await this.gatherData(projectId);
61
+ if (jsonMode) {
62
+ this.outputJson(data, flags);
63
+ return;
64
+ }
65
+ this.renderDashboard(data, flags.compact);
66
+ }
67
+ }
68
+ /**
69
+ * Gather all dashboard data from board, agents, and sessions.
70
+ */
71
+ async gatherData(projectId) {
72
+ const board = await this.storage.getBoard(projectId);
73
+ // Get agent status from workspace
74
+ let agents = [];
75
+ try {
76
+ const workspaceInfo = getWorkspaceInfo();
77
+ const activeAgents = workspaceInfo.agents.filter(a => a.status === 'active');
78
+ if (activeAgents.length > 0) {
79
+ agents = getAllAgentsStatus(workspaceInfo);
80
+ }
81
+ }
82
+ catch {
83
+ // Workspace info might not be available — ignore
84
+ }
85
+ // Get sessions from global session store
86
+ let sessions = [];
87
+ let sessionStore = null;
88
+ try {
89
+ sessionStore = new SessionStore();
90
+ sessionStore.reconcile();
91
+ sessions = sessionStore.list('running');
92
+ }
93
+ catch {
94
+ // Session store might not exist yet — ignore
95
+ }
96
+ finally {
97
+ sessionStore?.close();
98
+ }
99
+ return {
100
+ board: board ? { name: board.name, columns: board.columns } : null,
101
+ agents,
102
+ sessions,
103
+ timestamp: new Date(),
104
+ };
105
+ }
106
+ /**
107
+ * Auto-refresh loop: clear screen and redraw on interval.
108
+ */
109
+ async runWithRefresh(projectId, intervalSec, compact) {
110
+ const render = async () => {
111
+ const data = await this.gatherData(projectId);
112
+ // Clear screen
113
+ process.stdout.write('\x1B[2J\x1B[H');
114
+ this.renderDashboard(data, compact);
115
+ this.log(styles.muted(`\nAuto-refreshing every ${intervalSec}s. Press Ctrl+C to exit.`));
116
+ };
117
+ // Initial render
118
+ await render();
119
+ // Set up interval
120
+ const timer = setInterval(render, intervalSec * 1000);
121
+ // Wait for SIGINT
122
+ await new Promise((resolve) => {
123
+ const cleanup = () => {
124
+ clearInterval(timer);
125
+ resolve();
126
+ };
127
+ process.on('SIGINT', cleanup);
128
+ process.on('SIGTERM', cleanup);
129
+ });
130
+ }
131
+ /**
132
+ * Output all dashboard data as JSON for AI agents.
133
+ */
134
+ outputJson(data, flags) {
135
+ outputSuccessAsJson({
136
+ board: data.board
137
+ ? {
138
+ name: data.board.name,
139
+ columns: data.board.columns.map(col => ({
140
+ name: col.name,
141
+ ticketCount: col.tickets.length,
142
+ tickets: col.tickets.map(t => ({
143
+ id: t.id,
144
+ title: t.title,
145
+ priority: t.priority,
146
+ category: t.category,
147
+ assignee: t.assignee,
148
+ subtasksDone: t.subtasks.filter((s) => s.done).length,
149
+ subtasksTotal: t.subtasks.length,
150
+ })),
151
+ })),
152
+ totalTickets: data.board.columns.reduce((sum, col) => sum + col.tickets.length, 0),
153
+ }
154
+ : null,
155
+ agents: data.agents.map(a => ({
156
+ name: a.name,
157
+ exists: a.exists,
158
+ branch: a.branch,
159
+ assignedTickets: a.assignedTickets,
160
+ completedTickets: a.completedTickets,
161
+ running: getAgentTmuxSessions(a.name).length > 0,
162
+ })),
163
+ sessions: data.sessions.map(s => ({
164
+ id: s.id,
165
+ agentName: s.agentName,
166
+ runner: s.runner,
167
+ task: s.task,
168
+ environment: s.environment,
169
+ status: s.status,
170
+ duration: Date.now() - s.startedAt.getTime(),
171
+ startedAt: s.startedAt.toISOString(),
172
+ })),
173
+ timestamp: data.timestamp.toISOString(),
174
+ }, createMetadata('dashboard', flags));
175
+ }
176
+ // ===========================================================================
177
+ // Rendering
178
+ // ===========================================================================
179
+ renderDashboard(data, compact) {
180
+ const termWidth = process.stdout.columns || 80;
181
+ // Header
182
+ this.log(styles.title('\n PROLETARIAT DASHBOARD'));
183
+ this.log(styles.muted(` ${data.timestamp.toLocaleTimeString()} — ` +
184
+ `${data.agents.length} agent(s), ` +
185
+ `${data.sessions.length} session(s)`));
186
+ this.log(styles.muted(' ' + '═'.repeat(Math.min(termWidth - 4, 76))));
187
+ // Section 1: Kanban Board
188
+ this.renderBoardSection(data, compact);
189
+ // Section 2: Agents
190
+ this.renderAgentsSection(data);
191
+ // Section 3: Sessions
192
+ this.renderSessionsSection(data);
193
+ // Footer
194
+ this.log(styles.muted(' ' + '═'.repeat(Math.min(termWidth - 4, 76))));
195
+ this.log(styles.muted(' Commands: ') +
196
+ styles.primary('prlt dashboard -r 5') +
197
+ styles.muted(' (auto-refresh) ') +
198
+ styles.primary('prlt ps') +
199
+ styles.muted(' (sessions) ') +
200
+ styles.primary('prlt agent list') +
201
+ styles.muted(' (agents)'));
202
+ this.log('');
203
+ }
204
+ // -- Board ------------------------------------------------------------------
205
+ renderBoardSection(data, compact) {
206
+ this.log('');
207
+ this.log(styles.header(' BOARD'));
208
+ if (!data.board) {
209
+ this.log(styles.muted(' No board found.'));
210
+ return;
211
+ }
212
+ // Summary bar: show counts per column inline
213
+ const summaryParts = data.board.columns
214
+ .map(col => {
215
+ const colStyle = getColumnStyle(col.name);
216
+ return colStyle(`${col.name}: ${col.tickets.length}`);
217
+ });
218
+ this.log(' ' + summaryParts.join(styles.muted(' | ')));
219
+ this.log(styles.muted(' ' + '─'.repeat(60)));
220
+ // Show tickets grouped by column (skip empty columns in compact mode)
221
+ for (const column of data.board.columns) {
222
+ if (compact && column.tickets.length === 0)
223
+ continue;
224
+ const headerColor = getColumnStyle(column.name);
225
+ const emoji = getColumnEmoji(column.name);
226
+ this.log(headerColor(` ${emoji} ${column.name} (${column.tickets.length})`));
227
+ if (column.tickets.length === 0) {
228
+ this.log(styles.muted(' (empty)'));
229
+ continue;
230
+ }
231
+ const sortedTickets = [...column.tickets].sort((a, b) => (a.position || 0) - (b.position || 0));
232
+ for (const ticket of sortedTickets) {
233
+ if (compact) {
234
+ this.renderTicketCompact(ticket);
235
+ }
236
+ else {
237
+ this.renderTicketFull(ticket);
238
+ }
239
+ }
240
+ }
241
+ }
242
+ renderTicketCompact(ticket) {
243
+ const priority = formatPriority(ticket.priority);
244
+ const assignee = ticket.assignee ? styles.muted(` @${ticket.assignee}`) : '';
245
+ this.log(` ${styles.code(ticket.id)}: ${ticket.title} ${priority}${assignee}`);
246
+ }
247
+ renderTicketFull(ticket) {
248
+ const priority = formatPriority(ticket.priority);
249
+ const category = formatCategory(ticket.category);
250
+ const assignee = ticket.assignee ? styles.muted(` @${ticket.assignee}`) : '';
251
+ this.log(` ${styles.code(ticket.id)} ${ticket.title} ${priority} ${category}${assignee}`);
252
+ if (ticket.description) {
253
+ const shortDesc = ticket.description.split('\n')[0].substring(0, 50);
254
+ this.log(styles.muted(` ${shortDesc}${ticket.description.length > 50 ? '...' : ''}`));
255
+ }
256
+ if (ticket.subtasks.length > 0) {
257
+ const done = ticket.subtasks.filter(s => s.done).length;
258
+ const total = ticket.subtasks.length;
259
+ const pct = Math.round((done / total) * 100);
260
+ const bar = this.progressBar(done, total, 10);
261
+ this.log(styles.muted(` ${bar} ${done}/${total} (${pct}%)`));
262
+ }
263
+ }
264
+ progressBar(done, total, width) {
265
+ const filled = Math.round((done / total) * width);
266
+ const empty = width - filled;
267
+ return styles.success('█'.repeat(filled)) + styles.muted('░'.repeat(empty));
268
+ }
269
+ // -- Agents -----------------------------------------------------------------
270
+ renderAgentsSection(data) {
271
+ this.log('');
272
+ this.log(styles.header(' AGENTS'));
273
+ if (data.agents.length === 0) {
274
+ this.log(styles.muted(' No agents found.'));
275
+ return;
276
+ }
277
+ // Header row
278
+ this.log(styles.muted(' ' +
279
+ padEnd('Name', 18) +
280
+ padEnd('Status', 12) +
281
+ padEnd('Tickets', 24) +
282
+ 'Branch'));
283
+ this.log(styles.muted(' ' + '─'.repeat(70)));
284
+ for (const agent of data.agents) {
285
+ const sessions = getAgentTmuxSessions(agent.name);
286
+ const isRunning = sessions.length > 0;
287
+ // Determine status
288
+ let statusLabel;
289
+ let statusStyled;
290
+ if (!agent.exists) {
291
+ statusLabel = 'missing';
292
+ statusStyled = styles.error(statusLabel);
293
+ }
294
+ else if (isRunning) {
295
+ statusLabel = 'running';
296
+ statusStyled = styles.success(statusLabel);
297
+ }
298
+ else {
299
+ statusLabel = 'idle';
300
+ statusStyled = styles.muted(statusLabel);
301
+ }
302
+ const ticketsLabel = agent.assignedTickets.length > 0
303
+ ? truncate(agent.assignedTickets.join(', '), 22)
304
+ : 'none';
305
+ const ticketsStyled = agent.assignedTickets.length > 0
306
+ ? styles.info(ticketsLabel)
307
+ : styles.muted(ticketsLabel);
308
+ const branchLabel = agent.branch ? truncate(agent.branch, 30) : '-';
309
+ const branchStyled = agent.branch ? styles.code(branchLabel) : styles.muted(branchLabel);
310
+ this.log(' ' +
311
+ padEnd(agent.name, 18) +
312
+ padEnd(statusLabel, 12).replace(statusLabel, statusStyled) +
313
+ padEnd(ticketsLabel, 24).replace(ticketsLabel, ticketsStyled) +
314
+ branchStyled);
315
+ }
316
+ // Agent summary
317
+ const activeCount = data.agents.filter(a => a.exists).length;
318
+ const runningCount = data.agents.filter(a => getAgentTmuxSessions(a.name).length > 0).length;
319
+ this.log(styles.muted(` Total: ${data.agents.length} | Active: ${activeCount} | Running: ${runningCount}`));
320
+ }
321
+ // -- Sessions ---------------------------------------------------------------
322
+ renderSessionsSection(data) {
323
+ this.log('');
324
+ this.log(styles.header(' SESSIONS'));
325
+ if (data.sessions.length === 0) {
326
+ this.log(styles.muted(' No running sessions.'));
327
+ return;
328
+ }
329
+ // Header row
330
+ this.log(styles.muted(' ' +
331
+ padEnd('Agent', 16) +
332
+ padEnd('Runner', 12) +
333
+ padEnd('Task', 28) +
334
+ padEnd('Env', 8) +
335
+ padEnd('Duration', 10) +
336
+ 'Status'));
337
+ this.log(styles.muted(' ' + '─'.repeat(78)));
338
+ for (const session of data.sessions) {
339
+ const duration = formatDuration(Date.now() - session.startedAt.getTime());
340
+ const taskDisplay = truncate(session.task, 26);
341
+ const statusColor = session.status === 'running' ? styles.success : styles.muted;
342
+ this.log(' ' +
343
+ padEnd(session.agentName, 16) +
344
+ padEnd(session.runner, 12) +
345
+ padEnd(taskDisplay, 28) +
346
+ padEnd(session.environment, 8) +
347
+ padEnd(duration, 10) +
348
+ statusColor(session.status));
349
+ }
350
+ }
351
+ }
352
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
@@ -490,6 +490,7 @@ export default class OrchestratorStart extends PromptCommand {
490
490
  hqPath,
491
491
  isOrchestrator: true,
492
492
  hqName,
493
+ executionEnvironment: environment,
493
494
  };
494
495
  // Build execution config
495
496
  const executionConfig = { ...DEFAULT_EXECUTION_CONFIG };