@joynt/foundry 0.0.0-stage → 0.1.51

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 (216) hide show
  1. package/dist/backends/command.d.ts +37 -0
  2. package/dist/backends/command.d.ts.map +1 -0
  3. package/dist/backends/command.js +79 -0
  4. package/dist/backends/command.js.map +1 -0
  5. package/dist/backends/index.d.ts +9 -0
  6. package/dist/backends/index.d.ts.map +1 -0
  7. package/dist/backends/index.js +37 -0
  8. package/dist/backends/index.js.map +1 -0
  9. package/dist/cli.d.ts +3 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +191 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/commands/action.d.ts +6 -0
  14. package/dist/commands/action.d.ts.map +1 -0
  15. package/dist/commands/action.js +171 -0
  16. package/dist/commands/action.js.map +1 -0
  17. package/dist/commands/cancelled.d.ts +5 -0
  18. package/dist/commands/cancelled.d.ts.map +1 -0
  19. package/dist/commands/cancelled.js +107 -0
  20. package/dist/commands/cancelled.js.map +1 -0
  21. package/dist/commands/init.d.ts +5 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +323 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/commands/preview.d.ts +4 -0
  26. package/dist/commands/preview.d.ts.map +1 -0
  27. package/dist/commands/preview.js +108 -0
  28. package/dist/commands/preview.js.map +1 -0
  29. package/dist/commands/release.d.ts +2 -0
  30. package/dist/commands/release.d.ts.map +1 -0
  31. package/dist/commands/release.js +89 -0
  32. package/dist/commands/release.js.map +1 -0
  33. package/dist/commands/report.d.ts +14 -0
  34. package/dist/commands/report.d.ts.map +1 -0
  35. package/dist/commands/report.js +91 -0
  36. package/dist/commands/report.js.map +1 -0
  37. package/dist/commands/reset.d.ts +4 -0
  38. package/dist/commands/reset.d.ts.map +1 -0
  39. package/dist/commands/reset.js +155 -0
  40. package/dist/commands/reset.js.map +1 -0
  41. package/dist/commands/review.d.ts +2 -0
  42. package/dist/commands/review.d.ts.map +1 -0
  43. package/dist/commands/review.js +73 -0
  44. package/dist/commands/review.js.map +1 -0
  45. package/dist/commands/setup-bot.d.ts +31 -0
  46. package/dist/commands/setup-bot.d.ts.map +1 -0
  47. package/dist/commands/setup-bot.js +429 -0
  48. package/dist/commands/setup-bot.js.map +1 -0
  49. package/dist/commands/sync.d.ts +2 -0
  50. package/dist/commands/sync.d.ts.map +1 -0
  51. package/dist/commands/sync.js +77 -0
  52. package/dist/commands/sync.js.map +1 -0
  53. package/dist/config.d.ts +9 -0
  54. package/dist/config.d.ts.map +1 -0
  55. package/dist/config.js +147 -0
  56. package/dist/config.js.map +1 -0
  57. package/dist/index.d.ts +15 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +29 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/lib/agent-output.d.ts +49 -0
  62. package/dist/lib/agent-output.d.ts.map +1 -0
  63. package/dist/lib/agent-output.js +256 -0
  64. package/dist/lib/agent-output.js.map +1 -0
  65. package/dist/lib/agent-report.d.ts +107 -0
  66. package/dist/lib/agent-report.d.ts.map +1 -0
  67. package/dist/lib/agent-report.js +233 -0
  68. package/dist/lib/agent-report.js.map +1 -0
  69. package/dist/lib/authorize.d.ts +3 -0
  70. package/dist/lib/authorize.d.ts.map +1 -0
  71. package/dist/lib/authorize.js +67 -0
  72. package/dist/lib/authorize.js.map +1 -0
  73. package/dist/lib/branches.d.ts +22 -0
  74. package/dist/lib/branches.d.ts.map +1 -0
  75. package/dist/lib/branches.js +82 -0
  76. package/dist/lib/branches.js.map +1 -0
  77. package/dist/lib/claim.d.ts +22 -0
  78. package/dist/lib/claim.d.ts.map +1 -0
  79. package/dist/lib/claim.js +129 -0
  80. package/dist/lib/claim.js.map +1 -0
  81. package/dist/lib/completion.d.ts +5 -0
  82. package/dist/lib/completion.d.ts.map +1 -0
  83. package/dist/lib/completion.js +63 -0
  84. package/dist/lib/completion.js.map +1 -0
  85. package/dist/lib/deployments.d.ts +21 -0
  86. package/dist/lib/deployments.d.ts.map +1 -0
  87. package/dist/lib/deployments.js +104 -0
  88. package/dist/lib/deployments.js.map +1 -0
  89. package/dist/lib/event-handler.d.ts +74 -0
  90. package/dist/lib/event-handler.d.ts.map +1 -0
  91. package/dist/lib/event-handler.js +1002 -0
  92. package/dist/lib/event-handler.js.map +1 -0
  93. package/dist/lib/events.d.ts +72 -0
  94. package/dist/lib/events.d.ts.map +1 -0
  95. package/dist/lib/events.js +3 -0
  96. package/dist/lib/events.js.map +1 -0
  97. package/dist/lib/gh-cli-client.d.ts +46 -0
  98. package/dist/lib/gh-cli-client.d.ts.map +1 -0
  99. package/dist/lib/gh-cli-client.js +260 -0
  100. package/dist/lib/gh-cli-client.js.map +1 -0
  101. package/dist/lib/git.d.ts +42 -0
  102. package/dist/lib/git.d.ts.map +1 -0
  103. package/dist/lib/git.js +247 -0
  104. package/dist/lib/git.js.map +1 -0
  105. package/dist/lib/github-client.d.ts +98 -0
  106. package/dist/lib/github-client.d.ts.map +1 -0
  107. package/dist/lib/github-client.js +3 -0
  108. package/dist/lib/github-client.js.map +1 -0
  109. package/dist/lib/github.d.ts +82 -0
  110. package/dist/lib/github.d.ts.map +1 -0
  111. package/dist/lib/github.js +202 -0
  112. package/dist/lib/github.js.map +1 -0
  113. package/dist/lib/issue-file.d.ts +15 -0
  114. package/dist/lib/issue-file.d.ts.map +1 -0
  115. package/dist/lib/issue-file.js +84 -0
  116. package/dist/lib/issue-file.js.map +1 -0
  117. package/dist/lib/labels.d.ts +14 -0
  118. package/dist/lib/labels.d.ts.map +1 -0
  119. package/dist/lib/labels.js +70 -0
  120. package/dist/lib/labels.js.map +1 -0
  121. package/dist/lib/log.d.ts +11 -0
  122. package/dist/lib/log.d.ts.map +1 -0
  123. package/dist/lib/log.js +53 -0
  124. package/dist/lib/log.js.map +1 -0
  125. package/dist/lib/octokit-client.d.ts +112 -0
  126. package/dist/lib/octokit-client.d.ts.map +1 -0
  127. package/dist/lib/octokit-client.js +507 -0
  128. package/dist/lib/octokit-client.js.map +1 -0
  129. package/dist/lib/preview-verify.d.ts +48 -0
  130. package/dist/lib/preview-verify.d.ts.map +1 -0
  131. package/dist/lib/preview-verify.js +148 -0
  132. package/dist/lib/preview-verify.js.map +1 -0
  133. package/dist/lib/preview.d.ts +33 -0
  134. package/dist/lib/preview.d.ts.map +1 -0
  135. package/dist/lib/preview.js +308 -0
  136. package/dist/lib/preview.js.map +1 -0
  137. package/dist/lib/reconcile.d.ts +14 -0
  138. package/dist/lib/reconcile.d.ts.map +1 -0
  139. package/dist/lib/reconcile.js +114 -0
  140. package/dist/lib/reconcile.js.map +1 -0
  141. package/dist/lib/review.d.ts +38 -0
  142. package/dist/lib/review.d.ts.map +1 -0
  143. package/dist/lib/review.js +284 -0
  144. package/dist/lib/review.js.map +1 -0
  145. package/dist/lib/stale-prs.d.ts +31 -0
  146. package/dist/lib/stale-prs.d.ts.map +1 -0
  147. package/dist/lib/stale-prs.js +161 -0
  148. package/dist/lib/stale-prs.js.map +1 -0
  149. package/dist/lib/state-store.d.ts +23 -0
  150. package/dist/lib/state-store.d.ts.map +1 -0
  151. package/dist/lib/state-store.js +3 -0
  152. package/dist/lib/state-store.js.map +1 -0
  153. package/dist/lib/state.d.ts +23 -0
  154. package/dist/lib/state.d.ts.map +1 -0
  155. package/dist/lib/state.js +57 -0
  156. package/dist/lib/state.js.map +1 -0
  157. package/dist/lib/status-comment.d.ts +14 -0
  158. package/dist/lib/status-comment.d.ts.map +1 -0
  159. package/dist/lib/status-comment.js +195 -0
  160. package/dist/lib/status-comment.js.map +1 -0
  161. package/dist/lib/stores/file-store.d.ts +22 -0
  162. package/dist/lib/stores/file-store.d.ts.map +1 -0
  163. package/dist/lib/stores/file-store.js +172 -0
  164. package/dist/lib/stores/file-store.js.map +1 -0
  165. package/dist/lib/stores/index.d.ts +13 -0
  166. package/dist/lib/stores/index.d.ts.map +1 -0
  167. package/dist/lib/stores/index.js +20 -0
  168. package/dist/lib/stores/index.js.map +1 -0
  169. package/dist/lib/task-recovery.d.ts +22 -0
  170. package/dist/lib/task-recovery.d.ts.map +1 -0
  171. package/dist/lib/task-recovery.js +172 -0
  172. package/dist/lib/task-recovery.js.map +1 -0
  173. package/dist/lib/templates.d.ts +8 -0
  174. package/dist/lib/templates.d.ts.map +1 -0
  175. package/dist/lib/templates.js +58 -0
  176. package/dist/lib/templates.js.map +1 -0
  177. package/dist/lib/thread.d.ts +13 -0
  178. package/dist/lib/thread.d.ts.map +1 -0
  179. package/dist/lib/thread.js +75 -0
  180. package/dist/lib/thread.js.map +1 -0
  181. package/dist/lib/verify.d.ts +31 -0
  182. package/dist/lib/verify.d.ts.map +1 -0
  183. package/dist/lib/verify.js +90 -0
  184. package/dist/lib/verify.js.map +1 -0
  185. package/dist/lib/version.d.ts +9 -0
  186. package/dist/lib/version.d.ts.map +1 -0
  187. package/dist/lib/version.js +134 -0
  188. package/dist/lib/version.js.map +1 -0
  189. package/dist/lib/webhook.d.ts +39 -0
  190. package/dist/lib/webhook.d.ts.map +1 -0
  191. package/dist/lib/webhook.js +248 -0
  192. package/dist/lib/webhook.js.map +1 -0
  193. package/dist/lib/worker.d.ts +42 -0
  194. package/dist/lib/worker.d.ts.map +1 -0
  195. package/dist/lib/worker.js +9 -0
  196. package/dist/lib/worker.js.map +1 -0
  197. package/dist/lib/workers/index.d.ts +11 -0
  198. package/dist/lib/workers/index.d.ts.map +1 -0
  199. package/dist/lib/workers/index.js +18 -0
  200. package/dist/lib/workers/index.js.map +1 -0
  201. package/dist/lib/workers/subprocess.d.ts +8 -0
  202. package/dist/lib/workers/subprocess.d.ts.map +1 -0
  203. package/dist/lib/workers/subprocess.js +105 -0
  204. package/dist/lib/workers/subprocess.js.map +1 -0
  205. package/dist/lib/worktree.d.ts +21 -0
  206. package/dist/lib/worktree.d.ts.map +1 -0
  207. package/dist/lib/worktree.js +113 -0
  208. package/dist/lib/worktree.js.map +1 -0
  209. package/dist/types.d.ts +201 -0
  210. package/dist/types.d.ts.map +1 -0
  211. package/dist/types.js +6 -0
  212. package/dist/types.js.map +1 -0
  213. package/package.json +44 -4
  214. package/templates/foundry.yml +121 -0
  215. package/templates/vercel-preview-url.sh +61 -0
  216. package/README.md +0 -3
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Command agent backend — runs an arbitrary configured command.
3
+ *
4
+ * Template variables: {worktree}, {issue_url}, {issue_number}, {repo}, {title},
5
+ * {body}, {log_dir}, {state_dir}, {permission_mode}.
6
+ *
7
+ * {title} and {body} are written by whoever opened the issue and end up in a
8
+ * shell command line, so they are escaped for use INSIDE DOUBLE QUOTES. Put
9
+ * them nowhere else. Better, do not interpolate them at all: every launch also
10
+ * gets FOUNDRY_ISSUE_TITLE, FOUNDRY_ISSUE_BODY, FOUNDRY_ISSUE_NUMBER and
11
+ * FOUNDRY_ISSUE_URL in its environment, and "$FOUNDRY_ISSUE_TITLE" is never
12
+ * re-evaluated by the shell.
13
+ */
14
+ import type { AgentBackend, AgentBackendDef } from '../types.js';
15
+ /** Escape untrusted text for a bash double-quoted string: \\ " $ and ` lose their meaning. */
16
+ export declare function escapeForDoubleQuotes(value: string): string;
17
+ export declare function createCommandBackend(name: string, def: AgentBackendDef & {
18
+ command: string;
19
+ }): AgentBackend;
20
+ /**
21
+ * Claude Code preset — a pre-configured command backend.
22
+ *
23
+ * `--json-schema "$FOUNDRY_REPORT_SCHEMA"` makes Claude Code end the run with a
24
+ * schema-validated report (see lib/agent-report.ts). AskUserQuestion is
25
+ * disallowed because nobody is there to answer it; questions go in the report.
26
+ * `< /dev/null` stops the CLI waiting three seconds for stdin.
27
+ */
28
+ /**
29
+ * The developer brief, appended to the agent's system prompt by the preset.
30
+ * This is the standing instruction a stakeholder would give a developer; the
31
+ * per-issue brief is the issue itself.
32
+ */
33
+ export declare const AGENT_BRIEF: string;
34
+ export declare const CLAUDE_CODE_PRESET: AgentBackendDef & {
35
+ command: string;
36
+ };
37
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/backends/command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAqB,MAAM,aAAa,CAAC;AAEpF,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D;AAmBD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAyB3G;AAED;;;;;;;GAOG;AACH;;;;GAIG;AACH,eAAO,MAAM,WAAW,QAQb,CAAC;AAEZ,eAAO,MAAM,kBAAkB,EAAE,eAAe,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAInE,CAAC"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLAUDE_CODE_PRESET = exports.AGENT_BRIEF = void 0;
4
+ exports.escapeForDoubleQuotes = escapeForDoubleQuotes;
5
+ exports.createCommandBackend = createCommandBackend;
6
+ /** Escape untrusted text for a bash double-quoted string: \\ " $ and ` lose their meaning. */
7
+ function escapeForDoubleQuotes(value) {
8
+ return value.replace(/[\\"$`]/g, c => '\\' + c);
9
+ }
10
+ function interpolate(template, params, escapeUntrusted) {
11
+ const untrusted = (v) => (escapeUntrusted ? escapeForDoubleQuotes(v) : v);
12
+ const vars = {
13
+ worktree: params.worktree,
14
+ issue_url: params.issue_url,
15
+ issue_number: String(params.issue_number),
16
+ repo: params.repo,
17
+ title: untrusted(params.title),
18
+ body: untrusted((params.body ?? '').slice(0, 4000)),
19
+ log_dir: params.log_dir,
20
+ state_dir: params.state_dir,
21
+ permission_mode: params.permission_mode ?? '--dangerously-skip-permissions',
22
+ };
23
+ // Function replacer: a `$&` or `$1` inside a value must not be read as a replacement pattern.
24
+ return template.replace(/\{([a-z_]+)\}/g, (match, name) => (name in vars ? vars[name] : match));
25
+ }
26
+ function createCommandBackend(name, def) {
27
+ return {
28
+ name,
29
+ resolveCommand(params) {
30
+ return interpolate(def.command, params, true);
31
+ },
32
+ resolveEnv(params) {
33
+ // Environment values are handed to the process directly, never parsed by a shell.
34
+ const env = {
35
+ FOUNDRY_AGENT_BRIEF: exports.AGENT_BRIEF,
36
+ FOUNDRY_RESUME_CONTEXT: '',
37
+ FOUNDRY_MAX_TURNS: '150',
38
+ FOUNDRY_ISSUE_NUMBER: String(params.issue_number),
39
+ FOUNDRY_ISSUE_URL: params.issue_url,
40
+ FOUNDRY_ISSUE_TITLE: params.title,
41
+ FOUNDRY_ISSUE_BODY: params.body ?? '',
42
+ };
43
+ if (def.env) {
44
+ for (const [k, v] of Object.entries(def.env)) {
45
+ env[k] = interpolate(v, params, false);
46
+ }
47
+ }
48
+ return env;
49
+ },
50
+ };
51
+ }
52
+ /**
53
+ * Claude Code preset — a pre-configured command backend.
54
+ *
55
+ * `--json-schema "$FOUNDRY_REPORT_SCHEMA"` makes Claude Code end the run with a
56
+ * schema-validated report (see lib/agent-report.ts). AskUserQuestion is
57
+ * disallowed because nobody is there to answer it; questions go in the report.
58
+ * `< /dev/null` stops the CLI waiting three seconds for stdin.
59
+ */
60
+ /**
61
+ * The developer brief, appended to the agent's system prompt by the preset.
62
+ * This is the standing instruction a stakeholder would give a developer; the
63
+ * per-issue brief is the issue itself.
64
+ */
65
+ exports.AGENT_BRIEF = [
66
+ 'You are the developer assigned to this GitHub issue. The person who wrote it is a stakeholder, not a programmer, and will review your work as a pull request.',
67
+ 'Read the issue file before changing anything: it holds the issue and every comment the humans have made, in order. Later comments refine or override earlier ones.',
68
+ 'Make reasonable implementation decisions yourself and list each one under `assumptions` in your report. Ask a question only when the answer materially changes the work, and offer concrete options.',
69
+ 'Change only what the issue needs. Follow the conventions already in the repository.',
70
+ 'Commit as you go with clear messages. Never push, open pull requests, or change labels; Foundry does that.',
71
+ 'If `.joynt-foundry.yml` lists verify commands, run them before reporting done and fix what they find.',
72
+ 'End by reporting your outcome truthfully with the required schema: done, needs_input, plan_ready, or blocked.',
73
+ ].join(' ');
74
+ exports.CLAUDE_CODE_PRESET = {
75
+ type: 'command',
76
+ command: 'claude {permission_mode} -p "You are working on issue #{issue_number}: $FOUNDRY_ISSUE_TITLE. Read the issue first: its title, body, and every human comment so far are in the file $FOUNDRY_ISSUE_FILE (the live issue is at {issue_url} when you have network access). $FOUNDRY_RESUME_CONTEXT" --append-system-prompt "$FOUNDRY_AGENT_BRIEF" --max-turns "$FOUNDRY_MAX_TURNS" --json-schema "$FOUNDRY_REPORT_SCHEMA" --disallowedTools AskUserQuestion --verbose --output-format stream-json < /dev/null 2>&1 | tee {log_dir}/agent.log',
77
+ env: {},
78
+ };
79
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/backends/command.ts"],"names":[],"mappings":";;;AAgBA,sDAEC;AAmBD,oDAyBC;AA/CD,8FAA8F;AAC9F,SAAgB,qBAAqB,CAAC,KAAa;IACjD,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,MAAyB,EAAE,eAAwB;IACxF,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,IAAI,GAA2B;QACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;QACzC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;QAC9B,IAAI,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,gCAAgC;KAC5E,CAAC;IACF,8FAA8F;IAC9F,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1G,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAY,EAAE,GAA0C;IAC3F,OAAO;QACL,IAAI;QACJ,cAAc,CAAC,MAAyB;YACtC,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;QACD,UAAU,CAAC,MAAyB;YAClC,kFAAkF;YAClF,MAAM,GAAG,GAA2B;gBAClC,mBAAmB,EAAE,mBAAW;gBAChC,sBAAsB,EAAE,EAAE;gBAC1B,iBAAiB,EAAE,KAAK;gBACxB,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;gBACjD,iBAAiB,EAAE,MAAM,CAAC,SAAS;gBACnC,mBAAmB,EAAE,MAAM,CAAC,KAAK;gBACjC,kBAAkB,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;aACtC,CAAC;YACF,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;gBACZ,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH;;;;GAIG;AACU,QAAA,WAAW,GAAG;IACzB,+JAA+J;IAC/J,oKAAoK;IACpK,sMAAsM;IACtM,qFAAqF;IACrF,4GAA4G;IAC5G,uGAAuG;IACvG,+GAA+G;CAChH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEC,QAAA,kBAAkB,GAA0C;IACvE,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,2gBAA2gB;IACphB,GAAG,EAAE,EAAE;CACR,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Agent backend registry
3
+ */
4
+ import type { AgentBackend, FoundryConfig } from '../types.js';
5
+ import { CLAUDE_CODE_PRESET } from './command.js';
6
+ export declare function resolveBackend(config: FoundryConfig, backendName?: string): AgentBackend;
7
+ export declare function resolveBackendForIssue(config: FoundryConfig, issueLabels: string[]): AgentBackend;
8
+ export { CLAUDE_CODE_PRESET };
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAwB,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAExE,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CAsBxF;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,EAAE,GACpB,YAAY,CAUd;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLAUDE_CODE_PRESET = void 0;
4
+ exports.resolveBackend = resolveBackend;
5
+ exports.resolveBackendForIssue = resolveBackendForIssue;
6
+ const command_js_1 = require("./command.js");
7
+ Object.defineProperty(exports, "CLAUDE_CODE_PRESET", { enumerable: true, get: function () { return command_js_1.CLAUDE_CODE_PRESET; } });
8
+ function resolveBackend(config, backendName) {
9
+ const name = backendName ?? config.default_agent_backend;
10
+ const def = config.agent_backends[name];
11
+ if (!def) {
12
+ throw new Error(`Agent backend "${name}" not found in config. Available: ${Object.keys(config.agent_backends).join(', ')}`);
13
+ }
14
+ if (def.type === 'command') {
15
+ if (def.preset && def.preset !== 'claude-code') {
16
+ throw new Error(`Agent backend "${name}": unknown preset "${def.preset}". Available: claude-code`);
17
+ }
18
+ const command = def.command ?? (def.preset === 'claude-code' ? command_js_1.CLAUDE_CODE_PRESET.command : undefined);
19
+ if (!command) {
20
+ throw new Error(`Agent backend "${name}" needs a \`command\` or \`preset: claude-code\`.`);
21
+ }
22
+ return (0, command_js_1.createCommandBackend)(name, { ...def, command });
23
+ }
24
+ throw new Error(`Unknown backend type: ${def.type}`);
25
+ }
26
+ function resolveBackendForIssue(config, issueLabels) {
27
+ if (config.agent_label_map) {
28
+ for (const label of issueLabels) {
29
+ const mapped = config.agent_label_map[label];
30
+ if (mapped) {
31
+ return resolveBackend(config, mapped);
32
+ }
33
+ }
34
+ }
35
+ return resolveBackend(config);
36
+ }
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":";;;AAMA,wCAsBC;AAED,wDAaC;AAvCD,6CAAwE;AAyC/D,mGAzCsB,+BAAkB,OAyCtB;AAvC3B,SAAgB,cAAc,CAAC,MAAqB,EAAE,WAAoB;IACxE,MAAM,IAAI,GAAG,WAAW,IAAI,MAAM,CAAC,qBAAqB,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,kBAAkB,IAAI,qCAAqC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3G,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,sBAAsB,GAAG,CAAC,MAAM,2BAA2B,CAAC,CAAC;QACrG,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,+BAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACvG,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,mDAAmD,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,IAAA,iCAAoB,EAAC,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,sBAAsB,CACpC,MAAqB,EACrB,WAAqB;IAErB,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC7C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,191 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ /**
38
+ * Joynt Foundry CLI
39
+ *
40
+ * GitHub Issues → coding agent → verified pull requests.
41
+ *
42
+ * Foundry runs as a GitHub Action (`foundry action`, packaged by action.yml at
43
+ * the repo root). The other commands set a repo up, operate on tasks from any
44
+ * checkout, or manage the integration branch.
45
+ */
46
+ const fs = __importStar(require("node:fs"));
47
+ const path = __importStar(require("node:path"));
48
+ const commander_1 = require("commander");
49
+ const log_js_1 = require("./lib/log.js");
50
+ const config_js_1 = require("./config.js");
51
+ const github_js_1 = require("./lib/github.js");
52
+ const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf-8'));
53
+ const program = new commander_1.Command();
54
+ function collect(value, previous) {
55
+ return [...previous, value];
56
+ }
57
+ program
58
+ .name('foundry')
59
+ .description('Joynt Foundry — GitHub Issues → coding agent → verified pull requests')
60
+ .version(pkg.version)
61
+ .option('-v, --verbose', 'Enable verbose/debug output')
62
+ .option('--github-backend <backend>', 'GitHub API client: gh-cli or octokit (env: FOUNDRY_GITHUB_BACKEND)')
63
+ .hook('preAction', async (thisCommand, actionCommand) => {
64
+ const opts = thisCommand.opts();
65
+ // `report` is run by the agent itself and must not need GitHub credentials.
66
+ if (actionCommand.name() === 'report')
67
+ return;
68
+ if (opts.verbose)
69
+ (0, log_js_1.setVerbose)(true);
70
+ if (opts.githubBackend)
71
+ process.env.FOUNDRY_GITHUB_BACKEND = opts.githubBackend;
72
+ const config = (0, config_js_1.loadConfigSafe)() ?? undefined;
73
+ await (0, github_js_1.initClient)(config);
74
+ });
75
+ // ── Setup ─────────────────────────────────────────────────────────────
76
+ program
77
+ .command('init')
78
+ .description('Scaffold .joynt-foundry.yml, create the labels, create the integration branch')
79
+ .option('--skip-labels', 'Skip creating GitHub labels')
80
+ .option('--clean-labels', 'Remove non-Foundry labels before creating Foundry labels')
81
+ .action(async (opts) => {
82
+ const { runInit } = await import('./commands/init.js');
83
+ await runInit(opts);
84
+ });
85
+ program
86
+ .command('setup-bot')
87
+ .description('Create a GitHub App so Foundry acts under its own name (optional under the Action)')
88
+ .option('--server-url <url>', 'Webhook URL for the GitHub App (unused by the Action)')
89
+ .action(async (opts) => {
90
+ const { runSetupBot } = await import('./commands/setup-bot.js');
91
+ await runSetupBot(opts);
92
+ });
93
+ // ── The Action entry point ────────────────────────────────────────────
94
+ program
95
+ .command('action')
96
+ .description('Run the state machine for one GitHub event (GitHub Actions entry point)')
97
+ .option('--event-name <name>', 'GitHub event name (default: $GITHUB_EVENT_NAME)')
98
+ .option('--event-path <path>', 'Path to the event JSON payload (default: $GITHUB_EVENT_PATH)')
99
+ .action(async (opts) => {
100
+ const { runAction } = await import('./commands/action.js');
101
+ await runAction(opts);
102
+ });
103
+ program
104
+ .command('report')
105
+ .description('Submit the agent\'s outcome report (run by the agent, for backends without structured output)')
106
+ .requiredOption('--status <status>', 'done | needs_input | plan_ready | blocked')
107
+ .requiredOption('--summary <text>', 'What was done, or why the agent stopped')
108
+ .option('--assumption <text>', 'A decision made without asking (repeatable)', collect, [])
109
+ .option('--question <text>', 'A question for the human; options after " | " separated by ";" (repeatable)', collect, [])
110
+ .option('--plan <text>', 'The plan, for plan_ready')
111
+ .option('--plan-file <path>', 'Read the plan from a file')
112
+ .option('--file <path>', 'Where to write the report (default: $FOUNDRY_REPORT_FILE)')
113
+ .action(async (opts) => {
114
+ const { runReport } = await import('./commands/report.js');
115
+ await runReport(opts);
116
+ });
117
+ program
118
+ .command('cancelled')
119
+ .description('After a cancelled job: mark the task failed so the issue is not left in-progress (run from an `if: cancelled()` step)')
120
+ .option('--event-name <name>', 'GitHub event name (default: $GITHUB_EVENT_NAME)')
121
+ .option('--event-path <path>', 'Path to the event JSON payload (default: $GITHUB_EVENT_PATH)')
122
+ .action(async (opts) => {
123
+ const { runCancelled } = await import('./commands/cancelled.js');
124
+ await runCancelled(opts);
125
+ });
126
+ program
127
+ .command('reconcile')
128
+ .description('Mark in-progress issues with no live run as failed (also runs on the schedule trigger)')
129
+ .action(async () => {
130
+ const { loadConfig, getConfigDir } = await import('./config.js');
131
+ const { reconcile } = await import('./lib/reconcile.js');
132
+ const changed = await reconcile(loadConfig(), getConfigDir());
133
+ console.log(`${changed.length} issue(s) marked failed.`);
134
+ });
135
+ // ── Operate on a task from any checkout ───────────────────────────────
136
+ program
137
+ .command('reset <issue>')
138
+ .description('Remove the branch, PR, and preview for a task; `@foundry go` starts it again')
139
+ .option('--force', 'Actually execute (default is dry-run)')
140
+ .action(async (issue, opts) => {
141
+ const { runReset } = await import('./commands/reset.js');
142
+ await runReset(issue, opts);
143
+ });
144
+ const previewCmd = program
145
+ .command('preview')
146
+ .description('Manage a task\'s preview environment by hand');
147
+ previewCmd
148
+ .command('up <issue>')
149
+ .description('Trigger the preview deployment for a task')
150
+ .action(async (issue) => {
151
+ const { runPreviewUp } = await import('./commands/preview.js');
152
+ await runPreviewUp(issue);
153
+ });
154
+ previewCmd
155
+ .command('down <issue>')
156
+ .description('Tear down the preview environment for a task')
157
+ .action(async (issue) => {
158
+ const { runPreviewDown } = await import('./commands/preview.js');
159
+ await runPreviewDown(issue);
160
+ });
161
+ previewCmd
162
+ .command('status <issue>')
163
+ .description('Show preview URL, deployment id, and state for a task')
164
+ .action(async (issue) => {
165
+ const { runPreviewStatus } = await import('./commands/preview.js');
166
+ await runPreviewStatus(issue);
167
+ });
168
+ // ── Integration branch ────────────────────────────────────────────────
169
+ program
170
+ .command('review <target>')
171
+ .description('Rebase a PR onto integration, merge it, run the integration rebuild (PR number or URL)')
172
+ .action(async (target) => {
173
+ const { runReview } = await import('./commands/review.js');
174
+ await runReview(target);
175
+ });
176
+ program
177
+ .command('release <type>')
178
+ .description('Bump the unified version across version_sources (patch|minor|major)')
179
+ .action(async (type) => {
180
+ const { runRelease } = await import('./commands/release.js');
181
+ await runRelease(type);
182
+ });
183
+ program
184
+ .command('sync-integration')
185
+ .description('Merge main into integration after a hotfix release')
186
+ .action(async () => {
187
+ const { runSyncIntegration } = await import('./commands/sync.js');
188
+ await runSyncIntegration();
189
+ });
190
+ program.parse();
191
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface ActionOptions {
2
+ eventName?: string;
3
+ eventPath?: string;
4
+ }
5
+ export declare function runAction(opts: ActionOptions): Promise<void>;
6
+ //# sourceMappingURL=action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/commands/action.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDlE"}
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runAction = runAction;
37
+ /**
38
+ * foundry action — run the Foundry state machine for one GitHub event.
39
+ *
40
+ * Designed to be the entry point of the composite GitHub Action. A job is
41
+ * started by a GitHub event (comment created, PR closed, review submitted),
42
+ * this command maps the event to FoundryEvents, dispatches them through the
43
+ * EventHandler, and, when a handler launched an agent, waits for it and feeds
44
+ * the outcome back in. The job ends when the state machine has nothing left
45
+ * to do for this event.
46
+ *
47
+ * - No polling. One event in, one job.
48
+ * - The agent runs as a subprocess of this process (SubprocessWorker), so
49
+ * the job log is the agent transcript.
50
+ * - Local state starts empty every time. Tasks referenced by the event are
51
+ * rebuilt from GitHub (task-recovery.ts) before mapping.
52
+ * - Every transition finishes in this job or is handed on by dispatch;
53
+ * nothing waits for "the next run" (events caused by the job's token do
54
+ * not start one).
55
+ */
56
+ const fs = __importStar(require("node:fs"));
57
+ const config_js_1 = require("../config.js");
58
+ const event_handler_js_1 = require("../lib/event-handler.js");
59
+ const webhook_js_1 = require("../lib/webhook.js");
60
+ const task_recovery_js_1 = require("../lib/task-recovery.js");
61
+ const completion_js_1 = require("../lib/completion.js");
62
+ const index_js_1 = require("../lib/workers/index.js");
63
+ const authorize_js_1 = require("../lib/authorize.js");
64
+ const state = __importStar(require("../lib/state.js"));
65
+ const log = __importStar(require("../lib/log.js"));
66
+ /** Safety valve: the completion loop never runs more than this many rounds per job. */
67
+ const MAX_COMPLETION_ROUNDS = 10;
68
+ async function runAction(opts) {
69
+ const eventName = opts.eventName ?? process.env.GITHUB_EVENT_NAME;
70
+ const eventPath = opts.eventPath ?? process.env.GITHUB_EVENT_PATH;
71
+ if (!eventName || !eventPath) {
72
+ throw new Error('foundry action needs GITHUB_EVENT_NAME and GITHUB_EVENT_PATH (or --event-name/--event-path).');
73
+ }
74
+ const payload = JSON.parse(fs.readFileSync(eventPath, 'utf-8'));
75
+ const action = payload.action ? `${eventName}.${payload.action}` : eventName;
76
+ const config = (0, config_js_1.loadConfig)();
77
+ const repoDir = (0, config_js_1.getConfigDir)();
78
+ if (eventName === 'schedule') {
79
+ const { reconcile } = await import('../lib/reconcile.js');
80
+ const changed = await reconcile(config, repoDir);
81
+ log.info(`Reconcile: ${changed.length} issue(s) marked failed.`);
82
+ return;
83
+ }
84
+ const payloadRepo = payload.repository?.full_name;
85
+ if (payloadRepo && payloadRepo !== config.repo) {
86
+ log.warn(`Event is for ${payloadRepo} but .joynt-foundry.yml says ${config.repo}.`);
87
+ }
88
+ log.info(`Foundry action: ${action} on ${config.repo}`);
89
+ // Rebuild the referenced task from GitHub so webhookToEvents can find it.
90
+ const issueNumber = (0, task_recovery_js_1.issueNumberFromPayload)(payload, config);
91
+ if (issueNumber !== null && !state.getTask(config.repo, issueNumber)) {
92
+ const recovered = await (0, task_recovery_js_1.recoverTask)(config, repoDir, issueNumber);
93
+ if (recovered) {
94
+ state.upsertTask(config.repo, recovered);
95
+ log.info(`Recovered task #${issueNumber} (${recovered.status}) from GitHub.`);
96
+ }
97
+ }
98
+ const events = (0, webhook_js_1.webhookToEvents)(eventName, payload, config);
99
+ if (events.length === 0) {
100
+ log.info(`No Foundry events for ${action}. Nothing to do.`);
101
+ writeOutputs(config, issueNumber);
102
+ return;
103
+ }
104
+ const handler = new event_handler_js_1.EventHandler(config, repoDir);
105
+ for (const event of events) {
106
+ if (event.type === 'command' && event.via === 'comment' && !(await (0, authorize_js_1.canCommand)(config, event.commentAuthor))) {
107
+ log.warn(`Ignoring "${event.command}" on #${event.issue} from ${event.commentAuthor}: write access to ${config.repo} is required.`);
108
+ continue;
109
+ }
110
+ log.info(`Handling ${describe(event)}`);
111
+ await handler.handleEvent(event);
112
+ await driveToCompletion(config, repoDir, handler);
113
+ }
114
+ writeOutputs(config, issueNumber);
115
+ }
116
+ /**
117
+ * If a handler launched an agent, wait for it, classify the outcome, and hand
118
+ * it back to the handler. The handler may launch again (e.g. a future
119
+ * verify-retry round), so loop until no agent is running.
120
+ */
121
+ async function driveToCompletion(config, repoDir, handler) {
122
+ const worker = (0, index_js_1.resolveWorker)('subprocess');
123
+ for (let round = 0; round < MAX_COMPLETION_ROUNDS; round++) {
124
+ const running = state.getAllTasks(config.repo)
125
+ .filter(t => t.status === 'agent-running' || t.status === 'resuming');
126
+ if (running.length === 0)
127
+ return;
128
+ for (const task of running) {
129
+ const handle = worker.handleFor(task.tmux_session);
130
+ if (!handle.wait) {
131
+ log.warn(`Worker for #${task.issue} cannot be awaited; leaving it.`);
132
+ return;
133
+ }
134
+ log.info(`Waiting for agent on #${task.issue}...`);
135
+ const code = await handle.wait();
136
+ log.info(`Agent for #${task.issue} exited (${code ?? 'signal'}). Analyzing outcome...`);
137
+ const fresh = state.getTask(config.repo, task.issue) ?? task;
138
+ await handler.handleEvent((0, completion_js_1.buildAgentCompletedEvent)(config, repoDir, fresh, code));
139
+ }
140
+ }
141
+ log.warn(`Stopped after ${MAX_COMPLETION_ROUNDS} completion rounds.`);
142
+ }
143
+ function describe(event) {
144
+ switch (event.type) {
145
+ case 'command':
146
+ return `command "${event.command}" on #${event.issue} (${event.task ? event.task.status : 'unclaimed'}) by ${event.commentAuthor}`;
147
+ case 'pr_preview':
148
+ return `pr_preview ${event.action} for PR #${event.pr_number} (${event.branch} → ${event.base})`;
149
+ case 'pr_approved':
150
+ return `pr_approved: PR #${event.pr_number} (${event.branch} → ${event.base}) by ${event.reviewer}`;
151
+ default:
152
+ return `${event.type} #${event.task.issue}`;
153
+ }
154
+ }
155
+ /** Expose the outcome to later workflow steps via $GITHUB_OUTPUT. */
156
+ function writeOutputs(config, issueNumber) {
157
+ const out = process.env.GITHUB_OUTPUT;
158
+ if (!out)
159
+ return;
160
+ const task = issueNumber !== null ? state.getTask(config.repo, issueNumber) : undefined;
161
+ const lines = [
162
+ `issue=${issueNumber ?? ''}`,
163
+ `status=${task?.status ?? ''}`,
164
+ `branch=${task?.branch ?? ''}`,
165
+ `pr-url=${task?.pr_url ?? ''}`,
166
+ `log-dir=${issueNumber !== null ? state.getLogDir(config.repo, issueNumber) : ''}`,
167
+ `log-path=${issueNumber !== null ? (0, completion_js_1.agentLogPath)(config, issueNumber) : ''}`,
168
+ ];
169
+ fs.appendFileSync(out, lines.join('\n') + '\n');
170
+ }
171
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/commands/action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function runCancelled(opts: {
2
+ eventName?: string;
3
+ eventPath?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=cancelled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancelled.d.ts","sourceRoot":"","sources":["../../src/commands/cancelled.ts"],"names":[],"mappings":"AAiBA,wBAAsB,YAAY,CAAC,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDlG"}