feat: v8.0.0 — first agent template (PM Sprint Agent) following Anthropic's agent template architecture
- Added templates/pm-sprint-agent/ directory with full agent template - AGENT.md system prompt with explicit step-by-step workflow - 2 subagents: capacity-analyst and risk-scorer - 2 connectors: linear and jira (with example configs) - Symlinked skills from main library: sprint-planning, sprint-brief - orchestrate.sh end-to-end workflow script - examples/ folder with input and output examples - tests/ folder with smoke test - Updated README to position skills as building blocks for agent templates - Added Anthropic agent templates announcement reference (May 5, 2026) - Bumped marketplace.json to v8.0.0 - Listed 7 candidate agent templates this library supports This is the first agent template in the library. More to follow.
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
# Connectors — Setup Guide
|
||||
|
||||
This folder contains the connector configurations for the PM Sprint Agent. Connectors provide governed access to your team's data sources — they are how the agent reaches Linear, Jira, Slack, and other systems without holding credentials in prompts.
|
||||
|
||||
## What's in this folder
|
||||
|
||||
- `linear.example.json` — Linear connector configuration template
|
||||
- `jira.example.json` — Jira connector configuration template (use this if your team uses Jira)
|
||||
- `slack.example.json` — Slack connector for posting summaries (coming soon)
|
||||
|
||||
## How to set up a connector
|
||||
|
||||
You only need to set up the connector for the ticketing system your team uses. Skip the others.
|
||||
|
||||
### Linear setup (5 minutes)
|
||||
|
||||
1. Generate a Linear API key:
|
||||
- Go to https://linear.app/settings/account/security
|
||||
- Click "Create Key"
|
||||
- Copy the key (starts with `lin_api_`)
|
||||
|
||||
2. Set the environment variable:
|
||||
```bash
|
||||
export LINEAR_API_KEY='lin_api_xxxxxxxxxxxxxxxxxxxxxxxx'
|
||||
```
|
||||
|
||||
To make this permanent, add the line to your `~/.zshrc` or `~/.bashrc`.
|
||||
|
||||
3. Find your team ID:
|
||||
```bash
|
||||
curl -H "Authorization: $LINEAR_API_KEY" \
|
||||
https://api.linear.app/graphql \
|
||||
-d '{"query": "{ teams { nodes { id name } } }"}'
|
||||
```
|
||||
|
||||
You'll get a JSON response with all your teams and their IDs.
|
||||
|
||||
4. Copy the example config and customise:
|
||||
```bash
|
||||
cp linear.example.json linear.json
|
||||
```
|
||||
|
||||
Edit `linear.json` and update:
|
||||
- `workspace_url` — your Linear workspace URL
|
||||
- `team_id` — the team ID from step 3
|
||||
|
||||
5. Test:
|
||||
```bash
|
||||
cd ../ # back to pm-sprint-agent root
|
||||
bash orchestrate.sh --dry-run --sprint-goal "test"
|
||||
```
|
||||
|
||||
### Jira setup (5 minutes)
|
||||
|
||||
1. Generate a Jira API token:
|
||||
- Go to https://id.atlassian.com/manage-profile/security/api-tokens
|
||||
- Click "Create API token"
|
||||
- Give it a label (e.g., "PM Sprint Agent")
|
||||
- Copy the token
|
||||
|
||||
2. Set environment variables:
|
||||
```bash
|
||||
export JIRA_EMAIL='you@yourcompany.com'
|
||||
export JIRA_API_TOKEN='ATATT3xFfGF0...'
|
||||
```
|
||||
|
||||
3. Find your project key and board ID:
|
||||
- **Project key**: visible in any issue URL (e.g., "PROJ" from `your-domain.atlassian.net/browse/PROJ-123`)
|
||||
- **Board ID**: navigate to your board, the URL contains `boards/{ID}` (e.g., 123)
|
||||
|
||||
4. Copy the example config and customise:
|
||||
```bash
|
||||
cp jira.example.json jira.json
|
||||
```
|
||||
|
||||
Edit `jira.json` and update:
|
||||
- `instance_url` — your Atlassian instance URL
|
||||
- `project_key` — your project key from step 3
|
||||
- `board_id` — your board ID from step 3
|
||||
|
||||
5. Test:
|
||||
```bash
|
||||
cd ../
|
||||
bash orchestrate.sh --dry-run --sprint-goal "test"
|
||||
```
|
||||
|
||||
## Building a connector for another system
|
||||
|
||||
If your team uses a ticketing system that's not in this folder (Shortcut, Asana, ClickUp, GitHub Issues), you can build a connector by following the same pattern.
|
||||
|
||||
A connector needs three things:
|
||||
|
||||
1. **A configuration file** (`{name}.json`) defining the data source URL, credentials, and available operations
|
||||
2. **An API client** that the orchestration script can call to fetch data
|
||||
3. **A mapping** from the source's data model to the standard fields the agent expects (issue ID, title, story points, status, assignee, dependencies)
|
||||
|
||||
The cleanest place to start is to copy `linear.example.json` or `jira.example.json` and modify it for your system.
|
||||
|
||||
If you build a connector for a new system, consider raising a PR back to the main pm-claude-skills repo so others can use it.
|
||||
|
||||
## Security notes
|
||||
|
||||
**Credentials live in environment variables, not in the JSON files.** The connector configs reference environment variable names, not the actual credentials. This means you can commit your `linear.json` or `jira.json` to source control without leaking credentials — but make sure your `LINEAR_API_KEY` or `JIRA_API_TOKEN` are stored securely (use a password manager or `.env` file with `.gitignore`).
|
||||
|
||||
**Rotate API keys periodically.** Both Linear and Jira allow you to revoke and regenerate API keys. Do this every 90 days as a security best practice.
|
||||
|
||||
**Use scoped permissions.** Where possible, generate API keys with only the permissions the agent needs (read-only access to issues, sprints, and team data — not write access).
|
||||
@@ -0,0 +1,73 @@
|
||||
{
|
||||
"connector_name": "jira",
|
||||
"version": "1.0.0",
|
||||
"description": "Jira connector for the PM Sprint Agent template. Provides governed access to issues, sprints, and boards.",
|
||||
|
||||
"configuration": {
|
||||
"instance_url": "https://your-domain.atlassian.net",
|
||||
"project_key": "PROJ",
|
||||
"board_id": 123,
|
||||
"default_jql_filter": "status in (\"To Do\", \"Open\", \"Backlog\") AND sprint is EMPTY",
|
||||
"include_subtasks": false,
|
||||
"rate_limit_requests_per_minute": 100
|
||||
},
|
||||
|
||||
"credentials": {
|
||||
"_comment": "Jira uses email + API token for authentication. Generate an API token at https://id.atlassian.com/manage-profile/security/api-tokens",
|
||||
"auth_email_env_var": "JIRA_EMAIL",
|
||||
"api_token_env_var": "JIRA_API_TOKEN",
|
||||
"auth_email_placeholder": "your-email@yourcompany.com",
|
||||
"api_token_placeholder": "ATATT3xFfGF0..."
|
||||
},
|
||||
|
||||
"available_operations": [
|
||||
{
|
||||
"name": "search_issues",
|
||||
"description": "Search for issues using JQL (Jira Query Language)",
|
||||
"default_jql": "project = PROJ AND status in (\"To Do\", \"Open\", \"Backlog\") AND sprint is EMPTY ORDER BY priority DESC, created DESC",
|
||||
"max_results": 200
|
||||
},
|
||||
{
|
||||
"name": "get_issue_details",
|
||||
"description": "Fetch detailed information about a specific issue",
|
||||
"required_input": "issue_key",
|
||||
"fields": ["summary", "description", "status", "priority", "assignee", "story_points", "labels", "components", "issuelinks"]
|
||||
},
|
||||
{
|
||||
"name": "get_sprint_velocity",
|
||||
"description": "Calculate average story points completed per sprint over the last N sprints",
|
||||
"default_lookback": 3
|
||||
},
|
||||
{
|
||||
"name": "list_sprints",
|
||||
"description": "Get past, current, and upcoming sprints for the configured board",
|
||||
"filters": ["state"]
|
||||
},
|
||||
{
|
||||
"name": "get_team_members",
|
||||
"description": "Get list of team members with their roles",
|
||||
"default_role_filter": "developer"
|
||||
}
|
||||
],
|
||||
|
||||
"permissions_required": [
|
||||
"Browse Projects",
|
||||
"View Issues",
|
||||
"View Sprints",
|
||||
"View Project Roles"
|
||||
],
|
||||
|
||||
"_setup_instructions": [
|
||||
"1. Generate a Jira API token at https://id.atlassian.com/manage-profile/security/api-tokens",
|
||||
"2. Set environment variables: export JIRA_EMAIL='you@company.com' && export JIRA_API_TOKEN='ATATT3xFfGF0...'",
|
||||
"3. Find your project key (visible in the URL when viewing a project, e.g., 'PROJ' from 'jira.com/browse/PROJ-123')",
|
||||
"4. Find your board ID: navigate to your board, look at the URL ('boards/123' = board ID 123)",
|
||||
"5. Update instance_url, project_key, and board_id in this file",
|
||||
"6. Save this file as 'jira.json' (without the .example)",
|
||||
"7. Test the connection: bash orchestrate.sh --dry-run --sprint-goal 'test'"
|
||||
],
|
||||
|
||||
"_jql_notes": "The default JQL filter pulls items in the project's backlog that aren't already assigned to a sprint. Customise the JQL if your team uses different statuses, custom fields, or specific epic filters.",
|
||||
|
||||
"_rate_limit_notes": "Jira Cloud's REST API is rate limited per-account. Standard rate is 100 requests per minute. The agent uses approximately 10-15 API calls per sprint plan."
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"connector_name": "linear",
|
||||
"version": "1.0.0",
|
||||
"description": "Linear connector for the PM Sprint Agent template. Provides governed access to issues, projects, and cycles.",
|
||||
|
||||
"configuration": {
|
||||
"workspace_url": "https://linear.app/your-workspace-name",
|
||||
"team_id": "TEAM_ID_HERE",
|
||||
"default_project_filter": "active",
|
||||
"default_state_filter": ["backlog", "ready"],
|
||||
"include_archived": false,
|
||||
"rate_limit_requests_per_minute": 60
|
||||
},
|
||||
|
||||
"credentials": {
|
||||
"_comment": "Replace these with your actual Linear API credentials. Generate a personal API key at https://linear.app/settings/account/security",
|
||||
"api_key_env_var": "LINEAR_API_KEY",
|
||||
"api_key_placeholder": "lin_api_xxxxxxxxxxxxxxxxxxxxxxxx"
|
||||
},
|
||||
|
||||
"available_operations": [
|
||||
{
|
||||
"name": "list_open_issues",
|
||||
"description": "Get all open issues in the team's backlog and ready states",
|
||||
"filters": ["team_id", "state", "label", "priority", "assignee", "project"],
|
||||
"max_results": 200
|
||||
},
|
||||
{
|
||||
"name": "get_issue_details",
|
||||
"description": "Fetch detailed information about a specific issue including comments, dependencies, and history",
|
||||
"required_input": "issue_id"
|
||||
},
|
||||
{
|
||||
"name": "get_team_velocity",
|
||||
"description": "Calculate average story points completed per cycle over the last N cycles",
|
||||
"default_lookback": 3
|
||||
},
|
||||
{
|
||||
"name": "get_team_capacity_calendar",
|
||||
"description": "Read team PTO and out-of-office calendar entries",
|
||||
"lookback_days": 14
|
||||
},
|
||||
{
|
||||
"name": "list_cycles",
|
||||
"description": "Get past, current, and upcoming cycles for the team",
|
||||
"filters": ["status"]
|
||||
}
|
||||
],
|
||||
|
||||
"permissions_required": [
|
||||
"issues:read",
|
||||
"teams:read",
|
||||
"cycles:read",
|
||||
"users:read"
|
||||
],
|
||||
|
||||
"_setup_instructions": [
|
||||
"1. Generate a Linear API key at https://linear.app/settings/account/security (workspace admin scope is sufficient)",
|
||||
"2. Set the LINEAR_API_KEY environment variable: export LINEAR_API_KEY='lin_api_xxxxx...'",
|
||||
"3. Find your team ID by running: curl -H 'Authorization: $LINEAR_API_KEY' https://api.linear.app/graphql -d '{\"query\": \"{ teams { nodes { id name } } }\"}'",
|
||||
"4. Update workspace_url and team_id in this file",
|
||||
"5. Save this file as 'linear.json' (without the .example)",
|
||||
"6. Test the connection: bash orchestrate.sh --dry-run --sprint-goal 'test'"
|
||||
],
|
||||
|
||||
"_rate_limit_notes": "Linear's API is rate limited to 60 requests per minute for personal API keys. The agent uses approximately 8-12 API calls per sprint plan, so rate limits are unlikely to be hit unless running multiple plans in parallel."
|
||||
}
|
||||
Reference in New Issue
Block a user