Lightning fast ADR drafting for busy teams.
Project description
Hekmo (ܚܟܡܬܐ / חָכְמָה / حكمة)
Syriac for "wisdom" (ḥekmtā) sharing its root with Hebrew (chokmah) and Arabic (hikma).
Lightning fast ADR drafting for busy teams.
This tool takes a GitHub issue thread with arguments, the back-and-forth, the eventual consensus and distills it into a clean Architecture Decision Record (ADR), so the reasoning behind a decision doesn't get lost in a comment thread nobody wants to re-read.
Example
Requirements
- Python 3.12+
- A GitHub PAT (personal access token)
- A DeepSeek API key
Quick start
pip install hekmo
Set two environment variables (see Configuration):
export GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxxxxxxxxxxx
export DEEPSEEK_API_KEY=sk-xxxxxxxxxxxx
Then run:
hekmo
Configuration
hekmo needs two credentials, set as environment variables:
| Variable | Purpose |
|---|---|
GITHUB_PERSONAL_ACCESS_TOKEN |
Reads issue/comment data via the GitHub GraphQL API |
DEEPSEEK_API_KEY |
Powers ADR generation |
Templates
hekmo supports multiple ADR formats out of the box, selectable at runtime:
- default — a comprehensive general-purpose format.
- Nygard — the original, lightweight ADR format.
- MADR — Markdown Architecture Decision Records, with explicit decision drivers and pros/cons of considered options.
- Alexandrian — a narrative-style format.
- Tyree-Akerman — a detailed format capturing assumptions, constraints, positions, and related artifacts
- Y-Statement — a compact, single-paragraph decision format.
(see hekmo/utils/templates.json for the full section breakdown of each format)
Best Practices and Architecture
flowchart LR
A[GitHub Issue Thread] -->|GraphQL, paginated| B[Fetch Comments]
B --> C[Format as Markdown]
C --> D[LLM: DeepSeek V4 Pro]
E[System Prompt<br/>Traceability Rules] --> D
D --> F[Generated ADR]
F --> G[adr-<issue_no>.md]
Garbage in, garbage out
hekmo extracts and structures what's actually written in a thread it doesn't infer intent that isn't there. The quality of the ADR is a direct function of the quality of the discussion:
- Threads with a clear proposal, real pushback, and a stated resolution produce strong ADRs.
- Threads that are mostly status updates, "+1"s, or tangents give the model little to work with the output will be thin or generic.
- If you're planning to generate an ADR from an issue, state the final decision and reasoning explicitly in a closing comment, rather than leaving the conclusion implied.
Traceability by design
hekmo's system prompt is built around one rule: every sentence in the generated ADR should be traceable back to something actually said in the thread. This is deliberate it keeps output trustworthy rather than a plausible-sounding hallucination, at the cost of not papering over a genuinely thin discussion with invented rationale.
Model support
hekmo currently uses DeepSeek V4 Pro exclusively for ADR generation. Your DEEPSEEK_API_KEY must have access to this model other DeepSeek models and other providers are not yet supported. As with any LLM-backed tool, hekmo is subject to the context window limits of the underlying model currently.
Where your ADR is saved
hekmo saves the generated ADR as adr-<issue_number>.md in the directory you're currently in when you run the command. It does not clone or touch any local git repo it only talks to GitHub's API.
If a file with that name already exists in your current directory, it will be silently overwritten. Run hekmo from a directory dedicated to your ADRs (or move the generated file immediately) if you want to avoid this.
If you're adopting this on a team, highest-leverage improvement today is raising the quality of the input itself:
- Better threads produce more factually grounded ADRs with less hallucination.
- Better threads mean less manual cleanup on every ADR, not just one.
- Encourage contributors to write detailed, decision-oriented comments, and treat thread quality as part of the process, not an afterthought.
The ADR is only ever as good as the conversation that produced it.
Motivation
Most engineering decisions don't happen in a design doc. They happen in a GitHub issue: someone proposes something, three people push back, someone finds a tradeoff nobody considered, and twenty comments later there's a decision buried in a thread that will never be read again.
This isn't just anecdotal. A 2023 mining-software-repositories study of ADR usage across open-source GitHub projects (Buchgeher et al., IEEE Access) found that ADR adoption remains low overall, and that roughly half of repositories that do adopt the practice contain only one to five ADRs total, a pattern the authors read as teams trying ADRs and then not sustaining them. The study also found that where ADRs do stick, it's a deliberate, sustained team effort over time, not a one-off habit.
Separately, an exploratory study on LLM-generated ADRs (Dhar et al., 2024) found that even the strongest models (GPT-4) can produce design decisions in the correct ADR format, but consistently fall short of comprehensively capturing the decision meaning LLMs are a genuinely useful drafting aid, not an autonomous replacement for human judgment. That study also worked from pre-cleaned, single-paragraph decision context, not the messier reality of a live 50-comment GitHub thread the harder, noisier input hekmo is actually built to handle. Follow-up work by the same group (Dhar et al., 2025) addressed this gap with retrieval-augmented fine-tuning, and a more recent study (Context Matters, 2026) showed that providing a project's prior architectural decisions as context substantially improves generation quality.
Conclusion: the practice of writing ADRs is dying from friction, not from lack of value, and LLMs can meaningfully lower that friction but only as a first draft a human reviews, not a replacement for their judgment. hekmo is built around both of these findings: it exists to make drafting cheap enough that it actually happens, and its "traceability by design" system prompt (see Best Practices and Architecture) is a direct response to the second finding every sentence must trace back to the thread, specifically so the output is a reviewable draft rather than a plausible-sounding hallucination.
License
Eclipse Public License - 2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hekmo-0.1.0.tar.gz.
File metadata
- Download URL: hekmo-0.1.0.tar.gz
- Upload date:
- Size: 4.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
303b77b24bc438216a8d454aa4ca845eaf145203b4f919eca7d13f0240d20372
|
|
| MD5 |
8fa258b6f96bd2fd9596c75298eef0b3
|
|
| BLAKE2b-256 |
b485e3fa2a084147f0fd5e52fc750391c337487c5eb198444d25435fb9d275bf
|
File details
Details for the file hekmo-0.1.0-py3-none-any.whl.
File metadata
- Download URL: hekmo-0.1.0-py3-none-any.whl
- Upload date:
- Size: 23.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9bef347e739fbccb4312fd254936e155d90e0b514ab03464203b80e13ae6b542
|
|
| MD5 |
a55b35c7a08553e3c9ea4fb5f4eb6276
|
|
| BLAKE2b-256 |
2225b4fda989aade7274df837b7381f5bf6b46ee98b59476aae70fd3ff111902
|