Skip to content

Commit fcc3c44

Browse files
committed
Merge remote-tracking branch 'origin/main' into tool-cli-daemon
2 parents 4652bed + 6c2d548 commit fcc3c44

3 files changed

Lines changed: 56 additions & 0 deletions

File tree

‎README.md‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,23 @@ altimate /discover
8181
8282
> **Zero additional setup.** One command install.
8383
84+
### Use it from Claude Code or Codex
85+
86+
The Altimate Code plugins let Claude Code and Codex hand dbt and warehouse work to
87+
altimate. Install the CLI above first — the plugins run it, they do not install it.
88+
89+
```bash
90+
# Claude Code
91+
claude plugin install altimate-code
92+
93+
# Codex — add the marketplace, then open Codex, type /plugins and install "Altimate Code"
94+
codex plugin marketplace add AltimateAI/altimate-codex-plugin
95+
```
96+
97+
See [Using with Claude Code](docs/docs/data-engineering/guides/using-with-claude-code.md) for
98+
the marketplace install, sign-in and the `/altimate-code:altimate` command, and the
99+
[Codex plugin README](https://github.com/AltimateAI/altimate-codex-plugin#install) for Codex.
100+
84101
## Why a specialized harness?
85102

86103
General AI coding agents can edit SQL files. They cannot *understand* your data stack.

‎packages/tui/src/feature-plugins/home/tips-view.tsx‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,19 @@ function parse(tip: string): TipPart[] {
7171
const NO_MODELS_TIP = "Run {highlight}/connect{/highlight} to add an AI provider and start coding"
7272
const NO_MODELS_PARTS = parse(NO_MODELS_TIP)
7373

74+
// altimate_change start — suggest the Altimate Code plugins for Claude Code and Codex
75+
const CLAUDE_PLUGIN_TIP =
76+
"Using Claude Code? Run {highlight}claude plugin install altimate-code{/highlight} to hand dbt and warehouse work to Altimate Code"
77+
const CODEX_PLUGIN_TIP =
78+
"Using Codex? Run {highlight}codex plugin marketplace add AltimateAI/altimate-codex-plugin{/highlight}, then install Altimate Code from {highlight}/plugins{/highlight}"
79+
// altimate_change end
80+
7481
// altimate_change start — upstream_fix: restore first-run beginner tip pool
7582
const BEGINNER_TIPS: Tip[] = [
7683
"Run {highlight}/connect{/highlight} to add your API key and get started",
7784
"Run {highlight}/discover{/highlight} to auto-detect your dbt project and warehouse connections",
85+
CLAUDE_PLUGIN_TIP,
86+
CODEX_PLUGIN_TIP,
7887
"Press {highlight}Ctrl+P{/highlight} to see all available commands",
7988
"Press {highlight}Tab{/highlight} to cycle between Build and Plan agents",
8089
"Use {highlight}/cost-report{/highlight} to analyze warehouse spending",
@@ -320,6 +329,8 @@ const TIPS: Tip[] = [
320329
"Use {highlight}/ci-check{/highlight} to run pre-merge SQL validation on changed files",
321330
"Ask me to analyze a SQL query for anti-patterns — I'll detect 19+ issue types with zero false positives",
322331
"Ask me to trace column-level lineage for any SQL query across dialects",
332+
CLAUDE_PLUGIN_TIP,
333+
CODEX_PLUGIN_TIP,
323334
// altimate_change end
324335
]
325336

‎packages/tui/test/feature-plugins/home-onboarding.test.tsx‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,31 @@ test("tips use beginner pool only for first-time users", async () => {
155155
random.mockRestore()
156156
}
157157
})
158+
159+
for (const [name, index, text] of [
160+
["Claude Code", 2, "Using Claude Code? Run claude plugin install altimate-code"],
161+
["Codex", 3, "Using Codex? Run codex plugin marketplace add AltimateAI/altimate-codex-plugin"],
162+
] as const) {
163+
test(`tips suggest the Altimate Code plugin for ${name}`, async () => {
164+
// Plugin tips sit at fixed positions in the all-string beginner pool.
165+
const random = spyOn(Math, "random").mockReturnValue((index + 0.5) / 14)
166+
167+
try {
168+
const app = await testRender(() => <TipsHarness isFirstTime={true} connected={false} />, {
169+
width: 200,
170+
height: 4,
171+
})
172+
173+
try {
174+
await renderOnceSettled(app)
175+
const frame = await captureSettledFrame(app)
176+
177+
expect(frame).toContain(text)
178+
} finally {
179+
app.renderer.destroy()
180+
}
181+
} finally {
182+
random.mockRestore()
183+
}
184+
})
185+
}

0 commit comments

Comments
 (0)