@jetrabbits/agentic 0.0.1 → 0.0.2
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.
- package/AGENTS.md +2 -40
- package/LICENSE +21 -0
- package/README.md +79 -41
- package/extensions/claude/agents/designer.md +60 -0
- package/extensions/claude/agents/developer.md +62 -0
- package/extensions/claude/agents/devops-engineer.md +68 -0
- package/extensions/claude/agents/pm.md +54 -0
- package/extensions/claude/agents/product-owner.md +75 -0
- package/extensions/claude/agents/qa.md +65 -0
- package/extensions/claude/agents/team-lead.md +66 -0
- package/extensions/codex/AGENTS.override.md +55 -51
- package/extensions/codex/agents/designer.toml +71 -0
- package/extensions/codex/agents/developer.toml +69 -0
- package/extensions/codex/agents/devops-engineer.toml +73 -0
- package/extensions/codex/agents/pm.toml +71 -0
- package/extensions/codex/agents/product-owner.toml +79 -0
- package/extensions/codex/agents/qa.toml +70 -0
- package/extensions/codex/agents/team-lead.toml +73 -0
- package/extensions/codex/skills/babysit-pr/SKILL.md +187 -0
- package/extensions/codex/skills/babysit-pr/agents/openai.yaml +4 -0
- package/extensions/codex/skills/babysit-pr/references/github-api-notes.md +72 -0
- package/extensions/codex/skills/babysit-pr/references/heuristics.md +58 -0
- package/extensions/codex/skills/babysit-pr/scripts/gh_pr_watch.py +806 -0
- package/extensions/codex/skills/babysit-pr/scripts/test_gh_pr_watch.py +155 -0
- package/package.json +2 -1
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import importlib.util
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
MODULE_PATH = Path(__file__).with_name("gh_pr_watch.py")
|
|
9
|
+
MODULE_SPEC = importlib.util.spec_from_file_location("gh_pr_watch", MODULE_PATH)
|
|
10
|
+
gh_pr_watch = importlib.util.module_from_spec(MODULE_SPEC)
|
|
11
|
+
assert MODULE_SPEC.loader is not None
|
|
12
|
+
MODULE_SPEC.loader.exec_module(gh_pr_watch)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def sample_pr():
|
|
16
|
+
return {
|
|
17
|
+
"number": 123,
|
|
18
|
+
"url": "https://github.com/openai/codex/pull/123",
|
|
19
|
+
"repo": "openai/codex",
|
|
20
|
+
"head_sha": "abc123",
|
|
21
|
+
"head_branch": "feature",
|
|
22
|
+
"state": "OPEN",
|
|
23
|
+
"merged": False,
|
|
24
|
+
"closed": False,
|
|
25
|
+
"mergeable": "MERGEABLE",
|
|
26
|
+
"merge_state_status": "CLEAN",
|
|
27
|
+
"review_decision": "",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def sample_checks(**overrides):
|
|
32
|
+
checks = {
|
|
33
|
+
"pending_count": 0,
|
|
34
|
+
"failed_count": 0,
|
|
35
|
+
"passed_count": 12,
|
|
36
|
+
"all_terminal": True,
|
|
37
|
+
}
|
|
38
|
+
checks.update(overrides)
|
|
39
|
+
return checks
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_collect_snapshot_fetches_review_items_before_ci(monkeypatch, tmp_path):
|
|
43
|
+
call_order = []
|
|
44
|
+
pr = sample_pr()
|
|
45
|
+
|
|
46
|
+
monkeypatch.setattr(gh_pr_watch, "resolve_pr", lambda *args, **kwargs: pr)
|
|
47
|
+
monkeypatch.setattr(gh_pr_watch, "load_state", lambda path: ({}, True))
|
|
48
|
+
monkeypatch.setattr(
|
|
49
|
+
gh_pr_watch,
|
|
50
|
+
"get_authenticated_login",
|
|
51
|
+
lambda: call_order.append("auth") or "octocat",
|
|
52
|
+
)
|
|
53
|
+
monkeypatch.setattr(
|
|
54
|
+
gh_pr_watch,
|
|
55
|
+
"fetch_new_review_items",
|
|
56
|
+
lambda *args, **kwargs: call_order.append("review") or [],
|
|
57
|
+
)
|
|
58
|
+
monkeypatch.setattr(
|
|
59
|
+
gh_pr_watch,
|
|
60
|
+
"get_pr_checks",
|
|
61
|
+
lambda *args, **kwargs: call_order.append("checks") or [],
|
|
62
|
+
)
|
|
63
|
+
monkeypatch.setattr(
|
|
64
|
+
gh_pr_watch,
|
|
65
|
+
"summarize_checks",
|
|
66
|
+
lambda checks: call_order.append("summarize") or sample_checks(),
|
|
67
|
+
)
|
|
68
|
+
monkeypatch.setattr(
|
|
69
|
+
gh_pr_watch,
|
|
70
|
+
"get_workflow_runs_for_sha",
|
|
71
|
+
lambda *args, **kwargs: call_order.append("workflow") or [],
|
|
72
|
+
)
|
|
73
|
+
monkeypatch.setattr(
|
|
74
|
+
gh_pr_watch,
|
|
75
|
+
"failed_runs_from_workflow_runs",
|
|
76
|
+
lambda *args, **kwargs: call_order.append("failed_runs") or [],
|
|
77
|
+
)
|
|
78
|
+
monkeypatch.setattr(
|
|
79
|
+
gh_pr_watch,
|
|
80
|
+
"recommend_actions",
|
|
81
|
+
lambda *args, **kwargs: call_order.append("recommend") or ["idle"],
|
|
82
|
+
)
|
|
83
|
+
monkeypatch.setattr(gh_pr_watch, "save_state", lambda *args, **kwargs: None)
|
|
84
|
+
|
|
85
|
+
args = argparse.Namespace(
|
|
86
|
+
pr="123",
|
|
87
|
+
repo=None,
|
|
88
|
+
state_file=str(tmp_path / "watcher-state.json"),
|
|
89
|
+
max_flaky_retries=3,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
gh_pr_watch.collect_snapshot(args)
|
|
93
|
+
|
|
94
|
+
assert call_order.index("review") < call_order.index("checks")
|
|
95
|
+
assert call_order.index("review") < call_order.index("workflow")
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_recommend_actions_prioritizes_review_comments():
|
|
99
|
+
actions = gh_pr_watch.recommend_actions(
|
|
100
|
+
sample_pr(),
|
|
101
|
+
sample_checks(failed_count=1),
|
|
102
|
+
[{"run_id": 99}],
|
|
103
|
+
[{"kind": "review_comment", "id": "1"}],
|
|
104
|
+
0,
|
|
105
|
+
3,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
assert actions == [
|
|
109
|
+
"process_review_comment",
|
|
110
|
+
"diagnose_ci_failure",
|
|
111
|
+
"retry_failed_checks",
|
|
112
|
+
]
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_run_watch_keeps_polling_open_ready_to_merge_pr(monkeypatch):
|
|
116
|
+
sleeps = []
|
|
117
|
+
events = []
|
|
118
|
+
snapshot = {
|
|
119
|
+
"pr": sample_pr(),
|
|
120
|
+
"checks": sample_checks(),
|
|
121
|
+
"failed_runs": [],
|
|
122
|
+
"new_review_items": [],
|
|
123
|
+
"actions": ["ready_to_merge"],
|
|
124
|
+
"retry_state": {
|
|
125
|
+
"current_sha_retries_used": 0,
|
|
126
|
+
"max_flaky_retries": 3,
|
|
127
|
+
},
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
monkeypatch.setattr(
|
|
131
|
+
gh_pr_watch,
|
|
132
|
+
"collect_snapshot",
|
|
133
|
+
lambda args: (snapshot, Path("/tmp/codex-babysit-pr-state.json")),
|
|
134
|
+
)
|
|
135
|
+
monkeypatch.setattr(
|
|
136
|
+
gh_pr_watch,
|
|
137
|
+
"print_event",
|
|
138
|
+
lambda event, payload: events.append((event, payload)),
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
class StopWatch(Exception):
|
|
142
|
+
pass
|
|
143
|
+
|
|
144
|
+
def fake_sleep(seconds):
|
|
145
|
+
sleeps.append(seconds)
|
|
146
|
+
if len(sleeps) >= 2:
|
|
147
|
+
raise StopWatch
|
|
148
|
+
|
|
149
|
+
monkeypatch.setattr(gh_pr_watch.time, "sleep", fake_sleep)
|
|
150
|
+
|
|
151
|
+
with pytest.raises(StopWatch):
|
|
152
|
+
gh_pr_watch.run_watch(argparse.Namespace(poll_seconds=30))
|
|
153
|
+
|
|
154
|
+
assert sleeps == [30, 30]
|
|
155
|
+
assert [event for event, _ in events] == ["snapshot", "snapshot"]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jetrabbits/agentic",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "Agent Intelligence Configuration CLI",
|
|
5
5
|
"bin": {
|
|
6
6
|
"agentic": "bin/agentic.js"
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
},
|
|
12
12
|
"files": [
|
|
13
13
|
"AGENTS.md",
|
|
14
|
+
"LICENSE",
|
|
14
15
|
"agentic",
|
|
15
16
|
"areas",
|
|
16
17
|
"extensions"
|