Skip to content

Commit

Permalink
feat: jira toolkit (#59)
Browse files Browse the repository at this point in the history
Co-authored-by: Bradley Axen <[email protected]>
  • Loading branch information
michaelneale and baxen authored Sep 16, 2024
1 parent b6638d5 commit 005f745
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .goosehints
Original file line number Diff line number Diff line change
@@ -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
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
26 changes: 26 additions & 0 deletions src/goose/toolkit/jira.py
Original file line number Diff line number Diff line change
@@ -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))
21 changes: 21 additions & 0 deletions src/goose/toolkit/prompts/jira.jinja
Original file line number Diff line number Diff line change
@@ -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
24 changes: 24 additions & 0 deletions tests/test_jira.py
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit 005f745

Please sign in to comment.