mirror of
https://github.com/block/goose.git
synced 2026-07-17 12:56:20 +02:00
feat: jira toolkit (#59)
Co-authored-by: Bradley Axen <baxen@squareup.com>
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
This is a python CLI app that uses UV. Read CONTRIBUTING.md for information on how to build and test it as needed.
|
||||
Some key concepts are that it is run as a command line interface, dependes on the "ai-exchange" package, and has the concept of toolkits which are ways that its behavior can be extended. Look in src/goose and tests.
|
||||
Once the user has UV installed it should be able to be used effectively along with uvx to run tasks as needed
|
||||
@@ -130,6 +130,8 @@ Rules designed to control or manage the output of the model. Moderators that cur
|
||||
* `screen`: for letting goose take a look at your screen to help debug or work on designs (gives goose eyes)
|
||||
* `github`: for awareness and suggestions on how to use github
|
||||
* `repo_context`: for summarizing and understanding a repository you are working in.
|
||||
* `jira`: for working with JIRA (issues, backlogs, tasks, bugs etc)
|
||||
|
||||
|
||||
#### Configuring goose per repo
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ goose-ai = "goose.module_name"
|
||||
[project.entry-points."goose.toolkit"]
|
||||
developer = "goose.toolkit.developer:Developer"
|
||||
github = "goose.toolkit.github:Github"
|
||||
jira = "goose.toolkit.jira:Jira"
|
||||
screen = "goose.toolkit.screen:Screen"
|
||||
repo_context = "goose.toolkit.repo_context.repo_context:RepoContext"
|
||||
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
from exchange import Message # type: ignore
|
||||
from goose.toolkit.base import tool # type: ignore
|
||||
import re
|
||||
from goose.toolkit.base import Toolkit
|
||||
|
||||
|
||||
class Jira(Toolkit):
|
||||
"""Provides an additional prompt on how to interact with Jira"""
|
||||
|
||||
def system(self) -> str:
|
||||
"""Retrieve detailed configuration and procedural guidelines for Jira operations"""
|
||||
template_content = Message.load("prompts/jira.jinja").text
|
||||
return template_content
|
||||
|
||||
@tool
|
||||
def is_jira_issue(self, issue_key: str) -> str:
|
||||
"""
|
||||
Checks if a given string is a valid JIRA issue key.
|
||||
Use this if it looks like the user is asking about a JIRA issue.
|
||||
|
||||
Args:
|
||||
issue_key (str): The potential Jira issue key to be validated.
|
||||
|
||||
"""
|
||||
pattern = r"[A-Z]+-\d+"
|
||||
return bool(re.match(pattern, issue_key))
|
||||
@@ -0,0 +1,21 @@
|
||||
You can interact with jira issues via the `jira` command line generally.
|
||||
If it fails to auth, prompt the user to run `jira init` in a separate terminal and then try again.
|
||||
|
||||
Typically when someone requests you to look at a ticket, they mean to view
|
||||
not just the top level comments and history, but also the comments nested within that ticket and status.
|
||||
|
||||
Some usages are for looking up a JIRA backlog, or looking up a JIRA issue.
|
||||
Use the tool is_jira_issue if not sure that a string that looks like a jira issue is.
|
||||
|
||||
Use `jira --help` if not sure of command line options.
|
||||
|
||||
If the jira command line is not installed, you can install it as follows:
|
||||
|
||||
On macos:
|
||||
```sh
|
||||
brew tap ankitpokhrel/jira-cli
|
||||
brew install jira-cli
|
||||
```
|
||||
|
||||
On other operating systems or for alternative installation methods, refer to the instructions here:
|
||||
https://github.com/ankitpokhrel/jira-cli
|
||||
@@ -0,0 +1,24 @@
|
||||
import pytest
|
||||
from goose.toolkit.jira import Jira
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def jira_toolkit():
|
||||
return Jira(None)
|
||||
|
||||
|
||||
def test_jira_system_prompt(jira_toolkit):
|
||||
prompt = jira_toolkit.system()
|
||||
print("System Prompt:\n", prompt)
|
||||
# Ensure Jinja template syntax isn't present in the loaded prompt
|
||||
# Ensure both installation instructions are present in the prompt
|
||||
assert "macos" in prompt
|
||||
assert "On other operating systems or for alternative installation methods" in prompt
|
||||
|
||||
|
||||
def test_is_jira_issue(jira_toolkit):
|
||||
valid_jira_issue = "PROJ-123"
|
||||
invalid_jira_issue = "INVALID_ISSUE"
|
||||
# Ensure the regex correctly identifies valid JIRA issues
|
||||
assert jira_toolkit.is_jira_issue(valid_jira_issue)
|
||||
assert not jira_toolkit.is_jira_issue(invalid_jira_issue)
|
||||
Reference in New Issue
Block a user