Skip to content

Apps: an Organization's own tabs in Workspace (supersedes #446's per-browser groups) - #467

Merged
immakermatty merged 7 commits into
mainfrom
claude/workspace-tabs
Oct 19, 2026
Merged

immakermatty merged 7 commits into
mainfrom
claude/workspace-tabs

Conversation

@immakermatty

@immakermatty immakermatty commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Status: ready for review. The product owner looked at the preview and approved the direction (2026-10-16). Root decision: HumanAndMachines/Lazurio#561 (0206).

Why

A partner Organization's Owner proposed Work / Administration groups in Workspace (#446, related #428). Matěj, the product owner, agreed with the direction and changed its scope. The Organization arranges its Workspace into tabs it names itself ("Každodenní práce", "Finance", "Sklad"), and every member sees the same arrangement. It is not a fixed pair, and it is not a per-browser preference. This covers what Teams were once drawn for in the UI, without bringing Teams back. A person's own order stays the favourites in the column.

What changes

  • One setting: settings.workspace.tabs in the Organization root's lazurio.organization.json. It is an ordered list of { name, modules }. Root decision 0194 says Organization-wide choices live in this section and are judged by its one closed-tree reader. The rules:

    • 1–12 tabs;
    • names of 1–40 characters, no surrounding spaces, unique ignoring case;
    • each module in one tab at most.

    An invalid section yields no tabs. The manifest stays usable.

  • Catalog: readFolderCatalog exposes workspaceTabs per Organization, so lazurio organization list --json, the Launchpad and agents all see one arrangement.

  • Apps: a row of tabs sits beside the Workspace pill, using the WAI-ARIA tabs pattern from Apps: add Work and Administration groups within Workspace #446 (arrows/Home/End, focus kept across background redraws).

  • Owner only: where GitHub's live answer says the identity is the Organization's Owner, Apps offers "Přesunout do karty" in a tile's menu and "Upravit karty" beside the tabs. Both open the Organization's modules in its Dashboard (?tab=modules&focus=workspace-tabs[&module=<id>]), the settings writer of 0194. The Launchpad writes nothing.

  • Preview: bun scripts/preview-launchpad.ts local cs 0 owner workspace-tabs gives a dozen modules in three tabs.

  • Decision: F32 gains a dated addendum with the alternatives. The shaping doc is docs/workspace-tabs.md.

The first two commits are the original contribution from #446 (authorship kept). The third replaces their browser-local storage, account login and in-menu move, and keeps the tabs pattern.

Not in this PR (rollout order)

  1. Lazurio Core adds workspace.tabs to organization-settings-lib.mjs and to the schema's $defs.organizationSettings, with the same name pattern (Decisions: 0206 Workspace tabs belong to the Organization; 0188 offers the personal space only on the personal Environment HumanAndMachines/Lazurio#561).
  2. This PR is released to the Environments.
  3. The Dashboard validates and delivers the key, and gets an editor in Nastavení Organizace → Moduly. Until steps 1–3 land, no Organization should declare tabs: older readers treat the whole settings section as invalid and keep the settings they applied last.
  4. Delivery through the Environment's relay (F45), so an Owner's change shows within about two minutes instead of after the next content synchronization.

Follow-ups

  • The Dashboard editor (Nastavení Organizace → Moduly) and delivery of the key.
  • Relay delivery (F45).
  • Open product questions, recorded in docs/workspace-tabs.md: whether moving should happen directly in Apps, a suggested name for the first tab, and whether Stewards may arrange tabs.

Verified

  • bun run check:static: pass on the rebased head.
  • Full bun test: 3837 pass, 9 skip. Five tests timed out at 5 s under machine load (load 13); they are in tests/install-script.test.ts and tests/tools-login.test.ts, unrelated to this change, and pass with --timeout 60000.
  • Focused tests: tests/workspace-tabs.test.ts, tests/organization-settings*.test.ts, tests/apps-view.test.ts, tests/catalog*.test.ts. The cases are: a real Folder's catalog read, an invalid section, the partition rules, favourites first inside a tab, Productionspace and the personal space unchanged, and the Owner-only Dashboard target.
  • Browser, local preview with workspace-tabs at 1280 px and 375 px: tabs, arrow keys, the Owner's menu item and "Upravit karty".

2026-10-19: brought up to date with main; tabs as the Chat / Apps / Automate switch, Workspace flag flush on its rule (prototypes-lazurio#73)

Taken over from the original thread by Matěj's DEV-6612 thread. Two things changed; the data contract, the Owner's Dashboard targets and the rollout order above did not.

1. Merged with main (a merge, not a rebase: the branch is public). Main had moved on with the guide F56 (#501–#503, #509), Apps → Trezor (#495, #500), three kinds of Environment (#497), one colour theme per Environment (#493) and the tour's gear stop (#475).

  • One textual conflict, in scripts/preview-launchpad.ts: main's team flag and this branch's workspace-tabs flag sit side by side, each keeping its option.
  • Nothing else collided. The guide's "?" stays right after the Apps heading and still plays its explanation after a tab switch. Main puts no guide mark on the Workspace head, so there was none to keep. The flag and its rule now take main's theme accent (--lz-accent).

2. The look Matěj chose on the wireframe (prototypes-lazurio#73), recorded as F32's addendum of 2026-10-19.

  • The tabs are the column head's segmented switch Chat · Apps · Automate (nav.switch / .tab in src/shell/styles.ts). That means 3 px around and 2 px between the tabs, radius-md and its inner corner, weight 550, and the shown tab raised on a hairline. The colours come from the page roles that the shell's colour roles stand for on the Launchpad (--hover, --card, --border, --fg, --muted-fg, focus --link). No new token: in the browser the computed background, padding, radius, gap, raised tab and hairline equal the column's switch.
  • The switch stands at the right end of the Workspace head, 6 px above the blue rule. "Upravit karty" (the Owner's) comes right after it.
  • The "Workspace" flag stays flush on the rule with no gap under it, because the head aligns its parts to its bottom edge. Where the switch does not fit beside the flag, it takes a line above the flag rather than below it, so it never sits between the flag and its rule. On a very narrow page the tabs wrap inside the switch.
  • Unchanged: the tabs' keyboard (arrows, Home, End), their WAI-ARIA roles, the count giving way to the tabs, and Productionspace without tabs.
  • appsSectionHead (apps-view.ts) now gives the head's parts in order, and catalog-panel.ts draws them. Its test holds the order: the flag first, then the switch with "Upravit karty", or the count. Pixel geometry is checked in a browser, not in CI.

Open, not in this PR: root decision 0207 point 1 (2026-10-17) says a personal Workspace may have tabs like an Organization's. This contract still gives the personal space none, because it has no Organization root whose settings could hold them. Where its arrangement lives is a separate step, noted in docs/workspace-tabs.md. Root decision 0206 itself is still the open HumanAndMachines/Lazurio#561, and so is Lazurio Core's half (rollout step 1).

Verified on head da7241b4fd090231fe1d9369b7d8c80c2193c6ff (after a second merge of main for #522's Trezor video and #527's Composio pin; no conflict):

  • bun run check:static: pass.
  • Focused tests (workspace-tabs, organization-settings*, apps-view, catalog-view, launchpad-page-corners, launchpad-guide, launchpad-theme, launchpad-first-paint, shell-theme): 182 pass, 0 fail.
  • Full bun test --timeout 30000 on f84cee1 (before the second merge): 4212 pass, 9 skip, 2 fail. Both failures are timeouts in tests this PR does not touch: guarded-process (fixture start, 5 s) and frozen-install-process (lifecycle preparation, 15 s), on a loaded machine (the run took 24 min). Each passes alone: guarded-process with the focused set, frozen-install-process 23/23. CI is the authority.
  • After the second merge (head above): check:static passes; workspace-tabs, shell-guide, environment-wording, apps-view, catalog-view, launchpad-vault-page: 156 pass, 0 fail.
  • Browser: headless Chromium on bun scripts/preview-launchpad.ts local cs|en … owner workspace-tabs, at 1440 and 900 px in Czech and English, before and after switching a tab (ArrowRight, End, Home, a click), plus 375 px:
    • gap under the "Workspace" flag: 0 px in every case;
    • switch above the rule: 6 px at 1440 and 900;
    • "Upravit karty" 10 px after the switch, on its centre line;
    • at 375 px the switch takes the line above and the flag stays at 0 px.
    • The keyboard still moves the selection and the focus, the panel follows aria-labelledby, the "?" still plays the guide after a switch, and Productionspace has its count and no tabs.
    • No page errors. The only failed requests are the preview's unrelated routes (/.lazurio/account/environments 403, /api/update/status 503, /api/content/jobs/latest 404).

🤖 Generated with Claude Code

Note

Add Organization-owned Workspace tabs to Launchpad Apps view

Implements the decided Organization Workspace tab model (supersedes #446's per-browser groups). Tabs are stored in the Organization manifest under workspace.tabs and validated in organization-settings.ts for tab count (max 12), name uniqueness after NFC/case folding, module ID syntax (max 500 per tab), and duplicate module assignments.

  • The catalog reader in catalog.ts exposes tabs only when the whole settings verdict is valid; invalid or absent settings produce no tab data.
  • The Apps renderer in catalog-panel.ts shows tabs as a keyboard-navigable ARIA tablist. Unassigned modules go to the first tab, favourites sort first, and tabs with no materialized modules are hidden. Fewer than two visible tabs fall back to the plain Workspace view.
  • Owners get a move-to-tab tile action and an edit-tabs link to the Dashboard in apps-view.ts; non-Owners get no target.
  • Adds a tabbed preview fixture via workspace-tabs option in preview-launchpad.ts, CSS in index.html, English and Czech labels in messages.ts, plus contract, catalog, rendering, fallback, and target tests in workspace-tabs.test.ts.
  • Risk: the hosted preview settings writer in preview.writeExample now spreads existing settings before writing integration settings; check hosted previews that configure Composio or Microsoft 365 retain prior behavior.

Macroscope summarized 7b6ed72.

MCN-Kacanos-M and others added 3 commits October 16, 2026 18:46
Matěj decided (F32 addendum of 2026-10-16) that the Organization, not each
browser, arranges its Workspace: `settings.workspace.tabs` of the root's
lazurio.organization.json names the tabs in order and the modules in each,
the same for every member. A module in no tab is in the first; a tab with
nothing on this Environment is left out; fewer than two tabs show the plain
Workspace. The catalog reads the tabs with the Organization, so the CLI,
the Launchpad and agents see one arrangement.

Only the Organization's Owner (GitHub's live answer) gets "Přesunout do
karty" in a tile's menu and "Upravit karty" beside the tabs; both open the
Organization's modules in its Dashboard, the settings writer of root
decision 0194. The Launchpad writes nothing.

This replaces the browser-local Work / Administration groups of the first
two commits (their storage, account login and menu move) and keeps their
tabs pattern: WAI-ARIA tabs, arrows/Home/End, focus kept across redraws.
Tabs carry names only. The preview gains `workspace-tabs`.

Co-Authored-By: MCN-Kacanos-M <284052013+MCN-Kacanos-M@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… 0206

The tab name pattern now matches Lazurio Core's and the manifest schema's
exactly (root decision 0206, HumanAndMachines/Lazurio#561): 1 to 40
characters, no control character and no whitespace at either end, so both
readers judge one section identically. F32's addendum and the shaping note
point to the root decision and the Core change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
immakermatty and others added 3 commits October 19, 2026 18:30
… in Apps, three kinds of words, the theme

Brings #467 up to date with main (dbee5f6) after the guide F56 (#501-#503,
#509), Apps → Trezor (#495, #500), three kinds of Environment (#497), one
colour theme per Environment (#493) and the tour's gear stop (#475).

One textual conflict, in scripts/preview-launchpad.ts: main's `team` flag
for a hosted Team Environment and this branch's `workspace-tabs` flag sit
side by side; each keeps its own option. The section head keeps main's
accent colour (`--lz-accent`, #493) for its flag and rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he flag flush on its rule

Matěj decided on the wireframe (prototypes-lazurio#73, 2026-10-19) that the
Organization's Workspace tabs are the same segmented switch as the column
head's Chat · Apps · Automate, at the right end of the Workspace head 6 px
above the blue rule, with "Upravit karty" right after it, while the
"Workspace" flag stays flush on the rule with no gap under it.

The switch reuses `nav.switch` / `.tab` of src/shell/styles.ts: 3 px around,
2 px between, radius-md and its inner corner, weight 550, the shown tab
raised on a hairline, in the page roles the shell's colour roles stand for on
the Launchpad (--hover, --card, --border, --fg, --muted-fg, --link), so the
computed styles equal the column's switch under every theme. The head aligns
its parts to its bottom edge and wraps in reverse: a switch that does not fit
beside the flag takes a line above it, never between the flag and its rule.
Keyboard (arrows, Home, End), WAI-ARIA roles and Productionspace are as they
were.

`appsSectionHead` gives the head's parts in order (flag first, then the
switch with "Upravit karty", or the count) and is tested; the geometry was
checked headless at 1440, 900 and 375 px in cs and en. F32 gains a dated
addendum; the shaping note records the wireframe's personal-Workspace tabs
(2026-10-17) as an open step.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…522)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@agentrozjedemeai agentrozjedemeai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@immakermatty Reviewed exact head da7241b, including c56d123..da7241b: both merges and f84cee1. The preview conflict retains both team and workspace-tabs; the Apps guide help remains alongside its heading across redraws, Apps → Trezor, the three Environment kinds and the theme accent remain in the merged head. The section-head ordering and switch styling match F32; the flag stays anchored to its rule when the switch wraps. Independent check: git diff --check origin/main...HEAD, bun run check:static, and 153 focused tests pass in a disposable exact-head clone. Head CI static and both test shards pass; no unresolved review threads. No substantive defect found. This approval is for this SHA only; merge remains subject to live provider gates.

@immakermatty
immakermatty merged commit b31cd25 into main Oct 19, 2026
7 checks passed
@immakermatty
immakermatty deleted the claude/workspace-tabs branch October 19, 2026 20:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants