ktw-lint 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_lint-0.1.0/PKG-INFO +185 -0
- ktw_lint-0.1.0/README.md +133 -0
- ktw_lint-0.1.0/dummy/__init__.py +1 -0
- ktw_lint-0.1.0/dummy/package.py +6 -0
- ktw_lint-0.1.0/ktw_lint.egg-info/PKG-INFO +185 -0
- ktw_lint-0.1.0/ktw_lint.egg-info/SOURCES.txt +8 -0
- ktw_lint-0.1.0/ktw_lint.egg-info/dependency_links.txt +1 -0
- ktw_lint-0.1.0/ktw_lint.egg-info/top_level.txt +1 -0
- ktw_lint-0.1.0/setup.cfg +4 -0
- ktw_lint-0.1.0/setup.py +118 -0
ktw_lint-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ktw-lint
|
|
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
|
+
[](https://pypi.org/project/keep-the-why/)
|
|
54
|
+
[](https://github.com/oliver-zehentleitner/keep-the-why/releases)
|
|
55
|
+
[](https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/LICENSE)
|
|
56
|
+
[](https://skillsllm.com/security-check/IPmNycVdbOyq)
|
|
57
|
+
[](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/validate-skill.yml)
|
|
58
|
+
[](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/lint-package.yml)
|
|
59
|
+
[](https://keepthewhy.com/)
|
|
60
|
+
[](https://t.me/unicorndevs)
|
|
61
|
+
[](https://x.com/keep_the_why)
|
|
62
|
+
[](https://bsky.app/profile/keep-the-why.bsky.social)
|
|
63
|
+
[](https://mastodon.social/@keep_the_why)
|
|
64
|
+
[](https://keepthewhy.com)
|
|
65
|
+
|
|
66
|
+
<a href="https://keepthewhy.com"><img src="https://keepthewhy.com/assets/logo.png" alt="Keep the Why — because "ask Bob" 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
|
+
[](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_lint-0.1.0/README.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
[](https://pypi.org/project/keep-the-why/)
|
|
2
|
+
[](https://github.com/oliver-zehentleitner/keep-the-why/releases)
|
|
3
|
+
[](https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/LICENSE)
|
|
4
|
+
[](https://skillsllm.com/security-check/IPmNycVdbOyq)
|
|
5
|
+
[](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/validate-skill.yml)
|
|
6
|
+
[](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/lint-package.yml)
|
|
7
|
+
[](https://keepthewhy.com/)
|
|
8
|
+
[](https://t.me/unicorndevs)
|
|
9
|
+
[](https://x.com/keep_the_why)
|
|
10
|
+
[](https://bsky.app/profile/keep-the-why.bsky.social)
|
|
11
|
+
[](https://mastodon.social/@keep_the_why)
|
|
12
|
+
[](https://keepthewhy.com)
|
|
13
|
+
|
|
14
|
+
<a href="https://keepthewhy.com"><img src="https://keepthewhy.com/assets/logo.png" alt="Keep the Why — because "ask Bob" 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
|
+
[](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,185 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ktw-lint
|
|
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
|
+
[](https://pypi.org/project/keep-the-why/)
|
|
54
|
+
[](https://github.com/oliver-zehentleitner/keep-the-why/releases)
|
|
55
|
+
[](https://github.com/oliver-zehentleitner/keep-the-why/blob/latest/LICENSE)
|
|
56
|
+
[](https://skillsllm.com/security-check/IPmNycVdbOyq)
|
|
57
|
+
[](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/validate-skill.yml)
|
|
58
|
+
[](https://github.com/oliver-zehentleitner/keep-the-why/actions/workflows/lint-package.yml)
|
|
59
|
+
[](https://keepthewhy.com/)
|
|
60
|
+
[](https://t.me/unicorndevs)
|
|
61
|
+
[](https://x.com/keep_the_why)
|
|
62
|
+
[](https://bsky.app/profile/keep-the-why.bsky.social)
|
|
63
|
+
[](https://mastodon.social/@keep_the_why)
|
|
64
|
+
[](https://keepthewhy.com)
|
|
65
|
+
|
|
66
|
+
<a href="https://keepthewhy.com"><img src="https://keepthewhy.com/assets/logo.png" alt="Keep the Why — because "ask Bob" 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
|
+
[](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 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
dummy
|
ktw_lint-0.1.0/setup.cfg
ADDED
ktw_lint-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-lint"
|
|
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
|
+
)
|