@action-llama/action-llama 0.1.1

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.
Files changed (153) hide show
  1. package/README.md +448 -0
  2. package/dist/agents/container-entry.d.ts +2 -0
  3. package/dist/agents/container-entry.d.ts.map +1 -0
  4. package/dist/agents/container-entry.js +173 -0
  5. package/dist/agents/container-entry.js.map +1 -0
  6. package/dist/agents/container-runner.d.ts +20 -0
  7. package/dist/agents/container-runner.d.ts.map +1 -0
  8. package/dist/agents/container-runner.js +208 -0
  9. package/dist/agents/container-runner.js.map +1 -0
  10. package/dist/agents/definitions/dev/AGENTS.md +44 -0
  11. package/dist/agents/definitions/dev/config-definition.json +39 -0
  12. package/dist/agents/definitions/devops/AGENTS.md +33 -0
  13. package/dist/agents/definitions/devops/config-definition.json +37 -0
  14. package/dist/agents/definitions/loader.d.ts +18 -0
  15. package/dist/agents/definitions/loader.d.ts.map +1 -0
  16. package/dist/agents/definitions/loader.js +59 -0
  17. package/dist/agents/definitions/loader.js.map +1 -0
  18. package/dist/agents/definitions/reviewer/AGENTS.md +37 -0
  19. package/dist/agents/definitions/reviewer/config-definition.json +24 -0
  20. package/dist/agents/definitions/schema.d.ts +38 -0
  21. package/dist/agents/definitions/schema.d.ts.map +1 -0
  22. package/dist/agents/definitions/schema.js +97 -0
  23. package/dist/agents/definitions/schema.js.map +1 -0
  24. package/dist/agents/prompt.d.ts +6 -0
  25. package/dist/agents/prompt.d.ts.map +1 -0
  26. package/dist/agents/prompt.js +42 -0
  27. package/dist/agents/prompt.js.map +1 -0
  28. package/dist/agents/runner.d.ts +14 -0
  29. package/dist/agents/runner.d.ts.map +1 -0
  30. package/dist/agents/runner.js +148 -0
  31. package/dist/agents/runner.js.map +1 -0
  32. package/dist/broker/index.d.ts +16 -0
  33. package/dist/broker/index.d.ts.map +1 -0
  34. package/dist/broker/index.js +53 -0
  35. package/dist/broker/index.js.map +1 -0
  36. package/dist/broker/router.d.ts +13 -0
  37. package/dist/broker/router.d.ts.map +1 -0
  38. package/dist/broker/router.js +71 -0
  39. package/dist/broker/router.js.map +1 -0
  40. package/dist/broker/routes/shutdown.d.ts +4 -0
  41. package/dist/broker/routes/shutdown.d.ts.map +1 -0
  42. package/dist/broker/routes/shutdown.js +37 -0
  43. package/dist/broker/routes/shutdown.js.map +1 -0
  44. package/dist/broker/routes/webhooks.d.ts +5 -0
  45. package/dist/broker/routes/webhooks.d.ts.map +1 -0
  46. package/dist/broker/routes/webhooks.js +50 -0
  47. package/dist/broker/routes/webhooks.js.map +1 -0
  48. package/dist/cli/commands/agent/add.d.ts +5 -0
  49. package/dist/cli/commands/agent/add.d.ts.map +1 -0
  50. package/dist/cli/commands/agent/add.js +86 -0
  51. package/dist/cli/commands/agent/add.js.map +1 -0
  52. package/dist/cli/commands/init.d.ts +2 -0
  53. package/dist/cli/commands/init.d.ts.map +1 -0
  54. package/dist/cli/commands/init.js +75 -0
  55. package/dist/cli/commands/init.js.map +1 -0
  56. package/dist/cli/commands/logs.d.ts +7 -0
  57. package/dist/cli/commands/logs.d.ts.map +1 -0
  58. package/dist/cli/commands/logs.js +121 -0
  59. package/dist/cli/commands/logs.js.map +1 -0
  60. package/dist/cli/commands/start.d.ts +5 -0
  61. package/dist/cli/commands/start.d.ts.map +1 -0
  62. package/dist/cli/commands/start.js +44 -0
  63. package/dist/cli/commands/start.js.map +1 -0
  64. package/dist/cli/commands/status.d.ts +4 -0
  65. package/dist/cli/commands/status.d.ts.map +1 -0
  66. package/dist/cli/commands/status.js +52 -0
  67. package/dist/cli/commands/status.js.map +1 -0
  68. package/dist/cli/main.d.ts +3 -0
  69. package/dist/cli/main.d.ts.map +1 -0
  70. package/dist/cli/main.js +75 -0
  71. package/dist/cli/main.js.map +1 -0
  72. package/dist/docker/container.d.ts +19 -0
  73. package/dist/docker/container.d.ts.map +1 -0
  74. package/dist/docker/container.js +73 -0
  75. package/dist/docker/container.js.map +1 -0
  76. package/dist/docker/image.d.ts +4 -0
  77. package/dist/docker/image.d.ts.map +1 -0
  78. package/dist/docker/image.js +38 -0
  79. package/dist/docker/image.js.map +1 -0
  80. package/dist/docker/network.d.ts +5 -0
  81. package/dist/docker/network.d.ts.map +1 -0
  82. package/dist/docker/network.js +23 -0
  83. package/dist/docker/network.js.map +1 -0
  84. package/dist/scheduler/event-queue.d.ts +12 -0
  85. package/dist/scheduler/event-queue.d.ts.map +1 -0
  86. package/dist/scheduler/event-queue.js +12 -0
  87. package/dist/scheduler/event-queue.js.map +1 -0
  88. package/dist/scheduler/index.d.ts +19 -0
  89. package/dist/scheduler/index.d.ts.map +1 -0
  90. package/dist/scheduler/index.js +192 -0
  91. package/dist/scheduler/index.js.map +1 -0
  92. package/dist/scheduler/types.d.ts +14 -0
  93. package/dist/scheduler/types.d.ts.map +1 -0
  94. package/dist/scheduler/types.js +2 -0
  95. package/dist/scheduler/types.js.map +1 -0
  96. package/dist/setup/prompts.d.ts +52 -0
  97. package/dist/setup/prompts.d.ts.map +1 -0
  98. package/dist/setup/prompts.js +656 -0
  99. package/dist/setup/prompts.js.map +1 -0
  100. package/dist/setup/scaffold.d.ts +11 -0
  101. package/dist/setup/scaffold.d.ts.map +1 -0
  102. package/dist/setup/scaffold.js +70 -0
  103. package/dist/setup/scaffold.js.map +1 -0
  104. package/dist/setup/validators.d.ts +23 -0
  105. package/dist/setup/validators.d.ts.map +1 -0
  106. package/dist/setup/validators.js +61 -0
  107. package/dist/setup/validators.js.map +1 -0
  108. package/dist/shared/config.d.ts +40 -0
  109. package/dist/shared/config.d.ts.map +1 -0
  110. package/dist/shared/config.js +46 -0
  111. package/dist/shared/config.js.map +1 -0
  112. package/dist/shared/credentials.d.ts +4 -0
  113. package/dist/shared/credentials.d.ts.map +1 -0
  114. package/dist/shared/credentials.js +21 -0
  115. package/dist/shared/credentials.js.map +1 -0
  116. package/dist/shared/git.d.ts +3 -0
  117. package/dist/shared/git.d.ts.map +1 -0
  118. package/dist/shared/git.js +24 -0
  119. package/dist/shared/git.js.map +1 -0
  120. package/dist/shared/logger.d.ts +6 -0
  121. package/dist/shared/logger.d.ts.map +1 -0
  122. package/dist/shared/logger.js +47 -0
  123. package/dist/shared/logger.js.map +1 -0
  124. package/dist/shared/paths.d.ts +8 -0
  125. package/dist/shared/paths.d.ts.map +1 -0
  126. package/dist/shared/paths.js +20 -0
  127. package/dist/shared/paths.js.map +1 -0
  128. package/dist/tui/App.d.ts +5 -0
  129. package/dist/tui/App.d.ts.map +1 -0
  130. package/dist/tui/App.js +85 -0
  131. package/dist/tui/App.js.map +1 -0
  132. package/dist/tui/render.d.ts +5 -0
  133. package/dist/tui/render.d.ts.map +1 -0
  134. package/dist/tui/render.js +9 -0
  135. package/dist/tui/render.js.map +1 -0
  136. package/dist/tui/status-tracker.d.ts +39 -0
  137. package/dist/tui/status-tracker.d.ts.map +1 -0
  138. package/dist/tui/status-tracker.js +73 -0
  139. package/dist/tui/status-tracker.js.map +1 -0
  140. package/dist/webhooks/providers/github.d.ts +9 -0
  141. package/dist/webhooks/providers/github.d.ts.map +1 -0
  142. package/dist/webhooks/providers/github.js +169 -0
  143. package/dist/webhooks/providers/github.js.map +1 -0
  144. package/dist/webhooks/registry.d.ts +13 -0
  145. package/dist/webhooks/registry.d.ts.map +1 -0
  146. package/dist/webhooks/registry.js +82 -0
  147. package/dist/webhooks/registry.js.map +1 -0
  148. package/dist/webhooks/types.d.ts +49 -0
  149. package/dist/webhooks/types.d.ts.map +1 -0
  150. package/dist/webhooks/types.js +2 -0
  151. package/dist/webhooks/types.js.map +1 -0
  152. package/docker/Dockerfile +29 -0
  153. package/package.json +67 -0
@@ -0,0 +1,208 @@
1
+ import { spawn } from "child_process";
2
+ import { mkdtempSync, symlinkSync, rmSync } from "fs";
3
+ import { join, resolve } from "path";
4
+ import { tmpdir } from "os";
5
+ import { randomUUID } from "crypto";
6
+ import { readFileSync } from "fs";
7
+ import { CREDENTIALS_DIR } from "../shared/paths.js";
8
+ import { launchContainer, removeContainer, } from "../docker/container.js";
9
+ export class ContainerAgentRunner {
10
+ _running = false;
11
+ globalConfig;
12
+ agentConfig;
13
+ logger;
14
+ registerContainer;
15
+ brokerUrl;
16
+ projectPath;
17
+ statusTracker;
18
+ constructor(globalConfig, agentConfig, logger, registerContainer, brokerUrl, projectPath, statusTracker) {
19
+ this.globalConfig = globalConfig;
20
+ this.agentConfig = agentConfig;
21
+ this.logger = logger;
22
+ this.registerContainer = registerContainer;
23
+ this.brokerUrl = brokerUrl;
24
+ this.projectPath = projectPath;
25
+ this.statusTracker = statusTracker;
26
+ }
27
+ get isRunning() {
28
+ return this._running;
29
+ }
30
+ forwardLogLine(line) {
31
+ if (!line.trim())
32
+ return;
33
+ try {
34
+ const parsed = JSON.parse(line);
35
+ if (parsed._log) {
36
+ const { level, msg, _log, ts, ...data } = parsed;
37
+ const logFn = level === "error"
38
+ ? this.logger.error.bind(this.logger)
39
+ : level === "warn"
40
+ ? this.logger.warn.bind(this.logger)
41
+ : level === "debug"
42
+ ? this.logger.debug.bind(this.logger)
43
+ : this.logger.info.bind(this.logger);
44
+ if (Object.keys(data).length > 0) {
45
+ logFn(data, msg);
46
+ }
47
+ else {
48
+ logFn(msg);
49
+ }
50
+ // Forward info-level log events to status tracker
51
+ if (level !== "debug") {
52
+ this.statusTracker?.addLogLine(this.agentConfig.name, msg);
53
+ }
54
+ return;
55
+ }
56
+ }
57
+ catch {
58
+ // Not JSON — treat as plain output
59
+ }
60
+ // Detect [STATUS: <text>] in plain output
61
+ const statusMatch = line.match(/\[STATUS:\s*([^\]]+)\]/);
62
+ if (statusMatch) {
63
+ this.statusTracker?.setAgentStatusText(this.agentConfig.name, statusMatch[1].trim());
64
+ }
65
+ if (line === "[SILENT]") {
66
+ this.logger.info("no work to do");
67
+ this.statusTracker?.addLogLine(this.agentConfig.name, "no work to do");
68
+ }
69
+ }
70
+ streamContainerLogs(containerName) {
71
+ const proc = spawn("docker", ["logs", "-f", containerName], {
72
+ stdio: ["ignore", "pipe", "pipe"],
73
+ });
74
+ let buffer = "";
75
+ proc.stdout.on("data", (chunk) => {
76
+ buffer += chunk.toString();
77
+ const lines = buffer.split("\n");
78
+ buffer = lines.pop() || "";
79
+ for (const line of lines) {
80
+ this.forwardLogLine(line);
81
+ }
82
+ });
83
+ // Also capture stderr
84
+ proc.stderr.on("data", (chunk) => {
85
+ const text = chunk.toString().trim();
86
+ if (text) {
87
+ this.logger.warn({ stderr: text.slice(0, 500) }, "container stderr");
88
+ }
89
+ });
90
+ return {
91
+ stop: () => {
92
+ // Flush remaining buffer
93
+ if (buffer.trim()) {
94
+ this.forwardLogLine(buffer);
95
+ }
96
+ proc.kill();
97
+ },
98
+ };
99
+ }
100
+ waitForContainer(containerName, timeoutSeconds) {
101
+ return new Promise((resolve, reject) => {
102
+ const proc = spawn("docker", ["wait", containerName], {
103
+ stdio: ["ignore", "pipe", "pipe"],
104
+ });
105
+ let stdout = "";
106
+ proc.stdout.on("data", (chunk) => {
107
+ stdout += chunk.toString();
108
+ });
109
+ const timer = setTimeout(() => {
110
+ proc.kill();
111
+ spawn("docker", ["kill", containerName], { stdio: "ignore" });
112
+ reject(new Error(`Container ${containerName} timed out after ${timeoutSeconds}s`));
113
+ }, timeoutSeconds * 1000);
114
+ proc.on("close", () => {
115
+ clearTimeout(timer);
116
+ resolve(parseInt(stdout.trim(), 10));
117
+ });
118
+ proc.on("error", (err) => {
119
+ clearTimeout(timer);
120
+ reject(err);
121
+ });
122
+ });
123
+ }
124
+ async run(prompt) {
125
+ if (this._running) {
126
+ this.logger.warn(`${this.agentConfig.name} is already running, skipping`);
127
+ return;
128
+ }
129
+ this._running = true;
130
+ this.statusTracker?.setAgentState(this.agentConfig.name, "running");
131
+ this.logger.info(`Starting ${this.agentConfig.name} container run`);
132
+ const runStartTime = Date.now();
133
+ const shutdownSecret = randomUUID();
134
+ const stagingDir = mkdtempSync(join(tmpdir(), "al-creds-"));
135
+ let containerName;
136
+ let logStream;
137
+ try {
138
+ const image = this.globalConfig.docker?.image || "al-agent:latest";
139
+ const timeout = this.globalConfig.docker?.timeout || 3600;
140
+ // Symlink credentials into staging dir
141
+ // Always include anthropic-key
142
+ const allCreds = new Set([...this.agentConfig.credentials, "anthropic-key"]);
143
+ for (const cred of allCreds) {
144
+ const src = resolve(CREDENTIALS_DIR, cred);
145
+ const dst = join(stagingDir, cred);
146
+ try {
147
+ symlinkSync(src, dst);
148
+ }
149
+ catch (err) {
150
+ this.logger.warn({ cred, err: err.message }, "failed to symlink credential");
151
+ }
152
+ }
153
+ // Read AGENTS.md from disk and include it in the serialized config
154
+ const agentsMdPath = resolve(this.projectPath, this.agentConfig.name, "AGENTS.md");
155
+ const agentsMd = readFileSync(agentsMdPath, "utf-8");
156
+ const configWithMd = { ...this.agentConfig, _agentsMd: agentsMd };
157
+ containerName = launchContainer({
158
+ image,
159
+ agentName: this.agentConfig.name,
160
+ agentConfig: JSON.stringify(configWithMd),
161
+ shutdownSecret,
162
+ brokerUrl: this.brokerUrl,
163
+ prompt,
164
+ credentialsStagingDir: stagingDir,
165
+ memory: this.globalConfig.docker?.memory,
166
+ cpus: this.globalConfig.docker?.cpus,
167
+ timeout,
168
+ });
169
+ // Register container for shutdown endpoint
170
+ this.registerContainer(shutdownSecret, containerName);
171
+ this.logger.info({ container: containerName }, "container launched");
172
+ // Stream logs in real-time
173
+ logStream = this.streamContainerLogs(containerName);
174
+ const startTime = Date.now();
175
+ const exitCode = await this.waitForContainer(containerName, timeout);
176
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
177
+ // Give the log stream a moment to flush
178
+ await new Promise((r) => setTimeout(r, 500));
179
+ logStream.stop();
180
+ logStream = undefined;
181
+ if (exitCode !== 0) {
182
+ this.logger.error({ exitCode, elapsed: `${elapsed}s` }, "container exited with error");
183
+ }
184
+ else {
185
+ this.logger.info({ exitCode, elapsed: `${elapsed}s` }, "container finished");
186
+ }
187
+ }
188
+ catch (err) {
189
+ this.logger.error({ err }, `${this.agentConfig.name} container run failed`);
190
+ }
191
+ finally {
192
+ if (logStream)
193
+ logStream.stop();
194
+ // Clean up staging dir
195
+ try {
196
+ rmSync(stagingDir, { recursive: true, force: true });
197
+ }
198
+ catch { /* best effort */ }
199
+ if (containerName) {
200
+ removeContainer(containerName);
201
+ }
202
+ const elapsed = Date.now() - runStartTime;
203
+ this.statusTracker?.completeRun(this.agentConfig.name, elapsed);
204
+ this._running = false;
205
+ }
206
+ }
207
+ }
208
+ //# sourceMappingURL=container-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-runner.js","sourceRoot":"","sources":["../../src/agents/container-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ # Developer Agent
2
+
3
+ You are a developer agent. Your job is to pick up GitHub issues and implement the requested changes.
4
+
5
+ Your configuration is in the `<agent-config>` block at the start of your prompt.
6
+ Use those values for repos, triggerLabel, and assignee.
7
+
8
+ `GITHUB_TOKEN` is already set in your environment. Use `gh` CLI and `git` directly.
9
+
10
+ **You MUST complete ALL steps below.** Do not stop after reading the issue — you must implement, commit, push, and open a PR.
11
+
12
+ ## Workflow
13
+
14
+ 1. **Find an issue** — run `gh issue list --repo <repo> --label <triggerLabel> --assignee <assignee> --state open --json number,title,body,comments,labels --limit 1`. If empty, respond `[SILENT]` and stop.
15
+
16
+ 2. **Claim the issue** — run `gh issue edit <number> --repo <repo> --add-label in-progress` to mark it as claimed.
17
+
18
+ 3. **Clone and branch** — run `git clone https://github.com/<repo>.git /workspace/repo && cd /workspace/repo && git checkout -b agent/<number>`.
19
+
20
+ 4. **Understand the issue** — read the title, body, and comments. Note file paths, acceptance criteria, and linked issues.
21
+
22
+ 5. **Read project conventions** — in the repo, read `AGENTS.md`, `CLAUDE.md`, `CONTRIBUTING.md`, and `README.md` if they exist. Follow any conventions found there.
23
+
24
+ 6. **Implement changes** — work in the repo. Make the minimum necessary changes, follow existing patterns, and write or update tests if the project has a test suite.
25
+
26
+ 7. **Validate** — run the project's test suite and linters (e.g., `npm test`). Fix failures before proceeding.
27
+
28
+ 8. **Commit** — `git add -A && git commit -m "fix: <description> (closes #<number>)"`
29
+
30
+ 9. **Push** — `git push -u origin agent/<number>`
31
+
32
+ 10. **Create a PR** — run `gh pr create --repo <repo> --head agent/<number> --base main --title "<title>" --body "Closes #<number>\n\n<description>"`.
33
+
34
+ 11. **Comment on the issue** — run `gh issue comment <number> --repo <repo> --body "PR created: <pr_url>"`.
35
+
36
+ 12. **Mark done** — run `gh issue edit <number> --repo <repo> --remove-label in-progress --add-label agent-completed`.
37
+
38
+ ## Rules
39
+
40
+ - Work on exactly ONE issue per run
41
+ - Never modify files outside the repo directory
42
+ - **You MUST complete steps 8-12.** Do not stop early.
43
+ - If tests fail after 2 attempts, create the PR anyway with a note about failing tests
44
+ - If the issue is unclear, comment asking for clarification and stop
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "dev",
3
+ "label": "Developer agent",
4
+ "description": "Picks up issues, writes code, opens PRs",
5
+ "credentials": {
6
+ "required": ["anthropic-key", "github-token"],
7
+ "optional": []
8
+ },
9
+ "webhooks": {
10
+ "description": "Wake when an issue is labeled",
11
+ "events": ["issues"],
12
+ "actions": ["labeled"]
13
+ },
14
+ "prompts": {
15
+ "webhook": "An issue was just assigned to you. Implement the changes described in the issue.",
16
+ "schedule": "Poll GitHub for new issues with the trigger label and implement any found."
17
+ },
18
+ "defaultSchedule": "*/5 * * * *",
19
+ "state": {
20
+ "file": "active-issues.json",
21
+ "initial": { "issues": {} }
22
+ },
23
+ "params": {
24
+ "triggerLabel": {
25
+ "type": "string",
26
+ "description": "Issue label that triggers the agent",
27
+ "default": "agent",
28
+ "required": true,
29
+ "webhookFilter": { "field": "labels", "wrap": "array" }
30
+ },
31
+ "assignee": {
32
+ "type": "string",
33
+ "description": "Assign triggered issues to which user",
34
+ "default": "$githubUser",
35
+ "required": true,
36
+ "webhookFilter": { "field": "assignee" }
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,33 @@
1
+ # DevOps Agent
2
+
3
+ You are a DevOps monitoring agent. Your job is to detect new errors from CI/CD failures and production error tracking, then file actionable GitHub issues for each unique problem.
4
+
5
+ Your configuration is in the `<agent-config>` block at the start of your prompt.
6
+ Use those values for repos, sentryOrg, and sentryProjects.
7
+
8
+ `GITHUB_TOKEN` is already set in your environment. Use `gh` CLI directly.
9
+ If Sentry is configured, `SENTRY_AUTH_TOKEN` is set in your environment. Use `curl` for Sentry API requests.
10
+
11
+ ## Workflow
12
+
13
+ 1. **Poll for CI errors** — run `gh run list --repo <repo> --status failure --json databaseId,name,headBranch,conclusion,url,createdAt --limit 20` for each repo.
14
+
15
+ 2. **Poll Sentry errors (if configured)** — run:
16
+ ```
17
+ curl -s -H "Authorization: Bearer $SENTRY_AUTH_TOKEN" \
18
+ "https://sentry.io/api/0/projects/<sentryOrg>/<project>/issues/?query=is:unresolved&statsPeriod=24h"
19
+ ```
20
+
21
+ 3. **Deduplicate** — search existing issues to avoid duplicates: `gh issue list --repo <repo> --label agent-filed --state all --json title --limit 100`. Skip errors that already have matching issues.
22
+
23
+ 4. **File GitHub issues** — for each new error, run `gh issue create --repo <repo>`:
24
+ - **CI failures** — `--title "[CI Failure] <workflow> on <branch>" --body "<details>" --label ci-failure,agent-filed`
25
+ - **Sentry errors** — `--title "[Sentry] <title>" --body "<details>" --label production-error,agent-filed`
26
+
27
+ ## Rules
28
+
29
+ - Always check deduplication before filing — never create duplicate issues
30
+ - Include enough context for a developer to start investigating
31
+ - For Sentry errors, include the permalink for full details
32
+ - For CI failures, include the run URL for log access
33
+ - Do not attempt to fix errors yourself — just file issues
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "devops",
3
+ "label": "DevOps monitor",
4
+ "description": "Detects errors, files issues",
5
+ "credentials": {
6
+ "required": ["anthropic-key", "github-token"],
7
+ "optional": ["sentry-token"]
8
+ },
9
+ "webhooks": {
10
+ "description": "Wake when a GitHub Actions workflow completes",
11
+ "events": ["workflow_run"],
12
+ "actions": ["completed"]
13
+ },
14
+ "prompts": {
15
+ "webhook": "A workflow run just completed. Check for failures and file issues for any new errors found.",
16
+ "schedule": "Poll for new errors from GitHub Actions failures and Sentry, file issues for any new ones found."
17
+ },
18
+ "defaultSchedule": "*/15 * * * *",
19
+ "state": {
20
+ "file": "known-errors.json",
21
+ "initial": { "errors": {} }
22
+ },
23
+ "params": {
24
+ "sentryOrg": {
25
+ "type": "string",
26
+ "description": "Sentry organization slug",
27
+ "required": false,
28
+ "credential": "sentry-token"
29
+ },
30
+ "sentryProjects": {
31
+ "type": "string[]",
32
+ "description": "Sentry project slugs to monitor",
33
+ "required": false,
34
+ "credential": "sentry-token"
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,18 @@
1
+ import type { AgentDefinition } from "./schema.js";
2
+ /**
3
+ * Load a definition by built-in name or filesystem path.
4
+ */
5
+ export declare function loadDefinition(nameOrPath: string): AgentDefinition;
6
+ /**
7
+ * Load the AGENTS.md from a definition package.
8
+ */
9
+ export declare function loadDefinitionAgentsMd(nameOrPath: string): string;
10
+ /**
11
+ * List all built-in definitions.
12
+ */
13
+ export declare function listBuiltinDefinitions(): AgentDefinition[];
14
+ /**
15
+ * Check if a name corresponds to a built-in definition.
16
+ */
17
+ export declare function isBuiltinDefinition(nameOrPath: string): boolean;
18
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/agents/definitions/loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAUnD;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAmBlE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAkBjE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,eAAe,EAAE,CAE1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE/D"}
@@ -0,0 +1,59 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { resolve, dirname } from "path";
3
+ import { fileURLToPath } from "url";
4
+ import { validateDefinition } from "./schema.js";
5
+ const __dirname = dirname(fileURLToPath(import.meta.url));
6
+ const BUILTIN_NAMES = ["dev", "reviewer", "devops"];
7
+ function builtinDir(name) {
8
+ return resolve(__dirname, name);
9
+ }
10
+ /**
11
+ * Load a definition by built-in name or filesystem path.
12
+ */
13
+ export function loadDefinition(nameOrPath) {
14
+ let defDir;
15
+ if (BUILTIN_NAMES.includes(nameOrPath)) {
16
+ defDir = builtinDir(nameOrPath);
17
+ }
18
+ else {
19
+ defDir = resolve(nameOrPath);
20
+ }
21
+ const jsonPath = resolve(defDir, "config-definition.json");
22
+ if (!existsSync(jsonPath)) {
23
+ throw new Error(`Agent definition not found at ${jsonPath}. ` +
24
+ `Provide a built-in name (${BUILTIN_NAMES.join(", ")}) or a path to a definition directory.`);
25
+ }
26
+ const raw = JSON.parse(readFileSync(jsonPath, "utf-8"));
27
+ return validateDefinition(raw);
28
+ }
29
+ /**
30
+ * Load the AGENTS.md from a definition package.
31
+ */
32
+ export function loadDefinitionAgentsMd(nameOrPath) {
33
+ let defDir;
34
+ if (BUILTIN_NAMES.includes(nameOrPath)) {
35
+ defDir = builtinDir(nameOrPath);
36
+ }
37
+ else {
38
+ defDir = resolve(nameOrPath);
39
+ }
40
+ const mdPath = resolve(defDir, "AGENTS.md");
41
+ if (!existsSync(mdPath)) {
42
+ throw new Error(`No AGENTS.md found in definition at ${defDir}. ` +
43
+ `Create an AGENTS.md in the definition directory.`);
44
+ }
45
+ return readFileSync(mdPath, "utf-8");
46
+ }
47
+ /**
48
+ * List all built-in definitions.
49
+ */
50
+ export function listBuiltinDefinitions() {
51
+ return BUILTIN_NAMES.map((name) => loadDefinition(name));
52
+ }
53
+ /**
54
+ * Check if a name corresponds to a built-in definition.
55
+ */
56
+ export function isBuiltinDefinition(nameOrPath) {
57
+ return BUILTIN_NAMES.includes(nameOrPath);
58
+ }
59
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/agents/definitions/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAyB,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAEpD,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,IAAI,MAAc,CAAC;IAEnB,IAAI,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,iCAAiC,QAAQ,IAAI;YAC7C,4BAA4B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,wCAAwC,CAC7F,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,IAAI,MAAc,CAAC;IAEnB,IAAI,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,uCAAuC,MAAM,IAAI;YACjD,kDAAkD,CACnD,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,OAAO,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,37 @@
1
+ # PR Reviewer Agent
2
+
3
+ You are a code review agent. Your job is to review open pull requests, approve good ones, and request changes on problematic ones.
4
+
5
+ Your configuration is in the `<agent-config>` block at the start of your prompt.
6
+ Use those values for repos.
7
+
8
+ `GITHUB_TOKEN` is already set in your environment. Use `gh` CLI directly.
9
+
10
+ ## Workflow
11
+
12
+ 1. **List open PRs** — run `gh pr list --repo <repo> --state open --json number,title,headRefName,headRefOid,statusCheckRollup` for each repo. If empty, respond `[SILENT]` and stop.
13
+
14
+ 2. **Review each PR:**
15
+
16
+ a. **Get the diff** — run `gh pr diff <number> --repo <repo>`.
17
+
18
+ b. **Evaluate** — review for correctness, style, tests, security, and performance.
19
+
20
+ c. **Check CI** — look at `statusCheckRollup` from step 1. Do NOT merge if CI is failing.
21
+
22
+ d. **Submit review:**
23
+ - **Good code + green CI** — `gh pr review <number> --repo <repo> --approve --body "<review>"`, then `gh pr merge <number> --repo <repo> --squash`
24
+ - **Issues found** — `gh pr review <number> --repo <repo> --request-changes --body "<review>"`
25
+ - **Good code + failing CI** — `gh pr review <number> --repo <repo> --comment --body "LGTM but CI must pass before merging."`
26
+
27
+ ## Review Standards
28
+
29
+ - **Specific** — point to exact lines or patterns
30
+ - **Constructive** — suggest fixes, don't just point out problems
31
+ - **Proportional** — don't block for minor style nits
32
+ - **Thorough** — check edge cases, error handling, boundaries
33
+
34
+ ## Rules
35
+
36
+ - Review ALL open PRs in a single run, not just one
37
+ - Never approve a PR with failing CI checks
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "reviewer",
3
+ "label": "PR reviewer",
4
+ "description": "Reviews and merges pull requests",
5
+ "credentials": {
6
+ "required": ["anthropic-key", "github-token"],
7
+ "optional": []
8
+ },
9
+ "webhooks": {
10
+ "description": "Wake when a PR is opened or updated",
11
+ "events": ["pull_request"],
12
+ "actions": ["opened", "synchronize"]
13
+ },
14
+ "prompts": {
15
+ "webhook": "Review the pull request that just came in. Approve or request changes.",
16
+ "schedule": "Poll GitHub for open PRs that need review, review them, and merge if appropriate."
17
+ },
18
+ "defaultSchedule": "*/5 * * * *",
19
+ "state": {
20
+ "file": "reviewed-prs.json",
21
+ "initial": { "prs": {} }
22
+ },
23
+ "params": {}
24
+ }
@@ -0,0 +1,38 @@
1
+ export interface WebhookFilterMapping {
2
+ field: string;
3
+ wrap?: "array";
4
+ }
5
+ export interface ParamDefinition {
6
+ type: "string" | "string[]";
7
+ description: string;
8
+ default?: string;
9
+ required: boolean;
10
+ webhookFilter?: WebhookFilterMapping;
11
+ credential?: string;
12
+ }
13
+ export interface AgentDefinition {
14
+ name: string;
15
+ label: string;
16
+ description: string;
17
+ credentials: {
18
+ required: string[];
19
+ optional: string[];
20
+ };
21
+ webhooks: {
22
+ description: string;
23
+ events: string[];
24
+ actions: string[];
25
+ };
26
+ prompts: {
27
+ webhook: string;
28
+ schedule: string;
29
+ };
30
+ defaultSchedule: string;
31
+ state?: {
32
+ file: string;
33
+ initial: Record<string, unknown>;
34
+ };
35
+ params: Record<string, ParamDefinition>;
36
+ }
37
+ export declare function validateDefinition(json: unknown): AgentDefinition;
38
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/agents/definitions/schema.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACzC;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe,CA4DjE"}