- Remove unused `using System.Linq;` from JobExecutionViewRendererL0
and `using System.Collections.Generic;` from StepEntryTranslatorL0.
- StepEntryTranslator: read run-step inputs through
`PipelineConstants.ScriptStepInputs.*` (`script`, `shell`,
`workingDirectory`). The runner stores these keys in their
constants-defined spelling — see ActionManifestManagerWrapper:244 —
not their kebab-case workflow-YAML form, so the previous
`working-directory` lookup never matched in practice. Tests
updated to use the same constants.
- TemplateTokenYamlAdapter / JobExecutionViewRenderer.FormatScalar:
defensively also strip a `---\n` prefix on top of the existing
`--- ` prefix. Not observed in any input I exercised, but cheap
insurance against an Emitter quirk on some YAML configurations.
- JobExecutionView.Append: reject passing both `stepIdentity` and
`matchKey`. The combination would orphan the original step's
line mapping the moment TryClaim overwrites `_stepIdentities`
for a different step. Add an L0 test covering the precondition.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Marking placeholders as skipped was a special-case treatment for
predicted Post placeholders whose Main step never executed. In practice
this is no different from any step that doesn't run: the debugger
simply never pauses on it, and the IStep→line mapping is only
populated when a placeholder is claimed.
Drop `IsSkipped` from `JobExecutionViewEntry`, the inline
`# (skipped — ...)` rendering, and `JobExecutionView.TryMarkSkipped`.
Placeholders that are never claimed simply stay in the view as
informational entries — the IStep→line dictionary excludes them,
so the debugger never tries to pause on them.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
`StringWriter` defaults to `Environment.NewLine`, which is CRLF on
Windows. YamlDotNet's `Emitter` calls `WriteLine` internally, so the
emitted YAML mixes CRLF (from the emitter) with the explicit `\n` we
append in the renderer skeleton. That breaks the document-end
stripping in `FormatScalar` and `TemplateTokenYamlAdapter.Serialize`
and corrupts the rendered view on Windows.
Set `sw.NewLine = "\n"` in both emitter entry points so the output
is always LF, regardless of host. Add regression tests asserting no
`\r` appears in the rendered view or in adapter output. The tests
are noop guards on Linux (where `Environment.NewLine` is already
\n) but catch any future regression on the Windows CI matrix.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The workflow parser tokenizes a mixed scalar like
`${{ runner.os }}-primes` as a single BasicExpressionToken whose
internal expression is `format('{0}-primes', runner.os)`. The
adapter was driving TemplateWriter, which calls `ToString()` and
surfaces the parser's normalized rewrite verbatim.
Replace TemplateWriter.Write with a local walker that mirrors it
except for BasicExpressionToken — those go through
`ToDisplayString()`, reversing the format(...) rewrite back to the
authored form. All other token kinds delegate to the same writer
calls TemplateWriter would make.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Translates IStep instances (ActionRunner, JobExtensionRunner, etc.)
into JobExecutionViewEntry. Filters auto-generated step IDs so only
explicit IDs surface in the view, and emits step parameters via the
TemplateTokenYamlAdapter to preserve pre-evaluation expressions.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
IObjectWriter that bridges the runner's TemplateWriter to YamlDotNet
so TemplateToken trees can be serialized with ${{ }} expressions
preserved. Lets the execution view show step parameters (with:, env:,
if:, etc.) exactly as authored in the workflow file, before any
expression evaluation.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Thread-safe append-only container of JobExecutionViewEntry. Supports
predictive Post-step placeholders via TryClaim(matchKey, step) and
TryMarkSkipped(matchKey) so the rendered view can reflect Main steps
that are skipped by their if: condition. Provides line lookup by
IStep for DAP stack-trace frame construction.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pure renderer that emits a phase-keyed YAML view (setup/pre/main/
post/cleanup) of a job's runner execution plan. Tracks per-entry
start lines so the debugger can map IStep instances back to source
locations. Includes a skipped-step annotation for predicted Post
placeholders whose Main step never executes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>