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
56 changes: 56 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,62 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.9.0] - 2026-08-01

The canvas audit. v1.8.0 rebuilt the interface around the canvas and never measured the canvas
itself, so every pan, zoom and drag setting was still a React Flow default. Driving all 16 `init`
templates through the running app, and running 8 interactions at 1920, 1440 and 390px, found 14
defects. This release closes them. No backend contract changes, so the CLI, the MCP server and
every API route behave exactly as in 1.8.0.

### Fixed

- **Every connection now draws an arrowhead.** The computed `markerEnd` on every edge was `none`,
so a directed architecture diagram showed no direction at all.
- **Connection lines clear the contrast floor.** They rendered at 1.42:1 in light and 1.81:1 in
dark, against the 3:1 WCAG floor for meaningful graphics. `--edge` is now `#64748b` on the light
canvas at 4.55:1 and `#94a3b8` on the dark canvas at 7.3:1, solid instead of dashed and 1.6px
instead of 1px.
- **The canvas zooms out far enough to fit a phone.** React Flow's 0.5 floor left 2 of 8 nodes
outside the pane at 390px, with the Zoom Out button already disabled on arrival. The floor is
now 0.12 and Fit View honours the same value, so all 8 fit at 0.29.
- **A boundary no longer eats the drag that should pan the canvas.** Dragging a VPC moved the box
and its children by 113px, the VPC itself did not follow, and nothing saved the move. Boundaries
are decoration now: they take no drag, no click and no pointer event.
- **A node is no longer trapped in its tier.** `extent: "parent"` against a box that hugged its
contents left a node 5 to 10px of travel and no way out. Nodes carry absolute positions, the
boundary re-fits around wherever they land, and a drag moves the full distance asked for.
- **The Delete key removes a selected connection.** React Flow listens for Backspace alone by
default, so Delete did nothing to a selected edge. Both keys work.
- **Connect-by-drag works at 390px.** Handles went from 6px to 9px with a 28px connect radius.
- **A connection leaves the side of the node that matches the tier gap.** One pair of handles sent
a same-tier connection out of the bottom and back into the top of the node beside it. Neighbours
in a row now link straight across, anything further apart dips under the row, and a connection
that skips a tier runs down the outside. Connections that disappear behind a card they do not
touch fall from 17 to 5 across the 16 templates, and labels sitting on a card fall from 18 to 13.
- **A tier orders its components before it places them.** A barycentre sweep puts connected
components near each other. Ties keep the spec's own order, so one spec always draws one picture.
- **The VPC border clears the tier borders inside it.** Both rectangles came from the same
component positions with the same padding, so they shared a line in 12 of the 16 templates.
- **Boundary colours come from theme tokens.** Hardcoded light `rgba` painted the VPC as a pale
slab on the dark canvas. Each tier keeps its hue and mixes its fill against the canvas.
- **A card holds a fixed 260px, the width the layout reserves for it.** The card grew with its
content while the layout assumed 200px.
- **A row centres on its nodes, not on the column slots they sit in.** The old form sat 50px off.
- **Add Resource puts the resource in its tier.** It used to land on a fixed grid position that
collided with whatever the generated layout had already put there.
- **The dead resize handle is gone.** `NodeResizer` rendered on every boundary with no handler to
keep a resize, so any resize vanished on the next change.

### Notes

- Catalog drag and drop still does not exist, and no documentation claims it. README and
`getting-started.md` say "drag components", which means dragging a node on the canvas, and that
works. `docs/competitor-landscape.md` lists a drag-and-drop designer as a competitor's advantage.
- Connection crossings rise from 8 to 13 across the 16 templates. That is the deliberate half of
the trade: a connection crossing another connection stays readable, while one that vanishes
behind an unrelated card does not.

## [1.8.0] - 2026-07-31

A full rebuild of the web canvas interface. A UI audit of all 15 frontend components found 45
Expand Down
18 changes: 10 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,16 +114,18 @@ findings = Validator().validate(spec, compliance=["hipaa", "pci-dss"])
hcl = export_spec(spec, "terraform", output_dir="./infra")
```

## v1.8.0 rebuilt the canvas and stopped a mid-stream double bill
## v1.9.0 gave the diagram arrowheads and got the canvas off React Flow's defaults

- **One token set and a dark theme.** The theme follows your operating system until you pick a side.
- **Every text colour clears the 4.5:1 contrast floor.** 29 sites did not.
- **It works on a phone.** Below 900px the layout becomes a two-pane switch, and the nine tabs scroll.
- **A mid-stream error no longer bills twice.** The old fallback ran a second generation over the first.
- **A real `tablist` with arrow-key roving focus**, a live region for progress, `Cmd/Ctrl+K` for the composer.
- **Panel results survive a tab switch.** The Export tab now offers all thirteen formats.
Measured by driving all 16 `init` templates through the running app, and 8 interactions at 1920, 1440 and 390px.

Earlier releases added control-ID mapping and `plan` (v1.5.0), the self-correcting architect and OSCAL (v1.6.0), and `cloudwright integrate` (v1.7.0). Full history in [CHANGELOG.md](CHANGELOG.md).
- **Every connection draws an arrowhead.** The computed `markerEnd` was `none` on every edge.
- **Connection lines clear 3:1 contrast.** They ran at 1.42:1 in light and 1.81:1 in dark.
- **The canvas fits a phone.** The 0.5 zoom floor left 2 of 8 nodes off the pane at 390px; the floor is 0.12.
- **A drag inside a VPC pans the canvas.** It used to drag the box out of shape and save nothing.
- **A node moves the distance you drag it.** A tight boundary plus `extent: "parent"` allowed 5 to 10px.
- **Connections stop hiding behind cards.** 17 of them did across the 16 templates; 5 still do.

Earlier releases added control-ID mapping and `plan` (v1.5.0), the self-correcting architect and OSCAL (v1.6.0), `cloudwright integrate` (v1.7.0), and the dark theme and responsive layout (v1.8.0). Full history in [CHANGELOG.md](CHANGELOG.md).

## Compatibility

Expand Down
Binary file modified examples/cloudwright-smart-canvas-demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion packages/cli/cloudwright_cli/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "1.8.0"
__version__ = "1.9.0"
2 changes: 1 addition & 1 deletion packages/core/cloudwright/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
ValidationResult,
)

__version__ = "1.8.0"
__version__ = "1.9.0"

__all__ = [
"Alternative",
Expand Down
8 changes: 4 additions & 4 deletions packages/core/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ dependencies = [
]

[project.optional-dependencies]
cli = ["cloudwright-ai-cli==1.8.0"]
web = ["cloudwright-ai-cli==1.8.0", "cloudwright-ai-web==1.8.0"]
mcp = ["cloudwright-ai-mcp==1.8.0"]
all = ["cloudwright-ai-cli==1.8.0", "cloudwright-ai-web==1.8.0", "cloudwright-ai-mcp==1.8.0", "databricks-sdk>=0.38.0"]
cli = ["cloudwright-ai-cli==1.9.0"]
web = ["cloudwright-ai-cli==1.9.0", "cloudwright-ai-web==1.9.0"]
mcp = ["cloudwright-ai-mcp==1.9.0"]
all = ["cloudwright-ai-cli==1.9.0", "cloudwright-ai-web==1.9.0", "cloudwright-ai-mcp==1.9.0", "databricks-sdk>=0.38.0"]
pdf = ["weasyprint", "markdown2"]
databricks = ["databricks-sdk>=0.38.0"]
live-import = [
Expand Down
2 changes: 1 addition & 1 deletion packages/mcp/cloudwright_mcp/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "1.8.0"
__version__ = "1.9.0"
2 changes: 1 addition & 1 deletion packages/web/cloudwright_web/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""Cloudwright Web — FastAPI backend for architecture intelligence."""

__version__ = "1.8.0"
__version__ = "1.9.0"


def __getattr__(name: str):
Expand Down

This file was deleted.

Loading
Loading