databricks-explore 0.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Databricks Explorer</title>
7
+ <script type="module" crossorigin src="/assets/index-CR9j5CJG.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-6I1cPS7i.css">
9
+ </head>
10
+ <body>
11
+ <div id="root"></div>
12
+ </body>
13
+ </html>
@@ -0,0 +1,207 @@
1
+ Metadata-Version: 2.5
2
+ Name: databricks-explore
3
+ Version: 0.5.0
4
+ Summary: Local Unity Catalog explorer: browse tables, draw relationships and run queries on a canvas.
5
+ Project-URL: Homepage, https://github.com/taslater/databricks-explore
6
+ Project-URL: Issues, https://github.com/taslater/databricks-explore/issues
7
+ Project-URL: Changelog, https://github.com/taslater/databricks-explore/releases
8
+ Author: Thomas Slater
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: data-catalog,databricks,lineage,sql,unity-catalog
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Web Environment
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Database
21
+ Requires-Python: >=3.11
22
+ Requires-Dist: databricks-sdk>=0.40
23
+ Requires-Dist: flask>=3.0
24
+ Requires-Dist: pillow>=10.1
25
+ Requires-Dist: platformdirs>=4
26
+ Requires-Dist: pydantic>=2.7
27
+ Requires-Dist: pyyaml>=6
28
+ Requires-Dist: sqlglot>=30
29
+ Description-Content-Type: text/markdown
30
+
31
+ # Databricks Explorer (v0.5)
32
+
33
+ Local Flask app plus a React UI to browse Unity Catalog, draw relationships (lineage, FKs, view deps, and stored ones such as user-drawn edges), and build query canvases. It runs on your computer and listens on 127.0.0.1 only.
34
+
35
+ ## Install
36
+ You need [uv](https://docs.astral.sh/uv/) and Python 3.11 or newer (uv fetches Python if you have none). You do not need Node: the web UI is built into the package.
37
+ ```sh
38
+ uv tool install databricks-explore
39
+ databricks-explore
40
+ ```
41
+ It prints the address (http://127.0.0.1:8765 by default) and opens it in your browser.
42
+
43
+ - **Upgrade:** `uv tool upgrade databricks-explore`
44
+ - **Uninstall:** `uv tool uninstall databricks-explore` (your data folder stays; delete it by hand if you want it gone)
45
+ - **One run without installing:** `uvx databricks-explore`
46
+
47
+ Options of `databricks-explore` (also `python -m databricks_explore`):
48
+
49
+ | Option | Effect |
50
+ |---|---|
51
+ | `--demo` | serve an invented workspace, no Databricks needed (see below) |
52
+ | `--redacted` | with `--demo`, make query history text read `<REDACTED>` |
53
+ | `--port N` | listen on this port (default 8765, or 8767 with `--demo`; the `PORT` variable does the same) |
54
+ | `--data-dir DIR` | keep the app's files in `DIR` (`EXPLORER_DATA_DIR` does the same) |
55
+ | `--no-browser` | print the address, do not open a tab |
56
+ | `--debug` | Werkzeug debugger and reloader (the debugger can run code from an error page) |
57
+
58
+ ### Where your data goes
59
+ The cache, logs, diagrams, canvases, relationship stores and the MCP token live in your per-user data folder, never inside the installed package:
60
+
61
+ | System | Default folder |
62
+ |---|---|
63
+ | macOS | `~/Library/Application Support/databricks-explore` |
64
+ | Linux | `~/.local/share/databricks-explore` (or `$XDG_DATA_HOME/databricks-explore`) |
65
+ | Windows | `%LOCALAPPDATA%\databricks-explore` |
66
+
67
+ Demo mode uses a `demo/` folder inside it, so invented canvases never mix with real ones. `--data-dir` or `EXPLORER_DATA_DIR` replaces the whole folder (demo mode then uses it as is). The command prints the folder it uses at startup. Paths such as `data/canvases/` elsewhere in this README and in `contracts/` mean `canvases/` inside this folder. If you ran an earlier version from a source checkout, its `data/` folder is not used any more: the command prints a hint, and `--data-dir ./data` keeps using it.
68
+
69
+ Dev mode with hot reload: see Development below.
70
+
71
+ ## Run without Databricks
72
+ Demo mode serves invented catalogs, tables, views, foreign keys, lineage and query results from a fake workspace. It never contacts Databricks, so it is safe for trying the UI, screenshots and tests.
73
+ ```sh
74
+ databricks-explore --demo
75
+ # http://127.0.0.1:8767 opens; pick profile "demo", Connect, pick warehouse "Demo Serverless"
76
+ ```
77
+ `EXPLORER_DEMO=1` does the same as `--demo`. Demo mode listens on port 8767 (`--port` or `PORT` overrides) so the browser keeps its saved profile apart from real use, and it writes to the `demo/` folder described above.
78
+
79
+ Magic words in a query (the rest of the SQL is ignored; any query returns a result):
80
+
81
+ | Word | Result |
82
+ |---|---|
83
+ | `demo_slow` | stays running for 45 seconds, to test Cancel and the timer |
84
+ | `demo_error` | fails with a table-not-found message |
85
+ | `demo_wide` | a 60-column result |
86
+ | `demo_big` | 50,000 rows, so the 5,000-row cap and the truncated badge show |
87
+
88
+ Otherwise the result follows the first demo table named in the SQL (`demo.sales.orders` by default: 3,000 rows with ids, timestamps, dates, decimals, nulls, empty strings and long text). `GROUP BY` or `count(` gives a daily series for the Chart tab. A trailing `LIMIT n` is honored.
89
+
90
+ Demo mode also has an invented query history (a few hundred statements by six fake users, with the hard SQL cases), table lineage and column lineage, so mining joins works offline. `databricks-explore --demo --redacted` (or `EXPLORER_DEMO_REDACTED=1`) makes every statement read `<REDACTED>`, to try the blocked path. In an ordinary demo three rows are redacted and get skipped. Mining state is kept in `demo/relationships/` in the data folder; delete it to start over.
91
+
92
+ ## Use
93
+ - Top bar: pick a profile and **Connect** (browser login if needed). Pick a SQL warehouse to enable queries on the canvas and search across all catalogs.
94
+ - **Graph** tab
95
+ - Picker modes (remembered): **Drill-down**, **Tree**, **Search**. « collapses the picker.
96
+ - Click node/edge for details; double-click node to expand; drag to arrange; **Reset layout** re-runs auto layout.
97
+ - Checkboxes hide each edge kind (the legend shows how each is drawn), stale lineage (not seen in N days) and rejected edges.
98
+ - Drag from the green dot on a hovered table node onto another node to store a **manual** edge between them.
99
+ - Click an edge to see its provenance, evidence and status. A stored edge can be **Accepted** or **Rejected**, and any edge can carry a note.
100
+ - **Save diagram** keeps positions → `data/diagrams/`.
101
+ - **Canvas** tab
102
+ - **+ Query window** or double-click the empty canvas adds a SQL window. Results appear in a grid, and the Chart tab draws a Vega-Lite chart. The window title bar has a maximize toggle that fills the canvas and restores the previous size.
103
+ - **Run:** Cmd/Ctrl+Enter (or **Run**) runs the selection, or else the statement under the cursor. Shift+Cmd/Ctrl+Enter (or **Run all**) runs every statement in order, stops at the first error and shows the last result. Statements are split on `;`, not inside strings, quoted names or comments. The text that ran flashes. **Cancel** stops the running statement and the rest of a script, and a timer shows how long it has run.
104
+ - **Result grid:** columns are typed. Numbers sort and filter as numbers and are right-aligned, dates use the date filter, NULL shows as dim italic `NULL` (an empty string stays blank), and the type is under the column name. Values are shown exactly as the warehouse returned them, except that timestamps drop the `T` and an all-zero fraction.
105
+ - **Copy:** cells, errors and the summary are selectable. Click a cell and press Cmd/Ctrl+C to copy its exact value, or tick rows (checkbox column) and press Cmd/Ctrl+C to copy them as TSV with headers. Right-click a cell for copy value, row or column, and Copy as TSV, CSV, Markdown, JSON or a SQL IN list (of that column), with or without headers, for the ticked rows or else all rows. **Copy all as…** does the same for every row after filters and sort, and **Export CSV** downloads them.
106
+ - **+ Note** adds a Markdown note. Drag a table from the picker to add a table card; **Query this** on a card creates `SELECT * FROM <table> LIMIT 100`.
107
+ - **Minimap** is off until you turn it on with the button in the canvas's top-left corner. The Details panel is collapsed on this tab.
108
+ - Reference another window in SQL as `{{title}}`. The canvas draws a read-only link to it.
109
+ - Save, Save as, and Open store canvases in `data/canvases/`. Named canvases autosave. **New diagram** starts a blank sketch under the next free `diagram-N` name. It needs no profile or warehouse.
110
+ - **Sketching** (draw.io-style, on the same canvas as the query windows). The left palette places a rectangle, rounded rectangle, ellipse, diamond, database, text, sticky note, frame or placeholder table: click for a default size, or drag to draw your own. Double-click (or Enter) edits a label in place. Drag from a side handle of any node to another to draw a connector, and drag a connector's end to reconnect it. Left-drag on the background is a marquee; pan with the hand tool, the space bar, or the middle or right button. Shortcuts: V select, H pan, C connect, R rectangle, U rounded, O ellipse, D diamond, B database, T text, S sticky, F frame, P placeholder table, Q query window, N note, G grid snap; Cmd/Ctrl+Z undo (Shift: redo), C copy, V paste, D duplicate, A select all, `]` and `[` forward and backward (Shift: front and back), Shift+L lock; Delete removes sketch nodes, connectors and table cards (query windows and notes keep their ✕ button, because they hold SQL and text); arrows nudge. **Properties** (button in the bottom bar) opens the Details area with the selection's label, shape, colors, font size, position, lock, and for a connector its line type, arrowheads, dash, color and label. **Arrange** aligns, distributes, orders and locks a selection. **Export** saves the canvas or the selection as PNG or SVG (the SVG embeds the page content, so some vector editors cannot open it).
111
+ - A **placeholder table** is a table that does not exist yet: edit its name, and each column's name, type and key marker (click the box to cycle PK and FK) on the card. Link it to the real table once it exists and the card shows the real columns and marks differences. A connector between two tables (real or placeholder) can be saved to the relationship store as a `sketch` edge from its Properties, with optional columns. Nothing is saved to the store automatically.
112
+ - Gray thin links are derived from SQL (`{{title}}` references and tables a query reads) and are read-only. Dark connectors are yours.
113
+
114
+ ## Ask
115
+ The **Ask** tab puts a question to Databricks Genie One in plain language. Press Enter to ask (Shift+Enter for a new line), and the turn shows Genie's progress steps while it works. The answer is Markdown (no raw HTML is rendered). Each SQL statement Genie ran has **Show result** (a grid, fetched when you ask for it) and **Open in Canvas** (a new query window with that SQL). Each table the answer links to is a chip with **Open in Graph** and **Link to concept...** (pick or create a concept, then add a `describes` link). **Cancel** stops a running turn, follow-up questions continue the same conversation, **New conversation** starts over, and **Open in Databricks** goes to the thread in the workspace.
116
+
117
+ It talks to the workspace's Genie One MCP server as the connected user, so it needs EXECUTE on `system.ai.genie_one_mcp`, and it sends the selected SQL warehouse along. Nothing is saved: questions, answers and results live in the page until you reload it, and `calls.jsonl` records only that a call happened. Demo mode has canned answers (try "revenue by status", "customers per country", `fail` and `demo_slow`). See `contracts/api.md`, section 7.
118
+
119
+ ## Relationships
120
+ Edges come from one place, `GET /api/relationships?table=<name>`. Foreign keys, lineage and view dependencies are derived from the cached Unity Catalog data on every read and are never stored. Everything else (mined joins, manual and sketched edges, concept links, ontology imports) is kept in `data/relationships/<profile>.sqlite`, one file per profile, each edge with its provenance and a status of proposed, accepted or rejected. A note on a derived edge is stored separately and follows the edge.
121
+
122
+ **Mining joins** (Graph tab, **Mine joins**) is an explicit batch run through the selected SQL warehouse. It shows the SQL and time window first, then reads `system.query.history` and `system.access.table_lineage`, extracts the columns each statement joins on, and stores them as proposed `join_mined` edges with run and user counts. Statement text and user names are never stored. Reading query text needs an account admin or `databricks_pii_access`; without that the run stops and says so. Later runs are incremental. Review the results in **Suggested relationships**, and see a **Usage** summary of the busiest tables. A node's **cols** button shows its columns, with column lineage and mined joins drawn between them. Column lineage comes from `system.access.column_lineage`, one cached query per table. `GET /api/relationships/export` and `POST /api/relationships/import` move stored edges as JSON. See `contracts/api.md`, section 4.
123
+
124
+ ## Concepts
125
+ The **Concepts** tab is a small business glossary over the catalog. It is shaped like an ontology, so a later import of Databricks' Genie Ontology (domains, certified terms, synonyms, metric views) can map onto it. A concept has a name (unique, ignoring case), a definition, synonyms, a domain, a status of draft, reviewed or certified, tags and provenance (`manual`, `uc_tag` or `ontology`). It links to a table (a metric view is a table), a column or another concept, with a relation: `defines`, `measures`, `identifies` or `describes` for tables and columns, `is_a`, `part_of` or `related_to` between concepts. Links are `concept_link` edges in the relationship store, so they travel with its export and import, and deleting a concept deletes its links.
126
+
127
+ - **Find candidates** searches the names and comments of the tables and columns already in the local cache for the concept's name and synonyms, and lists hits to link in one click. It never touches the warehouse, and only knows what you have browsed.
128
+ - **Suggest from tags...** shows the read-only SQL over the `system.information_schema` tag tables, then runs it on the selected warehouse and makes one draft concept per tag key and value, linked with `describes` to the tagged tables and columns. Running it again updates those concepts and keeps your edits. Demo mode has a few tags to try it. Tags whose name starts with `system.` (such as the certification tag) are skipped.
129
+ - **Import from Databricks...** shows every REST call and SQL statement first (all read-only), then reads Genie Ontology domains and pages (Beta endpoints; a 403 or 404 is reported as "not available on this workspace"), and the measures and dimensions of metric views (found through `system.information_schema.tables`, each column's display name, synonyms and comment read with `DESCRIBE TABLE EXTENDED <view> AS JSON`, falling back to the view's YAML definition when that fails). They become concepts with origin `ontology`; measures and dimensions are linked `measures` or `describes` to the metric view's column. Running it again updates by source, keeps your edits to fields the source did not change, and removes only the links the import made. Demo mode fakes all of it.
130
+ - **Certification badges.** The `system.certification_status` tag (`certified` or `deprecated`) is shown as a badge on table nodes in the Graph tab and next to link targets in the Concepts editor. The badges come from a local cache (`certification.json` in the profile's cache folder), so opening a tab never runs a query and never wakes a stopped warehouse. The Graph toolbar and the Concepts links section show `Certification: <age>` (or `Certification: not loaded`) with a refresh button, which runs the one query on the selected warehouse and is disabled while none is selected. "Import from Databricks" refreshes the cache as one of its steps.
131
+ - On the **Graph** tab, the **Concepts** toggle draws the concepts linked to the tables on the graph as diamond nodes, with an edge to the table, or to the column when a column is linked. Click one to open it in the Concepts tab.
132
+ - **Export** and **Import** use the relationship store's JSON file (`contracts/api.md`, sections 4 and 6).
133
+
134
+ ## Layout tools
135
+ `layout.py` checks and fixes where things sit on a canvas, for people and for agents that edit canvases. It is pure (no Flask, no SDK, no randomness) and works on the saved canvas format. Locked nodes never move, and frames hold nodes by geometry.
136
+
137
+ - **Doctor** (Canvas toolbar) opens a panel with a 0-100 layout score and the issues: overlaps, near-miss alignment (1 to 6 px), uneven spacing in rows and columns, connectors through nodes, connector crossings, connector sides facing away, nodes sticking out of a frame, labels that do not fit, outliers, and off-grid nodes when grid snap is on. Click an issue to select and zoom to its nodes. **Fix** applies the automatic fix for that issue, **Tidy all** applies every one with the smallest moves (it never makes a second change to a tidied canvas), and **Tidy selection** moves only the selected nodes.
138
+ - **Arrange selection** lays the selected nodes out as a grid, row, column, or a layered flow (left to right or top to bottom) from their connectors. The selection's top-left corner stays put, and it is shifted if it would land on other nodes.
139
+ - Every Fix, Tidy and Arrange is one undo step (Cmd/Ctrl+Z). Nothing is saved until the canvas autosaves or you save it.
140
+ - The same functions are served as `POST /api/layout/doctor`, `tidy`, `arrange`, `describe` (a compact text summary for a language model) and `render` (a schematic PNG), each taking an unsaved canvas or a saved name. See `contracts/api.md`, section 3b.
141
+ - `python scripts/layout_bench.py` perturbs three generated canvases (a flow, a grid of query windows, frames with members) with jitter, overlaps, off-by-a-few alignment and connectors on the wrong sides, runs `tidy`, and prints the doctor metrics before and after. Its output (seed 7, no grid):
142
+
143
+ ```
144
+ == flow: 9 nodes, 9 connectors
145
+ clean score 100 overlap 0 crossings 0 align 1.00
146
+ perturbed score 66 overlap 1785 crossings 1 align 0.00
147
+ tidied score 88 overlap 0 crossings 0 align 1.00
148
+ == query grid: 12 nodes, 8 connectors
149
+ perturbed score 28 overlap 107620 crossings 2 align 0.08
150
+ tidied score 84 overlap 0 crossings 3 align 0.57
151
+ == frames: 15 nodes, 5 connectors
152
+ perturbed score 32 overlap 16182 crossings 0 align 0.29
153
+ tidied score 88 overlap 0 crossings 0 align 0.92
154
+ ```
155
+
156
+ When tidy grows a node to fit its label, or finds a connector label with too little room, it pushes the nodes beyond that edge outward by the missing space instead of leaving them touching, and overlap separation leaves at least 16 px (more for a labeled connector). What tidy leaves is mostly connectors that pass through nodes. Those need a different arrangement, not a nudge, so Doctor reports them without a Fix.
157
+
158
+ ## Use from an agent (MCP)
159
+ A coding agent such as Claude Code can explore the catalog and work on canvases next to you, through an MCP server inside the app (`/mcp`, streamable HTTP, this computer only). Click **Agent access** in the top bar, then **Copy command** and paste it into a terminal once:
160
+
161
+ ```sh
162
+ claude mcp add --transport http databricks-explore http://127.0.0.1:8765/mcp --header "Authorization: Bearer <token>"
163
+ ```
164
+
165
+ The panel shows the real command (the port is the app's, 8767 in demo mode) with the token hidden until you tick **Show token**. **New token** replaces it, and agents that had the old one are refused until you give them the new command. The token is created on first run in `data/mcp_token` (mode 0600), and requests from another host or a web page are refused.
166
+
167
+ - **What it can do.** Read the catalog (search, describe, list), relationships, mined join suggestions and usage, and concepts; add manual relationships and review them; create and link concepts; run **read-only SQL** (one `SELECT`, `DESCRIBE`, `SHOW` or `EXPLAIN`, checked with sqlglot, capped at 1000 rows and a timeout, cancelled when slow); and edit canvases (add shapes, text, stickies, frames, placeholder tables, query windows and table cards, connect, arrange, tidy, run the doctor, and render a PNG). Mining runs only when the agent passes `confirm: true`.
168
+ - **What it cannot do.** Write to the workspace in any way, connect, or pick a profile or warehouse. It uses what you connected in the app, and its tools say "connect in the app first" otherwise.
169
+ - **Canvas edits.** An agent places nodes by structure (right of, below or inside another node) and gets the layout doctor's score and a short text summary back after every edit. Every agent edit is saved to the canvas file at once and can be undone: **Undo agent change** in the top bar, or the agent's own `undo_canvas` (the last 20 are kept in `data/canvas_history/`).
170
+ - **Live sync.** The open canvas checks for a newer revision every 2 seconds. With no unsaved edits it reloads in place and keeps your view. With unsaved edits you get "An agent changed this canvas", with **Reload** and **Keep mine**, and autosave waits for your choice.
171
+
172
+ Try it without a workspace: `databricks-explore --demo`, then `uv run --no-project --with mcp scripts/mcp_interop.py --url http://127.0.0.1:8767` (from a checkout, `uv run --with mcp scripts/mcp_interop.py` starts its own demo server). The script drives the demo app with the official MCP Python SDK client (initialize, list tools, `status`, `search_tables`, `run_sql` allowed and rejected, then a canvas: create, add nodes, connect, arrange, doctor, render) and prints a pass or fail line for each. The full contract, every tool with its input and output, is `contracts/mcp.md`.
173
+
174
+ ## Development
175
+ ```sh
176
+ git clone <this repository> && cd databricks-explore
177
+ uv sync # Python 3.11+, the app in editable mode and the dev group (pytest, jsonschema)
178
+ cd web && npm ci && npm run build && cd .. # once, and again after frontend changes
179
+ uv run databricks-explore --demo --no-browser # or without --demo, from source
180
+ uv run pytest -q
181
+ cd web && npm test
182
+ ```
183
+ The build writes the UI to `src/databricks_explore/web_dist/` (git-ignored), which the app serves, with `THIRD-PARTY-NOTICES.txt` for the npm packages bundled into it. For hot reload run the server with `--debug`, then in a second terminal `cd web && npm run dev` and open http://127.0.0.1:5173 (Vite proxies `/api` to the Flask server on port 8765, so use the default port).
184
+
185
+ `uv build` makes the wheel and sdist in `dist/`. If `web_dist/` is missing, a hatch build hook runs `npm ci` and `npm run build` first, and stops with a clear message when Node is not installed. `python scripts/check_dist.py dist` checks the result. Run from a source checkout, the app finds an old `data/` folder and prints a hint about `--data-dir ./data`.
186
+
187
+ Layout of the source: `src/databricks_explore/` (the Python package: `app.py`, `cli.py`, `dbx.py` and the rest, `mcp_server/`), `web/` (the React UI), `tests/`, `contracts/` (API, MCP and canvas schema), `scripts/`.
188
+
189
+ ## Releasing
190
+ Releases go to PyPI and GitHub from the `release` workflow when a tag `v<version>` is pushed. The tag must equal `__version__` in `src/databricks_explore/__init__.py`, the one place the version is defined. One-time setup, done by the owner:
191
+ 1. On GitHub, create the environment `pypi` (Settings, Environments) and add a required reviewer, so every publish waits for approval.
192
+ 2. On pypi.org, add a pending publisher for the project `databricks-explore` with this repository, the workflow `release.yml` and the environment `pypi` (Account settings, Publishing).
193
+ 3. Bump `__version__`, merge, then `git tag v0.5.0 && git push origin v0.5.0`. Approve the `publish` job when it waits.
194
+
195
+ The CI workflow (`ci.yml`) runs the Python tests on Linux, Windows and macOS, the web checks, builds the wheel and sdist, and installs the wheel as a tool on all three systems to run the demo server and the MCP interop script against it.
196
+
197
+ ## Calls
198
+ | Need | Call |
199
+ |---|---|
200
+ | browse | `catalogs.list`, `schemas.list`, `tables.list` |
201
+ | columns, PK/FK, view deps | `tables.get` |
202
+ | lineage + producers + timestamps | `GET /api/2.0/lineage-tracking/table-lineage` |
203
+ | search all (optional) | `system.information_schema.tables` via SQL warehouse |
204
+ | canvas queries | SQL Statement Execution API on the selected warehouse |
205
+
206
+ ## Feedback files
207
+ `logs/calls.jsonl`, `cache/...`, `diagrams/`, `canvases/`, `canvas_history/`, `relationships/`, `mcp_token`, `screenshots/` (all inside the data folder described under Install)
@@ -0,0 +1,32 @@
1
+ databricks_explore/__init__.py,sha256=RodePDY432TdWFeORUFsAq1mKnN_2w0vd_-OhkWOCcM,211
2
+ databricks_explore/__main__.py,sha256=ycQRymJuWkZ3jBgwEEtNJG-zKF4JP78hHgG86O4JdWw,138
3
+ databricks_explore/app.py,sha256=mhzej-606pOxdTT5laPCuP9JFAyUAIDmdRqsCjOPbUU,23186
4
+ databricks_explore/canvases.py,sha256=vimk7u-0cZx_8fY9TpwknuJCMuR5qgQiSzzcDkExpss,13815
5
+ databricks_explore/cli.py,sha256=YhEFLzTl5V3lqGTJNnYVTfNCo_0Do1BEffdnfYtcwLY,4173
6
+ databricks_explore/concepts.py,sha256=Ak454hfm9od7o_XbDTEC4fQmAQG7hhcXbE9umsLDQn4,15450
7
+ databricks_explore/dbx.py,sha256=pGhrny3giJPwLIQ6I6UzpmhvJnnqp4fXCtyTnGJdbgo,27759
8
+ databricks_explore/demo.py,sha256=Rd82Hni8EE0kG38FfuDXDSYHBH44GOWUL-XBcNPHt6s,35247
9
+ databricks_explore/demo_history.py,sha256=rXrKN8GgbgVRnr7dMh8p_JXPjRBFdhqD3lq8ovoTbZY,9461
10
+ databricks_explore/genie.py,sha256=zt98EXFGYcz1-V-qAT3ZVXgGEfX0HVtn9uUT4wRNHFQ,13362
11
+ databricks_explore/layout.py,sha256=oCESqm7toxObqL0qQlK3zhsUIDkbGieLrMWBv4OJQWw,81009
12
+ databricks_explore/mining.py,sha256=T3lrKTdW2VP3SOfefTcqBThAREl_Y2jS53PWNp4Pnzg,19747
13
+ databricks_explore/ontology.py,sha256=pdf_eaWB9ERubmCO_2JfNLOAPy1yngVZa682F-zYwZI,24015
14
+ databricks_explore/relationships.py,sha256=0F-3dyoKJj_MpFlHIUhW9FCjAq8NYZ0sr2PGymREZos,44341
15
+ databricks_explore/sqltools.py,sha256=7aZECBvIoTMF-2x5VkGYML6jqVk7FxGYOuSKVTwZ4ZQ,21296
16
+ databricks_explore/mcp_server/__init__.py,sha256=lZTm06uWCm7QEJwpgmos2kS89AkTYt7dp_KyjlB0ii8,5296
17
+ databricks_explore/mcp_server/auth.py,sha256=1O-o9wvhuY7JnyuXM-c-OOXqNXjnVjp6DTMtrO0jeV0,3216
18
+ databricks_explore/mcp_server/rpc.py,sha256=DcbKIxfECXhr9GAmWrI94U4CdOf7ll1XbLPPHKopp8M,4796
19
+ databricks_explore/mcp_server/schema.py,sha256=Dl4qSl9fIDgIfc0tXKry140-LKNBO0yrdU_MIQ4Lj4U,3583
20
+ databricks_explore/mcp_server/sqlguard.py,sha256=guLXPa4Zvt5mJh5GggMxYVf79jccAV_XzXveZ5REfaI,3402
21
+ databricks_explore/mcp_server/tooling.py,sha256=14d7xGWTbFrbqGkrnLmuySqghl3X-qQvbKOe_wMWz9s,2998
22
+ databricks_explore/mcp_server/tools_canvas.py,sha256=6Wg8xY_jd81p46q_19zIeoshGZdNJfKAA8xvjumsNwk,24903
23
+ databricks_explore/mcp_server/tools_data.py,sha256=zP9MYTHRX-6PpYvEphT_y-qi2WllWT0KZ3qvTwsg9vU,24109
24
+ databricks_explore/web_dist/THIRD-PARTY-NOTICES.txt,sha256=6jBW5w4P_rsbYnnWG_V1naop-IPe7XJquisLl29-Zzg,285342
25
+ databricks_explore/web_dist/index.html,sha256=P_0cZE_deEHioxdDKM170THXhqJ-Rn1_IzSgEDlQ1d4,404
26
+ databricks_explore/web_dist/assets/index-6I1cPS7i.css,sha256=PbJA6Xxn4JIr3lKHxR-6SqeUSYjzSzTSiXPFOs4zkek,46685
27
+ databricks_explore/web_dist/assets/index-CR9j5CJG.js,sha256=HaLlBvuJakPX6UQvoDfqv8kpqmfBRNinl9pbWvN48wo,3489556
28
+ databricks_explore-0.5.0.dist-info/METADATA,sha256=Kk3uP6ZNLbZhXd7mcU5FwDfQOmJ-PPTcUny6FCBS2C4,24497
29
+ databricks_explore-0.5.0.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
30
+ databricks_explore-0.5.0.dist-info/entry_points.txt,sha256=f9pkQOUw6d_WwQmgc6GAuTQeDgqjFUInnoZ563biVAw,67
31
+ databricks_explore-0.5.0.dist-info/licenses/LICENSE,sha256=mqWzGDe5xxI3SAhRlHU2Qn9EK6hiAe6DAq6ReGVfFew,1070
32
+ databricks_explore-0.5.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.33.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ databricks-explore = databricks_explore.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Thomas Slater
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.