Skip to content

Conversation

TheManWhoLikesToCode
Copy link

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

uv sync
uv run specify init demo-rovodev --ai rovodev --ignore-agent-tools --no-git
  • Template downloads successfully (gracefully falls back to copilot template)
  • Next steps display Rovodev-specific commands and agent.md guidance
uv run specify check
  • Reports acli (Rovodev CLI) installation status
  • Displays installation guide if tool is missing

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

Screenshot 2025-09-09 at 10 53 31 PM

post init
Screenshot 2025-09-09 at 10 55 33 PM

/specify
Screenshot 2025-09-09 at 11 02 05 PM

/specify + branch name
Screenshot 2025-09-09 at 11 04 14 PM

Project Tree
Screenshot 2025-09-09 at 11 05 36 PM

Modeled after @hiroaki HONJO codex support PR
@Copilot Copilot AI review requested due to automatic review settings September 10, 2025 06:08
Copilot

This comment was marked as outdated.

@Copilot Copilot AI review requested due to automatic review settings September 10, 2025 06:10
Copilot

This comment was marked as outdated.

@Copilot Copilot AI review requested due to automatic review settings September 10, 2025 06:12
Copilot

This comment was marked as outdated.

@Copilot Copilot AI review requested due to automatic review settings September 10, 2025 06:12
Copy link
Contributor

@Copilot Copilot AI left a 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.

Comment on lines 409 to 426
# 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:
Copy link
Preview

Copilot AI Sep 10, 2025

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"):
Copy link
Preview

Copilot AI Sep 10, 2025

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.

@@ -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")
Copy link
Preview

Copilot AI Sep 10, 2025

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.

@TheManWhoLikesToCode
Copy link
Author

TheManWhoLikesToCode commented Sep 10, 2025

To test run
uvx --from git+https://github.com/TheManWhoLikesToCode/spec-kit.git@Rovodev-CLI-Support specify init --here

@@ -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'
Copy link
Collaborator

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?

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
Screenshot 2025-09-10 at 6 38 52 PM

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.

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.

@localden localden self-assigned this Sep 10, 2025
@localden localden added enhancement merge-candidate Reasonable change that is going to be merged after a review. labels Sep 10, 2025
@federicociner
Copy link

@TheManWhoLikesToCode thanks for raising this PR. Can we please ensure that the naming we are using is Rovo Dev CLI to keep our branding consistent across partnerships and integrations?

@Copilot Copilot AI review requested due to automatic review settings September 11, 2025 02:58
Copy link
Contributor

@Copilot Copilot AI left a 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.

Comment on lines 417 to 424
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]")
Copy link
Preview

Copilot AI Sep 11, 2025

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.

Suggested change
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")
Copy link
Preview

Copilot AI Sep 11, 2025

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.

Suggested change
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.

@Copilot Copilot AI review requested due to automatic review settings September 11, 2025 03:09
Copy link
Contributor

@Copilot Copilot AI left a 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.

Comment on lines +417 to +424
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]")
Copy link
Preview

Copilot AI Sep 11, 2025

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.

@Copilot Copilot AI review requested due to automatic review settings September 11, 2025 03:34
Copy link
Contributor

@Copilot Copilot AI left a 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]
Copy link
Preview

Copilot AI Sep 11, 2025

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.

Suggested change
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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement merge-candidate Reasonable change that is going to be merged after a review.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants