@altimateai/altimate-code 0.9.6 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/package.json +13 -9
- package/postinstall.mjs +14 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,52 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.10.0] - 2026-09-02
|
|
9
|
+
|
|
10
|
+
Workspaces grow from a memory-only pilot into a working surface: a bound workspace now supplies its custom skills, attaches its own engine, and routes warehouse tools through it. Alongside that, a run no longer dies when one oversized tool result overflows the window, and the ChatGPT-subscription model picker was rebuilt against what the backend actually serves. Everything workspace-related stays behind `ALTIMATE_WORKSPACE=1` and is invisible to anyone not opted in — but the harness-reliability changes are the largest part of this release and apply to **every** session, opted in or not.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **A bound workspace's custom skills sync into the project.** Skill bundles attached to the workspace are pulled into `.altimate-code/skill/_workspace/<publicId>/`, where the existing discovery finds them with no other change — a synced skill is listed and invoked exactly like a local one. The tree carries its own `.gitignore` so it never reaches version control, is removed when you opt out or disconnect, and a directory the client did not create is never touched. (#1172)
|
|
15
|
+
- **The bound workspace's engine attaches as a derived MCP overlay.** In a bound project the `datamate` MCP entry is derived at config load from the workspace's pinned local engine — never written to disk, overriding IDE, hosted and stale entries. Each turn boundary re-reads the binding, replaces the entry on re-link, and retries a failed handshake once. (#1167)
|
|
16
|
+
- **Warehouse tools route through the workspace's engine.** A native warehouse capability is shadowed only when the engine materialised the matching tool and attach attests the engine is its own; the redirect happens after the native safety checks, and fails open with a reason otherwise. `--integrations=local` turns it off. (#1168)
|
|
17
|
+
- **An offer to install the engine a bound workspace needs.** A missing engine used to be a toast with a command in it. It is now an offer — Install now / Copy command / Not now — and the install only ever runs from an explicit choice; the next turn boundary picks the installed engine up. (#1169)
|
|
18
|
+
- **The model is told what a bound workspace serves.** Redirecting to an engine tool did not make the model choose it first, so every session paid a wasted turn learning the rule. The workspace's capabilities are now stated up front. (#1182)
|
|
19
|
+
- **Installs are counted from the shell installers, not just npm.** (#1096)
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- **Warehouse SDKs are resolved from disk instead of reported missing.** A bare `import("snowflake-sdk")` inside the compiled binary resolved against bunfs, which has no `node_modules`, so an SDK the user had already installed was invisible and reported as "not installed" — the single root cause behind nine open issues, five of them filed automatically by the telemetry scanner. (#1122)
|
|
24
|
+
- **Startup scans prune dependency trees again.** `Glob.Options` lost its `ignore` field in the v1.17.9 bridge, so the two `**/mcp.json` scans filtered results after every directory had already been opened and read. On a repo with `node_modules` installed that cost 12.93 CPU-seconds on every startup. Two intended consequences: a `favicon.*` inside `node_modules`/`dist` is no longer eligible as the project icon, and `altimate-code check` with no file arguments no longer picks up vendored SQL. (#1184)
|
|
25
|
+
- **Release binaries embed the live models.dev catalog.** Every platform binary was built with a checked-in test fixture as its bundled catalog, whose newest entry was dated 2026-03-30; verified against the shipped 0.9.7 binary in an isolated `HOME`. (#1188)
|
|
26
|
+
- **The ChatGPT-subscription model allowlist matches the backend.** The filter was built from the models.dev catalog rather than what the Codex endpoint serves, so it was wrong in both directions: `gpt-5.2`, `gpt-5.6` and `gpt-5.3-codex` were offered and rejected with HTTP 400, while the current flagship subscription models `gpt-5.6-sol`, `gpt-5.6-luna` and `gpt-5.6-terra` were hidden. Every id was verified against a live Pro credential and the `includes("codex")` substring auto-allow — which cannot express the real policy — was replaced with exact matching. The filter now matches on `api.id` rather than the config map key, so a model aliased in config is no longer deleted. (#1179, closes #1178)
|
|
27
|
+
- **`gpt-5.4` and `gpt-5.4-mini` are retired from the picker.** Both retired backend-side on 2026-08-31; the replacements are `gpt-5.6-terra` and `gpt-5.6-luna`. (#1190)
|
|
28
|
+
- **A large prompt no longer gets a hard 400 before generating anything.** The per-model output-token reservation never consulted `limit.context`, so on a model where prompt and completion share one window a large system prompt pushed input plus reservation past it. The reservation is now clamped against the context window. (#1196)
|
|
29
|
+
- **A run survives a single oversized tool result.** Previously the recovery compaction resent the full conversation, overflowed the same way and terminated with "Session too large to compact". It now summarizes what fits, with tightened context-safety margins and compaction fidelity. (#1171)
|
|
30
|
+
- **A credential could survive redaction and be replayed.** The mask that replaces cleared tool output is resent on every later request, and two of its fields bypassed the redactor — so an AWS key, an OpenAI key, a `curl` basic-auth value or a signed URL already in the conversation could still be transmitted after the output it came from was pruned. Both fields now go through the same redactor as the rest of the ledger, which also learned to recognise `curl.exe` and path-qualified `curl`. (#1171)
|
|
31
|
+
- **Interactive chat no longer ends answers with a literal `DONE`.** The run-mode completion token was declared on the `builder` agent, which is also the agent behind ordinary conversation, and nothing stripped the token before rendering — so it was appended to final answers in normal chat. It is now scoped to run mode. (#1171)
|
|
32
|
+
- **MCP diagnostics say what actually went wrong.** `mcp status` now reports each configured server's real state, including drift between discovered and on-disk config. (#1160) `server unavailable` logged the constant string `"failed"` and discarded `status.error`, the field holding the real message — a `401 Unauthorized`, a transport error, the actual cause. (#1159)
|
|
33
|
+
- **The marker check runs in a fresh worktree.** `script/upstream/analyze.ts` imported `minimatch` from the repo root, where it was never declared, so the check failed with `Cannot find package minimatch` before it could run. (#1177)
|
|
34
|
+
|
|
35
|
+
## [0.9.7] - 2026-08-25
|
|
36
|
+
|
|
37
|
+
Grep/search reliability fix for everyone, a Codex model-picker unblock, and a first, opt-in look at Workspaces — shared project binding with cloud-synced memory.
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
|
|
41
|
+
- **`grep`/`glob` no longer return nothing because of a single bad match.** One oversized, unparseable, or non-UTF-8 ripgrep record — a minified bundle, a source map, a one-line JSON/CSV fixture, anywhere in the searched tree — used to fail the entire search stream and silently discard every match already found in unrelated files. Telemetry showed 74 machines / 83 sessions over 7 days on v0.9.3/v0.9.4. Records are independent of their neighbours, so a bad one is now logged and skipped instead of aborting the rest of the search; the same fix landed in the legacy `/find` parser, and an invalid search pattern now correctly returns HTTP 400 instead of 500. (#1094)
|
|
42
|
+
- **ChatGPT Pro/Plus (Codex tier) users can pick `gpt-5.5` and `gpt-5.6`.** Both were live on OpenAI's side already, but the fork's OAuth allowlist hadn't been bumped past `gpt-5.4-mini` — any snapshot model not on the allowlist (and not containing "codex") was silently deleted from the picker before it ever reached you. Fixed; API-tier-only variants (`pro`, `luna`, `sol`, `terra`) stay out until confirmed available on the subscription tier. (#1133, closes #1132)
|
|
43
|
+
- **The models.dev catalog cache no longer crashes or poisons itself on a bad response.** A non-JSON or malformed 2xx body is now rejected before it's parsed or cached, instead of throwing mid-load or writing garbage the next run would trust. The unconditional fetch that used to run at module import — the cause of a v0.9.4 CI hang under restricted DNS — is gone; short-lived commands now rely on the bundled snapshot / disk cache rather than a live network call, so models added to models.dev between releases won't show up in short-lived commands until the next release. A narrower hang path can still occur in dev-mode builds without the bundled snapshot (tracked in #1144). (#1085)
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
|
|
47
|
+
- **Workspaces — pilot, opt-in via `ALTIMATE_WORKSPACE=1`, off by default.** A first look at linking a project to a shared Altimate workspace: a post-scan prompt plus a new `altimate-code link` subcommand to create or bind one, a browser-based setup handoff, and memory blocks that sync to the bound workspace so a team shares context. Nothing about this is visible unless the pilot flag is set — no new prompts, network calls, or CLI surface for anyone not opted in. Binding now explicitly tells you that saved memory blocks sync to the workspace if memory is enabled for it. (#1099, #1100, #1116)
|
|
48
|
+
- **`altimate_memory_refresh` tool.** Ask the CLI mid-session to re-fetch workspace memory instead of waiting for a new session — closes a gap where a running session could never pick up a memory block written after it started. `altimate_memory_read` now shows the same workspace-merged view the model actually sees, rather than local content only. (#1123)
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
|
|
52
|
+
- **Public-repo hygiene: a pre-push scan for internal tracker references, and a hardened build-staleness guard.** A local pre-push hook scans branch names, commit messages, and diff content for Jira-key-shaped and known internal-hostname references before they can land in the public repo (no CI-side backstop yet — local hook only, tracked in #1141). The staleness guard behind the release smoke test now hashes every embedded build input — workspace packages, `tsconfig.json`, the lockfile — instead of only walking `src/`/`script/` mtimes, closing several ways a binary could go stale without the guard noticing. (#1085)
|
|
53
|
+
|
|
8
54
|
## [0.9.6] - 2026-08-23
|
|
9
55
|
|
|
10
56
|
Correctness release: `check --checks {validate,semantic,grade,pii,safety,policy}` and the `altimate-core-*` tools (`migration`, `compare`, `track-lineage`, `query-pii`, `classify-pii`) now tell you the truth. Several previously returned false-clean or wrong output — teams gating CI on `check --fail-on error|warning` may see new failures on unchanged SQL. **These are real findings the tool previously missed, not regressions in your code.** Also fixes a data-hygiene bug where truncated tool-output files were being deleted the moment they were written.
|
package/package.json
CHANGED
|
@@ -7,20 +7,20 @@
|
|
|
7
7
|
"scripts": {
|
|
8
8
|
"postinstall": "bun ./postinstall.mjs || node ./postinstall.mjs"
|
|
9
9
|
},
|
|
10
|
-
"version": "0.
|
|
10
|
+
"version": "0.10.0",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@altimateai/altimate-core": "0.7.0"
|
|
14
14
|
},
|
|
15
15
|
"optionalDependencies": {
|
|
16
|
-
"@altimateai/altimate-code-windows-x64-baseline": "0.
|
|
17
|
-
"@altimateai/altimate-code-linux-arm64": "0.
|
|
18
|
-
"@altimateai/altimate-code-darwin-x64": "0.
|
|
19
|
-
"@altimateai/altimate-code-linux-x64-baseline": "0.
|
|
20
|
-
"@altimateai/altimate-code-darwin-arm64": "0.
|
|
21
|
-
"@altimateai/altimate-code-linux-x64": "0.
|
|
22
|
-
"@altimateai/altimate-code-darwin-x64-baseline": "0.
|
|
23
|
-
"@altimateai/altimate-code-windows-x64": "0.
|
|
16
|
+
"@altimateai/altimate-code-windows-x64-baseline": "0.10.0",
|
|
17
|
+
"@altimateai/altimate-code-linux-arm64": "0.10.0",
|
|
18
|
+
"@altimateai/altimate-code-darwin-x64": "0.10.0",
|
|
19
|
+
"@altimateai/altimate-code-linux-x64-baseline": "0.10.0",
|
|
20
|
+
"@altimateai/altimate-code-darwin-arm64": "0.10.0",
|
|
21
|
+
"@altimateai/altimate-code-linux-x64": "0.10.0",
|
|
22
|
+
"@altimateai/altimate-code-darwin-x64-baseline": "0.10.0",
|
|
23
|
+
"@altimateai/altimate-code-windows-x64": "0.10.0"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
26
|
"pg": ">=8",
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"mssql": ">=11",
|
|
32
32
|
"oracledb": ">=6",
|
|
33
33
|
"duckdb": ">=1",
|
|
34
|
+
"mongodb": ">=6",
|
|
34
35
|
"@clickhouse/client": ">=1",
|
|
35
36
|
"trino-client": ">=0.2"
|
|
36
37
|
},
|
|
@@ -59,6 +60,9 @@
|
|
|
59
60
|
"duckdb": {
|
|
60
61
|
"optional": true
|
|
61
62
|
},
|
|
63
|
+
"mongodb": {
|
|
64
|
+
"optional": true
|
|
65
|
+
},
|
|
62
66
|
"@clickhouse/client": {
|
|
63
67
|
"optional": true
|
|
64
68
|
},
|
package/postinstall.mjs
CHANGED
|
@@ -238,7 +238,20 @@ function writeUpgradeMarker(version) {
|
|
|
238
238
|
const xdgData = process.env.XDG_DATA_HOME || path.join(os.homedir(), ".local", "share")
|
|
239
239
|
const dataDir = path.join(xdgData, "altimate-code")
|
|
240
240
|
fs.mkdirSync(dataDir, { recursive: true })
|
|
241
|
-
|
|
241
|
+
// Companion first, trigger last. `.installed-version` is what the CLI keys on:
|
|
242
|
+
// it returns early unless that file exists, then consumes `.install-source`.
|
|
243
|
+
// Trigger-first left two windows — a CLI starting in between reports
|
|
244
|
+
// install_method "unknown", and writeFileSync truncates before writing, so a
|
|
245
|
+
// reader could observe an EMPTY `.installed-version` and delete it unread,
|
|
246
|
+
// losing the install outright. Matches `install` and `install.ps1`.
|
|
247
|
+
fs.writeFileSync(path.join(dataDir, ".install-source"), "npm")
|
|
248
|
+
// Trigger published atomically: writeFileSync truncates before filling, so a CLI
|
|
249
|
+
// starting mid-write could observe an EMPTY `.installed-version` and delete it
|
|
250
|
+
// unread, losing the install. renameSync within one directory is atomic.
|
|
251
|
+
const versionPath = path.join(dataDir, ".installed-version")
|
|
252
|
+
const tmpPath = `${versionPath}.${process.pid}.tmp`
|
|
253
|
+
fs.writeFileSync(tmpPath, version.replace(/^v/, ""))
|
|
254
|
+
fs.renameSync(tmpPath, versionPath)
|
|
242
255
|
} catch {
|
|
243
256
|
// Non-fatal — the CLI just won't show a welcome banner
|
|
244
257
|
}
|