Packaging & install-path cleanup¶
The tool itself is solid — MCP surface works, pyproject.toml is a disciplined single source of truth for Python deps, extras-based subpackage opt-in is clean. But the umbrella repo is doing three jobs at once (tool code, dev-loop umbrella, research-data mirror), and end users pay for all three on uv tool install git+…. Separating them is small work with large DX gains.
A. uv tool install git+… is broken¶
uv tool install git+https://github.com/arashshahidi1997/projio fails because uv runs git submodule update --init --recursive by default. Two distinct problems:
packages/figiohas a broken URL in.gitmodules:url = ./packages/figio. This is a self-referential repo-relative path, not a standalone repo URL. Recursion into it cannot succeed..projio/codio/mirrors/registers 14 research-data submodules (snakemake, grobid×2, biblio-glutton, oadoi, openalex×6, pyzotero, zotero×2). These aren't runtime deps of projio — they're codio's mirrors of upstream research infra — yet every git-install pulls them.
Severity: high. uv tool install git+… is the natural "install from source" path for a Python CLI in 2026. Today it only completes with --no-recurse-submodules, which isn't advertised anywhere.
Fixes, priority order:
- [ ] Move
.projio/codio/mirrors/*out of the repo. Fetch lazily into~/.cache/codio/mirrors/on first use, or via acodio mirrors fetchsubcommand. Tool repo should contain tool code. - [ ] Fix or drop the
packages/figiosubmodule URL. One-line fix; unblocks users who know to pass--no-recurse-submodules. - [ ] Decide what
packages/*submodules are for. PyPI extras already pull subpackages (projio[all]→ indexio, biblio, notio, codio, pipeio, figio). Submodules duplicate this for the dev loop. Two clean options: - Drop from
.gitmodules; providescripts/dev-clone-siblings.shfor contributors. - Keep but declare
update = noneso they're opt-in.
B. pandoc is invisible to pip/uv users¶
pixi.toml declares pandoc >=3.1; pyproject.toml doesn't. pip/uv users hit opaque runtime errors on pandoc-backed features.
- [ ] Add a
pandocextra that pullspypandoc_binary(pandoc bundled as a wheel — no system install needed). Thenuv tool install 'projio[all,pandoc]'is fully self-contained. datalad/git-annex stay pixi-only and get documented under "full environment".
C. Release/upgrade story is undocumented¶
Six subpackages on PyPI with loose >= pins and independent versions. uv tool upgrade projio may or may not pull fresh subpackages.
- [ ] Document the install matrix in the README (proposed below).
- [ ] Pick a versioning contract across sibling packages: lockstep (pin
==X.Y.Z) or genuinely independent (current). Flag the choice. - [ ] If the git-install path is preserved, document the
uv tool upgrade projio --reinstallpitfall (uv doesn't refetch git revs on plain upgrade).
D. Repo hygiene¶
src/layout — good.pixi.tomlcorrectly defers Python deps topyproject.toml— keep this, call it out inCONTRIBUTING.md..gitmodulesmixes "dev umbrella" submodules with "research data mirrors" — conflates two concerns. Resolved automatically by the §A cleanup.- Consider a
config_versionfield in.projio/config.ymlwith a warn-on-mismatch check. Prevents "my config looks right but nothing works" tickets from config schema evolution.
E. MCP surface papercuts (non-blocking)¶
- No tool returns "which note types have templates for THIS project" vs. globally configured. Would help when
note_createfails. - No bulk operation surface (e.g.,
note_update_bulk(filter=..., patch=...)). Triaging 30 open tasks one-at-a-time is tedious.
Proposed README install matrix¶
| Use case | Command |
|---|---|
| End-user, CLI only | uv tool install 'projio[all,pandoc]' |
| End-user, full env w/ datalad | clone repo; pixi install |
| Developing projio | git clone --no-recurse-submodules …; uv tool install -e '…/projio[all,pandoc,dev]' |
| Developing projio + sibling repos | scripts/dev-clone-siblings.sh && uv tool install -e '…/projio[all,dev]' --with-editable …/notio … |
After the §A fixes, this matrix is actually true. Today it isn't.
Priority ordering¶
- Move
.projio/codio/mirrors/*out — biggest single win. - Fix
packages/figiosubmodule URL — one line, unblocks--no-recurse-submodulesusers. - Add
pandocextra viapypandoc_binary— two-line pyproject change. - Document install matrix +
--no-recurse-submodulescaveat — README edit. - Drop
packages/*from.gitmodules— bigger refactor; do last.
Verification notes (spot-checked against current tree)¶
.gitmodulesline 28:url = ./packages/figio— confirmed self-referential..projio/codio/mirrors/submodule count: 14 — confirmed..projio/config.ymlline 13:notio.notes_dir: docs/log/— honored (notes land atdocs/log/). An earlier draft of this feedback claimed drift here; there is no drift.config_versionrecommendation in §D stands on its own merits, not on that example.