Start from beginning';
+ var dryRunEl = document.getElementById('qs-dry-run');
+ if (dryRunEl) dryRunEl.checked = false;
+ // Load step list
+ loadQsStepList(name);
document.getElementById('quickstart-dialog').showModal();
document.getElementById('quickstart-input').focus();
}
@@ -140,12 +185,22 @@
Start Pipeline:
Start Pipeline: Start from beginning';
+ for (var i = 0; i < steps.length; i++) {
+ opts += '';
+ }
+ if (fromStep) fromStep.innerHTML = opts;
+ var checksHTML = '';
+ for (var i = 0; i < steps.length; i++) {
+ checksHTML += '';
+ }
+ if (stepsChecks) stepsChecks.innerHTML = checksHTML || 'No steps';
+ var exclHTML = '';
+ for (var i = 0; i < steps.length; i++) {
+ exclHTML += '';
+ }
+ if (excludeChecks) excludeChecks.innerHTML = exclHTML || 'No steps';
+ }).catch(function() {
+ if (stepsChecks) stepsChecks.innerHTML = 'Failed to load steps';
+ if (excludeChecks) excludeChecks.innerHTML = 'Failed to load steps';
+ });
+}
+
+function onQsFromStepChange() {
+ var fromStep = document.getElementById('qs-from-step');
+ var stepsGroup = document.getElementById('qs-steps-group');
+ if (fromStep && fromStep.value) {
+ if (stepsGroup) stepsGroup.style.opacity = '0.5';
+ var checks = document.querySelectorAll('#qs-steps-checks input[type="checkbox"]');
+ for (var i = 0; i < checks.length; i++) { checks[i].checked = false; checks[i].disabled = true; }
+ } else {
+ if (stepsGroup) stepsGroup.style.opacity = '1';
+ var checks = document.querySelectorAll('#qs-steps-checks input[type="checkbox"]');
+ for (var i = 0; i < checks.length; i++) { checks[i].disabled = false; }
+ }
+}
+
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') hideQuickStart();
});
diff --git a/internal/webui/templates/pipelines.html b/internal/webui/templates/pipelines.html
index 538c25e0..8a64bb85 100644
--- a/internal/webui/templates/pipelines.html
+++ b/internal/webui/templates/pipelines.html
@@ -68,6 +68,42 @@
Start Pipeline:
Input (optional)
+
+ Advanced Options
+
+
+
+
+
+
+
+
+
+
+
+ Loading...
+
+
+
+
+
+ Loading...
+
+
+
+
+
+
@@ -82,6 +118,15 @@
Start Pipeline:
Start from beginning';
+ var dryRunEl = document.getElementById('qs-dry-run');
+ if (dryRunEl) dryRunEl.checked = false;
+ // Load step list
+ loadQsStepList(name);
document.getElementById('quickstart-dialog').showModal();
document.getElementById('quickstart-input').focus();
}
@@ -95,12 +140,22 @@
Start Pipeline:
Start Pipeline: Start from beginning';
+ for (var i = 0; i < steps.length; i++) {
+ opts += '';
+ }
+ if (fromStep) fromStep.innerHTML = opts;
+ var checksHTML = '';
+ for (var i = 0; i < steps.length; i++) {
+ checksHTML += '';
+ }
+ if (stepsChecks) stepsChecks.innerHTML = checksHTML || 'No steps';
+ var exclHTML = '';
+ for (var i = 0; i < steps.length; i++) {
+ exclHTML += '';
+ }
+ if (excludeChecks) excludeChecks.innerHTML = exclHTML || 'No steps';
+ }).catch(function() {
+ if (stepsChecks) stepsChecks.innerHTML = 'Failed to load steps';
+ if (excludeChecks) excludeChecks.innerHTML = 'Failed to load steps';
+ });
+}
+
+function onQsFromStepChange() {
+ var fromStep = document.getElementById('qs-from-step');
+ var stepsGroup = document.getElementById('qs-steps-group');
+ if (fromStep && fromStep.value) {
+ if (stepsGroup) stepsGroup.style.opacity = '0.5';
+ var checks = document.querySelectorAll('#qs-steps-checks input[type="checkbox"]');
+ for (var i = 0; i < checks.length; i++) { checks[i].checked = false; checks[i].disabled = true; }
+ } else {
+ if (stepsGroup) stepsGroup.style.opacity = '1';
+ var checks = document.querySelectorAll('#qs-steps-checks input[type="checkbox"]');
+ for (var i = 0; i < checks.length; i++) { checks[i].disabled = false; }
+ }
+}
+
// Set category badges from pipeline name prefix on load
document.querySelectorAll('#pipeline-tbody tr').forEach(function(row) {
var name = row.dataset.name || '';
diff --git a/specs/690-webui-start-flags/plan.md b/specs/690-webui-start-flags/plan.md
new file mode 100644
index 00000000..248e89db
--- /dev/null
+++ b/specs/690-webui-start-flags/plan.md
@@ -0,0 +1,72 @@
+# Implementation Plan: WebUI Start Pipeline Dialog Flags
+
+## Objective
+
+Expose the five high-priority CLI flags (`--model`, `--from-step`, `--steps`, `--exclude`, `--dry-run`) in the web UI's "Start Pipeline" dialog so users can configure pipeline runs without the CLI. Step lists must be dynamically populated from the pipeline definition.
+
+## Approach
+
+The implementation touches three layers: **types** (request struct), **handlers** (wiring to executor options), and **UI** (templates + JS). There are three distinct start dialogs that need updating:
+
+1. **Runs page** (`runs.html`) — full dialog with pipeline selector + new controls
+2. **Pipelines list page** (`pipelines.html`) — quickstart dialog (pipeline is pre-selected)
+3. **Pipeline detail page** (`pipeline_detail.html`) — quickstart dialog (pipeline is pre-selected)
+
+The existing `GET /api/pipelines/{name}` endpoint already returns step IDs, personas, and dependencies — this will be used to populate step dropdowns dynamically when a pipeline is selected.
+
+### Key Design Decisions
+
+1. **Collapsible "Advanced Options" section**: The five new controls go into a collapsible `` element below the Input field. This keeps the dialog simple for basic use while exposing power-user controls on demand.
+
+2. **Step selection via checkboxes, not multi-select**: Multi-select `