9f5a407773
- Add bundle/agents/researcher.md with full YAML frontmatter:
- meta.name: researcher
- meta.description with WHY/WHEN/WHAT/HOW pattern and 4 delegation examples
(hybrid cars near Woodinville, project management tools, Seattle-Tokyo flights,
mechanical keyboards for programming)
- model_role: [research, general]
- Body sections: Browser Control with 11-command playwright-cli table, Snapshot
Refs subsection, Best Practices, A2UI @mention, Artifacts @mention, Inline Visuals
@mention to visual-artifacts.md with proactive visual generation guidance, and
6-step Research Workflow (Understand → Plan → Browse/Extract → Present →
Generate Artifacts → Iterate)
- Add tests/test_researcher_agent.sh with 53 checks covering all spec requirements
Co-authored-by: Amplifier <amplifier@microsoft.com>
160 lines
5.8 KiB
Bash
Executable File
160 lines
5.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# test_researcher_agent.sh - Verify bundle/agents/researcher.md meets spec (task-3)
|
|
# RED: Run before file is created (should fail)
|
|
# GREEN: Run after file is created (should pass)
|
|
|
|
REPO=/home/ken/workspace/research-workbench
|
|
AGENT_FILE="$REPO/bundle/agents/researcher.md"
|
|
PASS=0
|
|
FAIL=0
|
|
|
|
check_file_exists() {
|
|
if [ -f "$AGENT_FILE" ]; then
|
|
echo "PASS: 'bundle/agents/researcher.md' exists"
|
|
((PASS++))
|
|
else
|
|
echo "FAIL: 'bundle/agents/researcher.md' should exist but is missing"
|
|
((FAIL++))
|
|
fi
|
|
}
|
|
|
|
check_contains() {
|
|
local description="$1"
|
|
local pattern="$2"
|
|
if grep -qF -- "$pattern" "$AGENT_FILE" 2>/dev/null; then
|
|
echo "PASS: researcher.md contains '$description'"
|
|
((PASS++))
|
|
else
|
|
echo "FAIL: researcher.md is missing '$description'"
|
|
((FAIL++))
|
|
fi
|
|
}
|
|
|
|
check_regex() {
|
|
local description="$1"
|
|
local pattern="$2"
|
|
if grep -qE "$pattern" "$AGENT_FILE" 2>/dev/null; then
|
|
echo "PASS: researcher.md matches '$description'"
|
|
((PASS++))
|
|
else
|
|
echo "FAIL: researcher.md is missing '$description'"
|
|
((FAIL++))
|
|
fi
|
|
}
|
|
|
|
echo "=== Checking file exists ==="
|
|
check_file_exists
|
|
|
|
echo ""
|
|
echo "=== Checking YAML frontmatter: meta.name ==="
|
|
check_contains "meta.name: researcher" "name: researcher"
|
|
|
|
echo ""
|
|
echo "=== Checking YAML frontmatter: model_role includes research ==="
|
|
check_contains "model_role includes research" "research"
|
|
check_regex "model_role list format" "model_role:.*\[.*\]|model_role:"
|
|
|
|
echo ""
|
|
echo "=== Checking YAML frontmatter: model_role includes general ==="
|
|
check_contains "model_role includes general" "general"
|
|
|
|
echo ""
|
|
echo "=== Checking meta.description WHY/WHEN/WHAT/HOW pattern ==="
|
|
# The description must have delegation examples
|
|
check_contains "WHY/WHEN delegation example structure" "<example>"
|
|
check_contains "delegation example closing tag" "</example>"
|
|
|
|
echo ""
|
|
echo "=== Checking delegation examples (4 required) ==="
|
|
check_contains "hybrid cars under \$10K example" "hybrid cars"
|
|
check_contains "Woodinville WA location" "Woodinville"
|
|
check_contains "project management tools example" "project management"
|
|
check_contains "Seattle to Tokyo flights example" "Tokyo"
|
|
check_contains "flights under \$800 example" "800"
|
|
check_contains "mechanical keyboards example" "mechanical keyboard"
|
|
check_contains "programming keyboards example" "programming"
|
|
|
|
echo ""
|
|
echo "=== Checking body: intro paragraph ==="
|
|
check_contains "research assistant intro" "research assistant"
|
|
check_regex "live web browser mention" "live.*browser|browser.*live|web browser"
|
|
|
|
echo ""
|
|
echo "=== Checking body: Browser Control section ==="
|
|
check_contains "Browser Control section header" "Browser Control"
|
|
check_contains "playwright-cli section" "playwright-cli"
|
|
check_contains "-s=research persistent session" "-s=research"
|
|
|
|
echo ""
|
|
echo "=== Checking playwright-cli command table (11 actions) ==="
|
|
# Action 1: Open a URL
|
|
check_contains "open URL command" "playwright-cli -s=research open https://example.com"
|
|
# Action 2: Take a snapshot
|
|
check_contains "snapshot command" "playwright-cli -s=research snapshot"
|
|
# Action 3: Compact snapshot
|
|
check_contains "compact snapshot command" "playwright-cli -s=research snapshot -ic"
|
|
# Action 4: Click an element
|
|
check_contains "click command" "playwright-cli -s=research click @e5"
|
|
# Action 5: Type text
|
|
check_contains "type command" 'playwright-cli -s=research type @e3'
|
|
# Action 6: Press a key
|
|
check_contains "press key command" "playwright-cli -s=research press Enter"
|
|
# Action 7: Scroll down
|
|
check_contains "scroll command" "playwright-cli -s=research scroll down"
|
|
# Action 8: Go back
|
|
check_contains "back command" "playwright-cli -s=research back"
|
|
# Action 9: New tab
|
|
check_contains "new tab command" "playwright-cli -s=research open https://other-site.com"
|
|
# Action 10: List tabs
|
|
check_contains "list tabs command" "playwright-cli -s=research tabs"
|
|
# Action 11: Switch tab
|
|
check_contains "switch tab command" "playwright-cli -s=research tab 2"
|
|
|
|
echo ""
|
|
echo "=== Checking body: Snapshot Refs subsection ==="
|
|
check_contains "Snapshot Refs section" "Snapshot Refs"
|
|
check_contains "@e1 ref example" "@e1"
|
|
check_contains "@e2 ref example" "@e2"
|
|
check_regex "snapshot after navigation guidance" "snapshot after|after.*navigation|navigate.*snapshot"
|
|
|
|
echo ""
|
|
echo "=== Checking body: Best Practices subsection ==="
|
|
check_contains "Best Practices section" "Best Practices"
|
|
check_contains "compact snapshot after open/click" "compact snapshot"
|
|
check_contains "refs change after navigation" "refs change"
|
|
check_regex "open new sites in new tabs" "new.*tab|tab.*new"
|
|
check_regex "user can take over via VNC" "VNC|vnc"
|
|
|
|
echo ""
|
|
echo "=== Checking body: A2UI section ==="
|
|
check_contains "A2UI section header" "A2UI"
|
|
check_contains "a2ui-format.md @mention" "bundle/context/a2ui-format.md"
|
|
|
|
echo ""
|
|
echo "=== Checking body: Artifacts section ==="
|
|
check_contains "Artifacts section header" "Artifacts"
|
|
check_contains "artifact-conventions.md @mention" "bundle/context/artifact-conventions.md"
|
|
|
|
echo ""
|
|
echo "=== Checking body: Inline Visuals section ==="
|
|
check_contains "Inline Visuals section header" "Inline Visuals"
|
|
check_contains "visual-artifacts.md @mention" "bundle/context/visual-artifacts.md"
|
|
check_regex "proactive visual generation mention" "proactive|visual.*generation|comparison.*table|chart"
|
|
|
|
echo ""
|
|
echo "=== Checking body: Research Workflow section ==="
|
|
check_contains "Research Workflow section header" "Research Workflow"
|
|
check_regex "Understand request step" "[Uu]nderstand"
|
|
check_regex "Plan step" "[Pp]lan"
|
|
check_regex "Browse/extract step" "[Bb]rowse|[Ee]xtract"
|
|
check_regex "Present step" "[Pp]resent"
|
|
check_regex "Generate artifacts step" "[Gg]enerate.*artifact|[Aa]rtifact.*generat"
|
|
check_regex "Iterate step" "[Ii]terat"
|
|
|
|
echo ""
|
|
echo "=============================="
|
|
echo "Results: $PASS passed, $FAIL failed"
|
|
echo "=============================="
|
|
|
|
[ $FAIL -eq 0 ] && exit 0 || exit 1
|