codee-agent 0.7.3__tar.gz → 0.7.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codee_agent-0.7.3 → codee_agent-0.7.4}/PKG-INFO +1 -1
- {codee_agent-0.7.3 → codee_agent-0.7.4}/pyproject.toml +1 -1
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/admin_service.py +3 -3
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/test_admin_service.py +62 -2
- {codee_agent-0.7.3 → codee_agent-0.7.4}/LICENSE +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/README.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/.gitignore +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/admin.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/admin_api.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/admin_cli.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/agent_cli.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/coding_agents.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/executor.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/init_cli.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/claude_key_rotation.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/cron_describe.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/mcp_config.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/runs_db.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/runtime_control.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/test_claude_key_rotation.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/test_mcp_config.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/test_runs_db.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/test_trigger_cron_skills.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/test_trigger_issue_skills.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/trigger_aws_sqs_skills.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/trigger_cron_skills.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/trigger_email_skills.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/lib/trigger_issue_skills.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/mail_server.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/setup_wizard.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/start_cli.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/tasks_providers.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/AGENTS.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/CLAUDE.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/aws-sqs-alarm-response/SKILL.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/cron-research-5xx-errors/SKILL.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/story-code-reviewer/SKILL.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/story-developer/SKILL.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/story-planner/SKILL.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/story-planner/assets/readme-template.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/story-qa/SKILL.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/story-security-reviewer/SKILL.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/task-code-reviewer/SKILL.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/task-developer/SKILL.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/task-qa/SKILL.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/task-security-reviewer/SKILL.md +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/test_admin_api.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/test_admin_cli.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/test_agent_cli.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/test_coding_agents.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/test_executor.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/test_init_cli.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/test_memory_index.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/test_setup_wizard.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/test_start_cli.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/workflow_graph.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_admin/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_admin/codee_admin.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_abstract/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_abstract/provider.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_claude_code/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_claude_code/account.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_claude_code/credentials.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_claude_code/oauth.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_claude_code/provider.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_claude_code/test.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_claude_code/usage.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_codex/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_codex/provider.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_codex/test.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_github_copilot/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_github_copilot/provider.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_github_copilot/test.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_opencode/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_opencode/provider.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_agent_opencode/test.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_database/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_database/claude_code_accounts.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_database/database.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_database/oauth_tokens.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_main_context/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_main_context/context.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_main_context/logging.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_main_context/test_context.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_main_context/test_logging.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_tasks_abstract/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_tasks_abstract/provider.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_tasks_azure_devops/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_tasks_azure_devops/oauth.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_tasks_azure_devops/provider.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_tasks_azure_devops/test.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_tasks_jira/__init__.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_tasks_jira/provider.py +0 -0
- {codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee_tasks_jira/test.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codee-agent
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.4
|
|
4
4
|
Summary: A virtual co-worker that picks up Jira and Azure DevOps tasks and solves them with coding agents.
|
|
5
5
|
Keywords: ai,agent,jira,azure-devops,claude-code,github-copilot,codex,opencode,automation
|
|
6
6
|
Author: Denis Kibalko
|
|
@@ -514,8 +514,9 @@ MOVE_VERB_RE = re.compile(
|
|
|
514
514
|
# status, whose own name may contain a work item word ("Task Ready").
|
|
515
515
|
MOVE_TARGET_WORDS = {"to", "into", "in", "onto", "back", "at"}
|
|
516
516
|
WORD_RE = re.compile(r"[\w-]+")
|
|
517
|
-
#
|
|
518
|
-
|
|
517
|
+
# Bound the phrase naming what moves, while allowing coordinated objects such
|
|
518
|
+
# as "the subtask, as well as the story" before the status preposition.
|
|
519
|
+
MOVE_WINDOW = 12
|
|
519
520
|
|
|
520
521
|
|
|
521
522
|
def _work_item_terms(name: str) -> tuple[str, ...]:
|
|
@@ -592,7 +593,6 @@ class _WorkItemScope:
|
|
|
592
593
|
break
|
|
593
594
|
if lowered in self._own or lowered in self._others:
|
|
594
595
|
yield lowered
|
|
595
|
-
break
|
|
596
596
|
|
|
597
597
|
|
|
598
598
|
def _css_string(text: str) -> str:
|
|
@@ -19,8 +19,9 @@ from codee.admin_service import (
|
|
|
19
19
|
MCP_CHECK, TASKS_CHECK, USAGE_CACHE_SECONDS,
|
|
20
20
|
USAGE_RATE_LIMIT_BACKOFF_SECONDS, WORKFLOW_CACHE_VERSION,
|
|
21
21
|
WORKFLOW_HUMAN_EDGE_COLOR, AdminService, WorkflowGeneration,
|
|
22
|
-
_remove_redundant_skill_transitions, azure_oauth,
|
|
23
|
-
normalize_work_items, parse_skill, relative_age_label,
|
|
22
|
+
_WorkItemScope, _remove_redundant_skill_transitions, azure_oauth,
|
|
23
|
+
issue_prompt_task, normalize_work_items, parse_skill, relative_age_label,
|
|
24
|
+
repository_name)
|
|
24
25
|
from codee.lib import runs_db
|
|
25
26
|
from codee_agent_claude_code import oauth as claude_oauth
|
|
26
27
|
from codee_agent_claude_code.account import AccountUnavailable
|
|
@@ -1291,6 +1292,65 @@ class AdminServiceIssueTriggerTest(unittest.TestCase):
|
|
|
1291
1292
|
agent.run.call_args.args[0],
|
|
1292
1293
|
)
|
|
1293
1294
|
|
|
1295
|
+
def test_coordinated_move_includes_both_work_items(self) -> None:
|
|
1296
|
+
story = _WorkItemScope("story", ("story", "task"))
|
|
1297
|
+
task = _WorkItemScope("task", ("story", "task"))
|
|
1298
|
+
for evidence in (
|
|
1299
|
+
"Move the subtask and the story to AI Human Response Requested",
|
|
1300
|
+
"Move the subtask **and** the story to **AI Human Response Requested**",
|
|
1301
|
+
"Move the subtask, as well as the story, to AI Human Response Requested",
|
|
1302
|
+
"Move the story and the subtask to AI Human Response Requested",
|
|
1303
|
+
):
|
|
1304
|
+
with self.subTest(evidence=evidence):
|
|
1305
|
+
self.assertEqual(story.other_work_item(evidence), "")
|
|
1306
|
+
self.assertEqual(task.other_work_item(
|
|
1307
|
+
"Move the story and the task to AI Human Response Requested"), "")
|
|
1308
|
+
self.assertEqual(story.other_work_item(
|
|
1309
|
+
"Move the subtask to AI Human Response Requested"), "subtask")
|
|
1310
|
+
self.assertEqual(task.other_work_item(
|
|
1311
|
+
"Move the story to AI Human Response Requested"), "story")
|
|
1312
|
+
|
|
1313
|
+
def test_generate_workflow_accepts_coordinated_story_transition(self) -> None:
|
|
1314
|
+
evidence = (
|
|
1315
|
+
"Move the subtask and the story to AI Human Response Requested"
|
|
1316
|
+
)
|
|
1317
|
+
with tempfile.TemporaryDirectory() as temporary_directory:
|
|
1318
|
+
root = Path(temporary_directory)
|
|
1319
|
+
skills_dir = root / ".claude" / "skills"
|
|
1320
|
+
skill_dir = skills_dir / "story-developer"
|
|
1321
|
+
skill_dir.mkdir(parents=True)
|
|
1322
|
+
(skill_dir / "SKILL.md").write_text(
|
|
1323
|
+
"---\nname: story-developer\ndisable-model-invocation: true\n"
|
|
1324
|
+
"x-codee-trigger: issue\nx-codee-issue-status: [Ready]\n"
|
|
1325
|
+
"x-codee-issue-type: story\n---\n" + evidence + "\n"
|
|
1326
|
+
)
|
|
1327
|
+
agent = Mock()
|
|
1328
|
+
agent.run.return_value = json.dumps({
|
|
1329
|
+
"statuses": ["Ready", "AI Human Response Requested"],
|
|
1330
|
+
"transitions": [{
|
|
1331
|
+
"source": "Ready", "target": "AI Human Response Requested",
|
|
1332
|
+
"label": "story-developer", "evidence": evidence,
|
|
1333
|
+
}],
|
|
1334
|
+
"final_statuses": ["AI Human Response Requested"],
|
|
1335
|
+
})
|
|
1336
|
+
service = AdminService.__new__(AdminService)
|
|
1337
|
+
service.root = root
|
|
1338
|
+
service.skills_dir = skills_dir
|
|
1339
|
+
service.data_dir = root / ".codee"
|
|
1340
|
+
service.context = Mock(
|
|
1341
|
+
settings=Settings(coding_agent=CodingAgent.CLAUDE_CODE))
|
|
1342
|
+
|
|
1343
|
+
with patch.dict("codee.admin_service.CODING_AGENTS", {
|
|
1344
|
+
CodingAgent.CLAUDE_CODE: Mock(return_value=agent),
|
|
1345
|
+
}):
|
|
1346
|
+
workflow = service.generate_workflow()["story"]
|
|
1347
|
+
|
|
1348
|
+
self.assertEqual(agent.continue_conversation.call_count, 0)
|
|
1349
|
+
self.assertEqual(
|
|
1350
|
+
[node["data"]["label"] for node in workflow["nodes"]],
|
|
1351
|
+
["Ready", "AI Human Response Requested"],
|
|
1352
|
+
)
|
|
1353
|
+
|
|
1294
1354
|
def test_generate_workflow_rejects_a_transition_that_moves_a_subtask(self) -> None:
|
|
1295
1355
|
"""A story skill moves its subtasks too, and those are not story statuses."""
|
|
1296
1356
|
with tempfile.TemporaryDirectory() as temporary_directory:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/aws-sqs-alarm-response/SKILL.md
RENAMED
|
File without changes
|
{codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/cron-research-5xx-errors/SKILL.md
RENAMED
|
File without changes
|
{codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/story-code-reviewer/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/story-security-reviewer/SKILL.md
RENAMED
|
File without changes
|
{codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/task-code-reviewer/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codee_agent-0.7.3 → codee_agent-0.7.4}/src/codee/templates/skills/task-security-reviewer/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|