-
Notifications
You must be signed in to change notification settings - Fork 1.9k
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
base: main
Are you sure you want to change the base?
feat: Rovodev CLI Support #133
Conversation
Modeled after @hiroaki HONJO codex support PR
Co-authored-by: Copilot <[email protected]>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: Copilot <[email protected]>
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.
Pull Request Overview
Adds support for Rovodev CLI as a fourth AI assistant option (alongside Claude Code, Gemini CLI, and GitHub Copilot) to the Specify CLI tool. The changes enable users to initialize projects with Rovodev CLI support and handle template fallback scenarios.
- Adds "rovodev" option to AI assistant choices with proper CLI checks and agent.md context file support
- Implements template fallback mechanism that uses copilot template when rovodev-specific template isn't available
- Updates agent context script and documentation to include Rovodev CLI throughout the workflow
Reviewed Changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.
File | Description |
---|---|
src/specify_cli/init.py | Adds rovodev to AI choices, implements template fallback logic, adds acli tool checking, and updates init workflow |
scripts/update-agent-context.sh | Extends agent context update script to support agent.md file for Rovodev CLI |
README.md | Updates documentation to include Rovodev CLI as a supported AI assistant option |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
src/specify_cli/__init__.py
Outdated
# 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] | ||
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]") | ||
|
||
if not matching_assets: | ||
if asset is None: |
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 uses AI. Check for mistakes.
@@ -737,6 +747,10 @@ def init( | |||
if not check_tool("gemini", "Install from: https://github.com/google-gemini/gemini-cli"): | |||
console.print("[red]Error:[/red] Gemini CLI is required for Gemini projects") | |||
agent_tool_missing = True | |||
elif selected_ai == "rovodev": | |||
if not check_tool("acli", "Install from: https://support.atlassian.com/rovo/docs/install-and-run-rovo-dev-cli-on-your-device"): |
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.
Copilot uses AI. Check for mistakes.
src/specify_cli/__init__.py
Outdated
@@ -855,11 +875,13 @@ def check(): | |||
console.print("\n[cyan]Optional AI tools:[/cyan]") | |||
claude_ok = check_tool("claude", "Install from: https://docs.anthropic.com/en/docs/claude-code/setup") | |||
gemini_ok = check_tool("gemini", "Install from: https://github.com/google-gemini/gemini-cli") | |||
rovodev_ok = check_tool("acli", "Install from: https://support.atlassian.com/rovo/docs/install-and-run-rovo-dev-cli-on-your-device") |
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.
Copilot uses AI. Check for mistakes.
To test run |
src/specify_cli/__init__.py
Outdated
@@ -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' |
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.
@TheManWhoLikesToCode thanks for raising this PR. Can we please ensure that the naming we are using is |
016638f
to
d705fc0
Compare
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.
Pull Request Overview
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
src/specify_cli/__init__.py
Outdated
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]") |
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]") |
Copilot uses AI. Check for mistakes.
@@ -737,6 +748,10 @@ def init( | |||
if not check_tool("gemini", "Install from: https://github.com/google-gemini/gemini-cli"): | |||
console.print("[red]Error:[/red] Gemini CLI is required for Gemini projects") | |||
agent_tool_missing = True | |||
elif selected_ai == "rovodevcli": | |||
if not check_tool("acli", "Install from: https://support.atlassian.com/rovo/docs/install-and-run-rovo-dev-cli-on-your-device"): | |||
console.print("[red]Error:[/red] Rovo Dev CLI is required for Rovo Dev CLI projects") |
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 error message "Rovo Dev CLI is required for Rovo Dev CLI projects" is redundant. Consider changing to "Rovo Dev CLI (acli) is required for Rovo Dev projects" to be more informative and consistent with other error messages.
console.print("[red]Error:[/red] Rovo Dev CLI is required for Rovo Dev CLI projects") | |
console.print("[red]Error:[/red] Rovo Dev CLI (acli) is required for Rovo Dev projects") |
Copilot uses AI. Check for mistakes.
d705fc0
to
b4ec379
Compare
b4ec379
to
e57469d
Compare
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.
Pull Request Overview
Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
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]") |
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 "rovodevcli". Consider extracting this into a configurable fallback mapping (e.g., FALLBACK_TEMPLATES = {"rovodevcli": "copilot"}
) to make it more maintainable and extensible for future AI assistants that might need fallbacks.
Copilot uses AI. Check for mistakes.
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.
Pull Request Overview
Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
|
||
asset = None | ||
if matching_assets: | ||
asset = matching_assets[0] |
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 fallback logic for rovodevcli -> copilot template mentioned in the comment is not implemented. The code should attempt to find the copilot template when rovodevcli template is not found.
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]") |
Copilot uses AI. Check for mistakes.
This reverts commit e6ce207.
Modeled after honjo-hiroaki-gtt codex support PR
Description
Summary: Adds Rovodev CLI agent option (--ai rovodev). The init flow checks for Rovodev CLI (acli), handles template fallback to copilot when rovodev-specific templates aren't published, and sets up agent.md context file. Agent context script updates now support agent.md for Rovodev CLI.
How To Test
Optional: With Rovodev CLI installed, test workflow:
acli /specify
→/plan
→/tasks
# Verify agent.md updates work correctly ./scripts/update-agent-context.sh rovodev
Note:
uv run specify check
shows warnings for missing tools but doesn't enumerate installed AI agents.Proof or it didn't happen
init
post init

/specify

/specify + branch name

Project Tree
