seqforge 2026.7.1__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.
Files changed (124) hide show
  1. seqforge/__init__.py +16 -0
  2. seqforge/cli/__init__.py +38 -0
  3. seqforge/cli/__main__.py +8 -0
  4. seqforge/cli/_common.py +105 -0
  5. seqforge/cli/compose.py +119 -0
  6. seqforge/cli/eval.py +103 -0
  7. seqforge/cli/harvest.py +417 -0
  8. seqforge/cli/hook.py +247 -0
  9. seqforge/cli/io.py +502 -0
  10. seqforge/cli/kb.py +348 -0
  11. seqforge/cli/manifest.py +536 -0
  12. seqforge/cli/probe.py +43 -0
  13. seqforge/cli/processing.py +192 -0
  14. seqforge/cli/project.py +52 -0
  15. seqforge/cli/resolve.py +55 -0
  16. seqforge/cli/root.py +66 -0
  17. seqforge/cli/run.py +463 -0
  18. seqforge/cli/schema.py +41 -0
  19. seqforge/compose/__init__.py +28 -0
  20. seqforge/compose/core.py +515 -0
  21. seqforge/compose/gates.py +113 -0
  22. seqforge/compose/params.py +447 -0
  23. seqforge/e2e.py +1926 -0
  24. seqforge/evals/__init__.py +78 -0
  25. seqforge/evals/case.py +382 -0
  26. seqforge/evals/grade.py +300 -0
  27. seqforge/evals/run.py +420 -0
  28. seqforge/harvest/__init__.py +121 -0
  29. seqforge/harvest/extract.py +319 -0
  30. seqforge/harvest/fields.py +212 -0
  31. seqforge/harvest/normalize.py +537 -0
  32. seqforge/harvest/prep.py +41 -0
  33. seqforge/harvest/providers.py +321 -0
  34. seqforge/harvest/verify.py +251 -0
  35. seqforge/hooks/__init__.py +33 -0
  36. seqforge/hooks/guards.py +214 -0
  37. seqforge/io/__init__.py +61 -0
  38. seqforge/io/archive.py +450 -0
  39. seqforge/io/attributes.py +190 -0
  40. seqforge/io/biosample/attributes.json +6341 -0
  41. seqforge/io/efo/labels.json +55 -0
  42. seqforge/io/efo.py +138 -0
  43. seqforge/io/onlist.py +661 -0
  44. seqforge/io/onlists/3M-february-2018.codes.gz +0 -0
  45. seqforge/io/onlists/737K-arc-v1.codes.gz +0 -0
  46. seqforge/io/onlists/737K-august-2016.codes.gz +0 -0
  47. seqforge/io/onlists/bd-rhapsody-cls1-384.codes.gz +0 -0
  48. seqforge/io/onlists/bd-rhapsody-cls1.codes.gz +0 -0
  49. seqforge/io/onlists/bd-rhapsody-cls2-384.codes.gz +0 -0
  50. seqforge/io/onlists/bd-rhapsody-cls2.codes.gz +0 -0
  51. seqforge/io/onlists/bd-rhapsody-cls3-384.codes.gz +0 -0
  52. seqforge/io/onlists/bd-rhapsody-cls3.codes.gz +0 -0
  53. seqforge/io/onlists/index.json +74 -0
  54. seqforge/io/remote.py +659 -0
  55. seqforge/io/taxonomy.py +194 -0
  56. seqforge/kb/__init__.py +62 -0
  57. seqforge/kb/anchor.py +169 -0
  58. seqforge/kb/generate.py +147 -0
  59. seqforge/kb/loader.py +152 -0
  60. seqforge/kb/roundtrip.py +112 -0
  61. seqforge/kb/schema.py +422 -0
  62. seqforge/kb/specs/10x-3p-gex/spec.yaml +62 -0
  63. seqforge/kb/specs/10x-3p-gex-v2/README.md +41 -0
  64. seqforge/kb/specs/10x-3p-gex-v2/spec.yaml +83 -0
  65. seqforge/kb/specs/10x-3p-gex-v3/README.md +56 -0
  66. seqforge/kb/specs/10x-3p-gex-v3/spec.yaml +118 -0
  67. seqforge/kb/specs/10x-3p-gex-v3.1/README.md +56 -0
  68. seqforge/kb/specs/10x-3p-gex-v3.1/spec.yaml +124 -0
  69. seqforge/kb/specs/bd-rhapsody-wta/README.md +103 -0
  70. seqforge/kb/specs/bd-rhapsody-wta/spec.yaml +130 -0
  71. seqforge/kb/specs/bd-rhapsody-wta-enhanced/spec.yaml +99 -0
  72. seqforge/kb/specs/bd-rhapsody-wta-enhanced-v1/spec.yaml +93 -0
  73. seqforge/kb/specs/bd-rhapsody-wta-enhanced-v2/spec.yaml +81 -0
  74. seqforge/kb/specs/bulk-rnaseq-pe/README.md +35 -0
  75. seqforge/kb/specs/bulk-rnaseq-pe/spec.yaml +97 -0
  76. seqforge/kb/specs/splitseq/README.md +51 -0
  77. seqforge/kb/specs/splitseq/spec.yaml +157 -0
  78. seqforge/manifest/__init__.py +61 -0
  79. seqforge/manifest/fill.py +531 -0
  80. seqforge/manifest/hash.py +77 -0
  81. seqforge/manifest/instruct.py +114 -0
  82. seqforge/manifest/policy.py +409 -0
  83. seqforge/manifest/validate.py +274 -0
  84. seqforge/models/__init__.py +268 -0
  85. seqforge/models/assertion.py +68 -0
  86. seqforge/models/base.py +100 -0
  87. seqforge/models/blocker.py +71 -0
  88. seqforge/models/conflict.py +47 -0
  89. seqforge/models/dataset.py +320 -0
  90. seqforge/models/evidenced.py +54 -0
  91. seqforge/models/observation.py +157 -0
  92. seqforge/models/processing.py +231 -0
  93. seqforge/models/records.py +145 -0
  94. seqforge/models/resolve.py +216 -0
  95. seqforge/probe/__init__.py +46 -0
  96. seqforge/probe/core.py +232 -0
  97. seqforge/probe/signals.py +250 -0
  98. seqforge/probe/streaming.py +118 -0
  99. seqforge/project.py +177 -0
  100. seqforge/py.typed +0 -0
  101. seqforge/resolve/__init__.py +98 -0
  102. seqforge/resolve/assign.py +204 -0
  103. seqforge/resolve/cache.py +119 -0
  104. seqforge/resolve/confuse.py +215 -0
  105. seqforge/resolve/engine.py +646 -0
  106. seqforge/resolve/escalate.py +668 -0
  107. seqforge/resolve/evaluators.py +306 -0
  108. seqforge/resolve/geometry.py +89 -0
  109. seqforge/resolve/group.py +85 -0
  110. seqforge/resolve/records.py +550 -0
  111. seqforge/resolve/scoring.py +373 -0
  112. seqforge/resolve/window.py +206 -0
  113. seqforge/workflows/__init__.py +234 -0
  114. seqforge/workflows/cram.py +117 -0
  115. seqforge/workflows/h5ad.py +368 -0
  116. seqforge/workflows/map/star.smk +101 -0
  117. seqforge/workflows/map/starsolo.smk +360 -0
  118. seqforge/workflows/qc.py +157 -0
  119. seqforge/workspace.py +125 -0
  120. seqforge-2026.7.1.dist-info/METADATA +125 -0
  121. seqforge-2026.7.1.dist-info/RECORD +124 -0
  122. seqforge-2026.7.1.dist-info/WHEEL +4 -0
  123. seqforge-2026.7.1.dist-info/entry_points.txt +2 -0
  124. seqforge-2026.7.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,125 @@
1
+ Metadata-Version: 2.4
2
+ Name: seqforge
3
+ Version: 2026.7.1
4
+ Summary: Compile arbitrary FASTQ + messy metadata into a validated, machine-independent sequencing library manifest and a runnable Snakemake config.
5
+ Project-URL: Homepage, https://github.com/liuhlab/seqforge
6
+ Project-URL: Issues, https://github.com/liuhlab/seqforge/issues
7
+ Project-URL: Changelog, https://github.com/liuhlab/seqforge/blob/main/CHANGELOG.md
8
+ Author: Liu Lab
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: bioinformatics,fastq,manifest,single-cell,snakemake
12
+ Classifier: Development Status :: 2 - Pre-Alpha
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: POSIX :: Linux
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
20
+ Classifier: Typing :: Typed
21
+ Requires-Python: >=3.12
22
+ Requires-Dist: anndata>=0.10
23
+ Requires-Dist: anthropic>=0.40
24
+ Requires-Dist: numpy>=2
25
+ Requires-Dist: openai>=1.40
26
+ Requires-Dist: openpyxl>=3.1
27
+ Requires-Dist: pdfplumber>=0.11
28
+ Requires-Dist: pooch>=1.8
29
+ Requires-Dist: pydantic>=2.7
30
+ Requires-Dist: pymupdf>=1.24
31
+ Requires-Dist: pypdf>=4
32
+ Requires-Dist: pyyaml>=6
33
+ Requires-Dist: requests>=2.31
34
+ Requires-Dist: tqdm>=4
35
+ Requires-Dist: typer>=0.12
36
+ Description-Content-Type: text/markdown
37
+
38
+ <!-- A centered, sized logo and title need inline HTML and precede the first heading, which the
39
+ default ruleset forbids (MD033, MD041). Scope the exception to this masthead; every other rule
40
+ stays on for the README. -->
41
+ <!-- markdownlint-disable MD033 MD041 -->
42
+ <p align="center">
43
+ <img src="docs/assets/logo-readme.png" alt="seqforge" width="200">
44
+ </p>
45
+
46
+ <h1 align="center">seqforge</h1>
47
+ <!-- markdownlint-enable MD033 MD041 -->
48
+
49
+ Compile `(arbitrary FASTQ files) + (unstructured human/DB metadata)` into a validated,
50
+ machine-independent **dataset manifest**, then into a runnable Snakemake config — for headless
51
+ reprocessing of large collections of public sequencing datasets into a genomic-AI training corpus.
52
+
53
+ **seqforge is a compiler, not a chatbot.** Deterministic code owns every decision. The LLM has
54
+ exactly two jobs: parse prose into span-verified assertions, and arbitrate ambiguity the
55
+ deterministic layer has *already flagged*. Everything else is a verifier.
56
+
57
+ ```text
58
+ probe(files) -> Observation deterministic, no LLM, no network, bytes only
59
+ harvest(prose, instructions) -> Assertion LLM, each claim span-verified
60
+ resolve(Observations, KB, hypothesis?) -> candidates, Conflicts, Questions, Blockers
61
+ ──────────────────────────────────────────────────────────────────────────────────────────────────
62
+ => manifest.yaml what the data IS. One per dataset. Immutable, content-addressed.
63
+
64
+ plan(Assertions, flags, policy) -> ProcessingSection flag > instruction > policy
65
+ ──────────────────────────────────────────────────────────────────────────────────────────────────
66
+ => processing.yaml what to DO with it. Many per dataset.
67
+
68
+ compose(manifest, processing) -> config.yaml + units.tsv + module selection
69
+ ```
70
+
71
+ Same dataset + a different recipe = a different pipeline, and the dataset's hash **does not move**.
72
+
73
+ The files can be local or remote: `seqforge io probe-remote <url>` fingerprints a library straight
74
+ from a URL via one bounded HTTP Range read — same identification, no download.
75
+
76
+ **Status: the pilot compiles end to end.** The deterministic spine is implemented and green
77
+ (`pixi run check`), and `seqforge run` takes the worm pilot PRJNA1027859 from its raw FASTQs and paper
78
+ to a validated manifest + a runnable Snakefile in one headless pass. The ground-truth alignment runs
79
+ (`kb e2e`) are still on synthetic yeast/worm fixtures with injected counts — it has not yet executed a
80
+ pipeline on real reads at scale.
81
+
82
+ Docs: **<https://liuhlab.github.io/seqforge/>** · design + rationale + scope delta:
83
+ [`docs/design.md`](docs/design.md) (its §9 is the running list of what is *not* yet built) · rules:
84
+ [`CLAUDE.md`](CLAUDE.md)
85
+
86
+ ## Install
87
+
88
+ ```bash
89
+ pip install seqforge
90
+ ```
91
+
92
+ This gives you the compiler and the `seqforge` CLI. The two lab-only stages — `compose` against a real
93
+ genome and `kb e2e` — additionally need the lab's `liulab-genome` and `liulab-data` packages, which are
94
+ not on PyPI. Install them from git when you need those features:
95
+
96
+ ```bash
97
+ pip install "liulab-genome @ git+https://github.com/liuhlab/liulab-genome.git" \
98
+ "liulab-data @ git+https://github.com/liuhlab/liulab-data.git"
99
+ ```
100
+
101
+ (Inside the lab, `pixi install` already pulls both — see below.)
102
+
103
+ ## Develop
104
+
105
+ Everything runs through [pixi](https://pixi.sh) (not `pip`/`conda`/`venv`):
106
+
107
+ ```bash
108
+ pixi install # build environments
109
+ pixi run test # pytest
110
+ pixi run lint # ruff check .
111
+ pixi run typecheck # mypy --strict on models/, probe/, resolve/, manifest/,
112
+ # compose/, workflows/, harvest/, evals/
113
+ pixi run check # lint + fmt-check + typecheck + test
114
+ pixi run -- pre-commit install # once per clone — ruff, mypy, shellcheck (not the suite)
115
+ ```
116
+
117
+ Most of the non-negotiable rules in `CLAUDE.md` are enforced by tests, so `pixi run check` is the
118
+ mechanism rather than a formality — and CI runs it on every push and PR. The pre-commit hooks are
119
+ deliberately limited to the fast ones, so run `check` yourself when you change behaviour.
120
+
121
+ ## Consumer of the liulab stack
122
+
123
+ seqforge references genomes by a `liulab-genome` UCSC assembly id + registered GTF name, and aligner
124
+ environments by their literal `liulab-runtime` name (`align-rna`, ...). It never defines genome-file
125
+ machinery or aligner environments itself — and there is a test that says so.
@@ -0,0 +1,124 @@
1
+ seqforge/__init__.py,sha256=rr_9gsgwojeRsqEajBpuYRx8AL81qhb23Zm9uU4kZEk,647
2
+ seqforge/e2e.py,sha256=eEBdFeSZjaigJuBd6CSsVIMHZmabT5juZWFN8DY7Vg4,86232
3
+ seqforge/project.py,sha256=oULzTLiP6M-tNRvV4__mHcsLp3DmocYAaNilzBOv3pU,6923
4
+ seqforge/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ seqforge/workspace.py,sha256=c6BxUr8Y3meD1_q5uuw_h2dpT4spFv7_eEzPZUzK73o,5750
6
+ seqforge/cli/__init__.py,sha256=BVE8GhWAJ1FQQotB0Z8zBFrhTaWuOybHLYRfQ2OfgZc,1377
7
+ seqforge/cli/__main__.py,sha256=Q5YJjURpTF__dZX609dwHfboYzkw3EJqwYMdLglSlPI,198
8
+ seqforge/cli/_common.py,sha256=29928Nzj2rIER1BqvG2tFtGUUjC8jhofDCMHMKAmxhs,4113
9
+ seqforge/cli/compose.py,sha256=vFrlegQqAR7Vy5aE_ivWNl1S0sB9nOVSxtCmBHG0qgs,4837
10
+ seqforge/cli/eval.py,sha256=TpWwPThphb6xP4cWtPzp98_g4mUv0V3EU3kkSeAdI78,3760
11
+ seqforge/cli/harvest.py,sha256=MLSqyajUl1UAVBD2GNR5szAt3zPwXmool57fdS9MQ3k,18311
12
+ seqforge/cli/hook.py,sha256=y1jbNB9dd6VaNtvTRINF4kL9e0Btbvesx8TWvvubZc4,8415
13
+ seqforge/cli/io.py,sha256=xwfo4yKbH-SWzUQfCEd4ZTDiw0e4WUZTpdPf9lwoPvg,20038
14
+ seqforge/cli/kb.py,sha256=LKrJYQOeWfqwNEZ11ygh2O-xqY0Xsy8q20AD4CY0pTY,14072
15
+ seqforge/cli/manifest.py,sha256=pDEcqCQ27lje089q7Fdrm4ERjPqvRwihTeUbCgzZLuE,24655
16
+ seqforge/cli/probe.py,sha256=NtqrDZVtqYX4kjonWdOmZDq5rDQXtfSfPcocIx2-Ntw,1739
17
+ seqforge/cli/processing.py,sha256=hSRg5mkxqLg73DqU1K2g7BZnNZ8X0txTVLJclmYvy90,7824
18
+ seqforge/cli/project.py,sha256=LE2qBal8Snj0kmjJPlhFwOqO7GuHgiF9M1QUz99CnUs,1859
19
+ seqforge/cli/resolve.py,sha256=WfFLiI4qbSKkR0xtMjUTtXyhmXNT3sL76HT3mE1rGws,1988
20
+ seqforge/cli/root.py,sha256=nDjcCWlPf6gdsVlDAPynkWG-MXVLWTOa2nf5pkZdQWA,2334
21
+ seqforge/cli/run.py,sha256=ZVR5b02OVg8HG_zACsAG9wvrBMWjdurVASmpxb5oaJw,20587
22
+ seqforge/cli/schema.py,sha256=66TpxDb6oDGCkQhPGRXOHYk2gZM8iJlxmrtUkYCDJIY,1306
23
+ seqforge/compose/__init__.py,sha256=GpKTvSg7xg7GSShS7NB0ezuywn55_6T5eyIs1K1hVY8,1013
24
+ seqforge/compose/core.py,sha256=mUMxRmKopVhwhLk8q574Lv82ObfLjDd1h_fz50WnERY,26085
25
+ seqforge/compose/gates.py,sha256=B-oUnZqicz0jlQ6NMIt0khwtfro7gQurgqtFtGZx6fU,5375
26
+ seqforge/compose/params.py,sha256=ikZ_3Spy0cd6yiFpvgCz312-JR2eu8boqJy8WWFZLLE,21705
27
+ seqforge/evals/__init__.py,sha256=gLQejcry0-QS1pGoAZayJ-vXcVYTg02_m_v6e8FpxoY,2226
28
+ seqforge/evals/case.py,sha256=cpyJJ2ZyYev3ysIJifU2Sg3bWkd-AbgAznUc9fYYbWE,15345
29
+ seqforge/evals/grade.py,sha256=b9M9HTiAPlGY2OpJissUQfpkTzD-KSgFvsXKegOOoX8,13500
30
+ seqforge/evals/run.py,sha256=CgKdp4VO142ZJdFgVyrR2NtbB3X7hfqJ04RVF6pLmUk,16629
31
+ seqforge/harvest/__init__.py,sha256=r26gcyG2CbjmUtZO5DmsRqjwZmqCEbNUiof5hn8Hix8,3563
32
+ seqforge/harvest/extract.py,sha256=gzowFf1LMXqJcpGyXPz4Lg0xKLQgVGcMXdjLtdaoPPo,17044
33
+ seqforge/harvest/fields.py,sha256=rclblKsdrts6SElE8Uc7fxRAxB-frGeT0K2hIjI2-Tw,11413
34
+ seqforge/harvest/normalize.py,sha256=iph2HTfVszSDFHZbTQvcazHPgzCk03AW4ruU1jbNkis,27744
35
+ seqforge/harvest/prep.py,sha256=UzvbyC7G72hgUGc4GNxPoW2zRSeEGBxRRWh6hz2F0pk,2061
36
+ seqforge/harvest/providers.py,sha256=Ej4S7EIubJC-F2hkPIqGRSrGgNjYJhghxzTa9mydhnU,14207
37
+ seqforge/harvest/verify.py,sha256=-Gta8BhqlpcnGzjPCVjhtpqcq-hZh3Cn4gpFsarQNmA,12154
38
+ seqforge/hooks/__init__.py,sha256=HTq2GgWVKmfF3xmNokXH8gsHkjYdrUGdxpMEIjuVAfc,887
39
+ seqforge/hooks/guards.py,sha256=dfd4PJlJ93_6OX9ULTgWqa93gDuPfauklmC2r4kZiR8,9437
40
+ seqforge/io/__init__.py,sha256=jc1j5hNGrGAWC5IKZoL2zv4ugs3ZRzICZAsAcWFB424,1715
41
+ seqforge/io/archive.py,sha256=HC6GXikfTgnyEZV4P5Q7GiwC-HtLCu5lp0ZdDeoqTh4,20795
42
+ seqforge/io/attributes.py,sha256=7C7E22_alJqnBF4pxFQ8zCMMhY2ixzANqVleXu7q9RI,8063
43
+ seqforge/io/efo.py,sha256=V48cg62HzBc3V2w5yASDYAk34DIA9ap4WA1uDdsStdU,5183
44
+ seqforge/io/onlist.py,sha256=c_CPt8wnX9mxqQwHnu4-sf2y3IsZsLul6Q7k6BGUGXc,29570
45
+ seqforge/io/remote.py,sha256=KVuM7xunyKIXUz5OEShPYYajVWqyCY4gSJbudUPIYi0,28906
46
+ seqforge/io/taxonomy.py,sha256=0kh3GZBgrUt-E77bTu7XJtIdCqPrIVOItRvGXUQyhPE,8622
47
+ seqforge/io/biosample/attributes.json,sha256=5sxx-Og_nsyWSt9GZcnE2rr6qecTRkvc-FiAoqK8cGA,239291
48
+ seqforge/io/efo/labels.json,sha256=rJvQdoNkcR8s9vLxICCZUScePFbReYmLkKi8tslQFPc,1148
49
+ seqforge/io/onlists/3M-february-2018.codes.gz,sha256=Xpir45Xe1f7FdK1D5-MNbVXmmhi5i3Bl8ngIhxb2_EM,521855
50
+ seqforge/io/onlists/737K-arc-v1.codes.gz,sha256=iBldBnos7joijEAYf27MnrybMH3ftJAPTTutjE8ICzU,34393
51
+ seqforge/io/onlists/737K-august-2016.codes.gz,sha256=EGKIxa6bOzJWsGdlIB4yhxPYrl9KUjt9nlKo_hoXzQc,23950
52
+ seqforge/io/onlists/bd-rhapsody-cls1-384.codes.gz,sha256=nUnlFNvEgRLBpOoC_KBNrpwKMTJQNjb2fH37TGCVcm8,850
53
+ seqforge/io/onlists/bd-rhapsody-cls1.codes.gz,sha256=0taDpOw17W0b1OG8avQ5f0f0-Ib3nTBTE90xXs0b3gY,299
54
+ seqforge/io/onlists/bd-rhapsody-cls2-384.codes.gz,sha256=ux-JEz_drDnv0rgfIZXhkez9EW-kxNO99umHSI7pBQQ,871
55
+ seqforge/io/onlists/bd-rhapsody-cls2.codes.gz,sha256=amwuBw076tMfp_WWLdSqy0un_67nNeZcWIbQ8vAbYGI,295
56
+ seqforge/io/onlists/bd-rhapsody-cls3-384.codes.gz,sha256=z6OyddRwZ1BN9Nc4AkQjuP5encCh_hsSetkJp-4RQwI,837
57
+ seqforge/io/onlists/bd-rhapsody-cls3.codes.gz,sha256=m35xsxzK4kON_rluHBFyxzd8wkg6LqYClOpF7GklqJw,294
58
+ seqforge/io/onlists/index.json,sha256=p0LCP-ya1K_tN1rXntoteGHDPLEKYYppdj89eR9NVKg,3212
59
+ seqforge/kb/__init__.py,sha256=PBBVtRh7cMy3AIvIpqZ9kf9de2-PiRR4oyRCyg71qAU,3243
60
+ seqforge/kb/anchor.py,sha256=p3a6vdJpCdUvdDilk7nODs9iyKTNOGkBp4UXkC6o8zE,8025
61
+ seqforge/kb/generate.py,sha256=XimDBFqXyZMrbj43IuuA2KckpeS3YcfN_XhvRcK8wKU,6221
62
+ seqforge/kb/loader.py,sha256=XdjyvjdwDyJ5kD8-cLZLq9v84eIT_SW12PSdWqBPPwI,5992
63
+ seqforge/kb/roundtrip.py,sha256=Xiooc1ImK5ORKZqE0pGw2Eh9G8KvWH5K8zX9b0t0AQM,4866
64
+ seqforge/kb/schema.py,sha256=Q9ynbzGd7KMu3kbZbw43DALRut-lPSziB8AwKzeY6yE,16858
65
+ seqforge/kb/specs/10x-3p-gex/spec.yaml,sha256=aTycbgiqCNJiYKmqdzvCvuVDQ7DzscQ87DAKcR5NXFE,2837
66
+ seqforge/kb/specs/10x-3p-gex-v2/README.md,sha256=l5GWkWLLL5SyDRMjnCyY47TVI5aBBhmH7aoqTGHp2GA,2039
67
+ seqforge/kb/specs/10x-3p-gex-v2/spec.yaml,sha256=5qXchBqMgxSTlFLlMRSuEN-bJ2wje6KoFPIFqEaMYaU,3766
68
+ seqforge/kb/specs/10x-3p-gex-v3/README.md,sha256=eyWhk59-YK5jrDZDKIUwplixIa9m43E_PTIIG2DBQgA,2949
69
+ seqforge/kb/specs/10x-3p-gex-v3/spec.yaml,sha256=dABAXfQXTaMMnyBKf-J7RsBPNFcw5Vj86gUioX3urSM,5935
70
+ seqforge/kb/specs/10x-3p-gex-v3.1/README.md,sha256=eyWhk59-YK5jrDZDKIUwplixIa9m43E_PTIIG2DBQgA,2949
71
+ seqforge/kb/specs/10x-3p-gex-v3.1/spec.yaml,sha256=6lHXGYuyTT52xe6GU5GJK4pPbV4UeFBC8_WH1q84l2I,5983
72
+ seqforge/kb/specs/bd-rhapsody-wta/README.md,sha256=123ChSx__Hu-JuT-p5WAodIqITBcL9JSWz94Bu56df0,5196
73
+ seqforge/kb/specs/bd-rhapsody-wta/spec.yaml,sha256=KJO2NvOUzt7Ld2yZA6dYVXgfHQCHs2r326sTdbt21UU,8424
74
+ seqforge/kb/specs/bd-rhapsody-wta-enhanced/spec.yaml,sha256=7DmFIgIzQzH00oIEy68mT1HMeBzApfi_h0ePmEe2erU,5991
75
+ seqforge/kb/specs/bd-rhapsody-wta-enhanced-v1/spec.yaml,sha256=WSUk7Z96zDLGuiuucTC-ozpetvC8n4uM3PhQOofPq5M,5548
76
+ seqforge/kb/specs/bd-rhapsody-wta-enhanced-v2/spec.yaml,sha256=GIQqRqIWIOgqVi9W-gmawE5fgtbpuvvdjgNe__RDy4k,4113
77
+ seqforge/kb/specs/bulk-rnaseq-pe/README.md,sha256=sJU_LjARSjlwvyOy-9xKMMzd8gVe2CocXdrHTO3C9Z8,1634
78
+ seqforge/kb/specs/bulk-rnaseq-pe/spec.yaml,sha256=DekklZ00CejU_Qv2WvlzuQBchr_7qo-x46ko1cPJjMc,5174
79
+ seqforge/kb/specs/splitseq/README.md,sha256=YPeZ0PZ8-qvT108WCqaWMlkwEnXaRk1cjqKdb4dmoMI,2584
80
+ seqforge/kb/specs/splitseq/spec.yaml,sha256=LWe3gd3ZtQxAxLB6S9eJmFLguikxOklaGrR2r7KIiSc,10737
81
+ seqforge/manifest/__init__.py,sha256=GJday3FGjUiakEfE4MMUWaQ8ktpS-N2Tt0OWUuO4sLo,1919
82
+ seqforge/manifest/fill.py,sha256=OmK_IfwhhJp3IDME9l26PZzNWD5H70fsO-A5qqrrrog,22880
83
+ seqforge/manifest/hash.py,sha256=rbWZdEu9K7T_TdRaVdH85B2wwMFrVAXgHphcbfsaS4Q,3545
84
+ seqforge/manifest/instruct.py,sha256=3YQnJbj35wpr4VRJ5-BRqE81vRj3Tf0KaIBEgV3usyo,5298
85
+ seqforge/manifest/policy.py,sha256=uEiOPK94q7_vZnbqo5iF-QQ2PiahXkT64bDAQtJptas,21621
86
+ seqforge/manifest/validate.py,sha256=dR7v5giYHssqxSWqXiERmP5oKno2TNQEW3XdtViH-qo,13387
87
+ seqforge/models/__init__.py,sha256=vx9B2tWGURpN2EAACFiob5_ftPvy1DMoCQbzJahYfs8,6173
88
+ seqforge/models/assertion.py,sha256=QzPpmOiLpGUQhz1NLu2qo6l9qiGvWGKNdRXPykxJyQY,2256
89
+ seqforge/models/base.py,sha256=I_X8w-GUDLyzcL0AdYIq0KqfC8lm6t_wtW-oi8xOc4s,4184
90
+ seqforge/models/blocker.py,sha256=dbeW_rOVBtd3MtMwfHs0AcOIbc9PvaCMxjBULz6XtdA,3154
91
+ seqforge/models/conflict.py,sha256=tKLNJ3ouDaSc8R6YL2P4IZg30-m2HuVoPg6cp4XwX38,1458
92
+ seqforge/models/dataset.py,sha256=Ccz9zjMBOZ7Nz5ORgVgD_4iciWfUOiJxSlXx00Rigc8,14051
93
+ seqforge/models/evidenced.py,sha256=eCtxAVZOmr301OVY65qv_q-1oOTfKG90EhZgrrjedeE,1957
94
+ seqforge/models/observation.py,sha256=nFGclFpP2mBwVMtV9p7NviaYLLPe1iSp-fajg0183xU,4726
95
+ seqforge/models/processing.py,sha256=nsXYlMLsxPdrwmLfJRBrF7s0QVm_GfZE9Zjf46Gvtwc,10129
96
+ seqforge/models/records.py,sha256=d1QKeM0sbGu7HQGy11ZQ6miTkpJA6uGsdHaJ6G2z_IE,6174
97
+ seqforge/models/resolve.py,sha256=zB5cfb8cTs0pUE5cjmKEGv2Zbl5XdlzATajQTSP-wIM,8219
98
+ seqforge/probe/__init__.py,sha256=J-7aOMXqWJMJXiklS05M7qabZjh8n3-Ja9oCoEIB-pk,1887
99
+ seqforge/probe/core.py,sha256=K_RzrtZNE41uO0v_jeGMYuyRTKqiwSSHu0W6rHSNfRU,9624
100
+ seqforge/probe/signals.py,sha256=DU5jovkz-Htpoh3MokM_1SSZclpGuW0gBVGSwUf-pXQ,8596
101
+ seqforge/probe/streaming.py,sha256=qbsmWVxgXIdbfsUvFDEbOV9iFuMnOdX_TnfOmhR1doY,4979
102
+ seqforge/resolve/__init__.py,sha256=ClKTGveNBr98iclZdA99W9asJt0BH7ts_Xvzz0mB9ZU,6427
103
+ seqforge/resolve/assign.py,sha256=q5J4jrjrX9AniZozXE1rkfIXV4MBiYuaAvPcKlUNr08,8722
104
+ seqforge/resolve/cache.py,sha256=2GieVZpp-HoelCqj8A7vYuBGGwpi61A4mAkf-Agojfc,4811
105
+ seqforge/resolve/confuse.py,sha256=6WtAmQxsMN3depTtxlSMQVMvSVn3atF5lFbgENCNXoA,10564
106
+ seqforge/resolve/engine.py,sha256=dicXbJdDWHBjDcDjw9NjtlH7yp5dqJJtMjYvITNgN1A,31124
107
+ seqforge/resolve/escalate.py,sha256=V4G2NygrI2dvz5LJIQOkYDIC5azfx93i_VLX3Lvk61U,30396
108
+ seqforge/resolve/evaluators.py,sha256=BXg8ZP0cJmgSXQaf0P_DAiKROzdgm1u5x5ZmxI0tyQM,13586
109
+ seqforge/resolve/geometry.py,sha256=bN0zGa-ZHv0ZsD_3GSARakmcUsigM9H3V0UoeHbF1OM,4199
110
+ seqforge/resolve/group.py,sha256=ucpfWSAAbbnzhrTzne1mUlsvxLKuLgYW3kzu_9OsKYw,4663
111
+ seqforge/resolve/records.py,sha256=38diluPsgsyAuzga9IuOesVzOdxJMY3aCFSKGjjklgo,25700
112
+ seqforge/resolve/scoring.py,sha256=-m9pUT-YjvDb2EnIw3GtwBlfgvm0vjeoScZil_mQTbI,17160
113
+ seqforge/resolve/window.py,sha256=AG3ory4P64AdL5nXGClVbijlYwoqgq6DRjagFhuFMbw,8393
114
+ seqforge/workflows/__init__.py,sha256=VSoR5rvkVin7wT8RP2tNEsyfH2o9u0KAFifRsjPyYhU,12799
115
+ seqforge/workflows/cram.py,sha256=y7pwNjgw5Dw8JPI33QJzHdp-YHh_DscdrCOlHRXsmPw,5997
116
+ seqforge/workflows/h5ad.py,sha256=2t8-tFP3VScA-Wh6A4ooTEibFX5zjvJ8hpkYOqSneLA,17760
117
+ seqforge/workflows/qc.py,sha256=uPro9Ma0L35etXF0s7Rx5Yw2a4TjwqhzoAt0J4nuovA,6095
118
+ seqforge/workflows/map/star.smk,sha256=uoSzrdc5L_g6hZnQkc8tTazfCI6WOux2xeaDFLMpsm4,4677
119
+ seqforge/workflows/map/starsolo.smk,sha256=ITXi2bYb-kOjIrY1LAV1aZYNGHiHFYoIMUFUoTBEPj8,18902
120
+ seqforge-2026.7.1.dist-info/METADATA,sha256=-SY8UtxMG6ON2Ekdbu3CDEPIuwYj_3EE_haSWr9fYoQ,6281
121
+ seqforge-2026.7.1.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
122
+ seqforge-2026.7.1.dist-info/entry_points.txt,sha256=pQptwtL5F2LFrRG3h4BbWud3JHgjSjw3nevi91v6on8,46
123
+ seqforge-2026.7.1.dist-info/licenses/LICENSE,sha256=YqrYteEs2ICOm_LU9wLTCWngjkabTAbpEDae3cmVDac,1064
124
+ seqforge-2026.7.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.31.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ seqforge = seqforge.cli:app
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Liu Lab
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.