feat(discovery): frontmatter guard for flat agents/commands docs
A flat .md under agents/ or commands/ whose frontmatter contains none of the definition keys (name, description, mode, agent, model, argument-hint, temperature, permission) is documentation, not an item: discovery marks it Skipped with a recorded warning — it never enters a selection, inventory, availability listing or collision index, but the warning lands in the lockfile and add/update/select reports like other discovery warnings. Skills keep their folder+SKILL.md marker, MCP keeps the .yaml marker. README gains the canonical layout table and the migration note for folder-style agent repos. Closes beads: agent-lib-2n7
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
package e2e
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func docFixture(h *harness, t *testing.T) {
|
||||
t.Helper()
|
||||
h.write(t, "skills/good-skill/SKILL.md", "---\nname: Good Skill\ndescription: works\n---\n# Good\n")
|
||||
h.write(t, "agents/scout.md", "---\ndescription: a real agent\n---\nbody\n")
|
||||
h.write(t, "agents/SCHEMA.md", "# Schema\npure documentation, no frontmatter\n")
|
||||
h.write(t, "commands/review.md", "---\nargument-hint: [files]\n---\nbody\n")
|
||||
h.write(t, "commands/README.md", "Documentation for the commands directory.\n")
|
||||
h.commitUpstream(t, "fixture with documentation files")
|
||||
}
|
||||
|
||||
func TestVendorAddSkipsDocMarkdownWithWarning(t *testing.T) {
|
||||
h := newHarness(t)
|
||||
docFixture(h, t)
|
||||
|
||||
out := h.mustRun(t, "vendor", "add", "superpowers", h.upstreamDir)
|
||||
if !contains(out, "agents/SCHEMA.md: no agent frontmatter, skipped") {
|
||||
t.Errorf("add report must warn about skipped SCHEMA.md:\n%s", out)
|
||||
}
|
||||
if !contains(out, "commands/README.md: no command frontmatter, skipped") {
|
||||
t.Errorf("add report must warn about skipped README.md:\n%s", out)
|
||||
}
|
||||
|
||||
lock := readFile(t, filepath.Join(h.workDir, "agent-lib.lock.json"))
|
||||
if !contains(lock, "agents/SCHEMA.md: no agent frontmatter, skipped") {
|
||||
t.Errorf("lockfile warnings must record the skip:\n%s", lock)
|
||||
}
|
||||
for _, dir := range []string{"agents", "commands"} {
|
||||
entries, err := os.ReadDir(filepath.Join(h.workDir, "external", "superpowers", dir))
|
||||
if err != nil {
|
||||
t.Fatalf("external %s area must exist: %v", dir, err)
|
||||
}
|
||||
for _, e := range entries {
|
||||
name := e.Name()
|
||||
if (dir == "agents" && name == "SCHEMA.md") || (dir == "commands" && name == "README.md") {
|
||||
t.Errorf("documentation file %s/%s must not be materialized", dir, name)
|
||||
}
|
||||
}
|
||||
}
|
||||
if !contains(out, "1 agents") || !contains(out, "1 commands") {
|
||||
t.Errorf("counts must reflect real items only:\n%s", out)
|
||||
}
|
||||
h.mustRun(t, "validate")
|
||||
}
|
||||
|
||||
func TestVendorAddIncludeErrorOmitsSkippedDocs(t *testing.T) {
|
||||
h := newHarness(t)
|
||||
docFixture(h, t)
|
||||
|
||||
out, err := h.run(t, "vendor", "add", "superpowers", h.upstreamDir, "--include", "typo")
|
||||
if err == nil {
|
||||
t.Fatalf("include with typo must fail:\n%s", out)
|
||||
}
|
||||
if contains(out, "SCHEMA") || contains(out, "README") {
|
||||
t.Errorf("skipped documentation must not appear as available ids:\n%s", out)
|
||||
}
|
||||
for _, want := range []string{"scout", "review", "good-skill"} {
|
||||
if !contains(out, want) {
|
||||
t.Errorf("real ids must still be listed as available (missing %s):\n%s", want, out)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestVendorUpdateSelectKeepSkippingDocs(t *testing.T) {
|
||||
h := newHarness(t)
|
||||
docFixture(h, t)
|
||||
h.mustRun(t, "vendor", "add", "superpowers", h.upstreamDir, "--include", "scout,review")
|
||||
|
||||
out := h.mustRun(t, "vendor", "select", "superpowers", "--add", "good-skill")
|
||||
if contains(out, "SCHEMA") {
|
||||
t.Errorf("select report must not surface skipped docs:\n%s", out)
|
||||
}
|
||||
lock := readFile(t, filepath.Join(h.workDir, "agent-lib.lock.json"))
|
||||
if got := strings.Count(lock, "no agent frontmatter, skipped"); got != 1 {
|
||||
t.Errorf("warning must stay recorded exactly once in the lockfile, got %d", got)
|
||||
}
|
||||
h.mustRun(t, "validate")
|
||||
}
|
||||
Reference in New Issue
Block a user