From 37ba6ab105ba08b9135d5ffe444a92b37e55fda1 Mon Sep 17 00:00:00 2001 From: eric sciple Date: Wed, 3 Dec 2025 10:40:31 -0600 Subject: [PATCH] Fix misleading error for malformed local workflow paths (#221) --- languageservice/src/validate.ts | 6 +++++ .../src/validate.uses-format.test.ts | 24 ++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/languageservice/src/validate.ts b/languageservice/src/validate.ts index cf27522..da44ad0 100644 --- a/languageservice/src/validate.ts +++ b/languageservice/src/validate.ts @@ -354,6 +354,12 @@ function validateWorkflowUsesFormat(diagnostics: Diagnostic[], token: StringToke return; } + // Malformed local workflow reference (starts with ./ but not in .github/workflows) + if (uses.startsWith("./")) { + addWorkflowUsesFormatError(diagnostics, token, "local workflow references must be rooted in '.github/workflows'"); + return; + } + // Remote workflow reference: must have @ for version const atSegments = uses.split("@"); if (atSegments.length === 1) { diff --git a/languageservice/src/validate.uses-format.test.ts b/languageservice/src/validate.uses-format.test.ts index 67777fc..dad042e 100644 --- a/languageservice/src/validate.uses-format.test.ts +++ b/languageservice/src/validate.uses-format.test.ts @@ -469,6 +469,27 @@ jobs: ]); }); + it("malformed local path not in .github/workflows", async () => { + const input = `on: push +jobs: + test: + uses: ./foo/bar.yml +`; + const result = await validate(createDocument("wf.yaml", input)); + expect(result).toEqual([ + { + message: + "Invalid workflow reference './foo/bar.yml': local workflow references must be rooted in '.github/workflows'", + severity: DiagnosticSeverity.Error, + range: { + start: {line: 3, character: 10}, + end: {line: 3, character: 23} + }, + code: "invalid-workflow-uses-format" + } + ]); + }); + it("missing .github/workflows path", async () => { const input = `on: push jobs: @@ -562,7 +583,8 @@ jobs: const result = await validate(createDocument("wf.yaml", input)); expect(result).toEqual([ { - message: "Invalid workflow reference './workflows/test.yml': no version specified", + message: + "Invalid workflow reference './workflows/test.yml': local workflow references must be rooted in '.github/workflows'", severity: DiagnosticSeverity.Error, range: { start: {line: 3, character: 10},