teddi-tool 2026.11.1__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.
- teddi_tool-2026.11.1/.agents/FILES.md +42 -0
- teddi_tool-2026.11.1/.agents/HISTORY.md +54 -0
- teddi_tool-2026.11.1/.agents/MAINTENANCE.md +37 -0
- teddi_tool-2026.11.1/.agents/ONBOARDING.md +68 -0
- teddi_tool-2026.11.1/.agents/POLICIES.md +87 -0
- teddi_tool-2026.11.1/.agents/TOOLS.md +65 -0
- teddi_tool-2026.11.1/.agents/policies/dox-authoring.md +73 -0
- teddi_tool-2026.11.1/.agents/policies/plans-and-docs.md +45 -0
- teddi_tool-2026.11.1/.config/mise/conf.d/docs.toml +7 -0
- teddi_tool-2026.11.1/.config/mise/conf.d/format.toml +11 -0
- teddi_tool-2026.11.1/.config/mise/conf.d/lint.toml +15 -0
- teddi_tool-2026.11.1/.config/mise/conf.d/mcp.toml +8 -0
- teddi_tool-2026.11.1/.config/mise/conf.d/quality.toml +24 -0
- teddi_tool-2026.11.1/.config/mise/conf.d/skills.toml +5 -0
- teddi_tool-2026.11.1/.config/mise/conf.d/tasks.toml +3 -0
- teddi_tool-2026.11.1/.config/mise/config.toml +23 -0
- teddi_tool-2026.11.1/.config/mise/data/dev-features.csv +21 -0
- teddi_tool-2026.11.1/.config/mise/data/skills.csv +16 -0
- teddi_tool-2026.11.1/.config/mise/scripts/install_dev_features.py +234 -0
- teddi_tool-2026.11.1/.config/pyreorder.toml +49 -0
- teddi_tool-2026.11.1/.config/rumdl.toml +72 -0
- teddi_tool-2026.11.1/.copier-answers.yml +24 -0
- teddi_tool-2026.11.1/.gitattributes +32 -0
- teddi_tool-2026.11.1/.github/workflows/ci.yml +150 -0
- teddi_tool-2026.11.1/.github/workflows/docs.yml +58 -0
- teddi_tool-2026.11.1/.github/workflows/release.yml +136 -0
- teddi_tool-2026.11.1/.gitignore +100 -0
- teddi_tool-2026.11.1/.pre-commit-config.yaml +33 -0
- teddi_tool-2026.11.1/AGENTS.md +154 -0
- teddi_tool-2026.11.1/LICENSE +21 -0
- teddi_tool-2026.11.1/PKG-INFO +125 -0
- teddi_tool-2026.11.1/README.md +90 -0
- teddi_tool-2026.11.1/docs/code_of_conduct.md +43 -0
- teddi_tool-2026.11.1/docs/contributing.md +53 -0
- teddi_tool-2026.11.1/docs/credits.md +9 -0
- teddi_tool-2026.11.1/docs/development.md +179 -0
- teddi_tool-2026.11.1/docs/index.md +79 -0
- teddi_tool-2026.11.1/docs/license.md +11 -0
- teddi_tool-2026.11.1/docs/reference/api.md +89 -0
- teddi_tool-2026.11.1/docs/usage.md +75 -0
- teddi_tool-2026.11.1/pyproject.toml +106 -0
- teddi_tool-2026.11.1/ruff.toml +73 -0
- teddi_tool-2026.11.1/scripts/gen_credits.py +29 -0
- teddi_tool-2026.11.1/scripts/release_notes.py +132 -0
- teddi_tool-2026.11.1/skills/cli-teddi/SKILL.md +79 -0
- teddi_tool-2026.11.1/skills/mcp-teddi/SKILL.md +108 -0
- teddi_tool-2026.11.1/src/teddi_tool/AGENTS.md +71 -0
- teddi_tool-2026.11.1/src/teddi_tool/__about__.py +17 -0
- teddi_tool-2026.11.1/src/teddi_tool/__init__.py +28 -0
- teddi_tool-2026.11.1/src/teddi_tool/__main__.py +6 -0
- teddi_tool-2026.11.1/src/teddi_tool/cli/__init__.py +3 -0
- teddi_tool-2026.11.1/src/teddi_tool/cli/app.py +33 -0
- teddi_tool-2026.11.1/src/teddi_tool/cli/args.py +53 -0
- teddi_tool-2026.11.1/src/teddi_tool/cli/commands.py +47 -0
- teddi_tool-2026.11.1/src/teddi_tool/client.py +191 -0
- teddi_tool-2026.11.1/src/teddi_tool/http_client.py +53 -0
- teddi_tool-2026.11.1/src/teddi_tool/models.py +95 -0
- teddi_tool-2026.11.1/src/teddi_tool/parser.py +182 -0
- teddi_tool-2026.11.1/src/teddi_tool/search_utils.py +159 -0
- teddi_tool-2026.11.1/src/teddi_tool/server.py +102 -0
- teddi_tool-2026.11.1/tests/AGENTS.md +47 -0
- teddi_tool-2026.11.1/tests/__init__.py +1 -0
- teddi_tool-2026.11.1/tests/conftest.py +17 -0
- teddi_tool-2026.11.1/tests/fixtures/.gitkeep +0 -0
- teddi_tool-2026.11.1/tests/test_client.py +145 -0
- teddi_tool-2026.11.1/tests/test_http_client.py +50 -0
- teddi_tool-2026.11.1/tests/test_models.py +122 -0
- teddi_tool-2026.11.1/tests/test_parser.py +175 -0
- teddi_tool-2026.11.1/ty.toml +18 -0
- teddi_tool-2026.11.1/uv.lock +2106 -0
- teddi_tool-2026.11.1/zensical.toml +167 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# AGENTS.md — FILES
|
|
2
|
+
|
|
3
|
+
Single source of truth for paths, config keys, and naming conventions.
|
|
4
|
+
Kept compact — agents hallucinate less when they know where definitions live.
|
|
5
|
+
|
|
6
|
+
## Pattern
|
|
7
|
+
|
|
8
|
+
- One file owns each class of definition (paths, config defaults, enums).
|
|
9
|
+
- Import from that file. Never hard-code values in other modules.
|
|
10
|
+
- Variables that address files get `_file` suffix; directories get `_dir`.
|
|
11
|
+
|
|
12
|
+
## Project-specific sources of truth
|
|
13
|
+
|
|
14
|
+
| What | Where | Key names |
|
|
15
|
+
|------|-------|-----------|
|
|
16
|
+
| Pydantic models & enums | `src/teddi_tool/models.py` | `SearchIn`, `SearchPattern`, `TechnicalBody`, `OutputFormat`, `SearchRequest`, `SearchResponse`, `TermResult`, `DocumentRef` |
|
|
17
|
+
| TEDDI endpoint URL | `src/teddi_tool/client.py:21` | `TEDDI_SEARCH_URL` = `https://webapp.etsi.org/Teddi/Main.asp` |
|
|
18
|
+
| Enum → TEDDI form values | `src/teddi_tool/client.py:24`–`35` | `SEARCH_IN_TO_PARAM`, `SEARCH_PATTERN_TO_PARAM` |
|
|
19
|
+
| TEDDI form field names | `src/teddi_tool/client.py:124`–`140` | `qWhatToSearch`, `qWhereOption`, `qWhatOption`, `qShowTBs` |
|
|
20
|
+
| HTTP session + cache | `src/teddi_tool/http_client.py:13` | `create_cached_teddi_async_client(cache_dir=None, cache_ttl=7200)`; DB `.cache/teddi_http.sqlite3` |
|
|
21
|
+
| HTML → models | `src/teddi_tool/parser.py:17` | `parse_teddi_response(html_content)` |
|
|
22
|
+
| Source protocol / client | `src/teddi_tool/client.py:38`, `:75` | `TeddiSource`, `TeddiClient` |
|
|
23
|
+
| Shared search + output | `src/teddi_tool/search_utils.py` | `execute_search`, `execute_list_bodies`, `build_results_payload`, `parse_technical_bodies`, `serialize_payload`, `render_table` |
|
|
24
|
+
| Shared CLI options | `src/teddi_tool/cli/args.py` | `TermArgument`, `ScopeOption`, `PatternOption`, `TechnicalBodiesOption`, `OutputOption` |
|
|
25
|
+
| CLI app and commands | `src/teddi_tool/cli/app.py`, `src/teddi_tool/cli/commands.py` | `search-term`, `list-bodies`, `server` commands |
|
|
26
|
+
| MCP server & tools | `src/teddi_tool/server.py` | `search_teddi`, `get_term_info`, `list_technical_bodies` |
|
|
27
|
+
| Console scripts | `pyproject.toml` → `[project.scripts]` | `teddi-tool`, `teddi`, `teddi-cli`, `teddi-mcp` |
|
|
28
|
+
| Lint/format defaults | `ruff.toml` | `line-length = 100`, `target-version = "py313"`, Google docstrings |
|
|
29
|
+
| Type-check defaults | `ty.toml` | `python-version = "3.13"`, `error-on-warning = true` |
|
|
30
|
+
| Test config | `pyproject.toml` → `[tool.pytest.ini_options]`, `[tool.coverage.*]` | `asyncio_mode = "auto"`, `testpaths = ["tests"]` |
|
|
31
|
+
| Test fixtures | `tests/fixtures/` (`.gitkeep`) | Reserved for reused TEDDI HTML payloads; exposed as the `test_data_dir` fixture in `tests/conftest.py` |
|
|
32
|
+
| Task definitions | `.config/mise/config.toml`, `.config/mise/conf.d/*.toml` | `dev`, `test`, `lint`, `lint-check`, `typecheck`, `spell`, `format`, `format-md`, `docs`, `all`, `release-notes` |
|
|
33
|
+
| Release automation | `.github/workflows/{ci,docs,release}.yml`, `scripts/release_notes.py` | CI matrix, Pages deploy, tag release + PyPI trusted publishing, LLM notes |
|
|
34
|
+
| Project version | `src/teddi_tool/__about__.py`, git tag | dynamic versioning (`uv-dynamic-versioning`) |
|
|
35
|
+
| Docs site | `zensical.toml`, `docs/` | nav, site URL, mkdocstrings config |
|
|
36
|
+
| Project skills | `skills/cli-teddi/SKILL.md`, `skills/mcp-teddi/SKILL.md` | — |
|
|
37
|
+
| User docs | `docs/index.md`, `docs/usage.md`, `docs/reference/api.md`, `docs/development.md` | — |
|
|
38
|
+
|
|
39
|
+
## Subdirectory
|
|
40
|
+
|
|
41
|
+
If this file grows past its size budget, split detail into
|
|
42
|
+
`.agents/files/<name>.md` — every file there MUST be listed above.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# AGENTS.md — HISTORY
|
|
2
|
+
|
|
3
|
+
State file. The one file that may reference the past — sparingly. Read when
|
|
4
|
+
relevant to the current task; long-term memory for decisions, not a log.
|
|
5
|
+
Routine history lives in git; only record what is costly to rediscover.
|
|
6
|
+
|
|
7
|
+
## Format
|
|
8
|
+
|
|
9
|
+
| Date | Decision | Rationale | Git ref |
|
|
10
|
+
| ---- | -------- | --------- | ------- |
|
|
11
|
+
| YYYY-MM-DD | [description] | [why] | [commit hash/tag] |
|
|
12
|
+
|
|
13
|
+
## Record
|
|
14
|
+
|
|
15
|
+
- High-level architectural decisions and breaking changes.
|
|
16
|
+
- Dependency, tooling, and platform choices — including the alternative that lost.
|
|
17
|
+
- False turns and rejected approaches, with the reason.
|
|
18
|
+
- Completion of an implementation plan (link to its archive below).
|
|
19
|
+
|
|
20
|
+
## Do not record
|
|
21
|
+
|
|
22
|
+
- Routine commits, refactor logs, session activity, release notes.
|
|
23
|
+
- Anything obvious from git, the code, or current AGENTS.md/state files.
|
|
24
|
+
|
|
25
|
+
## Guidance
|
|
26
|
+
|
|
27
|
+
- Keep entries brief — enough to reconstruct the reasoning.
|
|
28
|
+
- Link to the relevant commits or tags.
|
|
29
|
+
- If this file grows large, move older entries to `.agents/history/` and keep
|
|
30
|
+
a pointer here.
|
|
31
|
+
- Completed implementation plans are archived as single files at
|
|
32
|
+
`.agents/history/<YYYY-MM-DD-plan-name>.md` and linked from the decision
|
|
33
|
+
entry they belong to. The trigger to archive is **plan completion**, not
|
|
34
|
+
file growth — see `.agents/policies/plans-and-docs.md`.
|
|
35
|
+
|
|
36
|
+
## Decisions
|
|
37
|
+
|
|
38
|
+
| Date | Decision | Rationale | Git ref |
|
|
39
|
+
| ---- | -------- | --------- | ------- |
|
|
40
|
+
| 2026-03-19 | Repository split out of `tdoc-crawler` into a standalone `teddi-mcp` package | TEDDI lookup had no dependency on the 3GPP tdoc crawler; separate release and packaging | `08a2984` |
|
|
41
|
+
| 2026-03-20 | Lint and type-check config moved out of `pyproject.toml` into `ruff.toml` and `ty.toml` | Dedicated tool config files keep `pyproject.toml` about packaging; `ty.toml` enables `error-on-warning` | `3075a71` |
|
|
42
|
+
| 2026-03-20 | Task/tool config consolidated under `.config/mise/` with per-topic `conf.d/*.toml` | One task runner (`mise`) for format, lint, quality, skills, MCP registration instead of ad-hoc scripts | `d0a0208` |
|
|
43
|
+
| 2026-11-10 | Adopted the agents-scaffold DOX hierarchy; root `AGENTS.md` reduced to rail + state-file index | Old `AGENTS.md` was a 96-line design document injected on every call; content moved into `.agents/` and `src/teddi_tool/AGENTS.md` | uncommitted at adoption |
|
|
44
|
+
| 2026-11-10 | Dropped `refresh_ttl_on_access` from `create_cached_teddi_async_client`; hishel 2.x TTL is fixed at write time | The keyword no longer exists in `hishel.AsyncSqliteStorage` (it raised `TypeError` on every cache-backed client), and 2.x exposes no refresh-on-access API | uncommitted |
|
|
45
|
+
| 2026-11-11 | Renamed distribution/package to `teddi-tool` / `teddi_tool` and adopted the copier-uv-plus template (Cyclopts CLI, Zensical docs, GitHub Actions, tag versioning) | The project is a CLI as well as an MCP server; `teddi-mcp` misrepresented it. `teddi-tool` and the other candidate names are free on PyPI; `teddi` is taken | see migration commits |
|
|
46
|
+
|
|
47
|
+
## Archived plans
|
|
48
|
+
|
|
49
|
+
None yet. Completed plans land in `.agents/history/<YYYY-MM-DD-plan-name>.md`.
|
|
50
|
+
|
|
51
|
+
## Archive a plan
|
|
52
|
+
|
|
53
|
+
Procedure, naming, and the completion trigger — see
|
|
54
|
+
`.agents/policies/plans-and-docs.md` → Archive a plan.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# AGENTS.md — MAINTENANCE
|
|
2
|
+
|
|
3
|
+
How to keep `.agents/` files current.
|
|
4
|
+
|
|
5
|
+
## Process
|
|
6
|
+
|
|
7
|
+
1. When a rule changes, update the owning file — never another file.
|
|
8
|
+
2. When adding a new state file or directory under `.agents/`, add it to the
|
|
9
|
+
index table in root `AGENTS.md` and to **File update triggers** below.
|
|
10
|
+
3. After any `.agents/` change, check the index for stale entries.
|
|
11
|
+
|
|
12
|
+
## Principles
|
|
13
|
+
|
|
14
|
+
- **Single source of truth.** Each rule lives in exactly one file. The tier,
|
|
15
|
+
pointer, rationale, and size rules are in **DOX authoring**
|
|
16
|
+
(`.agents/policies/dox-authoring.md`) — consult it on every DOX change.
|
|
17
|
+
- **AGENTS.md is an index.** It points to `.agents/` files, does not replace them.
|
|
18
|
+
- **No logbooks.** State files describe current contracts; git owns history — see `.agents/POLICIES.md`.
|
|
19
|
+
- **State files stay lean.** When a file approaches its size budget, split
|
|
20
|
+
detail into the matching subdirectory (`.agents/files/`, `.agents/policies/`,
|
|
21
|
+
`.agents/tools/`, `.agents/maintenance/`) — every file there MUST be listed
|
|
22
|
+
in its state file.
|
|
23
|
+
|
|
24
|
+
## File update triggers
|
|
25
|
+
|
|
26
|
+
| File / Dir | Update when |
|
|
27
|
+
| ------------ | ------------- |
|
|
28
|
+
| `ONBOARDING.md` | Project structure, tooling, or entry points change |
|
|
29
|
+
| `POLICIES.md` | Boundaries, priorities, or verification change |
|
|
30
|
+
| `FILES.md` | Path constants, config keys, or naming conventions change |
|
|
31
|
+
| `TOOLS.md` | Tools, MCP servers, skills, or CLIs added, removed, or changed |
|
|
32
|
+
| `HISTORY.md` | Notable decision made or resolved |
|
|
33
|
+
| `MAINTENANCE.md` | Maintenance procedures, triggers, or principles change |
|
|
34
|
+
| `plans/` | New feature implementation starts |
|
|
35
|
+
| `history/` | HISTORY.md overflow or completed plans archived |
|
|
36
|
+
| `files/`, `policies/`, `tools/`, `maintenance/` | State files split into subdirectories |
|
|
37
|
+
| `../src/teddi_tool/AGENTS.md`, `../tests/AGENTS.md` | Module layout, contracts, or test conventions change |
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# AGENTS.md — ONBOARDING
|
|
2
|
+
|
|
3
|
+
Read this when starting a new session. After first read, only revisit when
|
|
4
|
+
project structure or tooling changes significantly.
|
|
5
|
+
|
|
6
|
+
## Project
|
|
7
|
+
|
|
8
|
+
`teddi-tool` — Cyclopts CLI and FastMCP server for ETSI TEDDI term/abbreviation
|
|
9
|
+
lookup. Distributed on PyPI, documented at
|
|
10
|
+
<https://jr2804.github.io/teddi-tool/>. Full docs at `README.md` and `docs/`.
|
|
11
|
+
|
|
12
|
+
## Quick start
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
mise install # pinned tools (uv, ruff, ty, rumdl, ...)
|
|
16
|
+
mise dev # uv sync -U --dev --all-extras --all-groups
|
|
17
|
+
mise test # pytest with coverage
|
|
18
|
+
mise lint # ruff check --fix --unsafe-fixes
|
|
19
|
+
mise lint-check # ruff check (CI mode)
|
|
20
|
+
mise typecheck # ty check
|
|
21
|
+
mise spell # codespell
|
|
22
|
+
mise format # pyreorder + ruff format + import sort
|
|
23
|
+
mise docs # zensical build
|
|
24
|
+
mise all # everything above
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Direct commands also work: `uv run pytest tests/ -v`, `uv run ruff check
|
|
28
|
+
src/ tests/`, `uv run ty check`.
|
|
29
|
+
|
|
30
|
+
## Entry points (read these first)
|
|
31
|
+
|
|
32
|
+
| File | Why |
|
|
33
|
+
|------|-----|
|
|
34
|
+
| `AGENTS.md` | Root rail — rules + `.agents/` index |
|
|
35
|
+
| `.agents/POLICIES.md` | Boundaries, priorities, verification |
|
|
36
|
+
| `.agents/FILES.md` | Source-of-truth locations |
|
|
37
|
+
| `src/teddi_tool/AGENTS.md` | Contracts for the package you are editing |
|
|
38
|
+
| `tests/AGENTS.md` | Test conventions |
|
|
39
|
+
|
|
40
|
+
## Where to dig deeper
|
|
41
|
+
|
|
42
|
+
- `docs/` — `index.md`, `usage.md`, `reference/api.md`, `development.md`
|
|
43
|
+
- `.agents/TOOLS.md` — tools, MCP servers, skills, CLIs in use
|
|
44
|
+
- `.agents/HISTORY.md` — past decisions and rationale
|
|
45
|
+
- `skills/cli-teddi/SKILL.md`, `skills/mcp-teddi/SKILL.md` — task-level usage recipes
|
|
46
|
+
|
|
47
|
+
## Executables
|
|
48
|
+
|
|
49
|
+
| Command | Module | Purpose |
|
|
50
|
+
|---------|--------|---------|
|
|
51
|
+
| `teddi-tool`, `teddi` | `src/teddi_tool/cli/app.py` | Search, `list-bodies`, `server` |
|
|
52
|
+
| `teddi-cli` | `src/teddi_tool/cli/app.py` | Alias kept for existing scripts |
|
|
53
|
+
| `teddi-mcp` | `src/teddi_tool/server.py` | MCP server (stdio) |
|
|
54
|
+
|
|
55
|
+
## Available tools
|
|
56
|
+
|
|
57
|
+
Development tools, MCP servers, skills, and CLIs are inventoried in the
|
|
58
|
+
state file `.agents/TOOLS.md` — read it before assuming a tool, update it
|
|
59
|
+
when tooling changes. If tooling grows large, detail moves to
|
|
60
|
+
`.agents/tools/<name>.md` (each listed in TOOLS.md).
|
|
61
|
+
|
|
62
|
+
## Project lifecycle
|
|
63
|
+
|
|
64
|
+
- Releases: push a `v*` tag; `.github/workflows/release.yml` builds, writes
|
|
65
|
+
LLM release notes (`scripts/release_notes.py`), creates the GitHub release,
|
|
66
|
+
and publishes to PyPI via OIDC trusted publishing.
|
|
67
|
+
- Template: generated from copier-uv-plus; `.copier-answers.yml` drives
|
|
68
|
+
`copier update`.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# AGENTS.md — POLICIES
|
|
2
|
+
|
|
3
|
+
Always applicable. Boundaries, priorities, verification, checklist.
|
|
4
|
+
|
|
5
|
+
Detail files (`.agents/policies/`):
|
|
6
|
+
|
|
7
|
+
| File | Covers |
|
|
8
|
+
| ---- | ------ |
|
|
9
|
+
| `dox-authoring.md` | Tiering, reference-don't-restate, content rules, state-file subdirectories, size budget |
|
|
10
|
+
| `plans-and-docs.md` | Implementation plans, plan archiving, documentation/history rules |
|
|
11
|
+
|
|
12
|
+
## Priorities
|
|
13
|
+
|
|
14
|
+
1. Correctness
|
|
15
|
+
2. Evidence
|
|
16
|
+
3. Safety
|
|
17
|
+
4. Minimal changes
|
|
18
|
+
5. Consistency
|
|
19
|
+
6. Performance
|
|
20
|
+
|
|
21
|
+
## Boundaries
|
|
22
|
+
|
|
23
|
+
- NEVER fabricate paths, commits, APIs, config keys, env vars, test results,
|
|
24
|
+
or benchmark numbers. If you don't know, say so.
|
|
25
|
+
- NEVER guess at command names, flags, or paths. Read source or run `--help`.
|
|
26
|
+
- NEVER add secrets, API keys, or tokens to files. Use env vars.
|
|
27
|
+
- NEVER run destructive commands (`rm -rf`, `git reset --hard`,
|
|
28
|
+
`git push --force`) without explicit confirmation.
|
|
29
|
+
- NEVER delete or move files without explicit instruction.
|
|
30
|
+
- NEVER create temp files in project root. Use dedicated temp dir.
|
|
31
|
+
|
|
32
|
+
Project-specific:
|
|
33
|
+
|
|
34
|
+
- Do not hit the live TEDDI endpoint from tests or automation — mock the
|
|
35
|
+
`httpx` client (see `tests/AGENTS.md`).
|
|
36
|
+
- Do not commit `.cache/`, `tests/.cache/`, or `.agents/plans/`.
|
|
37
|
+
- TEDDI has no public API contract. Treat the scraped page shape as evidence
|
|
38
|
+
that must be re-checked, never as prior knowledge.
|
|
39
|
+
|
|
40
|
+
## Change constraints
|
|
41
|
+
|
|
42
|
+
- Minimal, surgical edits. Preserve existing style.
|
|
43
|
+
- No new dependencies without explicit instruction.
|
|
44
|
+
- No unrelated refactoring while fixing a bug.
|
|
45
|
+
- A model/enum change is a cross-layer change — see `src/teddi_tool/AGENTS.md`
|
|
46
|
+
→ Work Guidance before editing `src/teddi_tool/models.py`.
|
|
47
|
+
|
|
48
|
+
## Code quality
|
|
49
|
+
|
|
50
|
+
Universal defaults. Project-specific standards live in child AGENTS.md.
|
|
51
|
+
|
|
52
|
+
- **SRP** — one reason to change per module/function.
|
|
53
|
+
- **DRY** — check before adding. Extract on third occurrence (Rule of Three).
|
|
54
|
+
- **Redundant code** — remove dead branches, unreachable conditions, unused
|
|
55
|
+
params/imports before finishing.
|
|
56
|
+
- **Duplication vs. abstraction** — prefer duplication over wrong premature
|
|
57
|
+
abstraction.
|
|
58
|
+
- No new code-quality tooling by default — opt in per project.
|
|
59
|
+
|
|
60
|
+
## Completion checklist
|
|
61
|
+
|
|
62
|
+
- Change solves the stated problem
|
|
63
|
+
- Relevant validation ran (or gaps stated)
|
|
64
|
+
- No unintended side effects or secrets exposed
|
|
65
|
+
|
|
66
|
+
## Verification
|
|
67
|
+
|
|
68
|
+
Run from the repository root:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
mise test # pytest with coverage
|
|
72
|
+
mise lint-check # ruff check (no fixes)
|
|
73
|
+
mise typecheck # ty check
|
|
74
|
+
mise spell # codespell
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Direct equivalents: `uv run pytest`, `uv run ruff check src/ tests/`,
|
|
78
|
+
`uv run ty check`. `ty.toml` sets `error-on-warning = true`. CI (`.github/workflows/ci.yml`)
|
|
79
|
+
runs `lint-check`, `typecheck`, `spell`, and the test matrix.
|
|
80
|
+
|
|
81
|
+
## Response format
|
|
82
|
+
|
|
83
|
+
Concise and specific. No filler, intros, or restated requirements.
|
|
84
|
+
Answer direct questions directly.
|
|
85
|
+
|
|
86
|
+
For review/debugging/analysis: findings with references, conclusion,
|
|
87
|
+
approach. Mention caveats.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# AGENTS.md — TOOLS
|
|
2
|
+
|
|
3
|
+
State file: inventory of tools used in development — CLIs, MCP servers,
|
|
4
|
+
skills, runtimes, and project scripts. Demand-loaded like all state files;
|
|
5
|
+
keep it current (see `.agents/MAINTENANCE.md`).
|
|
6
|
+
|
|
7
|
+
## Rules
|
|
8
|
+
|
|
9
|
+
- Use an existing tool before adding a new one. No new tools, MCP servers,
|
|
10
|
+
skills, or dependencies without explicit instruction (`.agents/POLICIES.md`).
|
|
11
|
+
- Each tool appears exactly once, in its primary table.
|
|
12
|
+
- Tables describe current usage — delete rows when tools leave; this is not a
|
|
13
|
+
historical log.
|
|
14
|
+
|
|
15
|
+
## Subdirectory
|
|
16
|
+
|
|
17
|
+
If this file grows past its size budget, split detail into
|
|
18
|
+
`.agents/tools/<name>.md` — every file there MUST be listed above.
|
|
19
|
+
|
|
20
|
+
## CLI tools & runtimes
|
|
21
|
+
|
|
22
|
+
| Tool | When | Purpose |
|
|
23
|
+
| ---- | ---- | ------- |
|
|
24
|
+
| `uv` | Always | Environment sync (`uv sync --dev`) and every command (`uv run …`, `uvx …`) |
|
|
25
|
+
| `mise` | Running project tasks | Toolchain + task runner reading `.config/mise/conf.d/*.toml` |
|
|
26
|
+
| `ruff` | Before finishing any edit | Lint, import sorting, formatting (`ruff.toml`, py313) |
|
|
27
|
+
| `ty` | After changing types or signatures | Static type check (`ty.toml`, warnings are errors) |
|
|
28
|
+
| `pytest` | After behaviour changes | Test suite with coverage; `asyncio_mode = "auto"` |
|
|
29
|
+
| `pyreorder` | `mise format` | Orders class members (public/protected/private) |
|
|
30
|
+
| `rumdl` | `mise format-md` | Markdown lint/format |
|
|
31
|
+
| `codespell` | `mise spell` | Spelling check over `src/ tests/` |
|
|
32
|
+
| `zensical` | `mise docs` | Builds the documentation site (`zensical.toml`) |
|
|
33
|
+
| `bun` / `bun x skills` | `mise add-skills` | Installs agent skills from the CSV catalogue |
|
|
34
|
+
| `bun x add-mcp` | `mise add-mcp-servers <agent>` | Registers MCP servers with an AI client |
|
|
35
|
+
|
|
36
|
+
## MCP servers
|
|
37
|
+
|
|
38
|
+
| Server | When | Purpose |
|
|
39
|
+
| ------ | ---- | ------- |
|
|
40
|
+
| `teddi-mcp` (this repo) | Querying TEDDI from an MCP client | Tools `search_teddi`, `get_term_info`, `list_technical_bodies`; stdio transport |
|
|
41
|
+
|
|
42
|
+
## Skills
|
|
43
|
+
|
|
44
|
+
| Skill | When | Purpose |
|
|
45
|
+
| ----- | ---- | ------- |
|
|
46
|
+
| `cli-teddi` (`skills/cli-teddi/SKILL.md`) | Terminal TEDDI searches | `uv run teddi-tool search-term|list-bodies` recipes and filters |
|
|
47
|
+
| `mcp-teddi` (`skills/mcp-teddi/SKILL.md`) | MCP-client TEDDI lookups | Tool arguments, TB filtering, multi-definition behaviour |
|
|
48
|
+
|
|
49
|
+
## Project scripts & tasks
|
|
50
|
+
|
|
51
|
+
| Command | Purpose |
|
|
52
|
+
| ------- | ------- |
|
|
53
|
+
| `mise dev` | `uv sync -U --dev --all-extras --all-groups` |
|
|
54
|
+
| `mise test` | `uv run pytest --cov=teddi_tool` |
|
|
55
|
+
| `mise lint` | `ruff check src/ tests/ --fix --unsafe-fixes` |
|
|
56
|
+
| `mise lint-check` | `ruff check src/ tests/` (CI mode) |
|
|
57
|
+
| `mise typecheck` | `ty check src/ tests/` |
|
|
58
|
+
| `mise spell` | `codespell src/ tests/` |
|
|
59
|
+
| `mise format` | `pyreorder` + ruff import sort + `ruff format` on `src/ tests/` |
|
|
60
|
+
| `mise format-md` | `rumdl` over Markdown |
|
|
61
|
+
| `mise docs` | `zensical build` |
|
|
62
|
+
| `mise all` | test, lint, spell, format, format-md, docs |
|
|
63
|
+
| `mise release-notes` | `scripts/release_notes.py` via OpenAI-compatible endpoint |
|
|
64
|
+
| `mise clean` | Remove build, coverage, and docs artifacts |
|
|
65
|
+
| `mise add-mcp-servers <agent>` / `mise add-skills` | Install MCP servers / skills from the template catalogues |
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# AGENTS.md — DOX authoring
|
|
2
|
+
|
|
3
|
+
Owned by `.agents/POLICIES.md`. How to keep AGENTS.md and state files lean.
|
|
4
|
+
|
|
5
|
+
AGENTS.md and `.agents/` files share limited context. Bloat and duplication
|
|
6
|
+
are the failure mode.
|
|
7
|
+
|
|
8
|
+
## Where a rule lives
|
|
9
|
+
|
|
10
|
+
A rule goes in the **highest (most general) tier that fully applies**:
|
|
11
|
+
|
|
12
|
+
- Applies to **all code in the project** → `.agents/POLICIES.md` (default).
|
|
13
|
+
- Meaningful **only inside one subtree** → that subtree's `AGENTS.md`.
|
|
14
|
+
- Just helps navigation → the parent's Child DOX Index, nothing else.
|
|
15
|
+
|
|
16
|
+
## Reference, don't restate
|
|
17
|
+
|
|
18
|
+
A rule appears in **exactly one file**. Other files use a **pointer line**:
|
|
19
|
+
`<topic> — see <file>`. Never copy the rule, rationale, or example.
|
|
20
|
+
|
|
21
|
+
## Rule first, rationale second, never third
|
|
22
|
+
|
|
23
|
+
A DOX line is the rule. If a rationale is costly to rediscover, add one
|
|
24
|
+
short clause. No multi-paragraph explanations or code pairs — those belong
|
|
25
|
+
in a skill or `docs/`, linked once.
|
|
26
|
+
|
|
27
|
+
## Content rules
|
|
28
|
+
|
|
29
|
+
- **No tree views.** Generate on demand with `rg --files | tree-cli --fromfile`.
|
|
30
|
+
- **No history in AGENTS.md files.** Git log has routine history. Record only
|
|
31
|
+
decisions costly to rediscover — in `.agents/HISTORY.md` (or
|
|
32
|
+
`.agents/history/` for overflow archives). Archiving completed plans:
|
|
33
|
+
see `plans-and-docs.md`.
|
|
34
|
+
- **Lean state files, optional subdirectories.** State files stay brief entry
|
|
35
|
+
points (index-style, not sprawling documents). A state file that grows past
|
|
36
|
+
its size budget (≤ **120 lines**) must be split into
|
|
37
|
+
`.agents/<topic>/<name>.md` subdirectories — not stuffed longer. Every file
|
|
38
|
+
in an optional subdirectory **MUST** be mentioned in the state file that
|
|
39
|
+
owns it.
|
|
40
|
+
- **No TODO lists.** Use issue trackers or beads.
|
|
41
|
+
- Prefer direct bullets with explicit names.
|
|
42
|
+
- Trim obvious statements, repeated rules, and detail that no longer applies.
|
|
43
|
+
|
|
44
|
+
## State file subdirectories
|
|
45
|
+
|
|
46
|
+
Each state file has a matching optional subdirectory for growth — the file
|
|
47
|
+
stays a lean index and the subdirectory carries the detail:
|
|
48
|
+
|
|
49
|
+
| State file | Optional subdirectory |
|
|
50
|
+
| ---------- | -------------------- |
|
|
51
|
+
| `FILES.md` | `.agents/files/` |
|
|
52
|
+
| `POLICIES.md` | `.agents/policies/` |
|
|
53
|
+
| `TOOLS.md` | `.agents/tools/` |
|
|
54
|
+
| `MAINTENANCE.md` | `.agents/maintenance/` |
|
|
55
|
+
|
|
56
|
+
- Only create a subdirectory when its state file approaches its size budget.
|
|
57
|
+
- Every file in a subdirectory MUST be listed in its state file (name + one
|
|
58
|
+
line of what it covers). A subdirectory file missing from the index is
|
|
59
|
+
dead content — move it or delete it.
|
|
60
|
+
- `ONBOARDING.md` and `HISTORY.md` have no subdirectories: entry points stay
|
|
61
|
+
a single file, and history growth goes to `.agents/history/`.
|
|
62
|
+
|
|
63
|
+
## Size budget
|
|
64
|
+
|
|
65
|
+
- `.agents/` files: ≤ **120 lines** (always-injected context).
|
|
66
|
+
- Subtree `AGENTS.md`: ≤ **250 lines** (loaded cumulatively with parents).
|
|
67
|
+
|
|
68
|
+
Exceeding the budget signals restating instead of pointing, or hoarding
|
|
69
|
+
rationale. Cut first; split the subtree only as a last resort.
|
|
70
|
+
|
|
71
|
+
When a state file exceeds its budget, split detail into its matching
|
|
72
|
+
subdirectory — the file stays a lean index and every file in the
|
|
73
|
+
subdirectory MUST be listed in it.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# AGENTS.md — Plans and documentation
|
|
2
|
+
|
|
3
|
+
Owned by `.agents/POLICIES.md`. Where working plans live, and how history
|
|
4
|
+
and shipped docs are kept.
|
|
5
|
+
|
|
6
|
+
## Implementation Plans
|
|
7
|
+
|
|
8
|
+
- Plans, refactoring plans, and design docs go in
|
|
9
|
+
`.agents/plans/<YYYY-MM-DD>-<feature-name>/` — NOT under version control
|
|
10
|
+
(gitignored).
|
|
11
|
+
- Name descriptively with phase-number prefixes so file order matches
|
|
12
|
+
implementation order, e.g. `01-sub-feature.md`, `02-next-sub-feature.md`.
|
|
13
|
+
- NEVER commit plans to git. They are mutable working artifacts.
|
|
14
|
+
- The archive trigger is **plan completion**: archive the moment the work
|
|
15
|
+
lands — don't wait for the next maintenance pass. Archive naming and
|
|
16
|
+
procedure: see **Documentation → Archive a plan**.
|
|
17
|
+
- Shipped docs (user-facing guides, API references) go in `docs/` and
|
|
18
|
+
ARE committed.
|
|
19
|
+
|
|
20
|
+
## Documentation
|
|
21
|
+
|
|
22
|
+
- When `.agents/HISTORY.md` grows too large, archive older entries to
|
|
23
|
+
`.agents/history/`. Reference them from `.agents/HISTORY.md`.
|
|
24
|
+
- Completed plans (`.agents/plans/<YYYY-MM-DD>-<feature-name>/`) are durable
|
|
25
|
+
once implemented: consolidate them into
|
|
26
|
+
`.agents/history/<YYYY-MM-DD-plan-name>.md`, remove the plan directory, and
|
|
27
|
+
reference the archive from `.agents/HISTORY.md`. The trigger is **plan
|
|
28
|
+
completion** — archive when the work lands, not at a later maintenance pass.
|
|
29
|
+
- `.agents/history/` IS version-controlled (durable decision records).
|
|
30
|
+
- AGENTS.md and state files describe the project's current contracts — never
|
|
31
|
+
append session notes, iteration logs, or changelogs; delete stale text
|
|
32
|
+
instead. `.agents/HISTORY.md` is the only permitted exception and holds
|
|
33
|
+
high-level decisions only.
|
|
34
|
+
|
|
35
|
+
## Archive a plan
|
|
36
|
+
|
|
37
|
+
1. Consolidate `.agents/plans/<YYYY-MM-DD>-<feature-name>/` into a single
|
|
38
|
+
file `.agents/history/<YYYY-MM-DD-plan-name>.md` (use the plan directory's
|
|
39
|
+
date prefix, e.g. `2026-07-14-api-migration.md`).
|
|
40
|
+
2. Delete the plan directory.
|
|
41
|
+
3. Add an entry to `.agents/HISTORY.md` referencing the archive and its
|
|
42
|
+
commit.
|
|
43
|
+
|
|
44
|
+
If the date prefix on the plan directory is missing or wrong, use the date
|
|
45
|
+
work started — record it in the archive filename exactly as-is.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
[tasks.format]
|
|
2
|
+
description = "Format code (ruff, isort, pyreorder)"
|
|
3
|
+
run = [
|
|
4
|
+
"pyreorder run src/ tests/ scripts/ --config .config/pyreorder.toml",
|
|
5
|
+
"ruff format src/ tests/",
|
|
6
|
+
"ruff check src/ tests/ --select I --fix",
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
[tasks.format-md]
|
|
10
|
+
description = "Lint and reformat Markdown files with rumdl"
|
|
11
|
+
run = "rumdl fmt --config .config/rumdl.toml src/ docs/ tests/ ./"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
[tasks.lint]
|
|
2
|
+
description = "Run linter (ruff) and apply safe and unsafe fixes"
|
|
3
|
+
run = 'ruff check src/ tests/ --fix --unsafe-fixes'
|
|
4
|
+
|
|
5
|
+
[tasks.lint-check]
|
|
6
|
+
description = "Run linter (ruff) without applying fixes"
|
|
7
|
+
run = 'ruff check src/ tests/'
|
|
8
|
+
|
|
9
|
+
[tasks.typecheck]
|
|
10
|
+
description = "Run type checker (ty)"
|
|
11
|
+
run = 'ty check src/ tests/'
|
|
12
|
+
|
|
13
|
+
[tasks.spell]
|
|
14
|
+
description = "Run spell checker (codespell)"
|
|
15
|
+
run = "codespell src/ tests/"
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
[tasks.add-mcp-servers]
|
|
2
|
+
description = "Install dev-feature tools and register MCP servers (driven by data/dev-features.csv)"
|
|
3
|
+
depends = ["dev"]
|
|
4
|
+
usage = '''
|
|
5
|
+
arg "<ai_agent>" help="AI assistant: claude, gemini, copilot, opencode, ... (see https://github.com/neondatabase/add-mcp)"
|
|
6
|
+
'''
|
|
7
|
+
run = "uv run .config/mise/scripts/install_dev_features.py add-mcp-servers {{usage.ai_agent}}"
|
|
8
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
[tasks.test]
|
|
2
|
+
description = "Run tests with coverage"
|
|
3
|
+
run = "uv run pytest --cov=teddi_tool"
|
|
4
|
+
sources = ["src/**/*.py", "tests/**/*.py"]
|
|
5
|
+
outputs = ["htmlcov/", ".coverage"]
|
|
6
|
+
|
|
7
|
+
[tasks.all]
|
|
8
|
+
description = "Run all quality checks"
|
|
9
|
+
depends = [
|
|
10
|
+
"test",
|
|
11
|
+
"lint",
|
|
12
|
+
"spell",
|
|
13
|
+
"format",
|
|
14
|
+
"format-md",
|
|
15
|
+
"docs",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
[tasks.release-notes]
|
|
19
|
+
description = "Generate release notes for the latest tag with an OpenAI-compatible endpoint"
|
|
20
|
+
run = "uv run --with httpx python scripts/release_notes.py"
|
|
21
|
+
|
|
22
|
+
[tasks.clean]
|
|
23
|
+
description = "Clean build artifacts"
|
|
24
|
+
run = ["rm -rf build dist *.egg-info .pytest_cache .coverage htmlcov docs/_build"]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# mise configuration
|
|
2
|
+
# Task definitions are in conf.d/*.toml files (automatically loaded by mise)
|
|
3
|
+
[tools]
|
|
4
|
+
# basic frameworks that should always be available
|
|
5
|
+
node = "latest"
|
|
6
|
+
bun = "latest"
|
|
7
|
+
|
|
8
|
+
# Linter/formatter/type checker tools
|
|
9
|
+
"ruff" = "latest"
|
|
10
|
+
"ty" = "latest"
|
|
11
|
+
"rumdl" = "latest"
|
|
12
|
+
"pypi:git+https://github.com/jr2804/pyreorder.git" = "latest"
|
|
13
|
+
"pypi:codespell" = "latest"
|
|
14
|
+
|
|
15
|
+
# CLI tools rg and tree-cli -> use `rg --files | tree-cli --fromfile` to get a nice tree view of the project files
|
|
16
|
+
ripgrep = "latest"
|
|
17
|
+
"github:peteretelej/tree" = { version = "latest", rename_exe = "tree-cli" }
|
|
18
|
+
|
|
19
|
+
[settings.npm]
|
|
20
|
+
package_manager = "bun"
|
|
21
|
+
|
|
22
|
+
[settings.pypi]
|
|
23
|
+
uvx = true
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
enabled,category,tool,tool_value,mcp_command,mcp_name,skill_repo,skill
|
|
2
|
+
0,slop,pypi:sloppylint,latest,,,https://codeberg.org/jr2804/copier-uv-plus.git,cli-sloppylint
|
|
3
|
+
0,slop,pypi:ai-slop-detector,"{ version = ""latest"", extras = [""all""] }",,,https://codeberg.org/jr2804/copier-uv-plus.git,cli-ai-slop-detector
|
|
4
|
+
0,slop,npm:@yuvrajangadsingh/vibecheck,latest,vibecheck --mcp,vibecheck,https://codeberg.org/jr2804/copier-uv-plus.git,cli-vibecheck
|
|
5
|
+
0,slop,npm:aislop,latest,mise x --command aislop-mcp,aislop,https://codeberg.org/jr2804/copier-uv-plus.git,cli-aislop
|
|
6
|
+
0,slop,,,,,https://codeberg.org/jr2804/copier-uv-plus.git,cli-deep-slop-scan
|
|
7
|
+
0,slop,github:djinn-soul/CytoScnPy,latest,cytoscnpy mcp-server,cytoscnpy,,
|
|
8
|
+
0,slop,github:ChuprinaDaria/Vibecode-Cleaner-Fartrun,latest,fartrun mcp,fartrun,https://codeberg.org/jr2804/copier-uv-plus.git,cli-fartrun
|
|
9
|
+
0,codebase,github:yoanbernabeu/grepai,latest,grepai mcp-serve,grepai,https://codeberg.org/jr2804/copier-uv-plus.git,cli-grepai
|
|
10
|
+
1,codebase,npm:@colbymchenry/codegraph,latest,codegraph serve --mcp,codegraph,https://codeberg.org/jr2804/copier-uv-plus.git,cli-codegraph
|
|
11
|
+
0,codebase,pypi:repowise,latest,repowise mcp .,repowise,https://codeberg.org/jr2804/copier-uv-plus.git,cli-repowise
|
|
12
|
+
0,codebase,github:1broseidon/ketch,latest,ketch mcp serve,ketch,1broseidon/ketch,ketch
|
|
13
|
+
0,dev,github:AlmogBaku/debug-skill,latest,,,AlmogBaku/debug-skill,
|
|
14
|
+
0,dev,github:rtk-ai/rtk,latest,,,https://github.com/FlorianBruniaux/claude-code-ultimate-guide/tree/main/examples,rtk-optimizer
|
|
15
|
+
1,tracking,github:gastownhall/beads,latest,,,gastownhall/beads,
|
|
16
|
+
1,tracking,github:dolthub/dolt,latest,,,,
|
|
17
|
+
1,tracking,pypi:beads-mcp,"{ version = ""latest"", uvx_args = ""-p 3.13"" }",mise x --command beads-mcp,beads,,
|
|
18
|
+
1,docs,pypi:kompend,"{ version = ""latest"", extras = [""pdf-full"", ""ocr""], uvx_args = ""-p 3.13 --index https://download.pytorch.org/whl/cu126 --index-strategy unsafe-best-match"" }",,,,
|
|
19
|
+
0,general,,,bun x @wonderwhy-er/desktop-commander@latest,desktop-commander,wonderwhy-er/DesktopCommanderMCP,desktop-commander-overview
|
|
20
|
+
0,general,,,bun x @modelcontextprotocol/server-sequential-thinking,sequential-thinking,,
|
|
21
|
+
0,rust,rust-skills,,,https://codeberg.org/jr2804/copier-uv-plus.git,rust-skills,
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
enabled,category,repo,skill
|
|
2
|
+
1,coding,https://github.com/jr2804/pyreorder,
|
|
3
|
+
1,coding,https://github.com/jr2804/prompts,python-ultimate
|
|
4
|
+
1,coding,https://github.com/alinaqi/claude-bootstrap,code-deduplication
|
|
5
|
+
1,coding,https://github.com/s2005/uv-skill,
|
|
6
|
+
1,coding,https://github.com/shadcn/improve,
|
|
7
|
+
1,docs,plannotator/effective-html,
|
|
8
|
+
1,docs,adewale/good-readme,
|
|
9
|
+
1,docs,https://github.com/nicobailon/visual-explainer,
|
|
10
|
+
1,docs,https://github.com/oil-oil/beautify-github-readme,
|
|
11
|
+
1,docs,https://github.com/jr2804/prompts,scientific-figures
|
|
12
|
+
1,docs,https://codeberg.org/jr2804/copier-uv-plus.git,project-docs
|
|
13
|
+
1,docs,https://codeberg.org/jr2804/copier-uv-plus.git,mermaid-diagrams
|
|
14
|
+
0,rust,https://codeberg.org/jr2804/copier-uv-plus.git,rust-skills
|
|
15
|
+
0,rust,https://codeberg.org/jr2804/copier-uv-plus.git,rust-pyo3-bindings
|
|
16
|
+
0,rust,https://codeberg.org/jr2804/copier-uv-plus.git,rust-dsp-stack
|