ktw 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ktw-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,185 @@
1
+ Metadata-Version: 2.4
2
+ Name: ktw
3
+ Version: 0.1.0
4
+ Summary: Name reservation for Keep the Why, the agent skill and repo-native convention that preserves the reasoning behind a codebase. Not a Python library - install the skill via your agent's skill tooling; the pip-installable linter is keep-the-why-lint.
5
+ Home-page: https://keepthewhy.com
6
+ Author: Oliver Zehentleitner
7
+ License: MIT
8
+ Project-URL: Homepage, https://keepthewhy.com
9
+ Project-URL: Documentation, https://keepthewhy.com/installation/
10
+ Project-URL: Linter (keep-the-why-lint), https://pypi.org/project/keep-the-why-lint/
11
+ Project-URL: Linting docs, https://keepthewhy.com/linting/
12
+ Project-URL: Repository, https://github.com/oliver-zehentleitner/keep-the-why
13
+ Project-URL: Source (skill), https://github.com/oliver-zehentleitner/keep-the-why/tree/latest/skills/keep-the-why
14
+ Project-URL: Changelog, https://github.com/oliver-zehentleitner/keep-the-why/blob/main/CHANGELOG.md
15
+ Project-URL: Issues, https://github.com/oliver-zehentleitner/keep-the-why/issues
16
+ Project-URL: Security, https://github.com/oliver-zehentleitner/keep-the-why/blob/main/SECURITY.md
17
+ Project-URL: Evals, https://keepthewhy.com/evals/
18
+ Project-URL: llms.txt, https://keepthewhy.com/llms.txt
19
+ Project-URL: Author, https://about.me/oliver-zehentleitner/
20
+ Project-URL: Telegram, https://t.me/unicorndevs
21
+ Project-URL: X, https://x.com/keep_the_why
22
+ Project-URL: Bluesky, https://bsky.app/profile/keep-the-why.bsky.social
23
+ Project-URL: Mastodon, https://mastodon.social/@keep_the_why
24
+ Keywords: keep-the-why,documentation,decision-records,adr,architecture-decision-records,rationale,context-engineering,agent-skills,ai-agents,claude-code,codex,opencode,markdown,knowledge-transfer,legacy-code
25
+ Classifier: Development Status :: 1 - Planning
26
+ Classifier: Environment :: Console
27
+ Classifier: Intended Audience :: Developers
28
+ Classifier: Intended Audience :: Information Technology
29
+ Classifier: Natural Language :: English
30
+ Classifier: Operating System :: OS Independent
31
+ Classifier: Programming Language :: Python :: 3
32
+ Classifier: Programming Language :: Python :: 3.10
33
+ Classifier: Programming Language :: Python :: 3.11
34
+ Classifier: Programming Language :: Python :: 3.12
35
+ Classifier: Programming Language :: Python :: 3.13
36
+ Classifier: Programming Language :: Python :: 3.14
37
+ Classifier: Topic :: Documentation
38
+ Classifier: Topic :: Software Development :: Documentation
39
+ Classifier: Topic :: Text Processing :: Markup :: Markdown
40
+ Requires-Python: >=3.10.0
41
+ Description-Content-Type: text/markdown
42
+ Dynamic: author
43
+ Dynamic: classifier
44
+ Dynamic: description
45
+ Dynamic: description-content-type
46
+ Dynamic: home-page
47
+ Dynamic: keywords
48
+ Dynamic: license
49
+ Dynamic: project-url
50
+ Dynamic: requires-python
51
+ Dynamic: summary
52
+
53
+ [![PyPI](https://img.shields.io/pypi/v/keep-the-why.svg?label=pypi)](https://pypi.org/project/keep-the-why/)
54
+ [![GitHub Release](https://img.shields.io/github/release/oliver-zehentleitner/keep-the-why.svg?label=github)](https://github.com/oliver-zehentleitner/keep-the-why/releases)
55
+ [![License](https://img.shields.io/github/license/oliver-zehentleitner/keep-the-why.svg?color=blue)](https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/LICENSE)
56
+ [![Security: SkillsLLM](https://skillsllm.com/security-check/badge.svg?owner=oliver-zehentleitner&repo=keep-the-why)](https://skillsllm.com/security-check/IPmNycVdbOyq)
57
+ [![Validate Skill](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/validate-skill.yml/badge.svg)](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/validate-skill.yml)
58
+ [![keep-the-why-lint (package)](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/lint-package.yml/badge.svg)](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/lint-package.yml)
59
+ [![Read the Docs](https://img.shields.io/badge/read-%20docs-yellow)](https://keepthewhy.com/)
60
+ [![Telegram](https://img.shields.io/badge/community-telegram-41ab8c)](https://t.me/unicorndevs)
61
+ [![X](https://img.shields.io/badge/x-%40keep__the__why-000000?logo=x)](https://x.com/keep_the_why)
62
+ [![Bluesky](https://img.shields.io/badge/bluesky-%40keep--the--why-0285FF?logo=bluesky&logoColor=white)](https://bsky.app/profile/keep-the-why.bsky.social)
63
+ [![Mastodon](https://img.shields.io/badge/mastodon-%40keep__the__why-6364FF?logo=mastodon&logoColor=white)](https://mastodon.social/@keep_the_why)
64
+ [![Keep the Why](https://keepthewhy.com/assets/badge.svg)](https://keepthewhy.com)
65
+
66
+ <a href="https://keepthewhy.com"><img src="https://keepthewhy.com/assets/logo.png" alt="Keep the Why — because &quot;ask Bob&quot; is not documentation."></a>
67
+
68
+ # Keep the Why
69
+
70
+ Keep a Changelog records what changed. Keep the Why preserves why it changed.
71
+
72
+ > **Looking for the linter?** The CI linter for Keep the Why projects is published under a different name:
73
+ > **[keep-the-why-lint](https://pypi.org/project/keep-the-why-lint/)** — `pip install keep-the-why-lint`, command `ktw-lint`.
74
+ >
75
+ > **This package (`keep-the-why`) is a name reservation.** Keep the Why itself is an agent skill and a Markdown convention, not a Python library — there's nothing to `import`. It ships as a `SKILL.md` package and installs through your agent's skill tooling (see [Install](#install) below), so this distribution intentionally contains no runtime code. It exists so the name on PyPI points at the real project instead of at nothing.
76
+
77
+ **Keep the Why** is a repo-native convention and agent skill for preserving the reasoning behind a codebase — architecture decisions, rejected alternatives, workarounds, incident learnings, operational constraints that the code alone can't explain. It captures that reasoning as a byproduct of working with your agent — so it stops re-suggesting rejected approaches, gives better answers, speeds up onboarding, and makes legacy projects tractable again. It works continuously as you develop, or retrospectively on an existing repo.
78
+
79
+ **The payoff, made concrete:** a new hire, or an AI agent that's never touched the codebase before, doesn't have to track down whoever wrote the original code — and doesn't just repeat what was already tried and rejected. No more guessing whether an odd piece of code is a [Chesterton's Fence](https://en.wikipedia.org/wiki/Wikipedia:Chesterton%27s_fence) worth keeping or just cruft nobody got around to removing. "Ask Bob" stops being the fallback.
80
+
81
+ **Tested with:** Claude Code, opencode, Pi, and more, with different models — see the [agent & model matrix](https://keepthewhy.com/agent-matrix/) for what's actually been run against what, and how.
82
+
83
+ Website: [https://keepthewhy.com](https://keepthewhy.com/) · [llms.txt](https://keepthewhy.com/llms.txt) for AI agents/assistants looking up this project
84
+
85
+ Documentation: [Installation](https://keepthewhy.com/installation/) · [Setup](https://keepthewhy.com/setup/) · [Repository structure](https://keepthewhy.com/repository-structure/) · [Linting](https://keepthewhy.com/linting/) · [Evals](https://keepthewhy.com/evals/) · [Philosophy](https://keepthewhy.com/philosophy/)
86
+
87
+ ## How it works
88
+
89
+ Keep the Why's agent skill is `SKILL.md`-based — an open, cross-agent format (Claude Code, Codex CLI, Gemini CLI, Cursor, and others). It operates in four modes:
90
+
91
+ 1. **Continuous capture** — during normal development, the agent notices rationale worth keeping and records it alongside the code as it happens.
92
+ 2. **Retrospective recovery** — pointed at an existing or legacy repository, the agent reconstructs what it can from git history, issues, and code, and is explicit about what it couldn't.
93
+ 3. **Knowledge-transfer interview** — before a maintainer's knowledge becomes unavailable, the agent analyzes the codebase first, then asks targeted questions about exactly what the code couldn't explain — or just listens while they narrate freely and extracts the rationale from that.
94
+ 4. **Maintenance** — existing rationale docs get kept current: contradictions resolved, superseded entries marked, oversized files split.
95
+
96
+ The captured knowledge lives in `context/` as versioned Markdown, organized by topic. Every entry carries a **Status** (`active` | `superseded` | `open` | `needs-review`) and an **Evidence** level (`confirmed` | `inferred` | `unknown`) — so the next reader knows how far to trust it — plus the rejected alternative and the reason the chosen path won. Because it's just Markdown in the repo, a `context/` update ships in the same commit or PR as the code change it explains — reviewed the same way, versioned the same way, no separate system to trust or keep in sync.
97
+
98
+ The skill's behavior is exercised by a suite of eval cases, executed for real — a fixture project per case, a fresh agent session, LLM-judged verdicts: [Evals](https://keepthewhy.com/evals/).
99
+
100
+ ## Install
101
+
102
+ Not with `pip` — the skill installs into your agent, not into a Python environment. `main` is active development; pin to `latest` (moved automatically by CI to the newest release) or an exact [tag](https://github.com/oliver-zehentleitner/keep-the-why/releases).
103
+
104
+ **Recommended — [skills CLI](https://skills.sh/)** (via `npx`, needs [Node.js](https://nodejs.org/en/download)):
105
+
106
+ ```bash
107
+ npx skills add https://github.com/oliver-zehentleitner/keep-the-why/tree/latest/skills/keep-the-why
108
+ ```
109
+
110
+ **Also — [GitHub CLI](https://cli.github.com/)** (`gh` v2.90.0+):
111
+
112
+ ```bash
113
+ gh skill install oliver-zehentleitner/keep-the-why keep-the-why@latest
114
+ ```
115
+
116
+ Both prompt for which agent (Claude Code, Codex, OpenCode, and 70+ more) and which scope (project or personal). Start a new session afterward, then tell your agent something like "initialize Keep the Why in this project" — a short one-time setup creates a `.keep-the-why` file at the project root, and later sessions pick the project back up on their own.
117
+
118
+ Every other install method — asm, Claude Code plugin, manual clone, per-agent directory paths, tools without a skill runtime at all: [Installation](https://keepthewhy.com/installation/).
119
+
120
+ ## The linter — this one *is* `pip install`
121
+
122
+ The structural half of the `context/` format is CI-checkable. **[keep-the-why-lint](https://pypi.org/project/keep-the-why-lint/)** validates required fields, value sets, index consistency, and `.keep-the-why` integrity — schema-version-aware, so unmigrated projects don't fail on structure their version never defined. Content (whether the rationale is *true*) stays a human judgment; the linter doesn't pretend otherwise.
123
+
124
+ ```bash
125
+ pip install keep-the-why-lint
126
+ ktw-lint .
127
+ ```
128
+
129
+ One line in GitHub Actions (`uses: oliver-zehentleitner/keep-the-why@lint-latest`), a job in GitLab CI, or a pre-commit hook — see [Linting](https://keepthewhy.com/linting/) and [CI linting setup](https://keepthewhy.com/ci-linting/). Python 3.10–3.14, no dependencies beyond the standard library.
130
+
131
+ ## Example
132
+
133
+ ```text
134
+ You: We're changing the retry mechanism because the previous
135
+ implementation caused duplicate orders. Make sure future
136
+ maintainers understand this.
137
+ ```
138
+
139
+ Keep the Why updates the relevant topic file in `context/` (or creates one if none exists), records the reason, and marks the old approach as superseded — without you having to ask for documentation separately.
140
+
141
+ Weeks later, a new maintainer — human or agent — can just ask:
142
+
143
+ ```text
144
+ You: Why does the retry mechanism track state instead of just retrying?
145
+ ```
146
+
147
+ and get the real answer instead of reverse-engineering it from the diff. See [`examples/`](https://github.com/oliver-zehentleitner/keep-the-why/tree/latest/skills/keep-the-why/examples) for continuous, retrospective, and interview-mode walkthroughs — including the case where a change gets *abandoned* and nothing would otherwise have recorded why.
148
+
149
+ ## The problem
150
+
151
+ Important project knowledge gets created in conversation — with a teammate, or with an AI coding agent — and then evaporates once the conversation ends. The code shows *what* was built. It rarely shows *why*. Missing reasoning costs you in four concrete ways:
152
+
153
+ - **Re-debate** — the same architecture question gets re-litigated because nobody remembers it was already settled.
154
+ - **Silent regression** — someone "cleans up" a workaround that looks unnecessary, not knowing it's the fix for a bug that then comes back.
155
+ - **Onboarding stall** — new contributors (human or AI) don't touch code they don't understand, so progress slows out of caution.
156
+ - **Repeated agent mistakes** — a fresh AI session, with no memory of the last one, proposes or re-implements something already tried and rejected, because nothing on disk records that it was.
157
+
158
+ ## What this is not
159
+
160
+ - Not a Python library. Nothing to import — this distribution is a name reservation; the skill and the linter are the real artifacts.
161
+ - Not a guarantee, and not magic. It lowers the friction of keeping rationale honest enough to make that practical to sustain; it doesn't replace the discipline.
162
+ - Not a replacement for tests. Tests tell you what broke; this tells you why it was built that way.
163
+ - Not session memory, and not an activity log of what an agent did — it's the reasoning behind the project, not a transcript.
164
+ - Not project management or an orchestration framework. It has one job: preserve the why.
165
+
166
+ ## Why I built this
167
+
168
+ See [Why I built this](https://keepthewhy.com/why/) — Oliver Zehentleitner on noticing this pattern while working with agents day to day, [blog](https://blog.technopathy.club), [GitHub](https://github.com/oliver-zehentleitner). For why it's built the way it is — no database, no daemon, no dashboard, deliberately — see [Philosophy](https://keepthewhy.com/philosophy/).
169
+
170
+ ## Feedback
171
+
172
+ Something not working as described, docs that confused you, or the skill's actual behavior not matching what it claims? [Open an issue](https://github.com/oliver-zehentleitner/keep-the-why/issues/new/choose) — that's exactly what it's for.
173
+
174
+ ## Contributing
175
+
176
+ See [CONTRIBUTING.md](https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/CONTRIBUTING.md), the [Changelog](https://github.com/oliver-zehentleitner/keep-the-why/blob/main/CHANGELOG.md), and the [Security policy](https://github.com/oliver-zehentleitner/keep-the-why/blob/main/SECURITY.md).
177
+
178
+ ## Contributors
179
+ [![Contributors](https://contributors-img.web.app/image?repo=oliver-zehentleitner/keep-the-why)](https://github.com/oliver-zehentleitner/keep-the-why/graphs/contributors)
180
+
181
+ We ♥️ open source!
182
+
183
+ ## License
184
+
185
+ [MIT](https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/LICENSE)
ktw-0.1.0/README.md ADDED
@@ -0,0 +1,133 @@
1
+ [![PyPI](https://img.shields.io/pypi/v/keep-the-why.svg?label=pypi)](https://pypi.org/project/keep-the-why/)
2
+ [![GitHub Release](https://img.shields.io/github/release/oliver-zehentleitner/keep-the-why.svg?label=github)](https://github.com/oliver-zehentleitner/keep-the-why/releases)
3
+ [![License](https://img.shields.io/github/license/oliver-zehentleitner/keep-the-why.svg?color=blue)](https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/LICENSE)
4
+ [![Security: SkillsLLM](https://skillsllm.com/security-check/badge.svg?owner=oliver-zehentleitner&repo=keep-the-why)](https://skillsllm.com/security-check/IPmNycVdbOyq)
5
+ [![Validate Skill](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/validate-skill.yml/badge.svg)](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/validate-skill.yml)
6
+ [![keep-the-why-lint (package)](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/lint-package.yml/badge.svg)](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/lint-package.yml)
7
+ [![Read the Docs](https://img.shields.io/badge/read-%20docs-yellow)](https://keepthewhy.com/)
8
+ [![Telegram](https://img.shields.io/badge/community-telegram-41ab8c)](https://t.me/unicorndevs)
9
+ [![X](https://img.shields.io/badge/x-%40keep__the__why-000000?logo=x)](https://x.com/keep_the_why)
10
+ [![Bluesky](https://img.shields.io/badge/bluesky-%40keep--the--why-0285FF?logo=bluesky&logoColor=white)](https://bsky.app/profile/keep-the-why.bsky.social)
11
+ [![Mastodon](https://img.shields.io/badge/mastodon-%40keep__the__why-6364FF?logo=mastodon&logoColor=white)](https://mastodon.social/@keep_the_why)
12
+ [![Keep the Why](https://keepthewhy.com/assets/badge.svg)](https://keepthewhy.com)
13
+
14
+ <a href="https://keepthewhy.com"><img src="https://keepthewhy.com/assets/logo.png" alt="Keep the Why — because &quot;ask Bob&quot; is not documentation."></a>
15
+
16
+ # Keep the Why
17
+
18
+ Keep a Changelog records what changed. Keep the Why preserves why it changed.
19
+
20
+ > **Looking for the linter?** The CI linter for Keep the Why projects is published under a different name:
21
+ > **[keep-the-why-lint](https://pypi.org/project/keep-the-why-lint/)** — `pip install keep-the-why-lint`, command `ktw-lint`.
22
+ >
23
+ > **This package (`keep-the-why`) is a name reservation.** Keep the Why itself is an agent skill and a Markdown convention, not a Python library — there's nothing to `import`. It ships as a `SKILL.md` package and installs through your agent's skill tooling (see [Install](#install) below), so this distribution intentionally contains no runtime code. It exists so the name on PyPI points at the real project instead of at nothing.
24
+
25
+ **Keep the Why** is a repo-native convention and agent skill for preserving the reasoning behind a codebase — architecture decisions, rejected alternatives, workarounds, incident learnings, operational constraints that the code alone can't explain. It captures that reasoning as a byproduct of working with your agent — so it stops re-suggesting rejected approaches, gives better answers, speeds up onboarding, and makes legacy projects tractable again. It works continuously as you develop, or retrospectively on an existing repo.
26
+
27
+ **The payoff, made concrete:** a new hire, or an AI agent that's never touched the codebase before, doesn't have to track down whoever wrote the original code — and doesn't just repeat what was already tried and rejected. No more guessing whether an odd piece of code is a [Chesterton's Fence](https://en.wikipedia.org/wiki/Wikipedia:Chesterton%27s_fence) worth keeping or just cruft nobody got around to removing. "Ask Bob" stops being the fallback.
28
+
29
+ **Tested with:** Claude Code, opencode, Pi, and more, with different models — see the [agent & model matrix](https://keepthewhy.com/agent-matrix/) for what's actually been run against what, and how.
30
+
31
+ Website: [https://keepthewhy.com](https://keepthewhy.com/) · [llms.txt](https://keepthewhy.com/llms.txt) for AI agents/assistants looking up this project
32
+
33
+ Documentation: [Installation](https://keepthewhy.com/installation/) · [Setup](https://keepthewhy.com/setup/) · [Repository structure](https://keepthewhy.com/repository-structure/) · [Linting](https://keepthewhy.com/linting/) · [Evals](https://keepthewhy.com/evals/) · [Philosophy](https://keepthewhy.com/philosophy/)
34
+
35
+ ## How it works
36
+
37
+ Keep the Why's agent skill is `SKILL.md`-based — an open, cross-agent format (Claude Code, Codex CLI, Gemini CLI, Cursor, and others). It operates in four modes:
38
+
39
+ 1. **Continuous capture** — during normal development, the agent notices rationale worth keeping and records it alongside the code as it happens.
40
+ 2. **Retrospective recovery** — pointed at an existing or legacy repository, the agent reconstructs what it can from git history, issues, and code, and is explicit about what it couldn't.
41
+ 3. **Knowledge-transfer interview** — before a maintainer's knowledge becomes unavailable, the agent analyzes the codebase first, then asks targeted questions about exactly what the code couldn't explain — or just listens while they narrate freely and extracts the rationale from that.
42
+ 4. **Maintenance** — existing rationale docs get kept current: contradictions resolved, superseded entries marked, oversized files split.
43
+
44
+ The captured knowledge lives in `context/` as versioned Markdown, organized by topic. Every entry carries a **Status** (`active` | `superseded` | `open` | `needs-review`) and an **Evidence** level (`confirmed` | `inferred` | `unknown`) — so the next reader knows how far to trust it — plus the rejected alternative and the reason the chosen path won. Because it's just Markdown in the repo, a `context/` update ships in the same commit or PR as the code change it explains — reviewed the same way, versioned the same way, no separate system to trust or keep in sync.
45
+
46
+ The skill's behavior is exercised by a suite of eval cases, executed for real — a fixture project per case, a fresh agent session, LLM-judged verdicts: [Evals](https://keepthewhy.com/evals/).
47
+
48
+ ## Install
49
+
50
+ Not with `pip` — the skill installs into your agent, not into a Python environment. `main` is active development; pin to `latest` (moved automatically by CI to the newest release) or an exact [tag](https://github.com/oliver-zehentleitner/keep-the-why/releases).
51
+
52
+ **Recommended — [skills CLI](https://skills.sh/)** (via `npx`, needs [Node.js](https://nodejs.org/en/download)):
53
+
54
+ ```bash
55
+ npx skills add https://github.com/oliver-zehentleitner/keep-the-why/tree/latest/skills/keep-the-why
56
+ ```
57
+
58
+ **Also — [GitHub CLI](https://cli.github.com/)** (`gh` v2.90.0+):
59
+
60
+ ```bash
61
+ gh skill install oliver-zehentleitner/keep-the-why keep-the-why@latest
62
+ ```
63
+
64
+ Both prompt for which agent (Claude Code, Codex, OpenCode, and 70+ more) and which scope (project or personal). Start a new session afterward, then tell your agent something like "initialize Keep the Why in this project" — a short one-time setup creates a `.keep-the-why` file at the project root, and later sessions pick the project back up on their own.
65
+
66
+ Every other install method — asm, Claude Code plugin, manual clone, per-agent directory paths, tools without a skill runtime at all: [Installation](https://keepthewhy.com/installation/).
67
+
68
+ ## The linter — this one *is* `pip install`
69
+
70
+ The structural half of the `context/` format is CI-checkable. **[keep-the-why-lint](https://pypi.org/project/keep-the-why-lint/)** validates required fields, value sets, index consistency, and `.keep-the-why` integrity — schema-version-aware, so unmigrated projects don't fail on structure their version never defined. Content (whether the rationale is *true*) stays a human judgment; the linter doesn't pretend otherwise.
71
+
72
+ ```bash
73
+ pip install keep-the-why-lint
74
+ ktw-lint .
75
+ ```
76
+
77
+ One line in GitHub Actions (`uses: oliver-zehentleitner/keep-the-why@lint-latest`), a job in GitLab CI, or a pre-commit hook — see [Linting](https://keepthewhy.com/linting/) and [CI linting setup](https://keepthewhy.com/ci-linting/). Python 3.10–3.14, no dependencies beyond the standard library.
78
+
79
+ ## Example
80
+
81
+ ```text
82
+ You: We're changing the retry mechanism because the previous
83
+ implementation caused duplicate orders. Make sure future
84
+ maintainers understand this.
85
+ ```
86
+
87
+ Keep the Why updates the relevant topic file in `context/` (or creates one if none exists), records the reason, and marks the old approach as superseded — without you having to ask for documentation separately.
88
+
89
+ Weeks later, a new maintainer — human or agent — can just ask:
90
+
91
+ ```text
92
+ You: Why does the retry mechanism track state instead of just retrying?
93
+ ```
94
+
95
+ and get the real answer instead of reverse-engineering it from the diff. See [`examples/`](https://github.com/oliver-zehentleitner/keep-the-why/tree/latest/skills/keep-the-why/examples) for continuous, retrospective, and interview-mode walkthroughs — including the case where a change gets *abandoned* and nothing would otherwise have recorded why.
96
+
97
+ ## The problem
98
+
99
+ Important project knowledge gets created in conversation — with a teammate, or with an AI coding agent — and then evaporates once the conversation ends. The code shows *what* was built. It rarely shows *why*. Missing reasoning costs you in four concrete ways:
100
+
101
+ - **Re-debate** — the same architecture question gets re-litigated because nobody remembers it was already settled.
102
+ - **Silent regression** — someone "cleans up" a workaround that looks unnecessary, not knowing it's the fix for a bug that then comes back.
103
+ - **Onboarding stall** — new contributors (human or AI) don't touch code they don't understand, so progress slows out of caution.
104
+ - **Repeated agent mistakes** — a fresh AI session, with no memory of the last one, proposes or re-implements something already tried and rejected, because nothing on disk records that it was.
105
+
106
+ ## What this is not
107
+
108
+ - Not a Python library. Nothing to import — this distribution is a name reservation; the skill and the linter are the real artifacts.
109
+ - Not a guarantee, and not magic. It lowers the friction of keeping rationale honest enough to make that practical to sustain; it doesn't replace the discipline.
110
+ - Not a replacement for tests. Tests tell you what broke; this tells you why it was built that way.
111
+ - Not session memory, and not an activity log of what an agent did — it's the reasoning behind the project, not a transcript.
112
+ - Not project management or an orchestration framework. It has one job: preserve the why.
113
+
114
+ ## Why I built this
115
+
116
+ See [Why I built this](https://keepthewhy.com/why/) — Oliver Zehentleitner on noticing this pattern while working with agents day to day, [blog](https://blog.technopathy.club), [GitHub](https://github.com/oliver-zehentleitner). For why it's built the way it is — no database, no daemon, no dashboard, deliberately — see [Philosophy](https://keepthewhy.com/philosophy/).
117
+
118
+ ## Feedback
119
+
120
+ Something not working as described, docs that confused you, or the skill's actual behavior not matching what it claims? [Open an issue](https://github.com/oliver-zehentleitner/keep-the-why/issues/new/choose) — that's exactly what it's for.
121
+
122
+ ## Contributing
123
+
124
+ See [CONTRIBUTING.md](https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/CONTRIBUTING.md), the [Changelog](https://github.com/oliver-zehentleitner/keep-the-why/blob/main/CHANGELOG.md), and the [Security policy](https://github.com/oliver-zehentleitner/keep-the-why/blob/main/SECURITY.md).
125
+
126
+ ## Contributors
127
+ [![Contributors](https://contributors-img.web.app/image?repo=oliver-zehentleitner/keep-the-why)](https://github.com/oliver-zehentleitner/keep-the-why/graphs/contributors)
128
+
129
+ We ♥️ open source!
130
+
131
+ ## License
132
+
133
+ [MIT](https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/LICENSE)
@@ -0,0 +1 @@
1
+ from dummy.package import Dummy
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ class Dummy(object):
5
+ def __init__(self):
6
+ print(f"Not ready!")
@@ -0,0 +1,185 @@
1
+ Metadata-Version: 2.4
2
+ Name: ktw
3
+ Version: 0.1.0
4
+ Summary: Name reservation for Keep the Why, the agent skill and repo-native convention that preserves the reasoning behind a codebase. Not a Python library - install the skill via your agent's skill tooling; the pip-installable linter is keep-the-why-lint.
5
+ Home-page: https://keepthewhy.com
6
+ Author: Oliver Zehentleitner
7
+ License: MIT
8
+ Project-URL: Homepage, https://keepthewhy.com
9
+ Project-URL: Documentation, https://keepthewhy.com/installation/
10
+ Project-URL: Linter (keep-the-why-lint), https://pypi.org/project/keep-the-why-lint/
11
+ Project-URL: Linting docs, https://keepthewhy.com/linting/
12
+ Project-URL: Repository, https://github.com/oliver-zehentleitner/keep-the-why
13
+ Project-URL: Source (skill), https://github.com/oliver-zehentleitner/keep-the-why/tree/latest/skills/keep-the-why
14
+ Project-URL: Changelog, https://github.com/oliver-zehentleitner/keep-the-why/blob/main/CHANGELOG.md
15
+ Project-URL: Issues, https://github.com/oliver-zehentleitner/keep-the-why/issues
16
+ Project-URL: Security, https://github.com/oliver-zehentleitner/keep-the-why/blob/main/SECURITY.md
17
+ Project-URL: Evals, https://keepthewhy.com/evals/
18
+ Project-URL: llms.txt, https://keepthewhy.com/llms.txt
19
+ Project-URL: Author, https://about.me/oliver-zehentleitner/
20
+ Project-URL: Telegram, https://t.me/unicorndevs
21
+ Project-URL: X, https://x.com/keep_the_why
22
+ Project-URL: Bluesky, https://bsky.app/profile/keep-the-why.bsky.social
23
+ Project-URL: Mastodon, https://mastodon.social/@keep_the_why
24
+ Keywords: keep-the-why,documentation,decision-records,adr,architecture-decision-records,rationale,context-engineering,agent-skills,ai-agents,claude-code,codex,opencode,markdown,knowledge-transfer,legacy-code
25
+ Classifier: Development Status :: 1 - Planning
26
+ Classifier: Environment :: Console
27
+ Classifier: Intended Audience :: Developers
28
+ Classifier: Intended Audience :: Information Technology
29
+ Classifier: Natural Language :: English
30
+ Classifier: Operating System :: OS Independent
31
+ Classifier: Programming Language :: Python :: 3
32
+ Classifier: Programming Language :: Python :: 3.10
33
+ Classifier: Programming Language :: Python :: 3.11
34
+ Classifier: Programming Language :: Python :: 3.12
35
+ Classifier: Programming Language :: Python :: 3.13
36
+ Classifier: Programming Language :: Python :: 3.14
37
+ Classifier: Topic :: Documentation
38
+ Classifier: Topic :: Software Development :: Documentation
39
+ Classifier: Topic :: Text Processing :: Markup :: Markdown
40
+ Requires-Python: >=3.10.0
41
+ Description-Content-Type: text/markdown
42
+ Dynamic: author
43
+ Dynamic: classifier
44
+ Dynamic: description
45
+ Dynamic: description-content-type
46
+ Dynamic: home-page
47
+ Dynamic: keywords
48
+ Dynamic: license
49
+ Dynamic: project-url
50
+ Dynamic: requires-python
51
+ Dynamic: summary
52
+
53
+ [![PyPI](https://img.shields.io/pypi/v/keep-the-why.svg?label=pypi)](https://pypi.org/project/keep-the-why/)
54
+ [![GitHub Release](https://img.shields.io/github/release/oliver-zehentleitner/keep-the-why.svg?label=github)](https://github.com/oliver-zehentleitner/keep-the-why/releases)
55
+ [![License](https://img.shields.io/github/license/oliver-zehentleitner/keep-the-why.svg?color=blue)](https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/LICENSE)
56
+ [![Security: SkillsLLM](https://skillsllm.com/security-check/badge.svg?owner=oliver-zehentleitner&repo=keep-the-why)](https://skillsllm.com/security-check/IPmNycVdbOyq)
57
+ [![Validate Skill](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/validate-skill.yml/badge.svg)](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/validate-skill.yml)
58
+ [![keep-the-why-lint (package)](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/lint-package.yml/badge.svg)](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/lint-package.yml)
59
+ [![Read the Docs](https://img.shields.io/badge/read-%20docs-yellow)](https://keepthewhy.com/)
60
+ [![Telegram](https://img.shields.io/badge/community-telegram-41ab8c)](https://t.me/unicorndevs)
61
+ [![X](https://img.shields.io/badge/x-%40keep__the__why-000000?logo=x)](https://x.com/keep_the_why)
62
+ [![Bluesky](https://img.shields.io/badge/bluesky-%40keep--the--why-0285FF?logo=bluesky&logoColor=white)](https://bsky.app/profile/keep-the-why.bsky.social)
63
+ [![Mastodon](https://img.shields.io/badge/mastodon-%40keep__the__why-6364FF?logo=mastodon&logoColor=white)](https://mastodon.social/@keep_the_why)
64
+ [![Keep the Why](https://keepthewhy.com/assets/badge.svg)](https://keepthewhy.com)
65
+
66
+ <a href="https://keepthewhy.com"><img src="https://keepthewhy.com/assets/logo.png" alt="Keep the Why — because &quot;ask Bob&quot; is not documentation."></a>
67
+
68
+ # Keep the Why
69
+
70
+ Keep a Changelog records what changed. Keep the Why preserves why it changed.
71
+
72
+ > **Looking for the linter?** The CI linter for Keep the Why projects is published under a different name:
73
+ > **[keep-the-why-lint](https://pypi.org/project/keep-the-why-lint/)** — `pip install keep-the-why-lint`, command `ktw-lint`.
74
+ >
75
+ > **This package (`keep-the-why`) is a name reservation.** Keep the Why itself is an agent skill and a Markdown convention, not a Python library — there's nothing to `import`. It ships as a `SKILL.md` package and installs through your agent's skill tooling (see [Install](#install) below), so this distribution intentionally contains no runtime code. It exists so the name on PyPI points at the real project instead of at nothing.
76
+
77
+ **Keep the Why** is a repo-native convention and agent skill for preserving the reasoning behind a codebase — architecture decisions, rejected alternatives, workarounds, incident learnings, operational constraints that the code alone can't explain. It captures that reasoning as a byproduct of working with your agent — so it stops re-suggesting rejected approaches, gives better answers, speeds up onboarding, and makes legacy projects tractable again. It works continuously as you develop, or retrospectively on an existing repo.
78
+
79
+ **The payoff, made concrete:** a new hire, or an AI agent that's never touched the codebase before, doesn't have to track down whoever wrote the original code — and doesn't just repeat what was already tried and rejected. No more guessing whether an odd piece of code is a [Chesterton's Fence](https://en.wikipedia.org/wiki/Wikipedia:Chesterton%27s_fence) worth keeping or just cruft nobody got around to removing. "Ask Bob" stops being the fallback.
80
+
81
+ **Tested with:** Claude Code, opencode, Pi, and more, with different models — see the [agent & model matrix](https://keepthewhy.com/agent-matrix/) for what's actually been run against what, and how.
82
+
83
+ Website: [https://keepthewhy.com](https://keepthewhy.com/) · [llms.txt](https://keepthewhy.com/llms.txt) for AI agents/assistants looking up this project
84
+
85
+ Documentation: [Installation](https://keepthewhy.com/installation/) · [Setup](https://keepthewhy.com/setup/) · [Repository structure](https://keepthewhy.com/repository-structure/) · [Linting](https://keepthewhy.com/linting/) · [Evals](https://keepthewhy.com/evals/) · [Philosophy](https://keepthewhy.com/philosophy/)
86
+
87
+ ## How it works
88
+
89
+ Keep the Why's agent skill is `SKILL.md`-based — an open, cross-agent format (Claude Code, Codex CLI, Gemini CLI, Cursor, and others). It operates in four modes:
90
+
91
+ 1. **Continuous capture** — during normal development, the agent notices rationale worth keeping and records it alongside the code as it happens.
92
+ 2. **Retrospective recovery** — pointed at an existing or legacy repository, the agent reconstructs what it can from git history, issues, and code, and is explicit about what it couldn't.
93
+ 3. **Knowledge-transfer interview** — before a maintainer's knowledge becomes unavailable, the agent analyzes the codebase first, then asks targeted questions about exactly what the code couldn't explain — or just listens while they narrate freely and extracts the rationale from that.
94
+ 4. **Maintenance** — existing rationale docs get kept current: contradictions resolved, superseded entries marked, oversized files split.
95
+
96
+ The captured knowledge lives in `context/` as versioned Markdown, organized by topic. Every entry carries a **Status** (`active` | `superseded` | `open` | `needs-review`) and an **Evidence** level (`confirmed` | `inferred` | `unknown`) — so the next reader knows how far to trust it — plus the rejected alternative and the reason the chosen path won. Because it's just Markdown in the repo, a `context/` update ships in the same commit or PR as the code change it explains — reviewed the same way, versioned the same way, no separate system to trust or keep in sync.
97
+
98
+ The skill's behavior is exercised by a suite of eval cases, executed for real — a fixture project per case, a fresh agent session, LLM-judged verdicts: [Evals](https://keepthewhy.com/evals/).
99
+
100
+ ## Install
101
+
102
+ Not with `pip` — the skill installs into your agent, not into a Python environment. `main` is active development; pin to `latest` (moved automatically by CI to the newest release) or an exact [tag](https://github.com/oliver-zehentleitner/keep-the-why/releases).
103
+
104
+ **Recommended — [skills CLI](https://skills.sh/)** (via `npx`, needs [Node.js](https://nodejs.org/en/download)):
105
+
106
+ ```bash
107
+ npx skills add https://github.com/oliver-zehentleitner/keep-the-why/tree/latest/skills/keep-the-why
108
+ ```
109
+
110
+ **Also — [GitHub CLI](https://cli.github.com/)** (`gh` v2.90.0+):
111
+
112
+ ```bash
113
+ gh skill install oliver-zehentleitner/keep-the-why keep-the-why@latest
114
+ ```
115
+
116
+ Both prompt for which agent (Claude Code, Codex, OpenCode, and 70+ more) and which scope (project or personal). Start a new session afterward, then tell your agent something like "initialize Keep the Why in this project" — a short one-time setup creates a `.keep-the-why` file at the project root, and later sessions pick the project back up on their own.
117
+
118
+ Every other install method — asm, Claude Code plugin, manual clone, per-agent directory paths, tools without a skill runtime at all: [Installation](https://keepthewhy.com/installation/).
119
+
120
+ ## The linter — this one *is* `pip install`
121
+
122
+ The structural half of the `context/` format is CI-checkable. **[keep-the-why-lint](https://pypi.org/project/keep-the-why-lint/)** validates required fields, value sets, index consistency, and `.keep-the-why` integrity — schema-version-aware, so unmigrated projects don't fail on structure their version never defined. Content (whether the rationale is *true*) stays a human judgment; the linter doesn't pretend otherwise.
123
+
124
+ ```bash
125
+ pip install keep-the-why-lint
126
+ ktw-lint .
127
+ ```
128
+
129
+ One line in GitHub Actions (`uses: oliver-zehentleitner/keep-the-why@lint-latest`), a job in GitLab CI, or a pre-commit hook — see [Linting](https://keepthewhy.com/linting/) and [CI linting setup](https://keepthewhy.com/ci-linting/). Python 3.10–3.14, no dependencies beyond the standard library.
130
+
131
+ ## Example
132
+
133
+ ```text
134
+ You: We're changing the retry mechanism because the previous
135
+ implementation caused duplicate orders. Make sure future
136
+ maintainers understand this.
137
+ ```
138
+
139
+ Keep the Why updates the relevant topic file in `context/` (or creates one if none exists), records the reason, and marks the old approach as superseded — without you having to ask for documentation separately.
140
+
141
+ Weeks later, a new maintainer — human or agent — can just ask:
142
+
143
+ ```text
144
+ You: Why does the retry mechanism track state instead of just retrying?
145
+ ```
146
+
147
+ and get the real answer instead of reverse-engineering it from the diff. See [`examples/`](https://github.com/oliver-zehentleitner/keep-the-why/tree/latest/skills/keep-the-why/examples) for continuous, retrospective, and interview-mode walkthroughs — including the case where a change gets *abandoned* and nothing would otherwise have recorded why.
148
+
149
+ ## The problem
150
+
151
+ Important project knowledge gets created in conversation — with a teammate, or with an AI coding agent — and then evaporates once the conversation ends. The code shows *what* was built. It rarely shows *why*. Missing reasoning costs you in four concrete ways:
152
+
153
+ - **Re-debate** — the same architecture question gets re-litigated because nobody remembers it was already settled.
154
+ - **Silent regression** — someone "cleans up" a workaround that looks unnecessary, not knowing it's the fix for a bug that then comes back.
155
+ - **Onboarding stall** — new contributors (human or AI) don't touch code they don't understand, so progress slows out of caution.
156
+ - **Repeated agent mistakes** — a fresh AI session, with no memory of the last one, proposes or re-implements something already tried and rejected, because nothing on disk records that it was.
157
+
158
+ ## What this is not
159
+
160
+ - Not a Python library. Nothing to import — this distribution is a name reservation; the skill and the linter are the real artifacts.
161
+ - Not a guarantee, and not magic. It lowers the friction of keeping rationale honest enough to make that practical to sustain; it doesn't replace the discipline.
162
+ - Not a replacement for tests. Tests tell you what broke; this tells you why it was built that way.
163
+ - Not session memory, and not an activity log of what an agent did — it's the reasoning behind the project, not a transcript.
164
+ - Not project management or an orchestration framework. It has one job: preserve the why.
165
+
166
+ ## Why I built this
167
+
168
+ See [Why I built this](https://keepthewhy.com/why/) — Oliver Zehentleitner on noticing this pattern while working with agents day to day, [blog](https://blog.technopathy.club), [GitHub](https://github.com/oliver-zehentleitner). For why it's built the way it is — no database, no daemon, no dashboard, deliberately — see [Philosophy](https://keepthewhy.com/philosophy/).
169
+
170
+ ## Feedback
171
+
172
+ Something not working as described, docs that confused you, or the skill's actual behavior not matching what it claims? [Open an issue](https://github.com/oliver-zehentleitner/keep-the-why/issues/new/choose) — that's exactly what it's for.
173
+
174
+ ## Contributing
175
+
176
+ See [CONTRIBUTING.md](https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/CONTRIBUTING.md), the [Changelog](https://github.com/oliver-zehentleitner/keep-the-why/blob/main/CHANGELOG.md), and the [Security policy](https://github.com/oliver-zehentleitner/keep-the-why/blob/main/SECURITY.md).
177
+
178
+ ## Contributors
179
+ [![Contributors](https://contributors-img.web.app/image?repo=oliver-zehentleitner/keep-the-why)](https://github.com/oliver-zehentleitner/keep-the-why/graphs/contributors)
180
+
181
+ We ♥️ open source!
182
+
183
+ ## License
184
+
185
+ [MIT](https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/LICENSE)
@@ -0,0 +1,8 @@
1
+ README.md
2
+ setup.py
3
+ dummy/__init__.py
4
+ dummy/package.py
5
+ ktw.egg-info/PKG-INFO
6
+ ktw.egg-info/SOURCES.txt
7
+ ktw.egg-info/dependency_links.txt
8
+ ktw.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ dummy
ktw-0.1.0/setup.cfg ADDED
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
ktw-0.1.0/setup.py ADDED
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # File: setup.py
5
+ #
6
+ # Part of 'Keep the Why'
7
+ # Project website: https://keepthewhy.com
8
+ # Github: https://github.com/oliver-zehentleitner/keep-the-why
9
+ # Documentation: https://keepthewhy.com
10
+ # PyPI: https://pypi.org/project/keep-the-why
11
+ #
12
+ # This distribution is a name reservation. Keep the Why is an agent skill
13
+ # (SKILL.md) and a Markdown convention, not a Python library - there is
14
+ # nothing to import. The pip-installable companion is the linter:
15
+ # https://pypi.org/project/keep-the-why-lint/
16
+ #
17
+ # License: MIT
18
+ # https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/LICENSE
19
+ #
20
+ # Author: Oliver Zehentleitner
21
+ #
22
+ # Copyright (c) 2026, Oliver Zehentleitner (https://about.me/oliver-zehentleitner)
23
+ # All rights reserved.
24
+ #
25
+ # Permission is hereby granted, free of charge, to any person obtaining a
26
+ # copy of this software and associated documentation files (the
27
+ # "Software"), to deal in the Software without restriction, including
28
+ # without limitation the rights to use, copy, modify, merge, publish, dis-
29
+ # tribute, sublicense, and/or sell copies of the Software, and to permit
30
+ # persons to whom the Software is furnished to do so, subject to the fol-
31
+ # lowing conditions:
32
+ #
33
+ # The above copyright notice and this permission notice shall be included
34
+ # in all copies or substantial portions of the Software.
35
+ #
36
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
37
+ # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
38
+ # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
39
+ # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
40
+ # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
41
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
42
+ # IN THE SOFTWARE.
43
+
44
+ from setuptools import setup, find_packages
45
+
46
+ name = "ktw"
47
+
48
+ with open("README.md", "r", encoding="utf-8") as fh:
49
+ print("Using README.md content as `long_description` ...")
50
+ long_description = fh.read()
51
+
52
+ setup(
53
+ name=name,
54
+ version="0.1.0",
55
+ author="Oliver Zehentleitner",
56
+ url="https://keepthewhy.com",
57
+ description="Name reservation for Keep the Why, the agent skill and repo-native convention that preserves "
58
+ "the reasoning behind a codebase. Not a Python library - install the skill via your agent's skill "
59
+ "tooling; the pip-installable linter is keep-the-why-lint.",
60
+ long_description=long_description,
61
+ long_description_content_type="text/markdown",
62
+ license="MIT",
63
+ install_requires=[],
64
+ keywords=[
65
+ "keep-the-why",
66
+ "documentation",
67
+ "decision-records",
68
+ "adr",
69
+ "architecture-decision-records",
70
+ "rationale",
71
+ "context-engineering",
72
+ "agent-skills",
73
+ "ai-agents",
74
+ "claude-code",
75
+ "codex",
76
+ "opencode",
77
+ "markdown",
78
+ "knowledge-transfer",
79
+ "legacy-code",
80
+ ],
81
+ project_urls={
82
+ "Homepage": "https://keepthewhy.com",
83
+ "Documentation": "https://keepthewhy.com/installation/",
84
+ "Linter (keep-the-why-lint)": "https://pypi.org/project/keep-the-why-lint/",
85
+ "Linting docs": "https://keepthewhy.com/linting/",
86
+ "Repository": "https://github.com/oliver-zehentleitner/keep-the-why",
87
+ "Source (skill)": "https://github.com/oliver-zehentleitner/keep-the-why/tree/latest/skills/keep-the-why",
88
+ "Changelog": "https://github.com/oliver-zehentleitner/keep-the-why/blob/main/CHANGELOG.md",
89
+ "Issues": "https://github.com/oliver-zehentleitner/keep-the-why/issues",
90
+ "Security": "https://github.com/oliver-zehentleitner/keep-the-why/blob/main/SECURITY.md",
91
+ "Evals": "https://keepthewhy.com/evals/",
92
+ "llms.txt": "https://keepthewhy.com/llms.txt",
93
+ "Author": "https://about.me/oliver-zehentleitner/",
94
+ "Telegram": "https://t.me/unicorndevs",
95
+ "X": "https://x.com/keep_the_why",
96
+ "Bluesky": "https://bsky.app/profile/keep-the-why.bsky.social",
97
+ "Mastodon": "https://mastodon.social/@keep_the_why",
98
+ },
99
+ packages=find_packages(exclude=["tools", "images", "dev", "docs", ".github"]),
100
+ python_requires=">=3.10.0",
101
+ classifiers=[
102
+ "Development Status :: 1 - Planning",
103
+ "Environment :: Console",
104
+ "Intended Audience :: Developers",
105
+ "Intended Audience :: Information Technology",
106
+ "Natural Language :: English",
107
+ "Operating System :: OS Independent",
108
+ "Programming Language :: Python :: 3",
109
+ "Programming Language :: Python :: 3.10",
110
+ "Programming Language :: Python :: 3.11",
111
+ "Programming Language :: Python :: 3.12",
112
+ "Programming Language :: Python :: 3.13",
113
+ "Programming Language :: Python :: 3.14",
114
+ "Topic :: Documentation",
115
+ "Topic :: Software Development :: Documentation",
116
+ "Topic :: Text Processing :: Markup :: Markdown",
117
+ ],
118
+ )