Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
52e20ff
update deps for sec vulnerabilities (#1205)
JannikStreek Mar 18, 2026
58bff57
make log level configurable (#1204)
JannikStreek Mar 18, 2026
144e9e9
build(deps-dev): bump the development-dependencies group across 1 dir…
dependabot[bot] Mar 18, 2026
2f14322
backfill openspec based on e2e tests (#1208)
JannikStreek Mar 18, 2026
2a48ec1
build(deps): bump docker/login-action from 3 to 4 (#1191)
dependabot[bot] Mar 18, 2026
b988c4f
build(deps): bump docker/setup-qemu-action from 3 to 4 (#1192)
dependabot[bot] Mar 18, 2026
cd15772
build(deps): bump ngx-toastr from 19.1.0 to 20.0.5 (#1180)
dependabot[bot] Mar 18, 2026
cae1f91
build(deps-dev): bump @types/supertest from 6.0.3 to 7.2.0 (#1196)
dependabot[bot] Mar 18, 2026
b5f363c
build(deps): bump docker/setup-buildx-action from 3 to 4 (#1193)
dependabot[bot] Mar 18, 2026
a6bd5ee
build(deps-dev): bump eslint from 9.39.2 to 10.0.3 (#1195)
dependabot[bot] Mar 18, 2026
58d5398
build(deps): bump actions/upload-artifact from 6 to 7 (#1181)
dependabot[bot] Mar 18, 2026
9ab760d
build(deps): bump docker/build-push-action from 6 to 7 (#1190)
dependabot[bot] Mar 18, 2026
c6240ca
build(deps-dev): bump @eslint/js from 9.39.2 to 10.0.1 (#1179)
dependabot[bot] Mar 18, 2026
de0c00d
build(deps): bump the production-dependencies group across 1 director…
dependabot[bot] Mar 18, 2026
c7c84d5
adjust log level to warn for deprecation warnings and use migrations …
JannikStreek Mar 18, 2026
b1d7b4c
Merge tag 'v0.2.4-1' into merge-0.2.4-1
JannikStreek Mar 19, 2026
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
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ jobs:
- uses: actions/checkout@v6

- name: Set up QEMU
uses: docker/setup-qemu-action@v3
uses: docker/setup-qemu-action@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4

- name: Login to GitHub Container Registry
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
Expand All @@ -36,7 +36,7 @@ jobs:
- run: corepack prepare pnpm@9 --activate

- name: Build and export to Docker
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
context: .
tags: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/playwright.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:
POSTGRES_QUERY_TIMEOUT: 100000
POSTGRES_STATEMENT_TIMEOUT: 100000
BINDING: localhost
- uses: actions/upload-artifact@v6
- uses: actions/upload-artifact@v7
if: ${{ !cancelled() }}
with:
name: playwright
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v6
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4
- name: Log in to the Container registry
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
Expand All @@ -51,7 +51,7 @@ jobs:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

- name: Build and push Docker image
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
platforms: linux/amd64
target: production
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,7 @@ The following environment variables override the feature flags from the JSON con
| `AI_ENABLED` | Enable AI features (mindmap generation) | `false` |
| `YJS_ENABLED` | Enable Yjs-based real-time collaboration | `false` |
| `DELETE_AFTER_DAYS` | Number of days before mindmaps are deleted | `30` |
| `LOG_LEVEL` | NestJS log verbosity (`error`, `warn`, `log`, `debug`, `verbose`) | `debug` in DEV, `log` otherwise |

### Further details

Expand Down
1 change: 1 addition & 0 deletions docker-compose-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ services:
POSTGRES_QUERY_TIMEOUT: ${POSTGRES_QUERY_TIMEOUT:-100000}
POSTGRES_STATEMENT_TIMEOUT: ${POSTGRES_STATEMENT_TIMEOUT:-100000}
DELETE_AFTER_DAYS: ${DELETE_AFTER_DAYS:-30}
LOG_LEVEL: ${LOG_LEVEL:-warn}
JWT_SECRET: ${JWT_SECRET}
ports:
- "${APP_PROD_PORT:-80}:3000"
Expand Down
1 change: 1 addition & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ services:
AI_LLM_TPD: ${DOCKER_COMPOSE_APP_ENV_AI_LLM_API_TPD}
JWT_SECRET: ${JWT_SECRET}
YJS_ENABLED: ${YJS_ENABLED:-true}
LOG_LEVEL: ${LOG_LEVEL:-warn}

TESTING_PLAYWRIGHT_WS_ENDPOINT: "ws://playwright:9323"
TESTING_PLAYWRIGHT_BASE_URL: "http://app:4200"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-03-18
36 changes: 36 additions & 0 deletions openspec/changes/archive/2026-03-18-backfill-e2e-specs/design.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
## Context

The project has 11 Playwright e2e test files that serve as the de facto specification for application behavior, but no formal specs exist outside of `log-level-config`. This change creates lightweight spec files derived 1:1 from e2e test assertions — no code changes involved.

## Goals / Non-Goals

**Goals:**
- Create one spec file per capability listed in the proposal (9 total)
- Each spec documents only behavior verified by existing e2e tests
- Specs use requirement/scenario format consistent with existing `log-level-config` spec

**Non-Goals:**
- Documenting behavior not covered by e2e tests
- Covering Yjs-related functionality (separate changes handle those)
- Adding new e2e tests or modifying existing ones
- Any application code changes

## Decisions

### Spec granularity: one folder per capability
Node editing, node images, and node links are grouped into a single `node-operations` spec since they all operate on individual nodes. Other capabilities get their own folder.

**Alternative considered:** 1:1 mapping of e2e file to spec file. Rejected because the three node-related test files cover closely related behavior on the same entity.

### Spec depth: match e2e assertions only
Each requirement/scenario maps directly to an e2e test assertion. No extrapolation beyond what tests verify.

**Alternative considered:** Comprehensive specs that also cover untested behavior. Rejected — that would be aspirational rather than documenting known-good behavior.

### Spec format: requirement + scenario blocks
Follow the same structure as `openspec/specs/log-level-config/spec.md` — requirement headings with WHEN/THEN scenario blocks.

## Risks / Trade-offs

- [Incomplete coverage] Specs only reflect what e2e tests check, not full feature behavior → Acceptable; specs can be expanded later when new tests are added
- [Maintenance burden] Specs may drift from e2e tests over time → Mitigated by keeping specs lightweight and tied to observable behavior
31 changes: 31 additions & 0 deletions openspec/changes/archive/2026-03-18-backfill-e2e-specs/proposal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
## Why

The project has 11 Playwright e2e test files covering core features but only 1 formal spec (`log-level-config`). This means implemented behavior is undocumented outside of test code. Backfilling specs from existing e2e tests creates a single source of truth for what the application does today, making future changes easier to reason about.

## What Changes

- Add 9 new capability specs derived directly from existing e2e tests
- Specs are intentionally lightweight — they document only what e2e tests verify, not aspirational behavior
- No code changes; this is purely documentation of existing behavior

## Capabilities

### New Capabilities
- `mind-map-core`: Map creation, root node rendering, node addition, persistence across page reload
- `node-operations`: Add/remove nodes via floating buttons, bold/italic text formatting, node dragging, image upload to nodes, add/remove hyperlinks on nodes
- `branch-colors`: First-level branches get distinct colors, child nodes inherit parent branch color
- `import-export`: Import menu with JSON and Mermaid options, JSON file upload import, Mermaid syntax import with color handling
- `undo-redo`: Undo reverts last action, redo restores it (button-driven)
- `settings`: Language selection, map options tab with auto branch colors toggle and font size configuration
- `zoom-controls`: Zoom in, zoom out, center map buttons
- `share-functionality`: Share dialog with QR code, copy link, editable/view-only toggle, download and duplicate actions
- `navigation`: Navigate to settings page and back, navigate to shortcuts page

### Modified Capabilities
_(none — all new specs)_

## Impact

- `openspec/specs/` — 9 new spec folders added
- No application code affected
- No existing specs modified
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
## ADDED Requirements

### Requirement: First-level branches have distinct colors
The system SHALL assign different colors to branches connecting first-level child nodes to the root. Each first-level branch SHALL have a unique color.

#### Scenario: Two first-level branches have different colors
- **WHEN** two child nodes are added directly to the root node
- **THEN** their branch connectors SHALL have different fill colors

### Requirement: Child nodes inherit their parent's branch color
The system SHALL assign child branches the same color as their parent's branch. All children of the same parent SHALL share the same branch color.

#### Scenario: Second-level node inherits parent branch color
- **WHEN** a child node is added to a first-level branch node
- **THEN** the child's branch color SHALL match the parent's branch color

#### Scenario: Multiple children of the same parent share branch color
- **WHEN** multiple child nodes are added to the same first-level branch
- **THEN** all their branch colors SHALL be identical to the parent's branch color
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
## ADDED Requirements

### Requirement: Import menu offers JSON and Mermaid options
The system SHALL provide an import menu that displays JSON and Mermaid import options when opened.

#### Scenario: Open import menu
- **WHEN** the user opens the import menu
- **THEN** both "JSON" and "MERMAID" options SHALL be visible

### Requirement: User can import a mind map from a JSON file
The system SHALL allow users to import a mind map by uploading a JSON file. The imported map SHALL replace the current map and display the nodes defined in the file.

#### Scenario: Upload JSON file for import
- **WHEN** the user selects JSON import and uploads a valid JSON map file
- **THEN** the imported nodes SHALL be visible on the map
- **AND** each expected node SHALL appear exactly once

### Requirement: User can import a mind map from Mermaid syntax
The system SHALL open a dialog with a text area when the user selects the Mermaid import option. Users SHALL enter Mermaid mindmap syntax and trigger import. On success, the dialog SHALL close and the nodes from the Mermaid syntax SHALL appear on the map.

#### Scenario: Import Mermaid mindmap via dialog
- **WHEN** the user enters valid Mermaid mindmap syntax and clicks import
- **THEN** the dialog SHALL close
- **AND** all nodes defined in the Mermaid syntax SHALL be visible on the map

### Requirement: Mermaid import preserves branch color assignment
The system SHALL assign distinct branch colors when importing a Mermaid mindmap with multiple first-level branches. Child branches SHALL share their parent's color, resulting in as many unique colors as there are first-level branches.

#### Scenario: Imported Mermaid map has correct branch colors
- **WHEN** a Mermaid mindmap with 3 first-level branches (one with a child) is imported
- **THEN** 4 branch connectors SHALL exist
- **AND** there SHALL be exactly 3 unique colors among them
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
## ADDED Requirements

### Requirement: User can create a new mind map
The system SHALL allow users to create a new mind map from the home page. Upon creation, the map SHALL be displayed with a default root node labeled "Root node".

#### Scenario: Create mind map from home page
- **WHEN** the user clicks "Create mind map"
- **THEN** a mind map SHALL be displayed with a root node labeled "Root node"

### Requirement: Nodes are persisted across page reloads
The system SHALL persist newly added nodes to the backend. When the page is reloaded, all previously added nodes SHALL be retrieved and displayed.

#### Scenario: Added node survives page reload
- **WHEN** the user adds a new node and reloads the page
- **THEN** the added node SHALL still be visible after reload
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## ADDED Requirements

### Requirement: User can navigate to settings and back to the map
The system SHALL provide a settings navigation button that opens the settings page. While on the settings page, the map SHALL not be rendered. A close action SHALL return the user to the map view.

#### Scenario: Navigate to settings and return
- **WHEN** the user navigates to settings
- **THEN** the settings page SHALL be visible and the map SHALL not be present
- **WHEN** the user closes settings
- **THEN** the map SHALL be visible again

### Requirement: User can navigate to the shortcuts page
The system SHALL provide a shortcuts navigation button that navigates to the keyboard shortcuts page.

#### Scenario: Navigate to shortcuts page
- **WHEN** the user clicks the shortcuts navigation button
- **THEN** the application SHALL navigate to the shortcuts page
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
## ADDED Requirements

### Requirement: User can add and remove child nodes
The system SHALL allow users to add a child node to the currently selected node via an add button, and remove a selected node via a remove button.

#### Scenario: Add a child node
- **WHEN** the user clicks the add node button and types a node name
- **THEN** the new node SHALL appear on the map

#### Scenario: Remove a node
- **WHEN** the user selects a node and clicks the remove node button
- **THEN** the node SHALL no longer be visible on the map

### Requirement: User can toggle bold and italic text styles on nodes
The system SHALL provide bold and italic toggle buttons that apply font styles to the selected node's text. Styles SHALL be independently togglable and composable.

#### Scenario: Toggle bold on
- **WHEN** the user selects a node and activates bold
- **THEN** the node text SHALL render in bold

#### Scenario: Toggle italic on while bold is active
- **WHEN** bold is active and the user activates italic
- **THEN** the node text SHALL render in both bold and italic

#### Scenario: Toggle bold off leaving only italic
- **WHEN** both bold and italic are active and the user deactivates bold
- **THEN** the node text SHALL render in italic only

#### Scenario: Toggle italic off returning to normal
- **WHEN** only italic is active and the user deactivates italic
- **THEN** the node text SHALL render in normal style

### Requirement: User can drag nodes to reposition them
The system SHALL allow users to drag nodes to new positions on the map. The node's visual position SHALL change after dragging.

#### Scenario: Drag a node to a new position
- **WHEN** the user drags a node to a different location
- **THEN** the map layout SHALL visually change to reflect the new position

### Requirement: User can upload images to nodes
The system SHALL allow users to upload an image file to a selected node. The image SHALL be displayed above the node text with positive dimensions.

#### Scenario: Upload image to a node
- **WHEN** the user selects a node and uploads an image file
- **THEN** the image SHALL be displayed on the node as a base64-encoded image
- **AND** the image SHALL have positive width and height
- **AND** the image SHALL be positioned above the node text

### Requirement: User can add and remove hyperlinks on nodes
The system SHALL allow users to attach a URL hyperlink to a selected node. The link SHALL be visible on the node and users SHALL be able to remove it.

#### Scenario: Add a link to a node
- **WHEN** the user selects a node and adds a URL via the add link action
- **THEN** the link SHALL be rendered on the node with the provided URL
- **AND** a link indicator text SHALL be visible

#### Scenario: Remove a link from a node
- **WHEN** the user removes a link from a node
- **THEN** the link SHALL no longer be visible on the node
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
## ADDED Requirements

### Requirement: User can change the application language
The system SHALL provide a language dropdown on the settings page with multiple language options. Users SHALL be able to select a different language.

#### Scenario: Select a different language
- **WHEN** the user navigates to settings and selects a language from the dropdown
- **THEN** the language selection SHALL be accepted

### Requirement: User can modify map options
The system SHALL provide a Map Options tab in settings with toggles and input fields. Users SHALL be able to toggle auto branch colors and configure minimum and maximum font sizes.

#### Scenario: Toggle auto branch colors and change font sizes
- **WHEN** the user opens the Map Options tab, toggles auto branch colors, sets min font size to 20 and max font size to 80, and closes settings
- **THEN** the map SHALL be displayed without errors
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
## ADDED Requirements

### Requirement: Share dialog displays map sharing options
The system SHALL open a share dialog when the user triggers the share action. The dialog SHALL contain a title, a QR code, a share link containing the map URL, a copy button, a download button, a duplicate button, and an editable/view-only toggle.

#### Scenario: Open share dialog and verify contents
- **WHEN** the user opens the share dialog
- **THEN** the dialog SHALL display a title, a QR code, a link input containing the map URL, copy/download/duplicate buttons, and an editable/view-only toggle

### Requirement: Copy button copies the share link to clipboard
The system SHALL copy the share link to the clipboard when the user clicks the copy button in the share dialog.

#### Scenario: Copy link to clipboard
- **WHEN** the user clicks the copy button
- **THEN** the clipboard content SHALL match the share link value

### Requirement: Share dialog can be closed
The system SHALL close the share dialog when the user clicks the close button.

#### Scenario: Close the share dialog
- **WHEN** the user clicks "Close"
- **THEN** the share dialog SHALL no longer be visible
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
## ADDED Requirements

### Requirement: User can undo the last action
The system SHALL provide an undo action that reverts the most recent operation. When a node addition is undone, the added node SHALL no longer be visible.

#### Scenario: Undo a node addition
- **WHEN** the user adds a node and triggers undo
- **THEN** the added node SHALL no longer be visible

### Requirement: User can redo an undone action
The system SHALL provide a redo action that restores the most recently undone operation. When a node addition undo is redone, the node SHALL reappear.

#### Scenario: Redo an undone node addition
- **WHEN** the user undoes a node addition and triggers redo
- **THEN** the node SHALL be visible again
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
## ADDED Requirements

### Requirement: User can zoom in, zoom out, and center the map
The system SHALL provide zoom in, zoom out, and center map controls. After any combination of zoom and center operations, the map and root node SHALL remain visible and usable.

#### Scenario: Use zoom and center controls
- **WHEN** the user zooms in, zooms out twice, and centers the map
- **THEN** the map SHALL be visible
- **AND** the root node SHALL be visible
17 changes: 17 additions & 0 deletions openspec/changes/archive/2026-03-18-backfill-e2e-specs/tasks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## 1. Core capability specs

- [x] 1.1 Copy `specs/mind-map-core/spec.md` to `openspec/specs/mind-map-core/spec.md`
- [x] 1.2 Copy `specs/node-operations/spec.md` to `openspec/specs/node-operations/spec.md`
- [x] 1.3 Copy `specs/branch-colors/spec.md` to `openspec/specs/branch-colors/spec.md`
- [x] 1.4 Copy `specs/undo-redo/spec.md` to `openspec/specs/undo-redo/spec.md`

## 2. Import/export and sharing specs

- [x] 2.1 Copy `specs/import-export/spec.md` to `openspec/specs/import-export/spec.md`
- [x] 2.2 Copy `specs/share-functionality/spec.md` to `openspec/specs/share-functionality/spec.md`

## 3. UI and navigation specs

- [x] 3.1 Copy `specs/settings/spec.md` to `openspec/specs/settings/spec.md`
- [x] 3.2 Copy `specs/zoom-controls/spec.md` to `openspec/specs/zoom-controls/spec.md`
- [x] 3.3 Copy `specs/navigation/spec.md` to `openspec/specs/navigation/spec.md`
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-03-18
Loading
Loading