Skip to content

Commit dea8d54

Browse files
committed
Add Tabnine CLI agent support
- Add Tabnine CLI to AGENT_CONFIG in specify CLI - Update README.md to list Tabnine CLI in supported agents table - Update AGENTS.md documentation with Tabnine CLI details - Add Tabnine template generation to release package scripts (both bash and PowerShell) - Include Tabnine packages in GitHub release script - Update agent context update scripts (bash and PowerShell) to support Tabnine - Configure Tabnine as TOML-based agent (similar to Gemini/Qwen) - Set up .tabnine/commands/ directory structure with {{args}} argument format
1 parent 6fed8ba commit dea8d54

File tree

8 files changed

+41
-11
lines changed

8 files changed

+41
-11
lines changed

.github/workflows/scripts/create-github-release.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ gh release create "$VERSION" \
4646
.genreleases/spec-kit-template-amp-ps-"$VERSION".zip \
4747
.genreleases/spec-kit-template-shai-sh-"$VERSION".zip \
4848
.genreleases/spec-kit-template-shai-ps-"$VERSION".zip \
49+
.genreleases/spec-kit-template-tabnine-sh-"$VERSION".zip \
50+
.genreleases/spec-kit-template-tabnine-ps-"$VERSION".zip \
4951
.genreleases/spec-kit-template-q-sh-"$VERSION".zip \
5052
.genreleases/spec-kit-template-q-ps-"$VERSION".zip \
5153
.genreleases/spec-kit-template-bob-sh-"$VERSION".zip \

.github/workflows/scripts/create-release-packages.ps1

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
1515
.PARAMETER Agents
1616
Comma or space separated subset of agents to build (default: all)
17-
Valid agents: claude, gemini, copilot, cursor-agent, qwen, opencode, windsurf, codex, kilocode, auggie, roo, codebuddy, amp, q, bob, qoder
17+
Valid agents: claude, gemini, copilot, cursor-agent, qwen, opencode, windsurf, codex, kilocode, auggie, roo, codebuddy, amp, q, bob, qoder, tabnine
1818
1919
.PARAMETER Scripts
2020
Comma or space separated subset of script types to build (default: both)
@@ -347,6 +347,10 @@ function Build-Variant {
347347
$cmdDir = Join-Path $baseDir ".qoder/commands"
348348
Generate-Commands -Agent 'qoder' -Extension 'md' -ArgFormat '$ARGUMENTS' -OutputDir $cmdDir -ScriptVariant $Script
349349
}
350+
'tabnine' {
351+
$cmdDir = Join-Path $baseDir ".tabnine/commands"
352+
Generate-Commands -Agent 'tabnine' -Extension 'toml' -ArgFormat '{{args}}' -OutputDir $cmdDir -ScriptVariant $Script
353+
}
350354
}
351355

352356
# Create zip archive
@@ -356,7 +360,7 @@ function Build-Variant {
356360
}
357361

358362
# Define all agents and scripts
359-
$AllAgents = @('claude', 'gemini', 'copilot', 'cursor-agent', 'qwen', 'opencode', 'windsurf', 'codex', 'kilocode', 'auggie', 'roo', 'codebuddy', 'amp', 'q', 'bob', 'qoder')
363+
$AllAgents = @('claude', 'gemini', 'copilot', 'cursor-agent', 'qwen', 'opencode', 'windsurf', 'codex', 'kilocode', 'auggie', 'roo', 'codebuddy', 'amp', 'q', 'bob', 'qoder', 'tabnine')
360364
$AllScripts = @('sh', 'ps')
361365

362366
function Normalize-List {

.github/workflows/scripts/create-release-packages.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,13 +217,16 @@ build_variant() {
217217
bob)
218218
mkdir -p "$base_dir/.bob/commands"
219219
generate_commands bob md "\$ARGUMENTS" "$base_dir/.bob/commands" "$script" ;;
220+
tabnine)
221+
mkdir -p "$base_dir/.tabnine/commands"
222+
generate_commands tabnine toml "{{args}}" "$base_dir/.tabnine/commands" "$script" ;;
220223
esac
221224
( cd "$base_dir" && zip -r "../spec-kit-template-${agent}-${script}-${NEW_VERSION}.zip" . )
222225
echo "Created $GENRELEASES_DIR/spec-kit-template-${agent}-${script}-${NEW_VERSION}.zip"
223226
}
224227

225228
# Determine agent list
226-
ALL_AGENTS=(claude gemini copilot cursor-agent qwen opencode windsurf codex kilocode auggie roo codebuddy amp shai q bob qoder)
229+
ALL_AGENTS=(claude gemini copilot cursor-agent qwen opencode windsurf codex kilocode auggie roo codebuddy amp shai q bob qoder tabnine)
227230
ALL_SCRIPTS=(sh ps)
228231

229232
norm_list() {

AGENTS.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ Specify supports multiple AI agents by generating agent-specific command files a
4747
| **Amazon Q Developer CLI** | `.amazonq/prompts/` | Markdown | `q` | Amazon Q Developer CLI |
4848
| **Amp** | `.agents/commands/` | Markdown | `amp` | Amp CLI |
4949
| **SHAI** | `.shai/commands/` | Markdown | `shai` | SHAI CLI |
50+
| **Tabnine CLI** | `.tabnine/commands/` | TOML | `tabnine` | Tabnine CLI |
5051
| **IBM Bob** | `.bob/commands/` | Markdown | N/A (IDE-based) | IBM Bob IDE |
5152

5253
### Step-by-Step Integration Guide
@@ -316,6 +317,7 @@ Require a command-line tool to be installed:
316317
- **Qoder CLI**: `qoder` CLI
317318
- **Amp**: `amp` CLI
318319
- **SHAI**: `shai` CLI
320+
- **Tabnine CLI**: `tabnine` CLI
319321

320322
### IDE-Based Agents
321323

@@ -354,7 +356,7 @@ Command content with {SCRIPT} and $ARGUMENTS placeholders.
354356

355357
### TOML Format
356358

357-
Used by: Gemini, Qwen
359+
Used by: Gemini, Qwen, Tabnine
358360

359361
```toml
360362
description = "Command description"

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ Want to see Spec Kit in action? Watch our [video overview](https://www.youtube.c
161161
| [Qwen Code](https://github.com/QwenLM/qwen-code) || |
162162
| [Roo Code](https://roocode.com/) || |
163163
| [SHAI (OVHcloud)](https://github.com/ovh/shai) || |
164+
| [Tabnine CLI](https://github.com/codota/tabnine-cli) || |
164165
| [Windsurf](https://windsurf.com/) || |
165166

166167
## 🔧 Specify CLI Reference

scripts/bash/update-agent-context.sh

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@
3030
#
3131
# 5. Multi-Agent Support
3232
# - Handles agent-specific file paths and naming conventions
33-
# - Supports: Claude, Gemini, Copilot, Cursor, Qwen, opencode, Codex, Windsurf, Kilo Code, Auggie CLI, Roo Code, CodeBuddy CLI, Qoder CLI, Amp, SHAI, or Amazon Q Developer CLI
33+
# - Supports: Claude, Gemini, Copilot, Cursor, Qwen, opencode, Codex, Windsurf, Kilo Code, Auggie CLI, Roo Code, CodeBuddy CLI, Qoder CLI, Amp, SHAI, Tabnine CLI, or Amazon Q Developer CLI
3434
# - Can update single agents or all existing agent files
3535
# - Creates default Claude file if no agent files exist
3636
#
3737
# Usage: ./update-agent-context.sh [agent_type]
38-
# Agent types: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|shai|q|bob|qoder
38+
# Agent types: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|shai|tabnine|q|bob|qoder
3939
# Leave empty to update all existing agent files
4040

4141
set -e
@@ -73,6 +73,7 @@ CODEBUDDY_FILE="$REPO_ROOT/CODEBUDDY.md"
7373
QODER_FILE="$REPO_ROOT/QODER.md"
7474
AMP_FILE="$REPO_ROOT/AGENTS.md"
7575
SHAI_FILE="$REPO_ROOT/SHAI.md"
76+
TABNINE_FILE="$REPO_ROOT/TABNINE.md"
7677
Q_FILE="$REPO_ROOT/AGENTS.md"
7778
BOB_FILE="$REPO_ROOT/AGENTS.md"
7879

@@ -627,6 +628,9 @@ update_specific_agent() {
627628
shai)
628629
update_agent_file "$SHAI_FILE" "SHAI"
629630
;;
631+
tabnine)
632+
update_agent_file "$TABNINE_FILE" "Tabnine CLI"
633+
;;
630634
q)
631635
update_agent_file "$Q_FILE" "Amazon Q Developer CLI"
632636
;;
@@ -635,7 +639,7 @@ update_specific_agent() {
635639
;;
636640
*)
637641
log_error "Unknown agent type '$agent_type'"
638-
log_error "Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|amp|shai|q|bob|qoder"
642+
log_error "Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|amp|shai|tabnine|q|bob|qoder"
639643
exit 1
640644
;;
641645
esac
@@ -705,6 +709,11 @@ update_all_existing_agents() {
705709
found_agent=true
706710
fi
707711

712+
if [[ -f "$TABNINE_FILE" ]]; then
713+
update_agent_file "$TABNINE_FILE" "Tabnine CLI"
714+
found_agent=true
715+
fi
716+
708717
if [[ -f "$QODER_FILE" ]]; then
709718
update_agent_file "$QODER_FILE" "Qoder CLI"
710719
found_agent=true

scripts/powershell/update-agent-context.ps1

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Mirrors the behavior of scripts/bash/update-agent-context.sh:
99
2. Plan Data Extraction
1010
3. Agent File Management (create from template or update existing)
1111
4. Content Generation (technology stack, recent changes, timestamp)
12-
5. Multi-Agent Support (claude, gemini, copilot, cursor-agent, qwen, opencode, codex, windsurf, kilocode, auggie, roo, codebuddy, amp, shai, q, bob, qoder)
12+
5. Multi-Agent Support (claude, gemini, copilot, cursor-agent, qwen, opencode, codex, windsurf, kilocode, auggie, roo, codebuddy, amp, shai, tabnine, q, bob, qoder)
1313
1414
.PARAMETER AgentType
1515
Optional agent key to update a single agent. If omitted, updates all existing agent files (creating a default Claude file if none exist).
@@ -25,7 +25,7 @@ Relies on common helper functions in common.ps1
2525
#>
2626
param(
2727
[Parameter(Position=0)]
28-
[ValidateSet('claude','gemini','copilot','cursor-agent','qwen','opencode','codex','windsurf','kilocode','auggie','roo','codebuddy','amp','shai','q','bob','qoder')]
28+
[ValidateSet('claude','gemini','copilot','cursor-agent','qwen','opencode','codex','windsurf','kilocode','auggie','roo','codebuddy','amp','shai','tabnine','q','bob','qoder')]
2929
[string]$AgentType
3030
)
3131

@@ -58,6 +58,7 @@ $CODEBUDDY_FILE = Join-Path $REPO_ROOT 'CODEBUDDY.md'
5858
$QODER_FILE = Join-Path $REPO_ROOT 'QODER.md'
5959
$AMP_FILE = Join-Path $REPO_ROOT 'AGENTS.md'
6060
$SHAI_FILE = Join-Path $REPO_ROOT 'SHAI.md'
61+
$TABNINE_FILE = Join-Path $REPO_ROOT 'TABNINE.md'
6162
$Q_FILE = Join-Path $REPO_ROOT 'AGENTS.md'
6263
$BOB_FILE = Join-Path $REPO_ROOT 'AGENTS.md'
6364

@@ -386,9 +387,10 @@ function Update-SpecificAgent {
386387
'qoder' { Update-AgentFile -TargetFile $QODER_FILE -AgentName 'Qoder CLI' }
387388
'amp' { Update-AgentFile -TargetFile $AMP_FILE -AgentName 'Amp' }
388389
'shai' { Update-AgentFile -TargetFile $SHAI_FILE -AgentName 'SHAI' }
390+
'tabnine' { Update-AgentFile -TargetFile $TABNINE_FILE -AgentName 'Tabnine CLI' }
389391
'q' { Update-AgentFile -TargetFile $Q_FILE -AgentName 'Amazon Q Developer CLI' }
390392
'bob' { Update-AgentFile -TargetFile $BOB_FILE -AgentName 'IBM Bob' }
391-
default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|shai|q|bob|qoder'; return $false }
393+
default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|q|bob|qoder'; return $false }
392394
}
393395
}
394396

@@ -408,6 +410,7 @@ function Update-AllExistingAgents {
408410
if (Test-Path $CODEBUDDY_FILE) { if (-not (Update-AgentFile -TargetFile $CODEBUDDY_FILE -AgentName 'CodeBuddy CLI')) { $ok = $false }; $found = $true }
409411
if (Test-Path $QODER_FILE) { if (-not (Update-AgentFile -TargetFile $QODER_FILE -AgentName 'Qoder CLI')) { $ok = $false }; $found = $true }
410412
if (Test-Path $SHAI_FILE) { if (-not (Update-AgentFile -TargetFile $SHAI_FILE -AgentName 'SHAI')) { $ok = $false }; $found = $true }
413+
if (Test-Path $TABNINE_FILE) { if (-not (Update-AgentFile -TargetFile $TABNINE_FILE -AgentName 'Tabnine CLI')) { $ok = $false }; $found = $true }
411414
if (Test-Path $Q_FILE) { if (-not (Update-AgentFile -TargetFile $Q_FILE -AgentName 'Amazon Q Developer CLI')) { $ok = $false }; $found = $true }
412415
if (Test-Path $BOB_FILE) { if (-not (Update-AgentFile -TargetFile $BOB_FILE -AgentName 'IBM Bob')) { $ok = $false }; $found = $true }
413416
if (-not $found) {

src/specify_cli/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,12 @@ def _format_rate_limit_error(status_code: int, headers: httpx.Headers, url: str)
226226
"install_url": None, # IDE-based
227227
"requires_cli": False,
228228
},
229+
"tabnine": {
230+
"name": "Tabnine CLI",
231+
"folder": ".tabnine/",
232+
"install_url": "https://github.com/codota/tabnine-cli",
233+
"requires_cli": True,
234+
},
229235
}
230236

231237
SCRIPT_TYPE_CHOICES = {"sh": "POSIX Shell (bash/zsh)", "ps": "PowerShell"}
@@ -945,7 +951,7 @@ def ensure_executable_scripts(project_path: Path, tracker: StepTracker | None =
945951
@app.command()
946952
def init(
947953
project_name: str = typer.Argument(None, help="Name for your new project directory (optional if using --here, or use '.' for current directory)"),
948-
ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor-agent, qwen, opencode, codex, windsurf, kilocode, auggie, codebuddy, amp, shai, q, bob, or qoder "),
954+
ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor-agent, qwen, opencode, codex, windsurf, kilocode, auggie, codebuddy, amp, shai, q, bob, qoder, or tabnine"),
949955
script_type: str = typer.Option(None, "--script", help="Script type to use: sh or ps"),
950956
ignore_agent_tools: bool = typer.Option(False, "--ignore-agent-tools", help="Skip checks for AI agent tools like Claude Code"),
951957
no_git: bool = typer.Option(False, "--no-git", help="Skip git repository initialization"),

0 commit comments

Comments
 (0)