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.
@@ -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 [yyyy] [name of copyright owner]
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
+ ![Open Issue Format](https://oif.md/oif-header-1500x500.png)
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
+ ![Open Issue Format](https://oif.md/oif-header-1500x500.png)
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"