-
Notifications
You must be signed in to change notification settings - Fork 3.8k
feat: Rovodev CLI Support #133
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 4 commits
eff26e1
c84bef8
3be23e9
7ab296d
e57469d
a33d885
e6ce207
214c8d9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -51,7 +51,8 @@ | |||||||||||||||||||||||||||||||||
| AI_CHOICES = { | ||||||||||||||||||||||||||||||||||
| "copilot": "GitHub Copilot", | ||||||||||||||||||||||||||||||||||
| "claude": "Claude Code", | ||||||||||||||||||||||||||||||||||
| "gemini": "Gemini CLI" | ||||||||||||||||||||||||||||||||||
| "gemini": "Gemini CLI", | ||||||||||||||||||||||||||||||||||
| "rovodev": "Rovodev CLI", | ||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # ASCII Art Banner | ||||||||||||||||||||||||||||||||||
|
|
@@ -405,23 +406,30 @@ def download_template_from_github(ai_assistant: str, download_dir: Path, *, verb | |||||||||||||||||||||||||||||||||
| console.print(f"[red]Error fetching release information:[/red] {e}") | ||||||||||||||||||||||||||||||||||
| raise typer.Exit(1) | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # Find the template asset for the specified AI assistant | ||||||||||||||||||||||||||||||||||
| # Find the template asset for the specified AI assistant, with fallback for 'rovodev' -> 'copilot' | ||||||||||||||||||||||||||||||||||
| pattern = f"spec-kit-template-{ai_assistant}" | ||||||||||||||||||||||||||||||||||
| matching_assets = [ | ||||||||||||||||||||||||||||||||||
| asset for asset in release_data.get("assets", []) | ||||||||||||||||||||||||||||||||||
| if pattern in asset["name"] and asset["name"].endswith(".zip") | ||||||||||||||||||||||||||||||||||
| ] | ||||||||||||||||||||||||||||||||||
| assets = release_data.get("assets", []) | ||||||||||||||||||||||||||||||||||
| matching_assets = [a for a in assets if pattern in a["name"] and a["name"].endswith(".zip")] | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| asset = None | ||||||||||||||||||||||||||||||||||
| if matching_assets: | ||||||||||||||||||||||||||||||||||
| asset = matching_assets[0] | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
| asset = matching_assets[0] | |
| asset = matching_assets[0] | |
| # Fallback: if rovodevcli not found, try copilot | |
| if asset is None and ai_assistant == "rovodevcli": | |
| fallback_pattern = "spec-kit-template-copilot" | |
| fallback_assets = [a for a in assets if fallback_pattern in a["name"] and a["name"].endswith(".zip")] | |
| if fallback_assets: | |
| asset = fallback_assets[0] | |
| if verbose: | |
| console.print("[yellow]Falling back to 'copilot' template as 'rovodevcli' template was not found.[/yellow]") |
Outdated
Copilot
AI
Sep 11, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The condition checks for "rovodev" but the AI_CHOICES dictionary uses "rovodevcli" as the key. This condition will never be true, causing the fallback logic to never execute.
| elif ai_assistant == "rovodev": | |
| # Fallback to copilot template if rovodev-specific template is not published yet | |
| fallback_pattern = "spec-kit-template-copilot" | |
| fallback_assets = [a for a in assets if fallback_pattern in a["name"] and a["name"].endswith(".zip")] | |
| if fallback_assets: | |
| asset = fallback_assets[0] | |
| if verbose: | |
| console.print("[yellow]No 'rovodev' template found; falling back to 'copilot' template.[/yellow]") | |
| elif ai_assistant == "rovodevcli": | |
| # Fallback to copilot template if rovodevcli-specific template is not published yet | |
| fallback_pattern = "spec-kit-template-copilot" | |
| fallback_assets = [a for a in assets if fallback_pattern in a["name"] and a["name"].endswith(".zip")] | |
| if fallback_assets: | |
| asset = fallback_assets[0] | |
| if verbose: | |
| console.print("[yellow]No 'rovodevcli' template found; falling back to 'copilot' template.[/yellow]") |
Outdated
Copilot
AI
Sep 10, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[nitpick] The fallback logic is hardcoded specifically for 'rovodev' -> 'copilot'. Consider implementing a more flexible fallback mapping that could be extended for other AI assistants in the future.
Copilot
AI
Sep 10, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[nitpick] The URL is quite long and makes the line exceed reasonable length limits. Consider storing the installation URL in a constant or variable for better readability.
Outdated
Copilot
AI
Sep 10, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[nitpick] Same long URL as in the agent tools check. Consider extracting this to a constant for consistency and maintainability.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am not actually sure this is needed here. Can you explain why this fallback is implemented?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Similar to what honjo-hiroaki-gtt mentioned in his PR here https://github.com/github/spec-kit/pull/14/files#diff-8e3e8dfe8740d05f4d06dd457ea293ec88ac0ecc9bba6eb182f0f767db67ce9eR453
Without it the Rovo Dev CLI templates return nothing to my understanding. The templates published are here and there's none for Rovo Dev CLI

There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wait lol. After some thought this is a smoke signal. I'll add .github workflows to populate the templates.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm keeping the fallback for now as I'm not the owner of this repo, so the pointer to the releases is returning empty. I like using speckit with rovodev. If it's required to merge I'll do it but to keep it functional I'll keep the fallback.