Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# Changelog

## 0.2.0 — 2026-10-01

**Source control** — a new tab that drives Fabric Git integration across every workspace you can see.
- Scan: Git connection, repo, folder and branch of each workspace, grouped by repo and folder or listed A–Z by workspace; branch workspaces and their source; workspaces sharing a branch.
- Freshness: stale (no sync for 7 days) and needs attention (30 days, never initialised, conflicts). Thresholds in `settings.json`.
- Update from Git and Commit to Git, with the change list first, selective commits and an explicit conflict policy. Updates that would delete a lakehouse, warehouse or database are refused.
- Offload items Git can't track to a nominated local folder, in the Fabric Git layout with a manifest. Reports without a definition are saved as PBIX, others as metadata.
- Repoint a workspace to another branch: preflight, full local backup, preview of every add / overwrite / delete before anything changes, blocks on data-bearing deletions, automatic restore on failure, a journal that survives crashes, and branch-workspace links put back.
- Step-by-step progress with live percentages for long service operations.

Repointing is new and changes a workspace's Git connection: try it on a test workspace first. It needs the workspace Admin role.

**Interface**
- Clearer text: 14px body, nothing below 12px, subpixel rendering, less negative letter spacing.

## 0.1.0 — first public release

A cross-platform (Windows, Linux) desktop editor for Microsoft Fabric semantic models, notebooks and lakehouses.
Expand Down
8 changes: 7 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ A cross-platform desktop editor for Microsoft Fabric. It edits semantic models l
- **TOM SDK** (`Microsoft.AnalysisServices.NetCore.retail.amd64`) stays at `19.84.1` unless there is explicit approval. It connects over HTTP XMLA with `Server.AccessToken`, which works cross-platform. TCP and local PBI Desktop connections are Windows-only and out of scope.
- **Auth:** one MSAL public client (Power BI Desktop client id, system-browser loopback). The Power BI-audience token covers the Power BI REST, Fabric REST and XMLA APIs. OneLake uses a storage-audience token.
- **Licence:** source-available (Daxis Community License 1.0), not open source. Never call it open source, never add copyleft dependencies, and add every new third-party component to `THIRD-PARTY-NOTICES.md`.
- **Scope:** semantic models, notebooks and lakehouses only. There is no Git integration, no local PBI Desktop and no licensing.
- **Scope:** semantic models, notebooks, lakehouses and source control. Source control drives Fabric's own Git integration through its REST API (scan, status, commit, update, repoint) and offloads items Git can't track to a local folder. Daxis never pushes from the local machine and never deletes a data-bearing item. No local PBI Desktop and no licensing.
- **Repoint safety:** every step that changes a workspace's Git connection is written to `RepointJournal` first, and any failure after disconnect restores the original branch. Never add a path that disconnects without a journal, or that updates without the user having seen the preview.
- **Save safety:** model edits stay local until the user has reviewed the before/after list and clicked "Confirm & save to service". Every other write (refresh, notebook save/run) goes through `TabBase.Ask(...)`. Never add a write path that skips both.
- **Token safety:** only `FabricClient` sends tokens, and `IsTrusted(url, scope)` allowlists hosts per audience. Never add another HTTP path with a bearer token. Browser links go through `Web.Open`, which accepts Fabric/Power BI portal links plus the two product pages (GitHub repo, portable-labs.com) only.
- **Config:** `DAXIS_CLIENT_ID` sets your own Entra app (the default is the Power BI Desktop public client). `DAXIS_HOME` sets the data folder, for portable installs and isolated test runs.
Expand All @@ -27,12 +28,17 @@ A cross-platform desktop editor for Microsoft Fabric. It edits semantic models l
| `src/Daxis.Core/ReportAnalysis.cs` | Report definitions (PBIR and legacy): pages, visuals, slicers, applied filters, field refs. `Coverage` classifies model fields as used in reports / model only / unused. `Dax` token-level reference finder |
| `src/Daxis.Core/ModelHealth.cs` | Storage (VertiPaq DMVs → size per column/table) and refresh health (schedule, history, durations) |
| `src/Daxis.Core/Treemap.cs` | Squarified treemap layout (pure maths; `TreemapView` renders it) |
| `src/Daxis.Core/FabricGit.cs` | Fabric Git integration endpoints (partial of `FabricClient`) |
| `src/Daxis.Core/SourceControl.cs` | Git models and parsing, freshness, branch families, tracked / data-bearing item types, switch and update impact classification, preflight, `RepointJournal` |
| `src/Daxis.Core/Repoint.cs` | `Repointer`: backup → disconnect → connect → initialise → preview → apply or restore |
| `src/Daxis.Core/Offload.cs` | Writes item definitions to disk in the Fabric Git layout (atomic per item, path-safe, manifest); offloads and repoint backups |
| `src/Daxis.Core/ModelGraph.cs` | Graphs plus layout for the model diagram (relationships) and pipeline lineage (sources → staging → tables → reports) |
| `src/Daxis.App/GraphCanvas.cs` | Pan/zoom canvas that renders a `Graph`: entrance animation, hover tracing with flowing particles, semantic zoom, drag, find |
| `src/Daxis.App/UsageBar.cs` | Animated share bar (report usage) |
| `src/Daxis.App/MainViewModel.cs` | Shell: sign-in, workspace, item lists, tabs, theme |
| `src/Daxis.App/ModelTab.cs` | Semantic model view model: typed object tree, DAX/M editing, overview, diagram, lineage, report usage, review-then-save |
| `src/Daxis.App/WorkspaceTab.cs` | Workspace overview: item inventory, models and reports, sources → models → reports lineage |
| `src/Daxis.App/SourceControlTab.cs` | Source control view model: scan, detail, commit / update, offload, repoint, recovery, operation stepper |
| `src/Daxis.App/Tabs.cs` | `TabBase`, `NotebookTab`, `LakehouseTab` |
| `src/Daxis.App/Views/*` | One view per tab type. Views are cached per tab in `MainWindow` |
| `src/Daxis.App/Editors.cs` | AvaloniaEdit setup, theme-aware highlighting and completion popup |
Expand Down
11 changes: 8 additions & 3 deletions DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ colors:
typography:
ui: "Inter (Circular substitute), embedded"
mono: "JetBrains Mono, embedded"
scale: { h1: 22/500/-0.4, title: 20/500/-0.3, h2: 15/500, body: 13/400, caption: 12/400, label: 11/500/+0.6 uppercase }
scale: { h1: 22/500/-0.2, title: 20/500/-0.2, h2: 16/500, body: 14/400, small: 13/400, caption: 12/400 (minimum), label: 11.5/500/+0.6 uppercase, mono: 12.5, editor: 13 }
rendering: subpixel antialiasing; negative tracking only at 20px and above
rounded: { control: 6, card: 8, pill: 999 }
spacing: [2, 4, 8, 12, 16, 20, 24, 32]
---
Expand Down Expand Up @@ -63,7 +64,7 @@ The tokens live in `src/Daxis.App/Theme/Tokens.axaml` and the component styles i
## Components
| Component | Rule |
|---|---|
| Button (default) | `bg2` fill, `border-strong` hairline, 6px radius, 13/500, 30px min height |
| Button (default) | `bg2` fill, `border-strong` hairline, 6px radius, 14/500, 30px min height |
| Button.primary | `brand` fill, `on-brand` text, hover `brand-hover`. Only one per view |
| Button.ghost | Transparent icon button with `fg-muted` icon and `bg3` on hover |
| Button.nav | Sidebar row: 28px, `fg-muted`, `bg3` when active or hovered |
Expand All @@ -76,12 +77,16 @@ The tokens live in `src/Daxis.App/Theme/Tokens.axaml` and the component styles i
| Graph canvas | `bg1` with a `border-strong` dot grid. Cards are `bg2` with an 8px radius and hairline; edges are `border-strong` beziers. Tracing dims everything else to 14% and draws the path in `brand-text` with `brand` particles moving in the flow direction. Zoomed out, detail fades and titles grow |
| Floating toolbar | `bg2`, hairline, 8px radius, no shadow; top-left over a canvas, hints bottom-left |
| Usage bar | `bg3` track, `brand` for the primary share over `brand-border` for the secondary; grows from zero |
| Stepper | One row per step of a long operation: hollow ring (pending), pulsing brand ring (running, with a 3px determinate bar when the service reports a percentage), brand check (done), danger cross (failed). Sits in a card over a scrim; the result shows as a callout and the card closes only when nothing is running |
| Skeleton | `bg3` bar that breathes (opacity 0.35↔1) only while its row is loading |
| Callout | `bg2` card with hairline for explanations; `.danger` (DangerSoft + Danger) for blocks, `.warn` (Warning hairline) for warnings that need acknowledgement |
| Status dot | 8px: brand = fresh, `Warning` = stale, `Danger` = needs attention, `fg-faint` = unknown |
| Icons | Hand-drawn 24×24 stroke geometry at a 1.6px stroke (`Icon.cs`). No emoji, no icon fonts |

## Motion
- Ease out, never bounce. Canvas motion is exponential easing (frame-rate independent); page switches fade in over 280ms.
- Animate to explain: entrances stagger left to right in flow order, and particles show direction. Nothing loops while the view is idle.
- Request frames only while something is moving.
- Request frames only while something is moving. The only looping animations (skeleton, running step) exist only while work is in flight.

## Syntax colours
The same roles apply to DAX and Python:
Expand Down
2 changes: 2 additions & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
<!-- Release builds override this from the git tag (v0.2.0 → 0.2.0). -->
<Version>0.2.0</Version>
<!-- Reproducible restores: packages.lock.json is committed and CI restores in locked mode. -->
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>
Expand Down
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,13 @@ Windows and Linux. Free for individuals and small businesses.
- **Refresh health** and per-table freshness.
- **Edit** DAX and Power Query with IntelliSense and formatters. **Every change is reviewed** before/after, and nothing is written until you confirm.

**Source control** (Fabric Git integration, across every workspace you can see)
- **Scan:** which workspaces are on Git, the repo, folder and branch each uses, branch workspaces and their source, and workspaces sharing one branch.
- **Freshness:** flags workspaces not synced for a week (stale) or a month, never initialised, or in conflict (needs attention).
- **Update from Git / Commit to Git** with the item list first, selective commits and an explicit choice for conflicts.
- **Offload** items Git can't track (dashboards, datamarts, dataflows Gen1…) to a folder you choose, in the Fabric Git layout.
- **Repoint a workspace to another branch without losing anything:** refuses if anything is uncommitted, backs up every item locally, previews exactly what the branch would add, overwrite or delete, never deletes a lakehouse, warehouse or database, and puts the original branch back if you cancel or anything fails (even after a crash).

**Also:** notebooks (edit, save, run), lakehouses (tables and files), Ctrl+K workspace search, light and dark themes.

<table>
Expand Down Expand Up @@ -82,12 +89,14 @@ Linux needs a desktop session. Minimal images and WSL may also need `sudo apt in
- A work or school account with access to the workspace.
- For semantic models: a workspace on **Fabric, Premium or PPU** capacity with the **XMLA endpoint** enabled (read-write to edit), and Contributor or higher.
- Report usage reads report definitions, which Fabric only allows with **edit rights on the report**.
- Source control: Git integration enabled in the tenant, your Git account set up in the workspace's Source control panel, **Contributor** to see status, commit and update, **Admin** to repoint a branch. If Git calls are refused for missing permissions, register your own Entra app with the Fabric `Workspace.ReadWrite.All`, `Workspace.GitCommit.All` and `Workspace.GitUpdate.All` delegated scopes and point Daxis at it with `DAXIS_CLIENT_ID`.

## Security

- **No Daxis server, no telemetry.** Daxis only talks to Microsoft sign-in, Fabric, Power BI and OneLake.
- **Tokens stay on your machine** (DPAPI-encrypted on Windows, owner-only on Linux) and are never sent to any other host.
- **Nothing changes in Fabric without your confirmation.**
- **Git credentials never touch Daxis.** Fabric talks to GitHub or Azure DevOps itself; Daxis never pushes from your machine. Offloads and backups are written only to the folder you pick.
- Sign-in uses the Power BI Desktop public client. To use your own Entra app, set `DAXIS_CLIENT_ID`. `DAXIS_HOME` moves the data folder.

Details and vulnerability reporting: [SECURITY.md](SECURITY.md).
Expand Down
Loading
Loading