oifmd 0.1.0.dev0__tar.gz → 0.1.0.dev1__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.
- {oifmd-0.1.0.dev0 → oifmd-0.1.0.dev1}/LICENSE +1 -1
- oifmd-0.1.0.dev1/PKG-INFO +204 -0
- oifmd-0.1.0.dev1/README.md +183 -0
- oifmd-0.1.0.dev1/pyproject.toml +33 -0
- oifmd-0.1.0.dev1/src/oifmd/__init__.py +7 -0
- {oifmd-0.1.0.dev0 → oifmd-0.1.0.dev1}/src/oifmd/cli.py +147 -29
- oifmd-0.1.0.dev1/src/oifmd.egg-info/PKG-INFO +204 -0
- {oifmd-0.1.0.dev0 → oifmd-0.1.0.dev1}/src/oifmd.egg-info/SOURCES.txt +2 -1
- oifmd-0.1.0.dev1/tests/test_concurrent_comments.py +105 -0
- oifmd-0.1.0.dev0/PKG-INFO +0 -136
- oifmd-0.1.0.dev0/README.md +0 -123
- oifmd-0.1.0.dev0/pyproject.toml +0 -22
- oifmd-0.1.0.dev0/src/oifmd/__init__.py +0 -2
- oifmd-0.1.0.dev0/src/oifmd.egg-info/PKG-INFO +0 -136
- {oifmd-0.1.0.dev0 → oifmd-0.1.0.dev1}/setup.cfg +0 -0
- {oifmd-0.1.0.dev0 → oifmd-0.1.0.dev1}/src/oifmd/__main__.py +0 -0
- {oifmd-0.1.0.dev0 → oifmd-0.1.0.dev1}/src/oifmd.egg-info/dependency_links.txt +0 -0
- {oifmd-0.1.0.dev0 → oifmd-0.1.0.dev1}/src/oifmd.egg-info/entry_points.txt +0 -0
- {oifmd-0.1.0.dev0 → oifmd-0.1.0.dev1}/src/oifmd.egg-info/requires.txt +0 -0
- {oifmd-0.1.0.dev0 → oifmd-0.1.0.dev1}/src/oifmd.egg-info/top_level.txt +0 -0
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
same "printed page" as the copyright notice for easier
|
|
188
188
|
identification within third-party archives.
|
|
189
189
|
|
|
190
|
-
Copyright
|
|
190
|
+
Copyright 2026 The Open Issue Format contributors
|
|
191
191
|
|
|
192
192
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
193
|
you may not use this file except in compliance with the License.
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: oifmd
|
|
3
|
+
Version: 0.1.0.dev1
|
|
4
|
+
Summary: Open Issue Format (OIF) validator and tools
|
|
5
|
+
License-Expression: Apache-2.0
|
|
6
|
+
Project-URL: Documentation, https://oif.md/SPEC.md
|
|
7
|
+
Project-URL: Changelog, https://github.com/oifmd/oifmd/blob/main/CHANGELOG.md
|
|
8
|
+
Project-URL: Homepage, https://oif.md
|
|
9
|
+
Project-URL: Source, https://github.com/oifmd/oifmd
|
|
10
|
+
Keywords: oif,issues,issue-tracker,markdown,frontmatter,okf,git,agents
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Topic :: Software Development :: Bug Tracking
|
|
15
|
+
Classifier: Topic :: Text Processing :: Markup :: Markdown
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
Requires-Dist: pyyaml>=6
|
|
20
|
+
Dynamic: license-file
|
|
21
|
+
|
|
22
|
+
# Open Issue Format (OIF)
|
|
23
|
+
|
|
24
|
+

|
|
25
|
+
|
|
26
|
+
**Issues and review comments as files, in any git repository, about
|
|
27
|
+
anything in it.**
|
|
28
|
+
|
|
29
|
+
An issue is a Markdown file whose directory is its state. A comment is a
|
|
30
|
+
create-only file recording who said what, when, about which issue or
|
|
31
|
+
which path at which commit. Concurrent comments never conflict. Nothing
|
|
32
|
+
installed, and nothing written into the files being discussed.
|
|
33
|
+
|
|
34
|
+
- **Spec:** [SPEC.md](https://github.com/oifmd/oifmd/blob/main/SPEC.md)
|
|
35
|
+
- **Site:** https://oif.md
|
|
36
|
+
- **Package:** `oifmd` (validator)
|
|
37
|
+
|
|
38
|
+
## Sixty-second tour
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
board.md
|
|
42
|
+
issues/
|
|
43
|
+
├── backlog/
|
|
44
|
+
│ ├── column.md
|
|
45
|
+
│ └── add-jira-importer-nkhnsk.md
|
|
46
|
+
├── doing/
|
|
47
|
+
│ ├── column.md
|
|
48
|
+
│ └── fix-login-redirect-loop-7k2x9m.md
|
|
49
|
+
└── done/
|
|
50
|
+
├── column.md
|
|
51
|
+
└── write-spec-outline-h87456.md
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The directory is the status. The filename is the identity. Moving an
|
|
55
|
+
issue is `git mv issues/doing/fix-login-redirect-loop-7k2x9m.md issues/done/`.
|
|
56
|
+
|
|
57
|
+
`issues/doing/fix-login-redirect-loop-7k2x9m.md`:
|
|
58
|
+
|
|
59
|
+
```markdown
|
|
60
|
+
---
|
|
61
|
+
type: issue
|
|
62
|
+
resource: oif:app/7k2x9m
|
|
63
|
+
title: Login form rejects passwords containing "!"
|
|
64
|
+
kind: bug
|
|
65
|
+
priority: high
|
|
66
|
+
assignees: [coder/1.4]
|
|
67
|
+
requested_by: human:sam
|
|
68
|
+
tags: [auth]
|
|
69
|
+
about:
|
|
70
|
+
- path: src/LoginForm.svelte
|
|
71
|
+
commit: 3f9c2e1
|
|
72
|
+
created: 2026-09-13T03:10:00Z
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
Submitting a correct password with `!` clears the form and shows
|
|
76
|
+
"invalid credentials". Expected: login succeeds.
|
|
77
|
+
|
|
78
|
+
## Acceptance Criteria
|
|
79
|
+
|
|
80
|
+
- [x] Reproduce with a failing test
|
|
81
|
+
- [ ] Fix without changing the hashing path
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Comments are separate files, one per comment, keyed by the issue's id:
|
|
86
|
+
|
|
87
|
+
`comments/7k2x9m/k3n2wp.md`
|
|
88
|
+
|
|
89
|
+
```markdown
|
|
90
|
+
---
|
|
91
|
+
type: comment
|
|
92
|
+
at: 2026-09-13T04:12:00Z
|
|
93
|
+
by: human:sam
|
|
94
|
+
kind: verdict
|
|
95
|
+
result: changes_requested
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
Keep the strip for whitespace only.
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Read an issue and its whole history with one command:
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
cat issues/*/*-7k2x9m.md comments/7k2x9m/*.md
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Find what the board says about a file before you touch it:
|
|
108
|
+
|
|
109
|
+
```sh
|
|
110
|
+
grep -rl -- 'src/LoginForm.svelte' . # or: oifmd about src/LoginForm.svelte
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Not everything has a lifecycle. A standalone comment records a judgement
|
|
114
|
+
with no work attached, at `comments/<id>.md`:
|
|
115
|
+
|
|
116
|
+
```markdown
|
|
117
|
+
---
|
|
118
|
+
type: comment
|
|
119
|
+
at: 2026-09-15T04:10:00Z
|
|
120
|
+
by: human:sam
|
|
121
|
+
kind: confirms
|
|
122
|
+
about:
|
|
123
|
+
- path: docs/orders.md
|
|
124
|
+
commit: 3f9c2e1
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
Checked against the billing code at this commit. Holds.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Install
|
|
131
|
+
|
|
132
|
+
The format needs no tool. The validator is there when you want the
|
|
133
|
+
conformance list in section 8 of the spec checked for you.
|
|
134
|
+
|
|
135
|
+
```sh
|
|
136
|
+
pip install oifmd
|
|
137
|
+
|
|
138
|
+
oifmd validate <board> # check a board against the spec
|
|
139
|
+
oifmd about <path> # what the board says about a file
|
|
140
|
+
oifmd new <board> todo "…" # create an issue with a fresh id
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Why
|
|
144
|
+
|
|
145
|
+
Several tools got here first and independently reached the same shape:
|
|
146
|
+
Markdown plus frontmatter, one file per issue, living in the repo.
|
|
147
|
+
[Backlog.md](https://github.com/MrLesk/Backlog.md),
|
|
148
|
+
[beads](https://github.com/steveyegge/beads),
|
|
149
|
+
[git-issues](https://steviee.github.io/git-issues/) and
|
|
150
|
+
[beaver-backlog](https://github.com/builtbystef/beaver-backlog) each
|
|
151
|
+
worked it out on their own, and OIF is built on what they demonstrated.
|
|
152
|
+
|
|
153
|
+
What is missing is the format itself, written down apart from any one
|
|
154
|
+
tool: a specification you can implement against, a validator that says
|
|
155
|
+
whether a board conforms, and a version number so it can change without
|
|
156
|
+
breaking readers. That is what this is. Issues outlive whichever tool
|
|
157
|
+
wrote them, and any agent can read a board cold.
|
|
158
|
+
|
|
159
|
+
Design rules that fall out of being agent-first and git-native:
|
|
160
|
+
|
|
161
|
+
- **State is the directory.** A move is one atomic rename, not a
|
|
162
|
+
read-modify-write that two agents can trample.
|
|
163
|
+
- **Identity is a random six-character id in the filename.** Two
|
|
164
|
+
branches can create issues at once and merge with no counter, no
|
|
165
|
+
scan, no renumbering. Sequential keys like `APP-2753` survive as
|
|
166
|
+
aliases.
|
|
167
|
+
- **Records point at things; things never point back.** Everything is
|
|
168
|
+
written under the board root, so a board can describe a vendored
|
|
169
|
+
dependency, a submodule, a generated tree or a repo you only cloned to
|
|
170
|
+
review. The target's own tooling sees no diff.
|
|
171
|
+
- **One comment is one file**, keyed by the issue's id. Two agents
|
|
172
|
+
commenting at once write two different paths, so nothing conflicts and
|
|
173
|
+
nothing is lost. Appending to a shared file does not survive concurrent
|
|
174
|
+
writers; see SPEC.md section 7.1.
|
|
175
|
+
- **Unknown keys pass through.** A conforming consumer never rejects
|
|
176
|
+
them and keeps them when it rewrites a file.
|
|
177
|
+
- **Every column has a `column.md`.** It keeps empty columns in git and
|
|
178
|
+
tells an arriving agent what belongs there and how to leave.
|
|
179
|
+
- **The board declares its own vocabulary.** `board.md` lists the columns
|
|
180
|
+
and, optionally, the `kinds` an issue may have and which kinds may
|
|
181
|
+
contain which. Epic, story and task are one team's words, not the
|
|
182
|
+
format's. Ready `board.md` files for Kanban, Scrum and Shape Up are in
|
|
183
|
+
[`profiles/`](https://github.com/oifmd/oifmd/blob/main/profiles).
|
|
184
|
+
|
|
185
|
+
An OIF board is a conforming [Open Knowledge Format](https://okf.md)
|
|
186
|
+
bundle: same substrate, same actor convention, `type: issue` on every
|
|
187
|
+
file. The one deliberate divergence, identity by id rather than by path,
|
|
188
|
+
is spelled out in SPEC.md section 9. A tracker is a service you log into; OIF is a
|
|
189
|
+
directory you already have.
|
|
190
|
+
|
|
191
|
+
## This repository
|
|
192
|
+
|
|
193
|
+
The roadmap for OIF itself lives in [`board/`](https://github.com/oifmd/oifmd/blob/main/board), in OIF.
|
|
194
|
+
GitHub Issues stays open for conversation; accepted work lands in
|
|
195
|
+
`board/issues/` with the GitHub number kept in `external_ids`.
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
## License
|
|
199
|
+
|
|
200
|
+
Apache-2.0.
|
|
201
|
+
|
|
202
|
+
Open Issue Format is an independent specification, not affiliated with
|
|
203
|
+
or endorsed by Google. Open Knowledge Format, OKF and Google are marks
|
|
204
|
+
of their respective owners. See SPEC.md section 10.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Open Issue Format (OIF)
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
**Issues and review comments as files, in any git repository, about
|
|
6
|
+
anything in it.**
|
|
7
|
+
|
|
8
|
+
An issue is a Markdown file whose directory is its state. A comment is a
|
|
9
|
+
create-only file recording who said what, when, about which issue or
|
|
10
|
+
which path at which commit. Concurrent comments never conflict. Nothing
|
|
11
|
+
installed, and nothing written into the files being discussed.
|
|
12
|
+
|
|
13
|
+
- **Spec:** [SPEC.md](https://github.com/oifmd/oifmd/blob/main/SPEC.md)
|
|
14
|
+
- **Site:** https://oif.md
|
|
15
|
+
- **Package:** `oifmd` (validator)
|
|
16
|
+
|
|
17
|
+
## Sixty-second tour
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
board.md
|
|
21
|
+
issues/
|
|
22
|
+
├── backlog/
|
|
23
|
+
│ ├── column.md
|
|
24
|
+
│ └── add-jira-importer-nkhnsk.md
|
|
25
|
+
├── doing/
|
|
26
|
+
│ ├── column.md
|
|
27
|
+
│ └── fix-login-redirect-loop-7k2x9m.md
|
|
28
|
+
└── done/
|
|
29
|
+
├── column.md
|
|
30
|
+
└── write-spec-outline-h87456.md
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The directory is the status. The filename is the identity. Moving an
|
|
34
|
+
issue is `git mv issues/doing/fix-login-redirect-loop-7k2x9m.md issues/done/`.
|
|
35
|
+
|
|
36
|
+
`issues/doing/fix-login-redirect-loop-7k2x9m.md`:
|
|
37
|
+
|
|
38
|
+
```markdown
|
|
39
|
+
---
|
|
40
|
+
type: issue
|
|
41
|
+
resource: oif:app/7k2x9m
|
|
42
|
+
title: Login form rejects passwords containing "!"
|
|
43
|
+
kind: bug
|
|
44
|
+
priority: high
|
|
45
|
+
assignees: [coder/1.4]
|
|
46
|
+
requested_by: human:sam
|
|
47
|
+
tags: [auth]
|
|
48
|
+
about:
|
|
49
|
+
- path: src/LoginForm.svelte
|
|
50
|
+
commit: 3f9c2e1
|
|
51
|
+
created: 2026-09-13T03:10:00Z
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
Submitting a correct password with `!` clears the form and shows
|
|
55
|
+
"invalid credentials". Expected: login succeeds.
|
|
56
|
+
|
|
57
|
+
## Acceptance Criteria
|
|
58
|
+
|
|
59
|
+
- [x] Reproduce with a failing test
|
|
60
|
+
- [ ] Fix without changing the hashing path
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Comments are separate files, one per comment, keyed by the issue's id:
|
|
65
|
+
|
|
66
|
+
`comments/7k2x9m/k3n2wp.md`
|
|
67
|
+
|
|
68
|
+
```markdown
|
|
69
|
+
---
|
|
70
|
+
type: comment
|
|
71
|
+
at: 2026-09-13T04:12:00Z
|
|
72
|
+
by: human:sam
|
|
73
|
+
kind: verdict
|
|
74
|
+
result: changes_requested
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
Keep the strip for whitespace only.
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Read an issue and its whole history with one command:
|
|
81
|
+
|
|
82
|
+
```sh
|
|
83
|
+
cat issues/*/*-7k2x9m.md comments/7k2x9m/*.md
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Find what the board says about a file before you touch it:
|
|
87
|
+
|
|
88
|
+
```sh
|
|
89
|
+
grep -rl -- 'src/LoginForm.svelte' . # or: oifmd about src/LoginForm.svelte
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Not everything has a lifecycle. A standalone comment records a judgement
|
|
93
|
+
with no work attached, at `comments/<id>.md`:
|
|
94
|
+
|
|
95
|
+
```markdown
|
|
96
|
+
---
|
|
97
|
+
type: comment
|
|
98
|
+
at: 2026-09-15T04:10:00Z
|
|
99
|
+
by: human:sam
|
|
100
|
+
kind: confirms
|
|
101
|
+
about:
|
|
102
|
+
- path: docs/orders.md
|
|
103
|
+
commit: 3f9c2e1
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
Checked against the billing code at this commit. Holds.
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Install
|
|
110
|
+
|
|
111
|
+
The format needs no tool. The validator is there when you want the
|
|
112
|
+
conformance list in section 8 of the spec checked for you.
|
|
113
|
+
|
|
114
|
+
```sh
|
|
115
|
+
pip install oifmd
|
|
116
|
+
|
|
117
|
+
oifmd validate <board> # check a board against the spec
|
|
118
|
+
oifmd about <path> # what the board says about a file
|
|
119
|
+
oifmd new <board> todo "…" # create an issue with a fresh id
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Why
|
|
123
|
+
|
|
124
|
+
Several tools got here first and independently reached the same shape:
|
|
125
|
+
Markdown plus frontmatter, one file per issue, living in the repo.
|
|
126
|
+
[Backlog.md](https://github.com/MrLesk/Backlog.md),
|
|
127
|
+
[beads](https://github.com/steveyegge/beads),
|
|
128
|
+
[git-issues](https://steviee.github.io/git-issues/) and
|
|
129
|
+
[beaver-backlog](https://github.com/builtbystef/beaver-backlog) each
|
|
130
|
+
worked it out on their own, and OIF is built on what they demonstrated.
|
|
131
|
+
|
|
132
|
+
What is missing is the format itself, written down apart from any one
|
|
133
|
+
tool: a specification you can implement against, a validator that says
|
|
134
|
+
whether a board conforms, and a version number so it can change without
|
|
135
|
+
breaking readers. That is what this is. Issues outlive whichever tool
|
|
136
|
+
wrote them, and any agent can read a board cold.
|
|
137
|
+
|
|
138
|
+
Design rules that fall out of being agent-first and git-native:
|
|
139
|
+
|
|
140
|
+
- **State is the directory.** A move is one atomic rename, not a
|
|
141
|
+
read-modify-write that two agents can trample.
|
|
142
|
+
- **Identity is a random six-character id in the filename.** Two
|
|
143
|
+
branches can create issues at once and merge with no counter, no
|
|
144
|
+
scan, no renumbering. Sequential keys like `APP-2753` survive as
|
|
145
|
+
aliases.
|
|
146
|
+
- **Records point at things; things never point back.** Everything is
|
|
147
|
+
written under the board root, so a board can describe a vendored
|
|
148
|
+
dependency, a submodule, a generated tree or a repo you only cloned to
|
|
149
|
+
review. The target's own tooling sees no diff.
|
|
150
|
+
- **One comment is one file**, keyed by the issue's id. Two agents
|
|
151
|
+
commenting at once write two different paths, so nothing conflicts and
|
|
152
|
+
nothing is lost. Appending to a shared file does not survive concurrent
|
|
153
|
+
writers; see SPEC.md section 7.1.
|
|
154
|
+
- **Unknown keys pass through.** A conforming consumer never rejects
|
|
155
|
+
them and keeps them when it rewrites a file.
|
|
156
|
+
- **Every column has a `column.md`.** It keeps empty columns in git and
|
|
157
|
+
tells an arriving agent what belongs there and how to leave.
|
|
158
|
+
- **The board declares its own vocabulary.** `board.md` lists the columns
|
|
159
|
+
and, optionally, the `kinds` an issue may have and which kinds may
|
|
160
|
+
contain which. Epic, story and task are one team's words, not the
|
|
161
|
+
format's. Ready `board.md` files for Kanban, Scrum and Shape Up are in
|
|
162
|
+
[`profiles/`](https://github.com/oifmd/oifmd/blob/main/profiles).
|
|
163
|
+
|
|
164
|
+
An OIF board is a conforming [Open Knowledge Format](https://okf.md)
|
|
165
|
+
bundle: same substrate, same actor convention, `type: issue` on every
|
|
166
|
+
file. The one deliberate divergence, identity by id rather than by path,
|
|
167
|
+
is spelled out in SPEC.md section 9. A tracker is a service you log into; OIF is a
|
|
168
|
+
directory you already have.
|
|
169
|
+
|
|
170
|
+
## This repository
|
|
171
|
+
|
|
172
|
+
The roadmap for OIF itself lives in [`board/`](https://github.com/oifmd/oifmd/blob/main/board), in OIF.
|
|
173
|
+
GitHub Issues stays open for conversation; accepted work lands in
|
|
174
|
+
`board/issues/` with the GitHub number kept in `external_ids`.
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
## License
|
|
178
|
+
|
|
179
|
+
Apache-2.0.
|
|
180
|
+
|
|
181
|
+
Open Issue Format is an independent specification, not affiliated with
|
|
182
|
+
or endorsed by Google. Open Knowledge Format, OKF and Google are marks
|
|
183
|
+
of their respective owners. See SPEC.md section 10.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "oifmd"
|
|
7
|
+
version = "0.1.0.dev1"
|
|
8
|
+
description = "Open Issue Format (OIF) validator and tools"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "Apache-2.0"
|
|
11
|
+
license-files = ["LICENSE"]
|
|
12
|
+
requires-python = ">=3.10"
|
|
13
|
+
keywords = ["oif", "issues", "issue-tracker", "markdown", "frontmatter", "okf", "git", "agents"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 3 - Alpha",
|
|
16
|
+
"Intended Audience :: Developers",
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"Topic :: Software Development :: Bug Tracking",
|
|
19
|
+
"Topic :: Text Processing :: Markup :: Markdown",
|
|
20
|
+
]
|
|
21
|
+
dependencies = ["pyyaml>=6"]
|
|
22
|
+
|
|
23
|
+
[project.urls]
|
|
24
|
+
Documentation = "https://oif.md/SPEC.md"
|
|
25
|
+
Changelog = "https://github.com/oifmd/oifmd/blob/main/CHANGELOG.md"
|
|
26
|
+
Homepage = "https://oif.md"
|
|
27
|
+
Source = "https://github.com/oifmd/oifmd"
|
|
28
|
+
|
|
29
|
+
[project.scripts]
|
|
30
|
+
oifmd = "oifmd.cli:main"
|
|
31
|
+
|
|
32
|
+
[tool.setuptools.packages.find]
|
|
33
|
+
where = ["src"]
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""Open Issue Format (OIF) reference tooling. Spec: https://oif.md"""
|
|
2
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
3
|
+
|
|
4
|
+
try:
|
|
5
|
+
__version__ = version("oifmd")
|
|
6
|
+
except PackageNotFoundError: # running from a source tree, not installed
|
|
7
|
+
__version__ = "0+unknown"
|