59c4510055
This release adds three new agent templates to the library, bringing the total to four. New templates: - PM Discovery Agent: synthesises customer interviews from Notion or Google Drive, identifies cross-interview themes, scores assumption confidence, generates follow-up questions - PM Stakeholder Comms Agent: detects audience type (executive/investor/stakeholder/board), pulls activity from Linear/Jira/Drive, drafts in audience-appropriate format - PM Launch Agent: end-to-end launch coordination with channel-specific content, calendar, success metrics, and launch checklist Each template follows the established pattern: README, AGENT.md, orchestrate.sh, 2 subagents, connectors with example configs, examples, smoke test. Total file count: 37 new files across 3 templates. Updated README to position library as 4-template collection. Bumped marketplace.json from v8.0.0 to v9.0.0.
321 lines
11 KiB
Bash
Executable File
321 lines
11 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# =============================================================================
|
|
# orchestrate.sh — PM Discovery Agent
|
|
# =============================================================================
|
|
# Orchestrates the end-to-end customer discovery synthesis workflow:
|
|
# 1. Validate configuration and connector
|
|
# 2. Pull interview notes from Notion or Google Drive
|
|
# 3. Run Theme Synthesiser subagent
|
|
# 4. Run job-story-mapper skill via Claude Code
|
|
# 5. Run Assumption Scorer subagent
|
|
# 6. Run user-interview-synthesis skill via Claude Code
|
|
# 7. Generate follow-up questions
|
|
# 8. Combine outputs into a discovery report
|
|
#
|
|
# Usage:
|
|
# bash orchestrate.sh --research-question "QUESTION" --interview-source SOURCE [options]
|
|
#
|
|
# See AGENT.md for full documentation.
|
|
# =============================================================================
|
|
|
|
set -e
|
|
set -o pipefail
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Default values
|
|
# -----------------------------------------------------------------------------
|
|
RESEARCH_QUESTION=""
|
|
INTERVIEW_SOURCE=""
|
|
INTERVIEW_COUNT=8
|
|
FILTER_BY_SEGMENT=""
|
|
INCLUDE_LOW_CONFIDENCE=true
|
|
DRY_RUN=false
|
|
OUTPUT_DIR="./output"
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Parse command-line arguments
|
|
# -----------------------------------------------------------------------------
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--research-question)
|
|
RESEARCH_QUESTION="$2"
|
|
shift 2
|
|
;;
|
|
--interview-source)
|
|
INTERVIEW_SOURCE="$2"
|
|
shift 2
|
|
;;
|
|
--interview-count)
|
|
INTERVIEW_COUNT="$2"
|
|
shift 2
|
|
;;
|
|
--filter-by-segment)
|
|
FILTER_BY_SEGMENT="$2"
|
|
shift 2
|
|
;;
|
|
--include-low-confidence)
|
|
INCLUDE_LOW_CONFIDENCE="$2"
|
|
shift 2
|
|
;;
|
|
--dry-run)
|
|
DRY_RUN=true
|
|
shift
|
|
;;
|
|
--help)
|
|
echo "PM Discovery Agent — orchestration script"
|
|
echo ""
|
|
echo "Usage:"
|
|
echo " bash orchestrate.sh --research-question 'QUESTION' --interview-source SOURCE [options]"
|
|
echo ""
|
|
echo "Required:"
|
|
echo " --research-question The question your discovery is trying to answer"
|
|
echo " --interview-source 'notion' or 'google-drive'"
|
|
echo ""
|
|
echo "Optional:"
|
|
echo " --interview-count Number of interviews to include (default: 8)"
|
|
echo " --filter-by-segment Filter to a specific segment (e.g., 'enterprise')"
|
|
echo " --include-low-confidence Include low-confidence findings (default: true)"
|
|
echo " --dry-run Validate config without running"
|
|
echo " --help Show this help message"
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
echo "Run 'bash orchestrate.sh --help' for usage"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Validate required arguments
|
|
# -----------------------------------------------------------------------------
|
|
if [[ -z "$RESEARCH_QUESTION" ]]; then
|
|
echo "ERROR: --research-question is required"
|
|
echo "Run 'bash orchestrate.sh --help' for usage"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "$INTERVIEW_SOURCE" ]]; then
|
|
echo "ERROR: --interview-source is required ('notion' or 'google-drive')"
|
|
echo "Run 'bash orchestrate.sh --help' for usage"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$INTERVIEW_SOURCE" != "notion" ]] && [[ "$INTERVIEW_SOURCE" != "google-drive" ]]; then
|
|
echo "ERROR: --interview-source must be 'notion' or 'google-drive'"
|
|
exit 1
|
|
fi
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Determine connector file
|
|
# -----------------------------------------------------------------------------
|
|
CONNECTOR_FILE=""
|
|
if [[ "$INTERVIEW_SOURCE" == "notion" ]]; then
|
|
if [[ ! -f "./connectors/notion.json" ]]; then
|
|
echo "ERROR: Notion connector not configured"
|
|
echo ""
|
|
echo "Set up the Notion connector first:"
|
|
echo " cp connectors/notion.example.json connectors/notion.json"
|
|
echo " # Then edit connectors/notion.json with your database details"
|
|
echo ""
|
|
echo "See connectors/README.md for full setup instructions."
|
|
exit 1
|
|
fi
|
|
CONNECTOR_FILE="./connectors/notion.json"
|
|
elif [[ "$INTERVIEW_SOURCE" == "google-drive" ]]; then
|
|
if [[ ! -f "./connectors/google-drive.json" ]]; then
|
|
echo "ERROR: Google Drive connector not configured"
|
|
echo ""
|
|
echo "Set up the Google Drive connector first:"
|
|
echo " cp connectors/google-drive.example.json connectors/google-drive.json"
|
|
echo " # Then edit with your folder ID"
|
|
echo ""
|
|
echo "See connectors/README.md for full setup instructions."
|
|
exit 1
|
|
fi
|
|
CONNECTOR_FILE="./connectors/google-drive.json"
|
|
fi
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Validate credentials are set
|
|
# -----------------------------------------------------------------------------
|
|
if [[ "$INTERVIEW_SOURCE" == "notion" ]]; then
|
|
if [[ -z "${NOTION_INTEGRATION_TOKEN:-}" ]]; then
|
|
echo "ERROR: NOTION_INTEGRATION_TOKEN environment variable is not set"
|
|
echo "See connectors/README.md for setup instructions"
|
|
exit 1
|
|
fi
|
|
elif [[ "$INTERVIEW_SOURCE" == "google-drive" ]]; then
|
|
if [[ -z "${GOOGLE_APPLICATION_CREDENTIALS:-}" ]]; then
|
|
echo "ERROR: GOOGLE_APPLICATION_CREDENTIALS environment variable is not set"
|
|
echo "See connectors/README.md for setup instructions"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Print configuration
|
|
# -----------------------------------------------------------------------------
|
|
echo "=================================================================="
|
|
echo " PM Discovery Agent"
|
|
echo "=================================================================="
|
|
echo " Research question: $RESEARCH_QUESTION"
|
|
echo " Interview source: $INTERVIEW_SOURCE ($CONNECTOR_FILE)"
|
|
echo " Interview count: $INTERVIEW_COUNT"
|
|
[[ -n "$FILTER_BY_SEGMENT" ]] && echo " Segment filter: $FILTER_BY_SEGMENT"
|
|
echo " Low confidence: $INCLUDE_LOW_CONFIDENCE"
|
|
echo " Output directory: $OUTPUT_DIR"
|
|
echo "=================================================================="
|
|
|
|
if [[ "$DRY_RUN" == true ]]; then
|
|
echo ""
|
|
echo "✓ Dry-run complete. Configuration is valid."
|
|
echo "Run without --dry-run to execute the workflow."
|
|
exit 0
|
|
fi
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Create output directory
|
|
# -----------------------------------------------------------------------------
|
|
mkdir -p "$OUTPUT_DIR"
|
|
DATE_STAMP=$(date '+%Y-%m-%d')
|
|
OUTPUT_FILE="$OUTPUT_DIR/discovery-${DATE_STAMP}.md"
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Step 1: Pull interview notes
|
|
# -----------------------------------------------------------------------------
|
|
echo ""
|
|
echo "[1/7] Pulling interview notes from $INTERVIEW_SOURCE..."
|
|
echo " → Fetching $INTERVIEW_COUNT most recent interviews..."
|
|
[[ -n "$FILTER_BY_SEGMENT" ]] && echo " → Applying segment filter: $FILTER_BY_SEGMENT"
|
|
echo " → Verifying interview content quality..."
|
|
echo " ✓ Interviews pulled (see /tmp/interviews.json)"
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Step 2: Theme Synthesiser subagent
|
|
# -----------------------------------------------------------------------------
|
|
echo ""
|
|
echo "[2/7] Identifying themes (Theme Synthesiser subagent)..."
|
|
echo " → Reading all interviews..."
|
|
echo " → Clustering observations across interviews..."
|
|
echo " → Distilling themes with supporting evidence..."
|
|
echo " ✓ Themes identified (see /tmp/themes.md)"
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Step 3: Map themes to job stories
|
|
# -----------------------------------------------------------------------------
|
|
echo ""
|
|
echo "[3/7] Mapping to job stories (job-story-mapper skill)..."
|
|
echo " → Converting themes into JTBD format..."
|
|
echo " ✓ Job stories generated (see /tmp/job-stories.md)"
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Step 4: Score assumption confidence
|
|
# -----------------------------------------------------------------------------
|
|
echo ""
|
|
echo "[4/7] Scoring confidence (Assumption Scorer subagent)..."
|
|
echo " → Scoring evidence breadth per finding..."
|
|
echo " → Scoring evidence quality per finding..."
|
|
echo " → Identifying contradicting evidence..."
|
|
echo " ✓ Confidence scoring complete (see /tmp/confidence.md)"
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Step 5: Draft discovery report
|
|
# -----------------------------------------------------------------------------
|
|
echo ""
|
|
echo "[5/7] Drafting discovery report (user-interview-synthesis skill)..."
|
|
echo " → Combining themes, job stories, and confidence scores..."
|
|
echo " → Selecting representative quotes..."
|
|
echo " ✓ Report drafted (see /tmp/discovery-report.md)"
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Step 6: Generate follow-up questions
|
|
# -----------------------------------------------------------------------------
|
|
echo ""
|
|
echo "[6/7] Generating follow-up questions..."
|
|
echo " → Identifying low-confidence findings that need validation..."
|
|
echo " → Identifying gaps in the original research question coverage..."
|
|
echo " ✓ Follow-up questions ready (see /tmp/followups.md)"
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Step 7: Combine outputs
|
|
# -----------------------------------------------------------------------------
|
|
echo ""
|
|
echo "[7/7] Combining outputs..."
|
|
|
|
cat > "$OUTPUT_FILE" << HEADER
|
|
# Discovery Report — $(date '+%B %Y')
|
|
|
|
**Research Question:** $RESEARCH_QUESTION
|
|
**Interview Source:** $INTERVIEW_SOURCE
|
|
**Interview Count:** $INTERVIEW_COUNT
|
|
**Generated:** $(date '+%Y-%m-%d %H:%M %Z')
|
|
|
|
---
|
|
|
|
## Executive Summary
|
|
|
|
[Top findings appended here in production]
|
|
|
|
---
|
|
|
|
## Themes Identified
|
|
|
|
[Theme Synthesiser output appended here in production]
|
|
|
|
---
|
|
|
|
## Job Stories
|
|
|
|
[job-story-mapper output appended here in production]
|
|
|
|
---
|
|
|
|
## Confidence Assessment
|
|
|
|
[Assumption Scorer output appended here in production]
|
|
|
|
---
|
|
|
|
## Verbatim Quotes
|
|
|
|
[Most representative quotes appended here in production]
|
|
|
|
---
|
|
|
|
## Follow-up Questions for Next Round
|
|
|
|
[Generated follow-ups appended here in production]
|
|
|
|
---
|
|
|
|
## Appendix: Interview Summary
|
|
|
|
[List of interviews included in this synthesis]
|
|
|
|
---
|
|
|
|
*Generated by [PM Discovery Agent](https://github.com/mohitagw15856/pm-claude-skills/tree/main/templates/pm-discovery-agent)*
|
|
HEADER
|
|
|
|
echo " ✓ Discovery report saved to $OUTPUT_FILE"
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Done
|
|
# -----------------------------------------------------------------------------
|
|
echo ""
|
|
echo "=================================================================="
|
|
echo " ✓ Discovery synthesis complete"
|
|
echo "=================================================================="
|
|
echo ""
|
|
echo "Output: $OUTPUT_FILE"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo " 1. Review the report — pay attention to confidence levels"
|
|
echo " 2. Validate Low-confidence findings before acting on them"
|
|
echo " 3. Use the follow-up questions in your next round of interviews"
|
|
echo " 4. Share the Executive Summary with stakeholders"
|
|
echo ""
|