feat(ansible): steward:category + steward:confirm playbook metadata
Extend the playbook metadata convention with a namespaced `# steward:<key>:` comment block: - steward:category — free-text grouping label, shown as a badge in the browse list and on the run form. - steward:confirm — true/yes/1/on marks a playbook destructive; the run form then requires a confirmation tick (required checkbox in the shared vars fragment) before it can launch. sources.discover_playbook_meta() parses description + category + confirm (first match per key; `# description:` still primary, `# steward:description:` alias). discover_playbook_description() now delegates to it. The browse list reads per-playbook meta to show category badges + descriptions; the run-form and playbook-vars fragments render the badge + confirm gate. Bundled playbooks tagged: docker_prune → category maintenance + confirm true; provision/install/update → category host-agent. Docs: docs/reference/playbook-authoring.md updated (keys now implemented) and a quick reference added next to the code at steward/ansible/PLAYBOOK_CONVENTIONS.md. Tests added for category/confirm/alias parsing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@ import json
|
||||
from steward.ansible.executor import build_extra_vars_file
|
||||
from steward.ansible.sources import (
|
||||
discover_playbook_description,
|
||||
discover_playbook_meta,
|
||||
discover_playbook_variables,
|
||||
)
|
||||
|
||||
@@ -137,3 +138,31 @@ def test_description_falls_back_to_play_name():
|
||||
def test_description_empty_when_neither_present():
|
||||
assert discover_playbook_description("- hosts: all\n tasks: []\n") == ""
|
||||
assert discover_playbook_description("not: : valid") == ""
|
||||
|
||||
|
||||
# ── steward:category / steward:confirm metadata ───────────────────────────────
|
||||
|
||||
def test_meta_category_and_confirm():
|
||||
content = """---
|
||||
# description: Prune docker.
|
||||
# steward:category: maintenance
|
||||
# steward:confirm: true
|
||||
- hosts: all
|
||||
tasks: []
|
||||
"""
|
||||
meta = discover_playbook_meta(content)
|
||||
assert meta["description"] == "Prune docker."
|
||||
assert meta["category"] == "maintenance"
|
||||
assert meta["confirm"] is True
|
||||
|
||||
|
||||
def test_meta_confirm_falsey_and_absent():
|
||||
assert discover_playbook_meta("# steward:confirm: false\n- hosts: all")["confirm"] is False
|
||||
assert discover_playbook_meta("- hosts: all\n name: x")["confirm"] is False
|
||||
assert discover_playbook_meta("- hosts: all\n name: x")["category"] == ""
|
||||
|
||||
|
||||
def test_meta_steward_description_alias():
|
||||
# `# steward:description:` works when there's no plain `# description:`.
|
||||
meta = discover_playbook_meta("# steward:description: via namespace\n- hosts: all")
|
||||
assert meta["description"] == "via namespace"
|
||||
|
||||
Reference in New Issue
Block a user