Skip to content

Switch skill CI validation workflows to vally lint#2030

Merged
aaronpowell merged 7 commits into
mainfrom
aaronpowell/comparing-vally-lint
Jun 30, 2026
Merged

Switch skill CI validation workflows to vally lint#2030
aaronpowell merged 7 commits into
mainfrom
aaronpowell/comparing-vally-lint

Conversation

@aaronpowell

@aaronpowell aaronpowell commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Summary

Replaces the external skill-validator binary (downloaded nightly from GitHub releases) with @microsoft/vally-cli (vally lint) for all skill static-analysis CI checks.

Why vally lint?

  • No binary download — installed via npx, no curl+tar+chmod per run
  • Stricter checksvally lint enforces the full Agent Skills spec: valid frontmatter types, file-reference integrity (valid-refs), orphan-file detection, and a 500-line SKILL.md cap
  • npm-versioned — reproducible and auditable via the npm registry

Changes

Skill PR gate & comment (skill-check.yml, skill-check-comment.yml)

  • Removed binary download/cache steps; replaced with actions/setup-node + npx @microsoft/vally-cli lint
  • Artifact and output file renamed vally-lint-results / vally-output.txt
  • PR comment UI strings updated

Nightly quality report (skill-quality-report.yml)

  • Same binary → vally swap
  • Agent check step now records an informational note (vally only processes SKILL.md, not .agent.md)

External plugin quality gates (eng/external-plugin-quality-gates.mjs)

  • Removed downloadSkillValidator() and SKILL_VALIDATOR_ARCHIVE_URL
  • Replaced buildSkillValidatorArgs() + runSkillValidatorGate() with buildVallyLintArgs() + runVallyLintGate(): runs npx @microsoft/vally-cli lint per resolved skill directory, falling back to the full plugin root when no specific skill paths are found
  • Result keys renamed: skill_validator_statusvally_lint_status, skill_validator_outputvally_lint_output

External plugin intake comments (eng/external-plugin-intake.mjs)

  • normalizeQualityGateResult defaults updated to new key names
  • PR comment table row and details section updated: "skill-validator" → "vally lint"

Documentation (CONTRIBUTING.md)

  • Two prose references to skill-validator check --plugin updated to vally lint

Behavioural notes

  • Warn-only PR gate preserved — the PR gate captures vally lint exit code but does not fail the workflow (same as before)
  • False-positive riskvally treats prose absolute paths like /spec/ as broken file references (valid-refs: absolute-path). Skills with such documentation text may show new warnings
  • 500-line limitvally enforces a 500-line cap on SKILL.md. Many existing skills exceed this; the gate is warn-only so this doesn't block PRs but does surface in the quality report
  • Agent filesvally lint only processes SKILL.md; .agent.md linting remains out of scope for this change

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions github-actions Bot added the workflow PR touches workflow automation label Jun 17, 2026
aaronpowell and others added 4 commits June 23, 2026 14:41
Replace the downloaded skill-validator binary with
px @microsoft/vally-cli lint
in the external plugin quality gates pipeline:

- Remove downloadSkillValidator() and SKILL_VALIDATOR_ARCHIVE_URL constant
- Replace �uildSkillValidatorArgs() + 
unSkillValidatorGate() with
  �uildVallyLintArgs() + 
unVallyLintGate() that run
px vally-cli lint
  per resolved skill directory (falling back to the full plugin root when no
  specific skill paths can be resolved from plugin.json)
- Rename result keys skill_validator_status / skill_validator_output
  to �ally_lint_status / �ally_lint_output throughout both
  �ng/external-plugin-quality-gates.mjs and �ng/external-plugin-intake.mjs
- Update PR comment markdown to show 'vally lint' instead of 'skill-validator'
- Update CONTRIBUTING.md prose references accordingly

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@aaronpowell aaronpowell changed the title Switch skill CI validation workflows to Vally lint Switch skill CI validation workflows to vally lint Jun 23, 2026
Replace the npx-spawned vally-cli process with a direct call to the
@microsoft/vally core library in the external plugin quality gates scripts:

- Add @microsoft/vally as a devDependency in package.json
- Import runLint and LintConsoleReporter from @microsoft/vally
- Replace runVallyLintGate() process spawn with async API call:
  - runLint({ rootPath }) returns structured LintResults
  - LintConsoleReporter with a Writable capture stream collects
    text output without printing to stdout
- Make runExternalPluginQualityGates() async (propagated to
  runExternalPluginPrQualityGates() and both main entry points)
- Use Promise.all in runExternalPluginPrQualityGates() for parallel
  plugin checks
- Fix remaining skill_validator_status reference in pr-quality-gates
  summary string (now vally-lint=...) and YAML workflow table header
- Add 'npm install @microsoft/vally' step to both calling workflows

This removes a layer of indirection (Node -> npx -> CLI -> library)
and replaces it with a direct in-process library call, which is faster,
more reliable, and gives structured access to lint results.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
GitHub Advanced Security started work on behalf of aaronpowell June 30, 2026 02:30 View session
GitHub Advanced Security finished work on behalf of aaronpowell June 30, 2026 02:32
@aaronpowell aaronpowell marked this pull request as ready for review June 30, 2026 04:05
Copilot AI review requested due to automatic review settings June 30, 2026 04:05
@aaronpowell aaronpowell merged commit 28c3a14 into main Jun 30, 2026
21 checks passed
@aaronpowell aaronpowell deleted the aaronpowell/comparing-vally-lint branch June 30, 2026 04:07

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR replaces the repo’s skill/static-analysis validation from the externally-downloaded skill-validator binary to Vally-based linting (vally lint / @microsoft/vally) across skill CI workflows and external plugin quality gates, and updates related reporting/comment UX and documentation accordingly.

Changes:

  • Updated skill PR gate + PR comment workflows to run Vally lint and publish renamed artifacts/outputs.
  • Updated nightly skill quality report workflow to run Vally lint for skills and emit an informational “agents not linted” note.
  • Refactored external plugin quality gates to use @microsoft/vally APIs and renamed result keys from skill_validator_*vally_lint_*, plus updated intake comment formatting and docs.
Show a summary per file
File Description
package.json Adds @microsoft/vally as a dev dependency for Node-based linting in eng/ scripts.
package-lock.json Locks transitive dependencies introduced by @microsoft/vally.
eng/external-plugin-quality-gates.mjs Replaces binary download + CLI invocation with @microsoft/vally lint execution and new result fields.
eng/external-plugin-pr-quality-gates.mjs Updates PR gate runner for async vally-based quality gates and new summary fields.
eng/external-plugin-intake.mjs Updates intake comment rendering and defaults to new vally_lint_* result keys.
CONTRIBUTING.md Updates external-plugin workflow documentation references to use vally lint.
.github/workflows/skill-quality-report.yml Switches nightly scan to Vally lint and adjusts report parsing/strings for the new output.
.github/workflows/skill-check.yml Switches PR gate checks to npx @microsoft/vally-cli lint, updates artifact/output names and messaging.
.github/workflows/skill-check-comment.yml Updates the commenting workflow to read the renamed artifact/output and adjust UI strings.
.github/workflows/external-plugin-quality-gates.yml Installs @microsoft/vally and runs updated Node-based quality gates.
.github/workflows/external-plugin-pr-quality-gates.yml Installs @microsoft/vally and updates PR quality reporting to use vally_lint_status.
.codespellrc Adds Vally/vally to ignore list to avoid false positives.

Review details

  • Files reviewed: 11/12 changed files
  • Comments generated: 7
  • Review effort level: Low

Comment on lines 423 to 427
function normalizeQualityGateResult(rawResult) {
const defaults = {
overall_status: "not_run",
skill_validator_status: "not_run",
vally_lint_status: "not_run",
smoke_status: "not_run",
Comment on lines +191 to 211
let combinedOutput = "";
let anyFailure = false;

for (const target of targets) {
const chunks = [];
const captureStream = new Writable({
write(chunk, _encoding, callback) {
chunks.push(chunk.toString());
callback();
},
});

const result = await runLint({ rootPath: target });
const reporter = new LintConsoleReporter({ verbose: true, stream: captureStream });
await reporter.report(result);

combinedOutput += chunks.join("") + "\n";
if (!result.passed) {
anyFailure = true;
}
}
Comment on lines +74 to 78
const checkedPlugins = await Promise.all(plugins.map(async (plugin) => {
const quality = await runExternalPluginQualityGates(plugin);
return {
name: plugin?.name ?? "unknown",
source: plugin?.source ?? {},
Comment on lines +39 to +40
- name: Install @microsoft/vally
run: npm install @microsoft/vally
Comment on lines +98 to +99
- name: Install @microsoft/vally
run: npm install @microsoft/vally
--skills ./skills \
--verbose \
2>&1 | tee sv-skills-output.txt
npx --yes @microsoft/vally-cli lint ./skills --verbose 2>&1 | tee vally-skills-output.txt
for skill_dir in "${SKILL_DIRS[@]}"; do
echo "### Linting ${skill_dir}" | tee -a vally-output.txt
set +e
OUTPUT=$(npx --yes @microsoft/vally-cli lint "$skill_dir" --verbose 2>&1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

workflow PR touches workflow automation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants