dt-ai-toolkit 0.1.0__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.
Files changed (69) hide show
  1. dt_ai_toolkit-0.1.0/.gitignore +220 -0
  2. dt_ai_toolkit-0.1.0/.python-version +1 -0
  3. dt_ai_toolkit-0.1.0/CLAUDE.md +57 -0
  4. dt_ai_toolkit-0.1.0/LICENSE +21 -0
  5. dt_ai_toolkit-0.1.0/PKG-INFO +92 -0
  6. dt_ai_toolkit-0.1.0/README.md +77 -0
  7. dt_ai_toolkit-0.1.0/pyproject.toml +40 -0
  8. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/__init__.py +3 -0
  9. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/cli.py +43 -0
  10. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/commands/__init__.py +0 -0
  11. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/commands/agent.py +123 -0
  12. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/commands/docs.py +90 -0
  13. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/commands/doctor.py +36 -0
  14. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/commands/report.py +80 -0
  15. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/commands/setup.py +174 -0
  16. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/commands/skills.py +162 -0
  17. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/console.py +6 -0
  18. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/__init__.py +0 -0
  19. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/agent_defs.py +192 -0
  20. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/agent_runner.py +80 -0
  21. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/checks.py +76 -0
  22. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/cli_introspect.py +118 -0
  23. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/frontmatter.py +34 -0
  24. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/gitignore.py +40 -0
  25. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/guides.py +34 -0
  26. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/installer.py +85 -0
  27. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/placeholders.py +28 -0
  28. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/resources.py +73 -0
  29. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/scaffold.py +69 -0
  30. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/setup_config.py +133 -0
  31. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/core/skills_manager.py +264 -0
  32. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/agents/project-review.md +29 -0
  33. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/agents/sourcing-report.md +46 -0
  34. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/docs/agents.md +111 -0
  35. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/docs/getting-started.md +89 -0
  36. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/docs/reports.md +85 -0
  37. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/docs/setup.md +108 -0
  38. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/docs/skills.md +89 -0
  39. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/report/Report.tsx.tmpl +46 -0
  40. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/report/entry.tsx +8 -0
  41. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/report/gather_data.py.tmpl +33 -0
  42. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/report/render.py.tmpl +102 -0
  43. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/report/tsconfig.json +12 -0
  44. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/setup/default.toml +25 -0
  45. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/setup/example.toml +56 -0
  46. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/setup/templates/sandbox_README.md +5 -0
  47. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/skills/critique-talking-points/SKILL.md +91 -0
  48. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/skills/critique-visualization/SKILL.md +106 -0
  49. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/skills/dt-ai-toolkit/SKILL.md +107 -0
  50. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/skills/dt-setup-config/SKILL.md +142 -0
  51. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/skills/grill-me/SKILL.md +90 -0
  52. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/skills/interrogate-data/SKILL.md +138 -0
  53. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/data/skills/tsx-report-generator/SKILL.md +227 -0
  54. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/tui/__init__.py +0 -0
  55. dt_ai_toolkit-0.1.0/src/dt_ai_toolkit/tui/docs_app.py +97 -0
  56. dt_ai_toolkit-0.1.0/tests/__init__.py +0 -0
  57. dt_ai_toolkit-0.1.0/tests/test_agent_defs.py +148 -0
  58. dt_ai_toolkit-0.1.0/tests/test_agent_runner.py +55 -0
  59. dt_ai_toolkit-0.1.0/tests/test_cli.py +32 -0
  60. dt_ai_toolkit-0.1.0/tests/test_docs.py +100 -0
  61. dt_ai_toolkit-0.1.0/tests/test_doctor.py +57 -0
  62. dt_ai_toolkit-0.1.0/tests/test_frontmatter.py +44 -0
  63. dt_ai_toolkit-0.1.0/tests/test_gitignore.py +34 -0
  64. dt_ai_toolkit-0.1.0/tests/test_installer.py +67 -0
  65. dt_ai_toolkit-0.1.0/tests/test_placeholders.py +35 -0
  66. dt_ai_toolkit-0.1.0/tests/test_report_scaffold.py +54 -0
  67. dt_ai_toolkit-0.1.0/tests/test_setup_config.py +100 -0
  68. dt_ai_toolkit-0.1.0/tests/test_skills_manager.py +155 -0
  69. dt_ai_toolkit-0.1.0/uv.lock +1062 -0
@@ -0,0 +1,220 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ # Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ # poetry.lock
109
+ # poetry.toml
110
+
111
+ # pdm
112
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
113
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
114
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
115
+ # pdm.lock
116
+ # pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # pixi
121
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
122
+ # pixi.lock
123
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
124
+ # in the .venv directory. It is recommended not to include this directory in version control.
125
+ .pixi
126
+
127
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
128
+ __pypackages__/
129
+
130
+ # Celery stuff
131
+ celerybeat-schedule
132
+ celerybeat.pid
133
+
134
+ # Redis
135
+ *.rdb
136
+ *.aof
137
+ *.pid
138
+
139
+ # RabbitMQ
140
+ mnesia/
141
+ rabbitmq/
142
+ rabbitmq-data/
143
+
144
+ # ActiveMQ
145
+ activemq-data/
146
+
147
+ # SageMath parsed files
148
+ *.sage.py
149
+
150
+ # Environments
151
+ .env
152
+ .envrc
153
+ .venv
154
+ env/
155
+ venv/
156
+ ENV/
157
+ env.bak/
158
+ venv.bak/
159
+
160
+ # Spyder project settings
161
+ .spyderproject
162
+ .spyproject
163
+
164
+ # Rope project settings
165
+ .ropeproject
166
+
167
+ # mkdocs documentation
168
+ /site
169
+
170
+ # mypy
171
+ .mypy_cache/
172
+ .dmypy.json
173
+ dmypy.json
174
+
175
+ # Pyre type checker
176
+ .pyre/
177
+
178
+ # pytype static type analyzer
179
+ .pytype/
180
+
181
+ # Cython debug symbols
182
+ cython_debug/
183
+
184
+ # PyCharm
185
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
186
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
187
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
188
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
189
+ # .idea/
190
+
191
+ # Abstra
192
+ # Abstra is an AI-powered process automation framework.
193
+ # Ignore directories containing user credentials, local state, and settings.
194
+ # Learn more at https://abstra.io/docs
195
+ .abstra/
196
+
197
+ # Visual Studio Code
198
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
199
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
200
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
201
+ # you could uncomment the following to ignore the entire vscode folder
202
+ # .vscode/
203
+ # Temporary file for partial code execution
204
+ tempCodeRunnerFile.py
205
+
206
+ # Ruff stuff:
207
+ .ruff_cache/
208
+
209
+ # PyPI configuration file
210
+ .pypirc
211
+
212
+ # Marimo
213
+ marimo/_static/
214
+ marimo/_lsp/
215
+ __marimo__/
216
+
217
+ # Streamlit
218
+ .streamlit/secrets.toml
219
+
220
+ plans/
@@ -0,0 +1 @@
1
+ 3.14
@@ -0,0 +1,57 @@
1
+ # dt-ai-toolkit
2
+
3
+ A Typer CLI published to PyPI as `dt-ai-toolkit`, run by teammates via `uvx dt-ai-toolkit`.
4
+ It helps a data team set up Claude-ready data projects (`setup`), install curated Agent
5
+ Skills (`skills`), run agent flows via the Claude Agent SDK (`agent`), scaffold the TSX ->
6
+ HTML/PDF report pipeline (`report`), check the environment (`doctor`), and browse docs
7
+ (`docs`, a Textual TUI).
8
+
9
+ ## Tooling
10
+
11
+ uv only — never pip:
12
+
13
+ - `uv sync` — install deps (dev group included)
14
+ - `uv run dt-ai-toolkit ...` — run the CLI
15
+ - `uv run pytest` — run tests
16
+ - `uvx --from . dt-ai-toolkit ...` — end-to-end check of the packaged entry point
17
+ - `uv add <pkg>` / `uv add --dev <pkg>` — manage dependencies
18
+
19
+ ## Architecture rules
20
+
21
+ - `src/dt_ai_toolkit/commands/` — thin Typer layers: argument parsing and console output only.
22
+ - `src/dt_ai_toolkit/core/` — pure logic; **no typer imports** (keeps it unit-testable).
23
+ - `src/dt_ai_toolkit/data/` — package data (bundled skills, agent defs, templates, docs
24
+ guides); access only via `core/resources.py` (`importlib.resources`), never relative paths.
25
+ - `src/dt_ai_toolkit/tui/` — Textual app(s); consume plain dataclasses from core, no typer.
26
+ - All console output goes through `dt_ai_toolkit.console` (`console` / `err_console`).
27
+
28
+ ## Conventions
29
+
30
+ - Python floor is 3.11 — no 3.12+-only syntax. `.python-version` (3.14) is just the dev interpreter.
31
+ - pathlib everywhere; dataclasses over pydantic.
32
+ - Every action that executes commands or overwrites files: print what will happen, require
33
+ confirmation unless `--yes`, and support `--dry-run`. Never overwrite without `--force`.
34
+ - Windows: core logic must not assume POSIX; install steps support `windows_command`.
35
+ - typer is pinned to a minor version because `core/cli_introspect.py` walks
36
+ `typer.main.get_group(app)` (private-ish API; vendored click since typer 0.26). Never
37
+ `isinstance` against real `click` objects. A canary test covers this.
38
+
39
+ ## Key formats (sources of truth)
40
+
41
+ - Setup profile TOML schema: `src/dt_ai_toolkit/data/setup/example.toml` (annotated).
42
+ - Skill format: `.claude/skills/<name>/SKILL.md`, YAML frontmatter `name` + `description`.
43
+ - Agent definition: frontmatter markdown; the frontmatter -> `ClaudeAgentOptions` mapping
44
+ lives in `core/agent_defs.py`.
45
+ - Skill provenance lockfile: `.claude/skills/.dt-skills.json`.
46
+
47
+ ## Testing
48
+
49
+ - pytest with `tmp_path`; CLI via `typer.testing.CliRunner`.
50
+ - Tests never hit the network or the Anthropic API; subprocess and the Agent SDK are mocked.
51
+ - Git-install tests use a local `git init` fixture repo (real git, no network).
52
+
53
+ ## Release
54
+
55
+ 1. Bump `__version__` in `src/dt_ai_toolkit/__init__.py` and `version` in `pyproject.toml` together.
56
+ 2. `uv build`, smoke-test the wheel (`uvx --from dist/<wheel> dt-ai-toolkit doctor`).
57
+ 3. `uv publish` (only when the user asks), then tag `v<version>`.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ryan Wiley
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.
@@ -0,0 +1,92 @@
1
+ Metadata-Version: 2.4
2
+ Name: dt-ai-toolkit
3
+ Version: 0.1.0
4
+ Summary: Data-team toolkit for building, interacting with, and improving data projects with coding agents
5
+ License-Expression: MIT
6
+ License-File: LICENSE
7
+ Requires-Python: >=3.11
8
+ Requires-Dist: claude-agent-sdk>=0.1
9
+ Requires-Dist: httpx>=0.27
10
+ Requires-Dist: pyyaml>=6
11
+ Requires-Dist: rich>=13
12
+ Requires-Dist: textual>=8
13
+ Requires-Dist: typer<0.27,>=0.26
14
+ Description-Content-Type: text/markdown
15
+
16
+ # dt-ai-toolkit
17
+
18
+ A data-team toolkit for building, interacting with, and improving data projects
19
+ with coding agents. One install (uv) gets a teammate a Claude-ready project,
20
+ curated Agent Skills, runnable agent flows, and a PDF report pipeline.
21
+
22
+ ```bash
23
+ # no install needed — run it straight from PyPI
24
+ uvx dt-ai-toolkit --help
25
+ ```
26
+
27
+ ## Quickstart
28
+
29
+ ```bash
30
+ mkdir my-project && cd my-project
31
+ uvx dt-ai-toolkit setup # folders + gitignore + installs Claude Code & omnigent
32
+ uvx dt-ai-toolkit doctor # verify the environment
33
+ uvx dt-ai-toolkit docs # interactive docs browser
34
+ ```
35
+
36
+ ## Commands
37
+
38
+ | command | what it does |
39
+ |---|---|
40
+ | `setup` | Scaffold a data project (`data/`, `reports/`, `sandbox/`, managed .gitignore block) and install tooling. Customizable via a `dt-setup.toml` profile (`setup config init`). |
41
+ | `skills` | Install Agent Skills into `.claude/skills/` from the bundled set, a local folder, or a git repo. `list` / `install` / `update` with provenance tracking. |
42
+ | `agent` | Run agent flows via the Claude Agent SDK: bundled `sourcing-report` and `project-review`, or your own frontmatter-markdown agent files. |
43
+ | `report` | Scaffold the React TSX → HTML/PDF report pipeline (`report new <name>`). |
44
+ | `doctor` | Check the environment: uv, git, claude CLI, omnigent, auth, bun, playwright. |
45
+ | `docs` | Browse documentation — a Textual TUI, or `--plain` / `show <topic>` / `export` for non-interactive use. |
46
+
47
+ ## Bundled skills
48
+
49
+ - **interrogate-data** — structured protocol for profiling and stress-testing a dataset before trusting it
50
+ - **critique-talking-points** — adversarial claim-by-claim review of narratives before they ship
51
+ - **critique-visualization** — chart-honesty review, including re-deriving plotted values from source data
52
+ - **tsx-report-generator** — walks Claude through the full TSX → HTML/PDF report pipeline
53
+ - **dt-setup-config** — helps Claude build a custom `dt-setup.toml` for your team
54
+ - **dt-ai-toolkit** — meta skill teaching Claude how to call this CLI itself (`uvx dt-ai-toolkit ...`)
55
+ - **grill-me** — Socratic quiz rounds that test *your* understanding of a dataset, pipeline, or report before someone else does
56
+
57
+ ```bash
58
+ uvx dt-ai-toolkit skills list --available
59
+ uvx dt-ai-toolkit skills install interrogate-data
60
+ uvx dt-ai-toolkit skills install https://github.com/your-org/team-skills.git --all
61
+ ```
62
+
63
+ ## Custom agent flows
64
+
65
+ Agents are markdown files with YAML frontmatter — config on top, prompt below,
66
+ `{placeholders}` filled from the command line:
67
+
68
+ ```markdown
69
+ ---
70
+ name: data-audit
71
+ description: Audit a dataset for quality issues
72
+ allowed_tools: [Read, Glob, Grep, Bash]
73
+ args:
74
+ data_path: {required: true}
75
+ ---
76
+ Audit the dataset at {data_path}. Cite the query behind every finding.
77
+ ```
78
+
79
+ ```bash
80
+ dt-ai-toolkit agent run data-audit.md --arg data_path=data/sales.csv
81
+ dt-ai-toolkit agent run sourcing-report --arg topic="Q3 readmissions" --dry-run
82
+ ```
83
+
84
+ ## Development
85
+
86
+ ```bash
87
+ uv sync
88
+ uv run pytest
89
+ uv run dt-ai-toolkit --help
90
+ ```
91
+
92
+ See `CLAUDE.md` for architecture conventions.
@@ -0,0 +1,77 @@
1
+ # dt-ai-toolkit
2
+
3
+ A data-team toolkit for building, interacting with, and improving data projects
4
+ with coding agents. One install (uv) gets a teammate a Claude-ready project,
5
+ curated Agent Skills, runnable agent flows, and a PDF report pipeline.
6
+
7
+ ```bash
8
+ # no install needed — run it straight from PyPI
9
+ uvx dt-ai-toolkit --help
10
+ ```
11
+
12
+ ## Quickstart
13
+
14
+ ```bash
15
+ mkdir my-project && cd my-project
16
+ uvx dt-ai-toolkit setup # folders + gitignore + installs Claude Code & omnigent
17
+ uvx dt-ai-toolkit doctor # verify the environment
18
+ uvx dt-ai-toolkit docs # interactive docs browser
19
+ ```
20
+
21
+ ## Commands
22
+
23
+ | command | what it does |
24
+ |---|---|
25
+ | `setup` | Scaffold a data project (`data/`, `reports/`, `sandbox/`, managed .gitignore block) and install tooling. Customizable via a `dt-setup.toml` profile (`setup config init`). |
26
+ | `skills` | Install Agent Skills into `.claude/skills/` from the bundled set, a local folder, or a git repo. `list` / `install` / `update` with provenance tracking. |
27
+ | `agent` | Run agent flows via the Claude Agent SDK: bundled `sourcing-report` and `project-review`, or your own frontmatter-markdown agent files. |
28
+ | `report` | Scaffold the React TSX → HTML/PDF report pipeline (`report new <name>`). |
29
+ | `doctor` | Check the environment: uv, git, claude CLI, omnigent, auth, bun, playwright. |
30
+ | `docs` | Browse documentation — a Textual TUI, or `--plain` / `show <topic>` / `export` for non-interactive use. |
31
+
32
+ ## Bundled skills
33
+
34
+ - **interrogate-data** — structured protocol for profiling and stress-testing a dataset before trusting it
35
+ - **critique-talking-points** — adversarial claim-by-claim review of narratives before they ship
36
+ - **critique-visualization** — chart-honesty review, including re-deriving plotted values from source data
37
+ - **tsx-report-generator** — walks Claude through the full TSX → HTML/PDF report pipeline
38
+ - **dt-setup-config** — helps Claude build a custom `dt-setup.toml` for your team
39
+ - **dt-ai-toolkit** — meta skill teaching Claude how to call this CLI itself (`uvx dt-ai-toolkit ...`)
40
+ - **grill-me** — Socratic quiz rounds that test *your* understanding of a dataset, pipeline, or report before someone else does
41
+
42
+ ```bash
43
+ uvx dt-ai-toolkit skills list --available
44
+ uvx dt-ai-toolkit skills install interrogate-data
45
+ uvx dt-ai-toolkit skills install https://github.com/your-org/team-skills.git --all
46
+ ```
47
+
48
+ ## Custom agent flows
49
+
50
+ Agents are markdown files with YAML frontmatter — config on top, prompt below,
51
+ `{placeholders}` filled from the command line:
52
+
53
+ ```markdown
54
+ ---
55
+ name: data-audit
56
+ description: Audit a dataset for quality issues
57
+ allowed_tools: [Read, Glob, Grep, Bash]
58
+ args:
59
+ data_path: {required: true}
60
+ ---
61
+ Audit the dataset at {data_path}. Cite the query behind every finding.
62
+ ```
63
+
64
+ ```bash
65
+ dt-ai-toolkit agent run data-audit.md --arg data_path=data/sales.csv
66
+ dt-ai-toolkit agent run sourcing-report --arg topic="Q3 readmissions" --dry-run
67
+ ```
68
+
69
+ ## Development
70
+
71
+ ```bash
72
+ uv sync
73
+ uv run pytest
74
+ uv run dt-ai-toolkit --help
75
+ ```
76
+
77
+ See `CLAUDE.md` for architecture conventions.
@@ -0,0 +1,40 @@
1
+ [project]
2
+ name = "dt-ai-toolkit"
3
+ version = "0.1.0"
4
+ description = "Data-team toolkit for building, interacting with, and improving data projects with coding agents"
5
+ readme = "README.md"
6
+ license = "MIT"
7
+ requires-python = ">=3.11"
8
+ dependencies = [
9
+ "typer>=0.26,<0.27",
10
+ "rich>=13",
11
+ "textual>=8",
12
+ "claude-agent-sdk>=0.1",
13
+ "pyyaml>=6",
14
+ "httpx>=0.27",
15
+ ]
16
+
17
+ [project.scripts]
18
+ dt-ai-toolkit = "dt_ai_toolkit.cli:app"
19
+
20
+ [dependency-groups]
21
+ dev = [
22
+ "pytest>=8",
23
+ "pytest-asyncio>=0.24",
24
+ "ruff>=0.8",
25
+ ]
26
+
27
+ [build-system]
28
+ requires = ["hatchling"]
29
+ build-backend = "hatchling.build"
30
+
31
+ [tool.hatch.build.targets.wheel]
32
+ packages = ["src/dt_ai_toolkit"]
33
+
34
+ [tool.pytest.ini_options]
35
+ testpaths = ["tests"]
36
+ asyncio_mode = "auto"
37
+
38
+ [tool.ruff]
39
+ line-length = 100
40
+ src = ["src", "tests"]
@@ -0,0 +1,3 @@
1
+ """dt-ai-toolkit: data-team toolkit for agent-assisted data projects."""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,43 @@
1
+ """Root Typer app wiring all sub-apps."""
2
+
3
+ from typing import Annotated
4
+
5
+ import typer
6
+
7
+ from dt_ai_toolkit import __version__
8
+ from dt_ai_toolkit.commands import agent, docs, doctor, report, setup, skills
9
+ from dt_ai_toolkit.console import console
10
+
11
+ app = typer.Typer(
12
+ name="dt-ai-toolkit",
13
+ help="Data-team toolkit for building, interacting with, and improving data projects with coding agents.",
14
+ no_args_is_help=True,
15
+ rich_markup_mode="rich",
16
+ )
17
+
18
+ app.add_typer(setup.app, name="setup")
19
+ app.add_typer(skills.app, name="skills")
20
+ app.add_typer(agent.app, name="agent")
21
+ app.add_typer(report.app, name="report")
22
+ app.command(name="doctor", help=doctor.HELP)(doctor.doctor)
23
+ app.add_typer(docs.app, name="docs")
24
+
25
+
26
+ def _version_callback(value: bool) -> None:
27
+ if value:
28
+ console.print(f"dt-ai-toolkit {__version__}")
29
+ raise typer.Exit()
30
+
31
+
32
+ @app.callback()
33
+ def main(
34
+ version: Annotated[
35
+ bool,
36
+ typer.Option("--version", callback=_version_callback, is_eager=True, help="Show version and exit."),
37
+ ] = False,
38
+ ) -> None:
39
+ pass
40
+
41
+
42
+ if __name__ == "__main__":
43
+ app()
@@ -0,0 +1,123 @@
1
+ """`agent` sub-app: run agent flows via the Claude Agent SDK."""
2
+
3
+ import asyncio
4
+ import shutil
5
+ from pathlib import Path
6
+ from typing import Annotated
7
+
8
+ import typer
9
+ from rich.panel import Panel
10
+
11
+ from dt_ai_toolkit.console import console, err_console
12
+ from dt_ai_toolkit.core import resources
13
+ from dt_ai_toolkit.core.agent_defs import AgentSpecError, parse_agent_spec, resolve_agent
14
+
15
+ app = typer.Typer(
16
+ help="Run agent flows (built-in or your own frontmatter-markdown files).", no_args_is_help=True
17
+ )
18
+
19
+
20
+ @app.command("list")
21
+ def list_() -> None:
22
+ """List bundled agent flows."""
23
+ for name in resources.bundled_agent_names():
24
+ spec = parse_agent_spec(resources.read_bundled_agent(name), source=name)
25
+ console.print(f"[bold]{name}[/bold] — {spec.description}")
26
+ console.print(
27
+ "\n[dim]run one: dt-ai-toolkit agent run <name> --arg key=value"
28
+ "\nor your own: dt-ai-toolkit agent run path/to/agent.md[/dim]"
29
+ )
30
+
31
+
32
+ def _parse_args(pairs: list[str] | None) -> dict[str, str]:
33
+ parsed = {}
34
+ for pair in pairs or []:
35
+ key, sep, value = pair.partition("=")
36
+ if not sep or not key:
37
+ raise AgentSpecError(f"--arg must be key=value, got {pair!r}")
38
+ parsed[key] = value
39
+ return parsed
40
+
41
+
42
+ @app.command()
43
+ def show(
44
+ name_or_path: Annotated[str, typer.Argument(help="Bundled agent name or path to an agent .md file.")],
45
+ ) -> None:
46
+ """Show an agent definition: description, options, and declared args."""
47
+ try:
48
+ spec = resolve_agent(name_or_path)
49
+ except AgentSpecError as exc:
50
+ err_console.print(str(exc))
51
+ raise typer.Exit(code=1) from exc
52
+ console.print(f"[bold]{spec.name}[/bold] — {spec.description}")
53
+ console.print(f"source: {spec.source}")
54
+ if spec.options:
55
+ console.print("options:")
56
+ for key, value in spec.options.items():
57
+ console.print(f" {key}: {value}")
58
+ if spec.args:
59
+ console.print("args:")
60
+ for arg_name, arg in spec.args.items():
61
+ req = "[red]required[/red]" if arg.required else f"default: {arg.default!r}"
62
+ console.print(f" {arg_name} ({req}) {arg.help}")
63
+ console.print(Panel(spec.body.strip(), title="prompt template"))
64
+
65
+
66
+ @app.command()
67
+ def run(
68
+ name_or_path: Annotated[str, typer.Argument(help="Bundled agent name or path to an agent .md file.")],
69
+ arg: Annotated[list[str] | None, typer.Option("--arg", "-a", help="Prompt args as key=value (repeatable).")] = None,
70
+ model: Annotated[str | None, typer.Option("--model", help="Override the model.")] = None,
71
+ max_turns: Annotated[int | None, typer.Option("--max-turns", help="Override max turns.")] = None,
72
+ permission_mode: Annotated[str | None, typer.Option("--permission-mode", help="Override the permission mode.")] = None,
73
+ cwd: Annotated[Path | None, typer.Option("--cwd", help="Working directory for the agent.")] = None,
74
+ dry_run: Annotated[bool, typer.Option("--dry-run", help="Print the final prompt and options; no API call.")] = False,
75
+ verbose: Annotated[bool, typer.Option("--verbose", "-v", help="Show thinking and tool results.")] = False,
76
+ dangerously_allow_all: Annotated[
77
+ bool, typer.Option("--dangerously-allow-all", help="Permit permission_mode: bypassPermissions.")
78
+ ] = False,
79
+ ) -> None:
80
+ """Run an agent flow and stream its progress."""
81
+ try:
82
+ spec = resolve_agent(name_or_path)
83
+ prompt = spec.render_prompt(_parse_args(arg))
84
+ overrides = {
85
+ "model": model,
86
+ "max_turns": max_turns,
87
+ "permission_mode": permission_mode,
88
+ "cwd": str(cwd) if cwd else None,
89
+ }
90
+ options = spec.build_options(overrides, allow_bypass=dangerously_allow_all)
91
+ except AgentSpecError as exc:
92
+ err_console.print(str(exc))
93
+ raise typer.Exit(code=1) from exc
94
+
95
+ if dry_run:
96
+ console.print(Panel(prompt, title=f"prompt — {spec.name}"))
97
+ console.print(Panel(_describe_options(options), title="ClaudeAgentOptions"))
98
+ return
99
+
100
+ if shutil.which("claude") is None:
101
+ err_console.print(
102
+ "the `claude` CLI is required to run agents.\n"
103
+ "install it with `dt-ai-toolkit setup` (or check `dt-ai-toolkit doctor`)."
104
+ )
105
+ raise typer.Exit(code=1)
106
+
107
+ from dt_ai_toolkit.core.agent_runner import run_agent
108
+
109
+ console.print(f"[bold]running {spec.name}[/bold] [dim]({spec.source})[/dim]\n")
110
+ outcome = asyncio.run(run_agent(prompt, options, console, verbose=verbose))
111
+ if outcome.is_error:
112
+ raise typer.Exit(code=1)
113
+
114
+
115
+ def _describe_options(options) -> str:
116
+ import dataclasses
117
+
118
+ lines = []
119
+ for f in dataclasses.fields(options):
120
+ value = getattr(options, f.name)
121
+ if value not in (None, [], {}, False):
122
+ lines.append(f"{f.name}: {value}")
123
+ return "\n".join(lines)