backdraft 0.2.0__py3-none-any.whl
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.
- backdraft/__init__.py +13 -0
- backdraft/bind/__init__.py +37 -0
- backdraft/bind/binder.py +653 -0
- backdraft/bind/cli.py +133 -0
- backdraft/bind/evidence.py +232 -0
- backdraft/bind/verify/__init__.py +30 -0
- backdraft/bind/verify/base.py +70 -0
- backdraft/bind/verify/entail.py +156 -0
- backdraft/bind/verify/overlap.py +114 -0
- backdraft/bind/verify/recompute.py +45 -0
- backdraft/bind/verify/value_trace.py +352 -0
- backdraft/cli.py +341 -0
- backdraft/cli_context.py +152 -0
- backdraft/credentials.py +106 -0
- backdraft/extract/__init__.py +37 -0
- backdraft/extract/base.py +184 -0
- backdraft/extract/pdf_text.py +124 -0
- backdraft/extract/text.py +44 -0
- backdraft/extract/vlm.py +175 -0
- backdraft/extract/vlm_settings.py +197 -0
- backdraft/extract/xlsx.py +244 -0
- backdraft/gate/__init__.py +39 -0
- backdraft/gate/cli.py +131 -0
- backdraft/gate/reader.py +592 -0
- backdraft/gate/searcher.py +123 -0
- backdraft/kernel/__init__.py +17 -0
- backdraft/kernel/artifact.py +234 -0
- backdraft/kernel/chunking.py +162 -0
- backdraft/kernel/claims.py +142 -0
- backdraft/kernel/errors.py +35 -0
- backdraft/kernel/hashing.py +89 -0
- backdraft/kernel/model.py +336 -0
- backdraft/kernel/tokens.py +291 -0
- backdraft/registry/__init__.py +39 -0
- backdraft/registry/ledger.py +82 -0
- backdraft/registry/schema.sql +90 -0
- backdraft/registry/store.py +915 -0
- backdraft/render/__init__.py +31 -0
- backdraft/render/_text.py +69 -0
- backdraft/render/cli.py +107 -0
- backdraft/render/footnotes.py +172 -0
- backdraft/render/html.py +1211 -0
- backdraft/render/markdown.py +313 -0
- backdraft/render/placement.py +105 -0
- backdraft/render/sidecar.py +164 -0
- backdraft-0.2.0.dist-info/METADATA +253 -0
- backdraft-0.2.0.dist-info/RECORD +50 -0
- backdraft-0.2.0.dist-info/WHEEL +4 -0
- backdraft-0.2.0.dist-info/entry_points.txt +2 -0
- backdraft-0.2.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: backdraft
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Drop-in provenance for factual claims: one click from any claim to the evidence behind it.
|
|
5
|
+
License: MIT
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Requires-Python: >=3.13
|
|
8
|
+
Requires-Dist: openpyxl>=3.1
|
|
9
|
+
Requires-Dist: pdfplumber>=0.11
|
|
10
|
+
Requires-Dist: typer>=0.12
|
|
11
|
+
Provides-Extra: entail
|
|
12
|
+
Requires-Dist: anthropic>=0.40; extra == 'entail'
|
|
13
|
+
Provides-Extra: vlm
|
|
14
|
+
Requires-Dist: openai>=1.0; extra == 'vlm'
|
|
15
|
+
Requires-Dist: pdf2image>=1.17; extra == 'vlm'
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
|
|
18
|
+
<img src="assets/backdraft-mark.svg" width="56" alt="">
|
|
19
|
+
|
|
20
|
+
# backdraft
|
|
21
|
+
|
|
22
|
+
Drop-in provenance for factual claims: one click from any claim to the receipt
|
|
23
|
+
behind it.
|
|
24
|
+
|
|
25
|
+
An analyst who cannot show where a number came from either re-reads the source
|
|
26
|
+
or does not use the output. Backdraft removes that cost. In the usual loop, an
|
|
27
|
+
**agent** does the writing: it reads your source documents only through a gate
|
|
28
|
+
that mints a citation token over every span it shows, cites those tokens
|
|
29
|
+
inline, and a postprocess resolves them, attaches the verbatim evidence, and
|
|
30
|
+
renders one self-contained HTML file — the memo with the actual cited pages
|
|
31
|
+
and spreadsheet cells embedded inside it. The **human** just reads that file:
|
|
32
|
+
click a claim, see the source.
|
|
33
|
+
|
|
34
|
+
It works the same whether the writer is a model or a person, and whether the
|
|
35
|
+
citations were minted during writing or attached to a document afterwards.
|
|
36
|
+
|
|
37
|
+
Docs live at [backdraft.dev](https://backdraft.dev) — one page for people, and
|
|
38
|
+
[backdraft.dev/llms.txt](https://backdraft.dev/llms.txt) for agents.
|
|
39
|
+
|
|
40
|
+
## 60 seconds
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
uv tool install git+https://github.com/spencerbraun/backdraft
|
|
44
|
+
cd demo
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Ingest** the sources. Every anchor is minted here — chunks for PDF pages,
|
|
48
|
+
cells for spreadsheet sheets.
|
|
49
|
+
|
|
50
|
+
```console
|
|
51
|
+
$ backdraft init
|
|
52
|
+
registry: /…/demo/.backdraft
|
|
53
|
+
documents: 0
|
|
54
|
+
|
|
55
|
+
$ backdraft ingest sources/t12-summary.pdf sources/underwriting-model.xlsx
|
|
56
|
+
t12-summary t12-summary.pdf pdf 3 pages
|
|
57
|
+
underwriting-model underwriting-model.xlsx xlsx 2 pages
|
|
58
|
+
note: extracted with pdf-text (the embedded text layer). Glossy or scanned PDFs extract better through a vision model: install backdraft[vlm] and set BACKDRAFT_VLM_API_KEY in .backdraft/env.
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Read.** The page arrives with a citable name over each chunk. This is the whole
|
|
62
|
+
mechanism: what you can cite is exactly what you were shown.
|
|
63
|
+
|
|
64
|
+
```console
|
|
65
|
+
$ backdraft read t12-summary p1
|
|
66
|
+
# t12-summary p1 (page 1 of 3)
|
|
67
|
+
|
|
68
|
+
[bd:t12-summary:p1.c1:c2e8]
|
|
69
|
+
Bridgeview Commons — Trailing Twelve Month Summary
|
|
70
|
+
|
|
71
|
+
Property: Bridgeview Commons, 4400 Halsted Avenue, Columbus, OH 43214. 128 units across four three-story
|
|
72
|
+
garden buildings on 6.2 acres, built in 1998 and substantially renovated between 2019 and 2021. This summary
|
|
73
|
+
covers the trailing twelve months ended March 31, 2026, prepared from the borrower's monthly operating
|
|
74
|
+
statements and reconciled against the property manager's general ledger. Figures are unaudited.
|
|
75
|
+
|
|
76
|
+
[bd:t12-summary:p1.c2:7f11]
|
|
77
|
+
Total effective gross income for the trailing twelve months was $2,684,400, against gross potential rent of
|
|
78
|
+
$2,972,160. The resulting economic occupancy of 90.3% reflects an average physical occupancy of 94.1% offset
|
|
79
|
+
by concessions, bad debt, and vacancy loss. Physical occupancy was 96.4% in the most recent month and has not
|
|
80
|
+
fallen below 92.0% in any month of the period.
|
|
81
|
+
|
|
82
|
+
… five more chunks, c3 through c7.
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Chunks fall on the document's own paragraphs. A PDF stores glyphs at
|
|
86
|
+
coordinates, not paragraphs, so the extractor rebuilds the breaks from the line
|
|
87
|
+
geometry before the chunker sees the page.
|
|
88
|
+
|
|
89
|
+
Search results are citable too — no page read required to get an anchor:
|
|
90
|
+
|
|
91
|
+
```console
|
|
92
|
+
$ backdraft search "24850000"
|
|
93
|
+
1 result for "24850000"
|
|
94
|
+
|
|
95
|
+
[bd:underwriting-model:assumptions!B10:964a] underwriting-model p2
|
|
96
|
+
24850000
|
|
97
|
+
|
|
98
|
+
[Read the page: backdraft read underwriting-model p2]
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
A cell you can already see mints directly:
|
|
102
|
+
|
|
103
|
+
```console
|
|
104
|
+
$ backdraft cell underwriting-model "assumptions!B10"
|
|
105
|
+
[bd:underwriting-model:assumptions!B10:964a] 24850000
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Cite** by writing the token as the href of a markdown link on the claim span.
|
|
109
|
+
Multiple citations are `;`-separated in one href.
|
|
110
|
+
|
|
111
|
+
```markdown
|
|
112
|
+
[net operating income of $1,429,600](bd:t12-summary:p1.c3:f10b)
|
|
113
|
+
[Effective gross income of $2,684,400](bd:t12-summary:p1.c2:7f11;bd:underwriting-model:rent-roll!B11:4b79)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Bind.** Every token resolves or is reported. Nothing drops silently.
|
|
117
|
+
|
|
118
|
+
```console
|
|
119
|
+
$ backdraft bind memo.md --session s-bridgeview --check value-trace,overlap
|
|
120
|
+
bound 15 claim(s), 16 citation(s) [frontwalk]
|
|
121
|
+
resolved: 15
|
|
122
|
+
unresolved: 1
|
|
123
|
+
overlap: partial 4, pass 11
|
|
124
|
+
value-trace: pass 15
|
|
125
|
+
! unresolved: bd:t12-summary:p4.c1:1a2b
|
|
126
|
+
wrote .backdraft/records/memo.backdraft.json
|
|
127
|
+
|
|
128
|
+
$ echo $?
|
|
129
|
+
2
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Exit 2 means a citation did not resolve — the code a `Stop` hook or a CI job
|
|
133
|
+
gates on.
|
|
134
|
+
|
|
135
|
+
**Render.** One self-contained HTML file: the document, the receipts, the
|
|
136
|
+
evidence — cited page images, spreadsheet cells in place, the machine-readable
|
|
137
|
+
record — all embedded, no network, nothing to install for the reader.
|
|
138
|
+
|
|
139
|
+
```console
|
|
140
|
+
$ backdraft render memo.md --to html
|
|
141
|
+
memo.backdraft.html
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
That file is the whole deliverable: send it over email or Slack and the
|
|
145
|
+
recipient gets the full experience by double-clicking it.
|
|
146
|
+
|
|
147
|
+
The full version of this, with every command and every output:
|
|
148
|
+
[`demo/walkthrough.md`](demo/walkthrough.md). The artifact it produces is checked
|
|
149
|
+
in at [`demo/memo.backdraft.html`](demo/memo.backdraft.html).
|
|
150
|
+
|
|
151
|
+
## The design in five sentences
|
|
152
|
+
|
|
153
|
+
Reading is a **gate**: source documents reach the writer only through `read` and
|
|
154
|
+
`search`, which mint a token over everything they show and record it in a
|
|
155
|
+
**ledger**, so the set of citable things is exactly the set of things shown — and
|
|
156
|
+
a citation to something the writer never saw is a distinguishable failure rather
|
|
157
|
+
than an invisible one. **Anchors are content-addressed**: a token's identity
|
|
158
|
+
derives from the document's content and a location inside it, and it binds to an
|
|
159
|
+
extraction snapshot, so re-ingesting the same bytes yields the same tokens and a
|
|
160
|
+
changed source yields `drifted` instead of a broken link. **The receipt travels
|
|
161
|
+
with the claim** — an anchor is not a pointer but a pointer plus the verbatim
|
|
162
|
+
snippet and its hash, which is why the finished artifact is defensible with the
|
|
163
|
+
registry deleted and the sources gone. **Verification is a set of switches,
|
|
164
|
+
default off**: resolution is inherent to binding, but `value-trace`, `overlap`
|
|
165
|
+
and `entail` are opt-in, recorded as graded evidence and never used as gates, so
|
|
166
|
+
out of the box this is provenance rather than a truth oracle. **Artifacts are
|
|
167
|
+
self-describing**: each carries a `$format` string matched byte-for-byte and an
|
|
168
|
+
embedded `$legend` that teaches a reader who has never heard of backdraft how to
|
|
169
|
+
decode and check it, so the format outlives this implementation.
|
|
170
|
+
|
|
171
|
+
Failures are data throughout: `unresolved`, `not_shown`, `drifted`, `malformed`
|
|
172
|
+
and `unmatched` are first-class records in the report and visible sections in the
|
|
173
|
+
artifact. Nothing is ever warned about and dropped.
|
|
174
|
+
|
|
175
|
+
## What lives where
|
|
176
|
+
|
|
177
|
+
A working directory stays clean: the authored document and its artifact are
|
|
178
|
+
the only visible outputs. Everything else — registry, credentials, bind
|
|
179
|
+
records — lives under one hidden `.backdraft/` directory, and
|
|
180
|
+
`backdraft clean` tidies strays from older versions. The registry contains the
|
|
181
|
+
full text of everything ingested, so **gitignore `.backdraft/` for
|
|
182
|
+
confidential corpora**.
|
|
183
|
+
|
|
184
|
+
## Install
|
|
185
|
+
|
|
186
|
+
Not yet on PyPI — install from the repository:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
uv tool install git+https://github.com/spencerbraun/backdraft # CLI
|
|
190
|
+
uv add "backdraft @ git+https://github.com/spencerbraun/backdraft" # as a dependency
|
|
191
|
+
pip install git+https://github.com/spencerbraun/backdraft # or plain pip
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Python 3.13+. Two extras:
|
|
195
|
+
|
|
196
|
+
| Extra | Adds | For |
|
|
197
|
+
|---|---|---|
|
|
198
|
+
| `[vlm]` | `openai`, `pdf2image` | the VLM extractor — the recommended path for real PDFs (glossy layouts, info boxes, scans): a vision model reads each page and its clean representation becomes the receipt. `--extractor auto` prefers it only on explicit, backdraft-scoped consent: `BACKDRAFT_VLM_API_KEY` (env or `.backdraft/env` — `backdraft init` writes a template). Ambient `OPENAI_API_KEY`/`OPENROUTER_API_KEY` are deliberately never read; a generic key in the environment is not consent to send documents to its provider. The default provider is OpenRouter running Gemini 3.1 Flash Lite; direct OpenAI is base_url + model, set explicitly. Without a scoped key, `auto` falls back to the keyless text layer and says so. Needs poppler installed separately |
|
|
199
|
+
| `[entail]` | `anthropic` | `bind --check entail`, the model-judge verifier |
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
pip install "backdraft[vlm,entail] @ git+https://github.com/spencerbraun/backdraft"
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
From a checkout:
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
uv sync
|
|
209
|
+
uv run backdraft --help
|
|
210
|
+
uv run pytest
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Skills
|
|
214
|
+
|
|
215
|
+
Three agent skills ship in [`skills/`](skills). Copy the ones you want into your
|
|
216
|
+
agent's skills directory — for Claude Code, `~/.claude/skills/` (personal) or
|
|
217
|
+
`.claude/skills/` (per project):
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
cp -r skills/backdraft skills/backdraft-backfill skills/backdraft-artifact ~/.claude/skills/
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
| Skill | For |
|
|
224
|
+
|---|---|
|
|
225
|
+
| [`backdraft`](skills/backdraft/SKILL.md) | writing a new document from sources, citing as it goes |
|
|
226
|
+
| [`backdraft-backfill`](skills/backdraft-backfill/SKILL.md) | attributing a document that already exists |
|
|
227
|
+
| [`backdraft-artifact`](skills/backdraft-artifact/SKILL.md) | reading someone else's artifact cold |
|
|
228
|
+
|
|
229
|
+
The CLI is the system; a skill is one page telling an agent to use it. Nothing in
|
|
230
|
+
the skills is required to use backdraft by hand.
|
|
231
|
+
|
|
232
|
+
## Documentation
|
|
233
|
+
|
|
234
|
+
| Document | Is |
|
|
235
|
+
|---|---|
|
|
236
|
+
| [DESIGN.md](DESIGN.md) | why it is shaped this way — principles, architecture, decision log |
|
|
237
|
+
| [SPEC.md](SPEC.md) | the builders' contract — types, grammar, DDL, CLI surface, module boundaries |
|
|
238
|
+
| [spec/tokens.md](spec/tokens.md) | the citation token grammar, normatively |
|
|
239
|
+
| [spec/chunking.md](spec/chunking.md) | the deterministic chunker |
|
|
240
|
+
| [spec/artifact.md](spec/artifact.md) | the artifact format — sidecar payload, legend, HTML rules |
|
|
241
|
+
| [demo/walkthrough.md](demo/walkthrough.md) | the whole thing end to end, with real output |
|
|
242
|
+
|
|
243
|
+
The three files under `spec/` are the portable specification: another
|
|
244
|
+
implementation reads them and nothing else.
|
|
245
|
+
|
|
246
|
+
## Status
|
|
247
|
+
|
|
248
|
+
v1. The registry format, the token grammar and the artifact format are pinned
|
|
249
|
+
by prose specs and golden-file tests. What is deliberately queued — exhibits,
|
|
250
|
+
Excel region maps, more formats, `bd:calc` derivations — is written down in
|
|
251
|
+
[ROADMAP.md](ROADMAP.md).
|
|
252
|
+
|
|
253
|
+
MIT licensed.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
backdraft/__init__.py,sha256=dkCDv9tf_LE80W3zacOQSsgjCN1AcIkV2aVYv_jPRM4,412
|
|
2
|
+
backdraft/cli.py,sha256=nV_uPKIVzQ2qELstLSWMhD4U0Fqgm8Oi2Gd0Uvab6oE,12079
|
|
3
|
+
backdraft/cli_context.py,sha256=-d33EiI4YxiqqQBZD2xt6d-cq28V_UmoSVXdQtJQwx0,5292
|
|
4
|
+
backdraft/credentials.py,sha256=HgyhTjZJrVGeJqmQ15pxT6O7nvUuNcMhMhPvN1ZWizs,4035
|
|
5
|
+
backdraft/bind/__init__.py,sha256=mI0nmsY_7zvkf4_wLZG6LbgDpuUpZGtivyxN8UuBdGg,1080
|
|
6
|
+
backdraft/bind/binder.py,sha256=LehgwqDRrxVIBnx5V7VXPxuGvp65I7jUMjz5W142H90,25333
|
|
7
|
+
backdraft/bind/cli.py,sha256=4xoEolrXJcNN85uWXXB2x3qKW9Bw09H78vwLvXj3gMs,5125
|
|
8
|
+
backdraft/bind/evidence.py,sha256=bDxQnfQRlWEsY0HW9nwhJkLnUF15dImVBWo5aV22hZE,8303
|
|
9
|
+
backdraft/bind/verify/__init__.py,sha256=8RQfb7v1KSc9yDlb0oH-W-BdhW6qxKsW1lTzVJNNb2I,838
|
|
10
|
+
backdraft/bind/verify/base.py,sha256=jOCdK7UUGaqAgUwu-XKxI9lN5vxqYYZ7eGRSnu6q4U8,2606
|
|
11
|
+
backdraft/bind/verify/entail.py,sha256=2lvE2blmwxIyXTxXHNbCP2h6jtP4nBcbeC3s-sSFLFk,6582
|
|
12
|
+
backdraft/bind/verify/overlap.py,sha256=5598QjS1gnx0jtGG91qT2V8waxDLDZVgjD929wQArAg,4561
|
|
13
|
+
backdraft/bind/verify/recompute.py,sha256=G_5KJAB-SEm-ipCrOPgI5mm9pgKiQtUxjjW_idDDhoI,1819
|
|
14
|
+
backdraft/bind/verify/value_trace.py,sha256=I-XdGThH8uHiHoGCCAdlnIQKN0a1YqD9LFyO91O92Eg,13360
|
|
15
|
+
backdraft/extract/__init__.py,sha256=tYJkRq5r5IYgwP_fDScD2SPRbsl5pwLyx-bYqCkWIWY,787
|
|
16
|
+
backdraft/extract/base.py,sha256=961v91VwCKZcbdULDKt-ff2oSg2J74KBYjK0vxR5w_Y,6496
|
|
17
|
+
backdraft/extract/pdf_text.py,sha256=y3XNlol17JBy68qzLt_Husu9a3cn35Ren4tAfY-qo6w,5050
|
|
18
|
+
backdraft/extract/text.py,sha256=a5vkWNcHL8eRjWk8CHOnh0t5YA2DCxqaJ1EwnCPpvPI,1369
|
|
19
|
+
backdraft/extract/vlm.py,sha256=eZiItol4pVPlZ_gJtyt3x6hO_0VAooeB7JJ372T5Whg,6809
|
|
20
|
+
backdraft/extract/vlm_settings.py,sha256=6agaEWwQFfoVRXsPcshJ-LKvPnJfX96ZzgPyY-cfImc,7208
|
|
21
|
+
backdraft/extract/xlsx.py,sha256=7wyBGTJE1u8AS6FZcDoJP-ecpq5h3duIh-eaBwxraT8,9000
|
|
22
|
+
backdraft/gate/__init__.py,sha256=YmnC7w5tgHKZJCAF_t8ZdpGI-TTIYZAK5tCQmq0MSXY,1080
|
|
23
|
+
backdraft/gate/cli.py,sha256=tzK44Y6NY_asa7qCYbcsRKkrM3Eicnl-g7_S2X4_mWU,4723
|
|
24
|
+
backdraft/gate/reader.py,sha256=k9SY3H-Nu4XryH-3edYuRf2szNlU6OhqlUzU1Y4SV9M,22387
|
|
25
|
+
backdraft/gate/searcher.py,sha256=EVmEKOZQKKhoX4Ns1sdCgBAZUmlck4Zu5xU-as77VhU,4675
|
|
26
|
+
backdraft/kernel/__init__.py,sha256=NcrHGTFxs-dr1RiC5fcp0RNkbtqj_5HEgeIkRI8u6G0,996
|
|
27
|
+
backdraft/kernel/artifact.py,sha256=UgHEBBNJyUi6Ii3D0m6lWL28teloIo87iJmKu8Q3r9w,10793
|
|
28
|
+
backdraft/kernel/chunking.py,sha256=gWdTM7ybnZ1MdWv_1MGOMXG7IWn9De_s0annMxMW7Ys,6088
|
|
29
|
+
backdraft/kernel/claims.py,sha256=FBD6_j46r9W3KlWUrtYjMhjWnKG1O9FBQBjnk1mg1M8,5043
|
|
30
|
+
backdraft/kernel/errors.py,sha256=aecKYN2clJx2LWOpOBIQKYxsgO1Fd0yOK44Rks-J5IM,1032
|
|
31
|
+
backdraft/kernel/hashing.py,sha256=xjxlDeTDd0Nek5vRsCtXhr4J0r-w7dTDPoI5VnAieLg,2895
|
|
32
|
+
backdraft/kernel/model.py,sha256=s4zvpCJAOnRFumShL6wzaGTBRvb0HlGgrq_-_ErFD70,10049
|
|
33
|
+
backdraft/kernel/tokens.py,sha256=Tx1wPZ6Llwy6KvJbui7GjleuWp4VwsvDFqYJwxF9HTA,9809
|
|
34
|
+
backdraft/registry/__init__.py,sha256=Y78nNU8zZ1Qg80VRSWcex8ysHPODZVORD6QSSMzaJ-I,1007
|
|
35
|
+
backdraft/registry/ledger.py,sha256=sBNo1RurwfGSqCKV7aYCm0XQLojujokzAiw6-UxuwMA,2740
|
|
36
|
+
backdraft/registry/schema.sql,sha256=ngwmg4PF2iYiMDF6e0KTSEfhQ8lQZA05ab0UKFduHSc,3477
|
|
37
|
+
backdraft/registry/store.py,sha256=UG59_nsS5JjkIfMXwU6-hTQg--dYWeKJBeJQHm9FO2M,36419
|
|
38
|
+
backdraft/render/__init__.py,sha256=iEah2YoZRtj6ZRK6IXbd5P-QjvrOJYrt2OCbfVR6-8Y,1132
|
|
39
|
+
backdraft/render/_text.py,sha256=75ZtemjMD2GMS7xecm2Clret1PpJqgSiDSiLGU6N4xo,2880
|
|
40
|
+
backdraft/render/cli.py,sha256=cJn0Ay2dMFOPl7UjDX2Y7t0u-lCl-_VJanNfw0nrwfc,3699
|
|
41
|
+
backdraft/render/footnotes.py,sha256=k__tXW_ze_kBeH4UHIa4ROYMA9TLwyC1FyOShOIDRk8,6561
|
|
42
|
+
backdraft/render/html.py,sha256=1dA0E_K_qUlnqi4SGc-MdblYgG6ypSb2eSLmRNvK0Qc,49613
|
|
43
|
+
backdraft/render/markdown.py,sha256=0tFt8limamR94i3iG26PwgXMwG-dYU5xeS9b_d0_5Iw,11222
|
|
44
|
+
backdraft/render/placement.py,sha256=04Y5n9gekE9KNIqRN-BnkD6850oH2qId7tjbTJ7Hi-0,3913
|
|
45
|
+
backdraft/render/sidecar.py,sha256=WIz9MGmJNLFw7M6o1dl4G9oWQVpu0dvcwuuxHYYgBJs,5555
|
|
46
|
+
backdraft-0.2.0.dist-info/METADATA,sha256=wM2iRJ0-qnyPU_gS32ScL4YfuhtaQn4PVMk_mnZ_Pv4,10637
|
|
47
|
+
backdraft-0.2.0.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
|
|
48
|
+
backdraft-0.2.0.dist-info/entry_points.txt,sha256=bk-TQiaxqdx0IySRm5RPoPip8DNJV6uokDWqG1prHwE,49
|
|
49
|
+
backdraft-0.2.0.dist-info/licenses/LICENSE,sha256=23xc3FdDmd6cxW3y_c1SgjpzfFy1VMt26xCRKLh64TY,1070
|
|
50
|
+
backdraft-0.2.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Spencer Braun
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|