@joynt/foundry 0.0.0-stage → 0.1.50

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,172 @@
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.issueNumberFromBranch = issueNumberFromBranch;
37
+ exports.issueNumberFromPayload = issueNumberFromPayload;
38
+ exports.statusFromLabels = statusFromLabels;
39
+ exports.recoverTask = recoverTask;
40
+ /**
41
+ * Task recovery — rebuild a TaskState from GitHub when local state is empty.
42
+ *
43
+ * `foundry action` runs in a fresh job for every event. The file-based state
44
+ * store is therefore always empty at startup, but events like
45
+ * `pull_request.closed` or an `@foundry` comment refer to a task that was
46
+ * claimed by an earlier job. Everything needed to reconstruct that task is
47
+ * already on GitHub: the structured claim comment, the issue's labels, the PR
48
+ * for the branch, and the preview comment. This module reads them back.
49
+ */
50
+ const github = __importStar(require("./github.js"));
51
+ const git = __importStar(require("./git.js"));
52
+ const claim_js_1 = require("./claim.js");
53
+ const preview_js_1 = require("./preview.js");
54
+ const CLAIM_MARKER = '<!-- foundry-claim-block -->';
55
+ /**
56
+ * Turn a branch template like `feature/{issue}-{slug}` into a matcher that
57
+ * pulls the issue number back out of a branch name.
58
+ */
59
+ function issueNumberFromBranch(template, branch) {
60
+ const escaped = template.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
61
+ const pattern = '^' + escaped
62
+ .replace('\\{issue\\}', '(\\d+)')
63
+ .replace('\\{slug\\}', '.*') + '$';
64
+ const m = branch.match(new RegExp(pattern));
65
+ return m ? parseInt(m[1], 10) : null;
66
+ }
67
+ /**
68
+ * Find the issue a webhook payload is about. Issues and comments carry it
69
+ * directly; pull requests carry it via the head branch name, with the PR
70
+ * body's `Closes #N` as a fallback.
71
+ */
72
+ function issueNumberFromPayload(payload, config) {
73
+ if (typeof payload.issue?.number === 'number')
74
+ return payload.issue.number;
75
+ // workflow_dispatch with an `issue` input (see stale-prs.ts)
76
+ const dispatched = parseInt(String(payload.inputs?.issue ?? ''), 10);
77
+ if (Number.isFinite(dispatched))
78
+ return dispatched;
79
+ const pr = payload.pull_request;
80
+ if (!pr)
81
+ return null;
82
+ const fromBranch = issueNumberFromBranch(config.branch_template, pr.head?.ref ?? '');
83
+ if (fromBranch !== null)
84
+ return fromBranch;
85
+ const m = String(pr.body ?? '').match(/\b(?:closes|fixes|resolves)\s+#(\d+)/i);
86
+ return m ? parseInt(m[1], 10) : null;
87
+ }
88
+ /** Map the issue's current state label to a TaskStatus. Null if untracked. */
89
+ function statusFromLabels(config, labels) {
90
+ const L = config.labels;
91
+ const has = (l) => labels.includes(l);
92
+ if (has(L.done))
93
+ return 'done';
94
+ if (has(L.failed))
95
+ return 'failed';
96
+ if (has(L.ready_for_review))
97
+ return 'pr-open';
98
+ if (has(L.plan_review))
99
+ return 'plan-review';
100
+ if (has(L.waiting_for_input))
101
+ return 'waiting-for-input';
102
+ if (has(L.in_progress))
103
+ return 'agent-running';
104
+ return null;
105
+ }
106
+ function permissionModeFromLabels(config, labels) {
107
+ const modes = config.mode_labels ?? { plan: 'mode:plan', auto: 'mode:auto', default: 'mode:default' };
108
+ if (labels.includes(modes.plan))
109
+ return '--permission-mode plan';
110
+ if (labels.includes(modes.default))
111
+ return '--permission-mode default';
112
+ return '--dangerously-skip-permissions';
113
+ }
114
+ /**
115
+ * Rebuild the TaskState for an issue from GitHub. Returns null when the issue
116
+ * has never been claimed by Foundry (no claim comment). A claim with no state
117
+ * label (after `foundry reset`) comes back as `claimed`, which `@foundry go`
118
+ * treats as a fresh start.
119
+ */
120
+ async function recoverTask(config, repoDir, issueNumber, issue) {
121
+ const iss = issue ?? await github.getIssue(config.repo, issueNumber);
122
+ const labels = iss.labels.map(l => l.name);
123
+ const comments = await github.getComments(config.repo, issueNumber);
124
+ const claimBodies = comments
125
+ .filter(c => c.body.includes(CLAIM_MARKER))
126
+ .sort((a, b) => b.created_at.localeCompare(a.created_at));
127
+ const claim = claimBodies.length > 0 ? (0, claim_js_1.parseClaimComment)(claimBodies[0].body) : null;
128
+ if (!claim)
129
+ return null;
130
+ const branch = claim.branch || git.resolveBranchName(config.branch_template, issueNumber, iss.title);
131
+ const status = statusFromLabels(config, labels) ?? 'claimed';
132
+ let pr_url;
133
+ let pr_number;
134
+ try {
135
+ // Only an open PR is the task's PR: a restart deletes the branch, which
136
+ // closes the old one, and the next completion must open a new one.
137
+ const pr = await github.getPRStatus(config.repo, branch);
138
+ if (pr?.url && /^open$/i.test(pr.state)) {
139
+ pr_url = pr.url;
140
+ pr_number = github.extractPRNumber(pr.url) ?? undefined;
141
+ }
142
+ }
143
+ catch { }
144
+ let preview_url = (0, preview_js_1.previewUrlFromComments)(comments.map(c => c.body));
145
+ if (!preview_url && pr_number) {
146
+ try {
147
+ const prComments = await github.getComments(config.repo, pr_number);
148
+ preview_url = (0, preview_js_1.previewUrlFromComments)(prComments.map(c => c.body));
149
+ }
150
+ catch { }
151
+ }
152
+ const now = new Date().toISOString();
153
+ return {
154
+ issue: issueNumber,
155
+ title: iss.title,
156
+ issue_body: iss.body ?? '',
157
+ repo: config.repo,
158
+ branch,
159
+ worktree: git.resolveWorktreePath(config.worktree_base, issueNumber, iss.title, repoDir),
160
+ tmux_session: claim.tmux_session || git.workerId(issueNumber),
161
+ agent_backend: claim.agent_backend || config.default_agent_backend,
162
+ permission_mode: permissionModeFromLabels(config, labels),
163
+ status,
164
+ claimed_at: claimBodies[0].created_at,
165
+ updated_at: now,
166
+ runner_id: claim.runner_id,
167
+ pr_url,
168
+ pr_number,
169
+ preview_url,
170
+ };
171
+ }
172
+ //# sourceMappingURL=task-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-recovery.js","sourceRoot":"","sources":["../../src/lib/task-recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Absolute path of the templates directory, from dist/ or src/. */
2
+ export declare function templatesDir(): string;
3
+ export declare function readTemplate(name: string): string;
4
+ /** The workflow template with the repo's production branch substituted. */
5
+ export declare function renderWorkflow(template: string, opts: {
6
+ production: string;
7
+ }): string;
8
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAQA,oEAAoE;AACpE,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAErF"}
@@ -0,0 +1,58 @@
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.templatesDir = templatesDir;
37
+ exports.readTemplate = readTemplate;
38
+ exports.renderWorkflow = renderWorkflow;
39
+ /**
40
+ * Files Foundry ships for a target repo: the workflow template and example
41
+ * scripts. They live under packages/foundry/templates/ (published with the
42
+ * package) and are read at runtime, so the docs can link the same files.
43
+ */
44
+ const fs = __importStar(require("node:fs"));
45
+ const path = __importStar(require("node:path"));
46
+ /** Absolute path of the templates directory, from dist/ or src/. */
47
+ function templatesDir() {
48
+ // dist/lib/templates.js → ../../templates ; src/lib/templates.ts → ../../templates
49
+ return path.resolve(__dirname, '..', '..', 'templates');
50
+ }
51
+ function readTemplate(name) {
52
+ return fs.readFileSync(path.join(templatesDir(), name), 'utf-8');
53
+ }
54
+ /** The workflow template with the repo's production branch substituted. */
55
+ function renderWorkflow(template, opts) {
56
+ return template.replaceAll('__PRODUCTION_BRANCH__', opts.production);
57
+ }
58
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,oCAGC;AAED,oCAEC;AAGD,wCAEC;AArBD;;;;GAIG;AACH,4CAA8B;AAC9B,gDAAkC;AAElC,oEAAoE;AACpE,SAAgB,YAAY;IAC1B,mFAAmF;IACnF,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAC1D,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY;IACvC,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,2EAA2E;AAC3E,SAAgB,cAAc,CAAC,QAAgB,EAAE,IAA4B;IAC3E,OAAO,QAAQ,CAAC,UAAU,CAAC,uBAAuB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { FoundryConfig, GitHubComment } from '../types.js';
2
+ export interface ThreadComment {
3
+ author: string;
4
+ created_at: string;
5
+ body: string;
6
+ }
7
+ /** Foundry's own comments all carry an HTML marker; the author check covers the rest. */
8
+ export declare function isFoundryComment(comment: GitHubComment): boolean;
9
+ /** Reduce raw comments to the human thread, oldest first. */
10
+ export declare function threadFromComments(config: FoundryConfig, comments: GitHubComment[]): ThreadComment[];
11
+ /** Fetch and reduce. Never throws: a thread that cannot be read is empty. */
12
+ export declare function collectThread(config: FoundryConfig, issue: number): Promise<ThreadComment[]>;
13
+ //# sourceMappingURL=thread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../src/lib/thread.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAGhE;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAWpG;AAED,6EAA6E;AAC7E,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAGlG"}
@@ -0,0 +1,75 @@
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.isFoundryComment = isFoundryComment;
37
+ exports.threadFromComments = threadFromComments;
38
+ exports.collectThread = collectThread;
39
+ /**
40
+ * The human thread on an issue: what the agent is given at every launch.
41
+ *
42
+ * Comments never start work, but everything a human writes on the issue is
43
+ * context the agent must have. At each launch Foundry collects the issue's
44
+ * comments, drops its own (status, claim, preview, plan, and any other bot
45
+ * comment), strips the command text off command comments, and writes what is
46
+ * left into the issue file after the body, in order.
47
+ */
48
+ const github = __importStar(require("./github.js"));
49
+ const webhook_js_1 = require("./webhook.js");
50
+ /** Foundry's own comments all carry an HTML marker; the author check covers the rest. */
51
+ function isFoundryComment(comment) {
52
+ const login = comment.user?.login ?? '';
53
+ return (0, webhook_js_1.isBotLogin)(login) || comment.body.includes('<!-- foundry-');
54
+ }
55
+ /** Reduce raw comments to the human thread, oldest first. */
56
+ function threadFromComments(config, comments) {
57
+ const out = [];
58
+ const sorted = [...comments].sort((a, b) => a.created_at.localeCompare(b.created_at));
59
+ for (const c of sorted) {
60
+ if (isFoundryComment(c))
61
+ continue;
62
+ const remainder = (0, webhook_js_1.commandRemainder)(c.body, config);
63
+ const body = (remainder === null ? c.body : remainder).trim();
64
+ if (body === '')
65
+ continue;
66
+ out.push({ author: c.user?.login ?? 'unknown', created_at: c.created_at, body });
67
+ }
68
+ return out;
69
+ }
70
+ /** Fetch and reduce. Never throws: a thread that cannot be read is empty. */
71
+ async function collectThread(config, issue) {
72
+ const comments = await github.getComments(config.repo, issue);
73
+ return threadFromComments(config, comments);
74
+ }
75
+ //# sourceMappingURL=thread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread.js","sourceRoot":"","sources":["../../src/lib/thread.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,4CAGC;AAGD,gDAWC;AAGD,sCAGC;AA3CD;;;;;;;;GAQG;AACH,oDAAsC;AACtC,6CAA4D;AAS5D,yFAAyF;AACzF,SAAgB,gBAAgB,CAAC,OAAsB;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;IACxC,OAAO,IAAA,uBAAU,EAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;AACrE,CAAC;AAED,6DAA6D;AAC7D,SAAgB,kBAAkB,CAAC,MAAqB,EAAE,QAAyB;IACjF,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACtF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,gBAAgB,CAAC,CAAC,CAAC;YAAE,SAAS;QAClC,MAAM,SAAS,GAAG,IAAA,6BAAgB,EAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9D,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAC1B,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6EAA6E;AACtE,KAAK,UAAU,aAAa,CAAC,MAAqB,EAAE,KAAa;IACtE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9D,OAAO,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { FoundryConfig } from '../types.js';
2
+ /** Name of the check run that carries a verify result; the one a branch rule requires. */
3
+ export declare const VERIFY_CHECK_NAME = "Foundry Verification";
4
+ export interface VerifyResult {
5
+ command: string;
6
+ success: boolean;
7
+ output: string;
8
+ duration_ms: number;
9
+ }
10
+ export declare function runVerifyStep(command: string, cwd: string, extraEnv?: Record<string, string>): VerifyResult;
11
+ export declare function runVerifyPipeline(config: FoundryConfig, cwd: string): {
12
+ passed: boolean;
13
+ results: VerifyResult[];
14
+ };
15
+ export declare function runIntegrationRebuild(config: FoundryConfig, cwd: string): VerifyResult | null;
16
+ export interface VerifyAnnotation {
17
+ path: string;
18
+ start_line: number;
19
+ end_line: number;
20
+ annotation_level: 'notice' | 'warning' | 'failure';
21
+ message: string;
22
+ }
23
+ /**
24
+ * Parse verification output for file:line error patterns.
25
+ * Matches common formats:
26
+ * - ESLint/TSC: src/foo.ts(10,5): error TS1234: msg or src/foo.ts:10:5: msg
27
+ * - Generic: path/file.ext:line: message
28
+ * Returns up to 50 annotations (GitHub API limit per request).
29
+ */
30
+ export declare function parseAnnotations(results: VerifyResult[]): VerifyAnnotation[];
31
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/lib/verify.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,0FAA0F;AAC1F,eAAO,MAAM,iBAAiB,yBAAyB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,YAAY,CAwB/G;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG;IACrE,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB,CAcA;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAG7F;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,gBAAgB,EAAE,CAwB5E"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VERIFY_CHECK_NAME = void 0;
4
+ exports.runVerifyStep = runVerifyStep;
5
+ exports.runVerifyPipeline = runVerifyPipeline;
6
+ exports.runIntegrationRebuild = runIntegrationRebuild;
7
+ exports.parseAnnotations = parseAnnotations;
8
+ /**
9
+ * Verification pipeline — lint, typecheck, build, unit tests.
10
+ */
11
+ const node_child_process_1 = require("node:child_process");
12
+ /** Name of the check run that carries a verify result; the one a branch rule requires. */
13
+ exports.VERIFY_CHECK_NAME = 'Foundry Verification';
14
+ function runVerifyStep(command, cwd, extraEnv = {}) {
15
+ const start = Date.now();
16
+ try {
17
+ const output = (0, node_child_process_1.execSync)(command, {
18
+ cwd,
19
+ encoding: 'utf-8',
20
+ timeout: 300_000, // 5 min per step
21
+ env: { ...process.env, CI: '1', ...extraEnv },
22
+ stdio: ['pipe', 'pipe', 'pipe'],
23
+ });
24
+ return {
25
+ command,
26
+ success: true,
27
+ output: output.slice(-5000), // keep tail
28
+ duration_ms: Date.now() - start,
29
+ };
30
+ }
31
+ catch (err) {
32
+ return {
33
+ command,
34
+ success: false,
35
+ output: ((err.stdout ?? '') + '\n' + (err.stderr ?? '')).trim().slice(-5000),
36
+ duration_ms: Date.now() - start,
37
+ };
38
+ }
39
+ }
40
+ function runVerifyPipeline(config, cwd) {
41
+ const results = [];
42
+ let passed = true;
43
+ for (const cmd of config.verify) {
44
+ const result = runVerifyStep(cmd, cwd);
45
+ results.push(result);
46
+ if (!result.success) {
47
+ passed = false;
48
+ break; // fail-fast
49
+ }
50
+ }
51
+ return { passed, results };
52
+ }
53
+ function runIntegrationRebuild(config, cwd) {
54
+ if (!config.integration_rebuild)
55
+ return null;
56
+ return runVerifyStep(config.integration_rebuild, cwd);
57
+ }
58
+ /**
59
+ * Parse verification output for file:line error patterns.
60
+ * Matches common formats:
61
+ * - ESLint/TSC: src/foo.ts(10,5): error TS1234: msg or src/foo.ts:10:5: msg
62
+ * - Generic: path/file.ext:line: message
63
+ * Returns up to 50 annotations (GitHub API limit per request).
64
+ */
65
+ function parseAnnotations(results) {
66
+ const annotations = [];
67
+ // Match patterns like: path.ext:line:col: message or path.ext(line,col): message
68
+ const linePattern = /^([^\s:()]+\.\w+)[:(](\d+)[,:]?\d*\)?[:\s]+(.+)$/;
69
+ for (const result of results) {
70
+ if (result.success)
71
+ continue;
72
+ for (const line of result.output.split('\n')) {
73
+ const match = line.trim().match(linePattern);
74
+ if (match) {
75
+ const [, filePath, lineNum, message] = match;
76
+ annotations.push({
77
+ path: filePath,
78
+ start_line: Number(lineNum),
79
+ end_line: Number(lineNum),
80
+ annotation_level: 'failure',
81
+ message: message.trim(),
82
+ });
83
+ if (annotations.length >= 50)
84
+ return annotations;
85
+ }
86
+ }
87
+ }
88
+ return annotations;
89
+ }
90
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/lib/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type BumpType = 'patch' | 'minor' | 'major';
2
+ export declare function bumpSemver(current: string, type: BumpType): string;
3
+ export declare function readVersion(filePath: string): string;
4
+ export declare function writeVersion(filePath: string, newVersion: string): void;
5
+ export declare function bumpAllVersionSources(versionSources: string[], type: BumpType, repoRoot: string): {
6
+ version: string;
7
+ files: string[];
8
+ };
9
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAInD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAWlE;AAID,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBpD;AAID,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAyBvE;AAID,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,MAAM,EAAE,EACxB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAoBtC"}
@@ -0,0 +1,134 @@
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.bumpSemver = bumpSemver;
37
+ exports.readVersion = readVersion;
38
+ exports.writeVersion = writeVersion;
39
+ exports.bumpAllVersionSources = bumpAllVersionSources;
40
+ /**
41
+ * Unified monorepo versioning — bump ALL version_sources together.
42
+ *
43
+ * Dispatches read/write by filename so non-Node projects
44
+ * (Cargo.toml, pyproject.toml) are supported alongside package.json.
45
+ */
46
+ const node_child_process_1 = require("node:child_process");
47
+ const fs = __importStar(require("node:fs"));
48
+ const path = __importStar(require("node:path"));
49
+ // ── Pure semver helper ──────────────────────────────────────────────────
50
+ function bumpSemver(current, type) {
51
+ const match = current.match(/^(\d+)\.(\d+)\.(\d+)/);
52
+ if (!match)
53
+ throw new Error(`Cannot parse semver from "${current}"`);
54
+ let [, major, minor, patch] = match.map(Number);
55
+ switch (type) {
56
+ case 'major':
57
+ major++;
58
+ minor = 0;
59
+ patch = 0;
60
+ break;
61
+ case 'minor':
62
+ minor++;
63
+ patch = 0;
64
+ break;
65
+ case 'patch':
66
+ patch++;
67
+ break;
68
+ }
69
+ return `${major}.${minor}.${patch}`;
70
+ }
71
+ // ── Read version from a file ────────────────────────────────────────────
72
+ function readVersion(filePath) {
73
+ const basename = path.basename(filePath);
74
+ const content = fs.readFileSync(filePath, 'utf-8');
75
+ switch (basename) {
76
+ case 'package.json': {
77
+ const pkg = JSON.parse(content);
78
+ if (!pkg.version)
79
+ throw new Error(`No "version" field in ${filePath}`);
80
+ return pkg.version;
81
+ }
82
+ case 'Cargo.toml':
83
+ case 'pyproject.toml': {
84
+ const m = content.match(/^version\s*=\s*"([^"]+)"/m);
85
+ if (!m)
86
+ throw new Error(`No version = "..." found in ${filePath}`);
87
+ return m[1];
88
+ }
89
+ default:
90
+ throw new Error(`Unsupported version file: ${basename}. Supported: package.json, Cargo.toml, pyproject.toml`);
91
+ }
92
+ }
93
+ // ── Write version to a file ─────────────────────────────────────────────
94
+ function writeVersion(filePath, newVersion) {
95
+ const basename = path.basename(filePath);
96
+ switch (basename) {
97
+ case 'package.json': {
98
+ (0, node_child_process_1.execFileSync)('npm', ['version', newVersion, '--no-git-tag-version'], {
99
+ cwd: path.dirname(filePath),
100
+ encoding: 'utf-8',
101
+ timeout: 30_000,
102
+ });
103
+ break;
104
+ }
105
+ case 'Cargo.toml':
106
+ case 'pyproject.toml': {
107
+ const content = fs.readFileSync(filePath, 'utf-8');
108
+ const updated = content.replace(/^(version\s*=\s*")([^"]+)(")/m, `$1${newVersion}$3`);
109
+ fs.writeFileSync(filePath, updated, 'utf-8');
110
+ break;
111
+ }
112
+ default:
113
+ throw new Error(`Unsupported version file: ${basename}. Supported: package.json, Cargo.toml, pyproject.toml`);
114
+ }
115
+ }
116
+ // ── Bump all configured sources ─────────────────────────────────────────
117
+ function bumpAllVersionSources(versionSources, type, repoRoot) {
118
+ if (versionSources.length === 0) {
119
+ throw new Error('No version_sources configured in .joynt-foundry.yml');
120
+ }
121
+ // Read current version from primary source, bump it
122
+ const primaryPath = path.resolve(repoRoot, versionSources[0]);
123
+ const current = readVersion(primaryPath);
124
+ const next = bumpSemver(current, type);
125
+ const files = [];
126
+ // Write the new version to all sources
127
+ for (const src of versionSources) {
128
+ const fullPath = path.resolve(repoRoot, src);
129
+ writeVersion(fullPath, next);
130
+ files.push(fullPath);
131
+ }
132
+ return { version: next, files };
133
+ }
134
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"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"}