AI workflow automation from Teams and PRs to Jira.
Headless Project Management is an open-source automation layer that converts meeting communication into Jira artifacts and keeps Jira updated with actual delivery data from pull requests.
- Current stage: Alpha
- Primary focus: end-to-end automation reliability for Teams -> Jira and PR -> Jira enrichment
- Python baseline: 3.11+
- Reduce manual effort of translating meeting notes into Jira artifacts.
- Extract epics, stories, tasks, and bugs from Microsoft Teams transcripts using AI.
- Amend Jira issues from GitHub pull request activity so issues reflect delivered work.
- For developers: spend less time rewriting meeting and PR context into Jira, and more time building.
- For managers: turn conversations into trackable execution faster, with more reliable status visibility.
- For teams: create a clear chain from discussion -> implementation -> delivery without manual follow-up.
This repository currently contains the Phase 1 foundation:
- Monorepo-oriented project structure with
apps/andpackages/ - FastAPI service scaffold
- Transcript normalization logic
- Structured extraction contract and pipeline
- Jira client abstraction
- Initial tests and quality tooling configuration
apps/
api/
packages/
domain/
extraction/
ingestion/
integrations/
tests/
docs/
- Contributing guide:
CONTRIBUTING.md - Code of conduct:
CODE_OF_CONDUCT.md - Security policy:
SECURITY.md - Support guide:
SUPPORT.md
For release hygiene and publication checks, see docs/open-source-release-checklist.md.
- Create and activate a virtual environment.
- Install dependencies:
pip install -e .[dev]- Run tests:
pytest- Start API:
uvicorn apps.api.main:app --reload- Configure AI extraction (optional but recommended):
- Set
OPENAI_API_KEYin.env. - Optionally override
OPENAI_MODELandEXTRACTION_CONFIDENCE_THRESHOLD.
When the API key is configured, extraction uses OpenAI with strict JSON-schema output validation. If provider calls fail, the service falls back to a local heuristic extractor and marks low-confidence items for human review.
5.1 Configure Microsoft Teams polling integration (Phase 2):
- Set
MS_TENANT_ID,MS_CLIENT_ID, andMS_CLIENT_SECRET. - Grant Microsoft Graph app permissions required to read Teams channel messages.
Teams polling endpoint:
POST /transcripts/teams/pollwithteam_id,channel_id, and optionalmax_results.- The API normalizes each returned message and includes a deterministic
source_hashfor downstream idempotency.
Teams meeting transcript endpoint:
POST /transcripts/teams/meeting-transcriptwithuser_id,meeting_id, and optionaltranscript_id.- Fetches transcript artifacts from Microsoft Graph online meeting transcript endpoints.
- Uses
v1.0first, then falls back tobetafor tenants where transcript APIs are not available onv1.0. - Normalizes transcript content and returns a deterministic
source_hash.
One-call meeting transcript publish endpoint:
POST /transcripts/teams/meeting-transcript/publishwithuser_id,meeting_id, and optionaltranscript_id.- Executes transcript fetch -> extraction -> Jira publish in a single request.
- Returns transcript record, extraction payload, and created/reused Jira keys.
- Configure Jira publish integration:
- Set
JIRA_BASE_URL,JIRA_EMAIL,JIRA_API_TOKEN, andJIRA_PROJECT_KEY. - Optionally override issue type names with
JIRA_ISSUE_TYPE_EPIC,JIRA_ISSUE_TYPE_STORY,JIRA_ISSUE_TYPE_TASK, andJIRA_ISSUE_TYPE_BUG.
Jira publish uses authenticated Jira Cloud REST API calls and applies idempotency using source-hash labels (hpm-source-<full-hash>). Replays of the same transcript artifact try to reuse existing issues instead of creating duplicates.
Phase 1.2 behavior details:
- Auth: Jira Cloud API token auth via
JIRA_EMAIL+JIRA_API_TOKEN. - Issue type mapping: configurable with
JIRA_ISSUE_TYPE_EPIC/STORY/TASK/BUG. - Idempotency: each issue is tagged with a deterministic source label and item label derived from source hash + artifact type + title.
- Submit a transcript payload to
/transcripts/submit. - Preview extracted items through
/transcripts/extract. - Publish selected extraction to Jira through
/jira/publish.
- Poll Teams channel messages through
/transcripts/teams/poll. - Receive normalized records with source hashes.
- Feed selected records to extraction and Jira publish flows.
- Call
/transcripts/teams/meeting-transcriptwith organizeruser_idandmeeting_id. - Receive normalized transcript record with source hash.
- Feed transcript text into extraction and Jira publish flows.
- Configure
MS_DISCOVERY_USER_IDSwith comma-separated organizer/user IDs. - Trigger
POST /transcripts/teams/discovery/runto discover recent meetings and queue candidates. - Trigger
POST /transcripts/teams/discovery/process-nextrepeatedly (or from a worker loop) to process queued meetings end-to-end. - Each processing step fetches transcript, extracts Jira artifacts, and publishes to Jira without manual
meeting_idinput.
Discovery state is persisted in SQLite using MEETING_DISCOVERY_DB_PATH, with retry/backoff controls via MEETING_DISCOVERY_MAX_RETRIES and MEETING_DISCOVERY_BACKOFF_MINUTES.
- Configure
GITHUB_WEBHOOK_SECRETand set webhook URL to/github/webhooks/pull-request. - Configure
GITHUB_DRY_RUN_MODE=trueto test without Jira mutations. - Webhook signature is validated using
X-Hub-Signature-256before processing. - PR payload is parsed, Jira keys are extracted from title/body, and comment-only enrichment is applied.
- Delivery IDs are tracked in a SQLite idempotency store to avoid duplicate amendments.
After setting required variables in a local .env, run:
python scripts/run_e2e_publish.pyThe script runs transcript submission, extraction, and Jira publish in one flow and prints created or reused Jira keys.
Phase 1.3 demo details:
- Uses transcript fixtures under
fixtures/transcripts/. - Uses Jira sandbox project by default via
JIRA_SANDBOX_PROJECT_KEYwhen set. - Falls back to
JIRA_PROJECT_KEYwhen sandbox key is not provided.
Examples:
python scripts/run_e2e_publish.py
python scripts/run_e2e_publish.py --fixture fixtures/transcripts/bug_triage_001.txt
python scripts/run_e2e_publish.py --meeting-id demo-meeting-042 --project-key HPM-SBXApache-2.0