Skip to content

Commit f00cfaf

Browse files
committed
Merge remote-tracking branch 'origin/main' into feat/workspace-on-by-default
# Conflicts: # docs/docs/usage/cli.md
2 parents 03161dc + 9e8f8a3 commit f00cfaf

47 files changed

Lines changed: 4341 additions & 268 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎CHANGELOG.md‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,33 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.12.4] - 2026-09-29
9+
10+
One fix for every TUI user, and a round of workspace-pilot work: the IDE extension can drive `/workspace` and `skill publish` over `serve`, a sync says which skills it skipped, and cached workspace state is scoped to the signed-in account. Everything under **Added** is behind `ALTIMATE_WORKSPACE=1`. **Heads-up for support (pilot):** after upgrading, each project's cached workspace link and synced skills are discarded and fetched again on first use (the cache format changed to carry the account), so the first turn in a linked project re-syncs.
11+
12+
### Added
13+
14+
- **`serve` exposes `/workspace` Refresh and Sync over HTTP**, so the VS Code / Cursor extension's workspace panel can run the same actions as the TUI's `/workspace` menu. The routes answer 409 outside the pilot, and refuse browser-originated requests: any request a browser marks as coming from another site (a `Sec-Fetch-Site` other than `same-origin` or `none`, so `same-site` too), any `Origin` on a server without `OPENCODE_SERVER_PASSWORD`, and any other origin when one is set. Pilot only (`ALTIMATE_WORKSPACE=1`). (#1366)
15+
- **`skill publish` from the IDE extension.** `serve` lists which of the project's skills can be published and publishes one to the linked or extension-pinned workspace, with the same rules and refusal wording as the CLI: built-in, personal and workspace-delivered skills are refused, and a near-miss name gets a "did you mean". Pilot only (`ALTIMATE_WORKSPACE=1`). (#1371)
16+
- **A workspace sync says which skills it skipped, and why.** A skill that failed to arrive used to look exactly like a workspace with no skills. The TUI shows a warning, headless `run` prints one line, and `/workspace` → Refresh lists them — at most three by name, with a plain reason ("it is too large for this client", "it could not be saved on this device"); raw errors stay in the log. The same problem is not repeated every turn. An offline check in a project that is linked, or pinned by the IDE extension, now warns instead of passing silently. Pilot only (`ALTIMATE_WORKSPACE=1`). (#1374, #1376)
17+
18+
### Changed
19+
20+
- **Linking asks before uploading memory you saved earlier.** When the TUI finds that a project is already linked on the server, it now asks ("Attach and continue") before backfilling the memory saved on this machine into that workspace; nothing is sent until you choose it. New memory saved in a linked project still goes to its workspace, as before — a project belongs to exactly one workspace. Pilot only (`ALTIMATE_WORKSPACE=1`). (#1373, closes #1372)
21+
- **`/workspace` and `link` are clearer.** The menu adds **Open in browser** and **Switch workspace**, and an unlinked project is offered **Link to a workspace**. When the project is linked to a teammate's private workspace you cannot see, `link` says so instead of reporting a race and sending you round a retry loop. Relinking drops the previous workspace's memory from the session instead of continuing to show it. A skill you wrote in the project always wins over the workspace's copy of the same name, so publishing an update to it is no longer refused. Pilot only (`ALTIMATE_WORKSPACE=1`). (#1373)
22+
- **Outside the pilot, `altimate-code link` and `skill publish` explain themselves.** They print "Workspaces are a pilot feature and are off. Set ALTIMATE_WORKSPACE=1 to use this command." instead of failing with "Failed to change directory to …/link", and the TUI's `--workspace` option is no longer listed in `--help`. (#1373)
23+
24+
### Fixed
25+
26+
- **Returning to a conversation in the TUI now keeps the model it was using.** Picking a model in one conversation could rewrite the model recorded for the conversation opened before it, so switching back selected the wrong model. Every user, not only the pilot. (#1365, closes #1364)
27+
- **Two Altimate accounts on one machine no longer share workspace state.** The cached project link, the resolver's short-lived caches, and the synced workspace skills were keyed on the tenant only, so after switching to another account on the same tenant, the previous account's link — and its private workspace skills — could be served for up to five minutes. All of it is now keyed on the account, a snapshot another account fetched is withheld from discovery and removed, and anything that cannot be attributed is withheld rather than served. Pilot only (`ALTIMATE_WORKSPACE=1`). (#1377, fixes #1339)
28+
- **Link and re-link messages no longer talk about "bindings" or "pre-checks".** Found in this release's review.
29+
30+
### Known limitations
31+
32+
- Skill discovery now resolves the real path of each skill file it finds (one `realpath` per skill), for every user, to tell a workspace snapshot apart from an ordinary skill; a skill whose path cannot be resolved is left out, as a broken link already was.
33+
- `skill publish` keeps secrets out by file name only (`.env*`, `*.pem`, `credentials.json` and similar); it does not scan contents, so a token inside `config.yaml` is uploaded. Publishing is tenant-wide.
34+
835
## [0.12.3] - 2026-09-23
936

1037
**Heads-up before upgrading (every user):**

‎docs/docs/assets/stylesheets/extra.css‎

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,21 @@
1010
--alt-orange: #F07030;
1111
--alt-orange-deep: #C5571F;
1212
--alt-orange-tint: rgba(240, 112, 48, 0.12);
13+
/* Text that sits ON the brand orange. White gave 2.97:1 against #F07030 —
14+
axe flagged the two primary CTAs, and WCAG AA wants 4.5:1 for text this
15+
size. Near-black reads 6.69:1 on the same orange, so the brand colour
16+
stays exactly as the brand book specifies and the label becomes legible.
17+
The hover shade lifts instead of deepening, because with dark ink a
18+
lighter surface raises contrast (8.24:1) where a darker one lowered it. */
19+
--alt-ink-on-orange: #09090B;
20+
--alt-orange-lift: #FF8547;
21+
/* Brand orange used as TEXT. On the dark scheme #F07030 reads 6.9:1 against
22+
the near-black page and needs no help. On the light scheme the same orange
23+
sits on white or on its own 12% tint and drops to 2.4–2.8:1, so the
24+
eyebrow, the active product tab and the feature chips all failed AA there.
25+
The light override below deepens it to 4.9:1 on the worst of those three
26+
backgrounds while staying the same hue. */
27+
--alt-orange-text: var(--alt-orange);
1328
--alt-teal: #00CCAA;
1429
--alt-teal-tint: rgba(0, 204, 170, 0.12);
1530

@@ -35,10 +50,16 @@
3550

3651
/* ---- Light theme — clean, off-white-leaning -------------------------- */
3752
[data-md-color-scheme="default"] {
53+
--alt-orange-text: #A8420C;
3854
--md-primary-fg-color: var(--alt-bg-light);
3955
--md-primary-fg-color--light: #F4F4F5;
4056
--md-primary-fg-color--dark: var(--alt-fg-dark);
41-
--md-accent-fg-color: var(--alt-orange);
57+
/* Material paints the active nav item and every link hover with the accent,
58+
and body copy links with the typeset colour. On white, #F07030 gave 2.97:1
59+
and #C5571F gave 4.41:1 — both under AA. The deepened orange reads 6.09:1
60+
and is still the same hue. The slate block below keeps the brand orange,
61+
which already reads 6.9:1 against the near-black page. */
62+
--md-accent-fg-color: var(--alt-orange-text);
4263
--md-accent-fg-color--transparent: var(--alt-orange-tint);
4364
--md-default-bg-color: var(--alt-bg-light);
4465
--md-default-fg-color: var(--alt-fg-dark);
@@ -47,7 +68,7 @@
4768
--md-default-fg-color--lightest: var(--alt-border-light);
4869
--md-code-bg-color: #FAFAFA;
4970
--md-code-fg-color: #18181B;
50-
--md-typeset-a-color: var(--alt-orange-deep);
71+
--md-typeset-a-color: var(--alt-orange-text);
5172
--md-footer-bg-color: var(--alt-bg-dark);
5273
--md-footer-bg-color--dark: #000000;
5374
}
@@ -381,7 +402,7 @@ body, .md-typeset {
381402
font-weight: 700;
382403
letter-spacing: 0.14em;
383404
text-transform: uppercase;
384-
color: var(--alt-orange);
405+
color: var(--alt-orange-text);
385406
margin: 0 0 0.8rem;
386407
}
387408
.ak-eyebrow::before {
@@ -515,10 +536,10 @@ body, .md-typeset {
515536
.ak-btn svg { width: 15px; height: 15px; }
516537
.ak-btn-primary {
517538
background: var(--alt-orange);
518-
color: #FFFFFF !important;
539+
color: var(--alt-ink-on-orange) !important;
519540
}
520541
.ak-btn-primary:hover {
521-
background: var(--alt-orange-deep);
542+
background: var(--alt-orange-lift);
522543
}
523544
.ak-btn-secondary {
524545
background: transparent;
@@ -642,7 +663,7 @@ body, .md-typeset {
642663
font-weight: 500;
643664
letter-spacing: 0.005em;
644665
}
645-
.ak-bench-line strong { color: var(--alt-orange); font-weight: 700; }
666+
.ak-bench-line strong { color: var(--alt-orange-text); font-weight: 700; }
646667
.ak-bench-line .ak-dot {
647668
width: 4px;
648669
height: 4px;
@@ -756,7 +777,7 @@ body, .md-typeset {
756777
}
757778
.md-nav__link--active {
758779
font-weight: 600;
759-
color: var(--alt-orange) !important;
780+
color: var(--alt-orange-text) !important;
760781
}
761782
.md-nav--secondary .md-nav__link--active {
762783
position: relative;
@@ -791,13 +812,13 @@ body, .md-typeset {
791812
/* ---- Scroll-to-top FAB — solid orange, no gradient -------------- */
792813
.md-top {
793814
background: var(--alt-orange);
794-
color: #FFFFFF !important;
815+
color: var(--alt-ink-on-orange) !important;
795816
font-weight: 600;
796817
border-radius: 6px;
797818
box-shadow: 0 4px 12px rgba(240, 112, 48, 0.30);
798819
}
799820
.md-top:hover {
800-
background: var(--alt-orange-deep);
821+
background: var(--alt-orange-lift);
801822
}
802823

803824
/* ---- Reading-progress hairline — orange, not gradient ----------- */
@@ -942,8 +963,8 @@ body, .md-typeset {
942963
-webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.85' stroke-linecap='round' stroke-linejoin='round'><path d='M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5a2.5 2.5 0 0 0-5 0V5H4c-1.1 0-2 .9-2 2v3.8h1.5a2.5 2.5 0 0 1 0 5H2V20c0 1.1.9 2 2 2h3.8v-1.5a2.5 2.5 0 0 1 5 0V22H17c1.1 0 2-.9 2-2v-4h1.5a2.5 2.5 0 0 0 0-5z'/></svg>");
943964
mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.85' stroke-linecap='round' stroke-linejoin='round'><path d='M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5a2.5 2.5 0 0 0-5 0V5H4c-1.1 0-2 .9-2 2v3.8h1.5a2.5 2.5 0 0 1 0 5H2V20c0 1.1.9 2 2 2h3.8v-1.5a2.5 2.5 0 0 1 5 0V22H17c1.1 0 2-.9 2-2v-4h1.5a2.5 2.5 0 0 0 0-5z'/></svg>");
944965
}
945-
/* Altimate MCP — connect / link */
946-
.md-tabs__link[href*="/datamates/"]::before {
966+
/* Workspaces — connect / link */
967+
.md-tabs__link[href*="/workspaces/"]::before {
947968
-webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.85' stroke-linecap='round' stroke-linejoin='round'><path d='M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71'/><path d='M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71'/></svg>");
948969
mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.85' stroke-linecap='round' stroke-linejoin='round'><path d='M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71'/><path d='M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71'/></svg>");
949970
}
@@ -1075,7 +1096,7 @@ body, .md-typeset {
10751096
}
10761097
.ak-picker-tab--active {
10771098
background: var(--alt-orange-tint);
1078-
color: var(--alt-orange);
1099+
color: var(--alt-orange-text);
10791100
font-weight: 600;
10801101
border-left-color: var(--alt-orange);
10811102
}
@@ -1128,7 +1149,7 @@ body, .md-typeset {
11281149
border-radius: 4px;
11291150
font-size: 0.72rem;
11301151
font-weight: 600;
1131-
color: var(--alt-orange);
1152+
color: var(--alt-orange-text);
11321153
background: var(--alt-orange-tint);
11331154
letter-spacing: 0.01em;
11341155
text-decoration: none;
@@ -1141,7 +1162,7 @@ a.ak-feature-chip::after {
11411162
}
11421163
a.ak-feature-chip:hover {
11431164
background: var(--alt-orange);
1144-
color: #fff;
1165+
color: var(--alt-ink-on-orange);
11451166
}
11461167
a.ak-feature-chip:hover::after {
11471168
opacity: 1;
@@ -2104,7 +2125,7 @@ a.ak-flow-chip:hover {
21042125
}
21052126
.ak-flow-lane--highlight a.ak-flow-chip:hover {
21062127
background: var(--alt-orange);
2107-
color: #FFFFFF !important;
2128+
color: var(--alt-ink-on-orange) !important;
21082129
border-color: var(--alt-orange);
21092130
}
21102131

@@ -2738,3 +2759,25 @@ a.ak-stat:hover {
27382759
justify-content: center;
27392760
}
27402761
}
2762+
2763+
/* Collapsible admonition used on the dbt setup pages for the
2764+
query-comment / QUERY_TAG configuration block.
2765+
Header is bumped for prominence; body inherits page font size. */
2766+
.md-typeset details.knobs-callout {
2767+
margin: 1.5rem 0;
2768+
}
2769+
.md-typeset details.knobs-callout > summary {
2770+
font-size: 1rem;
2771+
font-weight: 700;
2772+
padding: 0.9rem 2.6rem 0.9rem 2.6rem;
2773+
}
2774+
.md-typeset details.knobs-callout[open] > summary {
2775+
padding-bottom: 0.9rem;
2776+
}
2777+
.md-typeset details.knobs-callout > *:not(summary) {
2778+
padding-left: 1.2rem;
2779+
padding-right: 1.2rem;
2780+
}
2781+
.md-typeset details.knobs-callout > *:last-child {
2782+
padding-bottom: 1rem;
2783+
}

‎docs/docs/develop/ecosystem.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ altimate has a growing ecosystem of plugins, tools, and integrations.
1919

2020
- **GitHub Actions**: Automated PR review and issue triage
2121
- **GitLab CI**: Merge request analysis
22-
- **VS Code / Cursor / Windsurf**: [IDE integration](../usage/ide.md) via the Datamates extension (branded **Altimate MCP** in-editor)
23-
- **[Altimate MCP](https://help.altimate.ai/datamates/)**: AI teammates platform with MCP integrations, Knowledge Hub, Memory, and Guardrails
22+
- **VS Code / Cursor / Windsurf**: [IDE integration](../usage/ide.md) via the Altimate Workspaces extension
23+
- **[Altimate Workspaces](https://help.altimate.ai/workspaces/)**: integrations, knowledge, memory and skills for your AI agent, in any editor or MCP client
2424
- **MCP**: Model Context Protocol servers
2525
- **ACP**: Agent Communication Protocol for editors
2626

‎docs/docs/index.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,6 @@ SDK, server API, plugins and the broader ecosystem.
103103
## Other Altimate products
104104

105105
- [Power User for dbt](https://help.altimate.ai/dbt-power-user/) — Best dbt extension for VS Code / Cursor.
106-
- [Altimate MCP](https://help.altimate.ai/datamates/) — A local-first MCP server for your data stack.
106+
- [Altimate Workspaces](https://help.altimate.ai/workspaces/) — Everything your AI agent needs, set up once, in any editor or MCP client.
107107
- [Altimate Lite for Snowflake](https://help.altimate.ai/snowflake-native-app/) — More out of your Snowflake compute, without your data leaving your account.
108108
- [Altimate Platform](https://altimate.ai/platform?utm_source=help-docs&utm_medium=referral&utm_campaign=docs-inline-link) — Enterprise cost optimization for [Snowflake](https://altimate.ai/use-cases/altimate-for-snowflake?utm_source=help-docs&utm_medium=referral&utm_campaign=docs-inline-link) and [Databricks](https://altimate.ai/use-cases/altimate-for-databricks?utm_source=help-docs&utm_medium=referral&utm_campaign=docs-inline-link).

‎docs/docs/usage/cli.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ Configuration can be controlled via environment variables:
9999
| `ALTIMATE_CLI_DISABLE_PRUNE` | Disable database pruning |
100100
| `ALTIMATE_CLI_DISABLE_MODELS_FETCH` | Don't fetch models from models.dev |
101101
| `ALTIMATE_DISABLE_WORKSPACE` | Set to `1` to turn off every workspace feature (linking, skill and memory sync, the workspace engine). Workspaces are on by default |
102+
| `ALTIMATE_WORKSPACE_WEB_URL` | Development only: the base URL of a local web app's Workspaces pages, used instead of the tenant's for `link`'s browser hand-off and workspace links. Include the mount path, e.g. `http://acme.localhost:3000/workspaces` |
102103
| `ALTIMATE_INTEGRATIONS` | Set to `local` to keep warehouse tools local rather than routing them through a bound workspace's engine |
103104
| `ALTIMATE_CODE_SERVE` | Set to `1` by `altimate-code serve` itself, whether the IDE extension or you launched it. Marks that process as the extension's host — so it is the one that reads the pin variables — and is stripped from every child the bash and shell tools start |
104105
| `ALTIMATE_PINNED_WORKSPACE_ID` / `_NAME` / `_ROOT` | Set together by the IDE extension on `serve`: the workspace selected in its panel and the folder it applies to. All three or none — a partial pin is refused rather than ignored. Read only when `ALTIMATE_CODE_SERVE` is set; never persisted; stripped from child processes |

‎docs/docs/usage/ide.md‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
---
22
title: "IDE Integration — Altimate Code in VS Code"
3-
description: "Use Altimate Code inside VS Code via the Datamates extension. Requires the altimate-code CLI to be installed."
3+
description: "Use Altimate Code inside VS Code via the Altimate Workspaces extension. Requires the altimate-code CLI to be installed."
44
---
55

66
# IDE Integration
77

8-
altimate-code integrates with your IDE via the [Datamates extension](https://marketplace.visualstudio.com/items?itemName=altimateai.vscode-altimate-mcp-server) — listed as **Datamates** in the Marketplace, its in-editor commands and docs are branded **Altimate MCP** — giving you AI-powered chat with 100+ data engineering tools directly in your editor.
8+
altimate-code integrates with your IDE via the [Altimate Workspaces extension](https://marketplace.visualstudio.com/items?itemName=altimateai.vscode-altimate-mcp-server) — listed as **Altimate Workspaces** in the Marketplace (it was called Datamates before version 0.10.0) — giving you AI-powered chat with 100+ data engineering tools directly in your editor.
99

1010
---
1111

@@ -17,23 +17,23 @@ Install the altimate-code CLI globally:
1717
npm install -g altimate-code
1818
```
1919

20-
The Datamates extension requires this to be installed for the chat and tools to function.
20+
The Altimate Workspaces extension requires this to be installed for the chat and tools to function.
2121

2222
## Install the Extension
2323

24-
Install the Datamates extension for your IDE:
24+
Install the Altimate Workspaces extension for your IDE:
2525

2626
- **VS Code** — [Microsoft Marketplace](https://marketplace.visualstudio.com/items?itemName=altimateai.vscode-altimate-mcp-server)
2727
- **Cursor / other VS Code-compatible editors** — [Open VSX Registry](https://open-vsx.org/extension/altimateai/vscode-altimate-mcp-server)
28-
- **Windsurf** — Install via the built-in extension marketplace (search "Datamates")
28+
- **Windsurf** — Install via the built-in extension marketplace (search "Altimate Workspaces")
2929

3030
## Open Altimate Code Chat
3131

3232
After installing the extension:
3333

3434
1. Press `Cmd+Shift+P` (macOS) or `Ctrl+Shift+P` (Windows/Linux) to open the command palette
35-
2. Type `Altimate MCP`
36-
3. Select **Altimate MCP: Open Altimate Code Chat**
35+
2. Type `Altimate Workspaces`
36+
3. Select **Altimate Workspaces: Open Altimate Code Chat**
3737

3838
This opens the Altimate Code chat panel where you can interact with altimate agents and use all 100+ data engineering tools.
3939

@@ -66,8 +66,8 @@ The extension installs the CLI natively: the release archive is fetched over HTT
6666
You need an LLM to power the chat. Two options:
6767

6868
- **BYOK (Bring Your Own Key)** — Free and unlimited. Configure any of the [35+ supported providers](../configure/providers.md) (Anthropic, OpenAI, AWS Bedrock, Azure OpenAI, etc.)
69-
- **[Altimate LLM Gateway](https://help.altimate.ai/datamates/user-guide/components/llm-gateway/)** — Managed LLM access with dynamic model routing. 10M tokens free to get started — no API keys to manage
69+
- **[Altimate LLM Gateway](https://help.altimate.ai/workspaces/user-guide/components/llm-gateway/)** — Managed LLM access with dynamic model routing. 10M tokens free to get started — no API keys to manage
7070

71-
## Full Altimate MCP Documentation
71+
## Full Altimate Workspaces documentation
7272

73-
The Datamates extension offers additional capabilities beyond Altimate Code Chat, including MCP server integrations, Knowledge Hub, Memory Hub, and Guardrails. See the [Altimate MCP documentation](https://help.altimate.ai/datamates/) for full setup guides, integration configuration, and feature details.
73+
The Altimate Workspaces extension offers more than Altimate Code Chat: integrations, knowledge, memory and skills from your workspace. See the [Workspaces documentation](https://help.altimate.ai/workspaces/) for full setup guides, integration configuration, and feature details.

0 commit comments

Comments
 (0)