@straiffi/archon 1.3.12 → 1.4.0

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 (90) hide show
  1. package/dist/client/assets/{TestsDialog-Bob_a1Hi.js → TestsDialog-CD_kQh8y.js} +1 -1
  2. package/dist/client/assets/{architectureDiagram-3BPJPVTR-DPR80srk.js → architectureDiagram-3BPJPVTR-eKhX8J5g.js} +1 -1
  3. package/dist/client/assets/{blockDiagram-GPEHLZMM-BGImH7RZ.js → blockDiagram-GPEHLZMM-dYzMDN2p.js} +1 -1
  4. package/dist/client/assets/{c4Diagram-AAUBKEIU-D7SYF0uE.js → c4Diagram-AAUBKEIU-Bfe91lzp.js} +1 -1
  5. package/dist/client/assets/channel-ByZgAb3R.js +1 -0
  6. package/dist/client/assets/{chunk-2J33WTMH-FhW6SlH-.js → chunk-2J33WTMH-Box1ZnSe.js} +1 -1
  7. package/dist/client/assets/{chunk-3OPIFGDE-DYutx44Q.js → chunk-3OPIFGDE-BOkhWfjl.js} +1 -1
  8. package/dist/client/assets/{chunk-5ZQYHXKU-Br3FlxNm.js → chunk-5ZQYHXKU-DZt1zqaf.js} +1 -1
  9. package/dist/client/assets/{chunk-727SXJPM-DMZKY_b6.js → chunk-727SXJPM-DZYZCHLI.js} +1 -1
  10. package/dist/client/assets/{chunk-AQP2D5EJ-DSbWZqHO.js → chunk-AQP2D5EJ-CmgJLI9e.js} +1 -1
  11. package/dist/client/assets/{chunk-CSCIHK7Q-5CpD4gNb.js → chunk-CSCIHK7Q-D8FHELNF.js} +1 -1
  12. package/dist/client/assets/{chunk-KSCS5N6A-CR-75NtK.js → chunk-KSCS5N6A-DtLUz0Po.js} +1 -1
  13. package/dist/client/assets/{chunk-L5ZTLDWV-BdF0Mghz.js → chunk-L5ZTLDWV-CBk5m6ON.js} +1 -1
  14. package/dist/client/assets/{chunk-LZXEDZCA-CMutcOJY.js → chunk-LZXEDZCA-CaexlXfB.js} +2 -2
  15. package/dist/client/assets/{chunk-ND2GUHAM-B0WV6btJ.js → chunk-ND2GUHAM-ma7eMIEB.js} +1 -1
  16. package/dist/client/assets/{chunk-NZK2D7GU-C0NDAld7.js → chunk-NZK2D7GU-Da9F4EmF.js} +1 -1
  17. package/dist/client/assets/{chunk-O5CBEL6O-DFHJdzgW.js → chunk-O5CBEL6O-BLScYRER.js} +1 -1
  18. package/dist/client/assets/{chunk-WU5MYG2G-BPQJmOLW.js → chunk-WU5MYG2G-r_Zx_ykt.js} +1 -1
  19. package/dist/client/assets/classDiagram-4FO5ZUOK-ALbA3AZT.js +1 -0
  20. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CRtCF2Am.js +1 -0
  21. package/dist/client/assets/{dagre-BM42HDAG-B0dEGtFW.js → dagre-BM42HDAG-CQZZ6fkN.js} +1 -1
  22. package/dist/client/assets/{diagram-2AECGRRQ-BKFE3UwF.js → diagram-2AECGRRQ-8fz_9Wj4.js} +1 -1
  23. package/dist/client/assets/{diagram-5GNKFQAL-BNqxZ9B1.js → diagram-5GNKFQAL-D2QIzYwx.js} +1 -1
  24. package/dist/client/assets/{diagram-KO2AKTUF-BhtjD426.js → diagram-KO2AKTUF-Dg7-VWuS.js} +1 -1
  25. package/dist/client/assets/{diagram-LMA3HP47-DqTF6PkV.js → diagram-LMA3HP47-CyvkOeSI.js} +1 -1
  26. package/dist/client/assets/{diagram-OG6HWLK6-CgxffqG3.js → diagram-OG6HWLK6-C6TmKjxR.js} +1 -1
  27. package/dist/client/assets/{erDiagram-TEJ5UH35-BWwMdU9P.js → erDiagram-TEJ5UH35-KO_Kcloa.js} +1 -1
  28. package/dist/client/assets/{flowDiagram-I6XJVG4X-B3xakVuh.js → flowDiagram-I6XJVG4X-BYDZ3qQE.js} +1 -1
  29. package/dist/client/assets/{ganttDiagram-6RSMTGT7-B1eynTXi.js → ganttDiagram-6RSMTGT7-BLDujCf9.js} +1 -1
  30. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-yS-cLx0T.js → gitGraphDiagram-PVQCEYII-B-zvAAKD.js} +1 -1
  31. package/dist/client/assets/{index-RzqxYM2a.js → index-C5vJR8lI.js} +114 -114
  32. package/dist/client/assets/index-mgNREnGE.css +2 -0
  33. package/dist/client/assets/{infoDiagram-5YYISTIA-Tz41TEOL.js → infoDiagram-5YYISTIA-BZadMEs3.js} +1 -1
  34. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH--rpZ6_Qj.js → ishikawaDiagram-YF4QCWOH-BnuStPyf.js} +1 -1
  35. package/dist/client/assets/{journeyDiagram-JHISSGLW-BICS8Pc2.js → journeyDiagram-JHISSGLW-13FrVYMv.js} +1 -1
  36. package/dist/client/assets/{kanban-definition-UN3LZRKU-CJX3MNTR.js → kanban-definition-UN3LZRKU-B4yGkr5P.js} +1 -1
  37. package/dist/client/assets/{line-CEznr8ot.js → line-D3D8vY5q.js} +1 -1
  38. package/dist/client/assets/{mermaid-parser.core-CAyxqbfC.js → mermaid-parser.core-DE23MjEP.js} +1 -1
  39. package/dist/client/assets/{mermaid.core-lZhCYAcS.js → mermaid.core-C47RYkRV.js} +3 -3
  40. package/dist/client/assets/{mindmap-definition-RKZ34NQL-DBnpzaB5.js → mindmap-definition-RKZ34NQL-H9vxHA6z.js} +1 -1
  41. package/dist/client/assets/{pieDiagram-4H26LBE5-BsJ62Z_s.js → pieDiagram-4H26LBE5-gtm2r2QV.js} +1 -1
  42. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-O7V8MQ77.js → quadrantDiagram-W4KKPZXB-CvQ8DgZT.js} +1 -1
  43. package/dist/client/assets/{requirementDiagram-4Y6WPE33-CBSp0PJm.js → requirementDiagram-4Y6WPE33-BJdKQQGp.js} +1 -1
  44. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-C_rNCXBt.js → sankeyDiagram-5OEKKPKP-C8MvJ4qc.js} +1 -1
  45. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-CQOlTV8H.js → sequenceDiagram-3UESZ5HK-vnLK2sVC.js} +1 -1
  46. package/dist/client/assets/{stateDiagram-AJRCARHV-mivSZyUu.js → stateDiagram-AJRCARHV-xmrmmwh0.js} +1 -1
  47. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DCX_KXXR.js +1 -0
  48. package/dist/client/assets/{timeline-definition-PNZ67QCA-BuPShGFC.js → timeline-definition-PNZ67QCA-BS6qgXzV.js} +1 -1
  49. package/dist/client/assets/{vennDiagram-CIIHVFJN-Bx7_gjaC.js → vennDiagram-CIIHVFJN-BY2_Ffta.js} +1 -1
  50. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-4CO-qLpT.js → wardleyDiagram-YWT4CUSO-CkoA3xv4.js} +1 -1
  51. package/dist/client/assets/{xychartDiagram-2RQKCTM6-CrLfXUhs.js → xychartDiagram-2RQKCTM6-DbdiR5DY.js} +1 -1
  52. package/dist/client/index.html +2 -2
  53. package/dist/server/db.js +22 -0
  54. package/dist/server/db.js.map +1 -1
  55. package/dist/server/index.js +115 -167
  56. package/dist/server/index.js.map +1 -1
  57. package/dist/server/lib/bundlePullRequests.js +47 -0
  58. package/dist/server/lib/bundlePullRequests.js.map +1 -1
  59. package/dist/server/lib/bundleReviewOperations.js +83 -0
  60. package/dist/server/lib/bundleReviewOperations.js.map +1 -0
  61. package/dist/server/lib/commitMessage.js +32 -0
  62. package/dist/server/lib/commitMessage.js.map +1 -0
  63. package/dist/server/lib/integrations/github.js +7 -0
  64. package/dist/server/lib/integrations/github.js.map +1 -1
  65. package/dist/server/lib/projects.js +44 -0
  66. package/dist/server/lib/projects.js.map +1 -1
  67. package/dist/server/lib/pullRequestContent.js +77 -0
  68. package/dist/server/lib/pullRequestContent.js.map +1 -0
  69. package/dist/server/lib/ticketAutomation.js +194 -0
  70. package/dist/server/lib/ticketAutomation.js.map +1 -0
  71. package/dist/server/lib/ticketAutomationCommit.js +188 -0
  72. package/dist/server/lib/ticketAutomationCommit.js.map +1 -0
  73. package/dist/server/lib/ticketSettingsOperations.js +35 -2
  74. package/dist/server/lib/ticketSettingsOperations.js.map +1 -1
  75. package/dist/server/lib/ticketWorkflowOperations.js +11 -0
  76. package/dist/server/lib/ticketWorkflowOperations.js.map +1 -1
  77. package/dist/server/lib/tickets.js +31 -1
  78. package/dist/server/lib/tickets.js.map +1 -1
  79. package/dist/server/workers/build.js +11 -0
  80. package/dist/server/workers/build.js.map +1 -1
  81. package/dist/server/workers/followUp.js +30 -3
  82. package/dist/server/workers/followUp.js.map +1 -1
  83. package/dist/server/workers/review.js +78 -4
  84. package/dist/server/workers/review.js.map +1 -1
  85. package/package.json +1 -1
  86. package/dist/client/assets/channel-CSR2Zu1K.js +0 -1
  87. package/dist/client/assets/classDiagram-4FO5ZUOK-DN8Vr8x9.js +0 -1
  88. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-8cgd_6y_.js +0 -1
  89. package/dist/client/assets/index-ZyUvSLAF.css +0 -2
  90. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-B42XUhCw.js +0 -1
@@ -0,0 +1,194 @@
1
+ import db from '../db.js';
2
+ const DEPTH_RANK = {
3
+ manual: 0,
4
+ auto_review: 1,
5
+ auto_commit: 2,
6
+ auto_push: 3,
7
+ auto_pr: 4,
8
+ };
9
+ const SEVERITY_RANK = {
10
+ low: 0,
11
+ medium: 1,
12
+ high: 2,
13
+ };
14
+ export const isAutomationDepth = (value) => {
15
+ return value === 'manual'
16
+ || value === 'auto_review'
17
+ || value === 'auto_commit'
18
+ || value === 'auto_push'
19
+ || value === 'auto_pr';
20
+ };
21
+ export const isAutomationReviewSeverity = (value) => {
22
+ return value === 'low' || value === 'medium' || value === 'high';
23
+ };
24
+ export const depthAtLeast = (depth, floor) => {
25
+ return DEPTH_RANK[depth] >= DEPTH_RANK[floor];
26
+ };
27
+ export const severityBlocks = (severity, threshold) => {
28
+ return SEVERITY_RANK[severity] >= SEVERITY_RANK[threshold];
29
+ };
30
+ export const resolveAutomationConfig = (ticket, project) => {
31
+ const projectDepth = project?.automation_depth ?? 'manual';
32
+ const projectFixEnabled = project?.automation_review_fix_enabled ?? 0;
33
+ const ticketDepth = ticket.automation_depth;
34
+ const ticketFixEnabled = ticket.automation_review_fix_enabled;
35
+ return {
36
+ depth: ticketDepth ?? projectDepth,
37
+ reviewFixEnabled: ticketFixEnabled !== null ? Boolean(ticketFixEnabled) : Boolean(projectFixEnabled),
38
+ reviewSeverity: project?.automation_review_severity ?? 'medium',
39
+ reviewMaxIterations: project?.automation_review_max_iterations ?? 3,
40
+ };
41
+ };
42
+ export const isAutomationActive = (config) => {
43
+ return config.depth !== 'manual';
44
+ };
45
+ export const serializeBundleAutomationState = (row) => {
46
+ if (!row) {
47
+ return null;
48
+ }
49
+ return {
50
+ review_iteration_count: row.review_iteration_count,
51
+ fix_loop_active: Boolean(row.fix_loop_active),
52
+ automation_paused_reason: row.automation_paused_reason,
53
+ automation_paused_at: row.automation_paused_at,
54
+ };
55
+ };
56
+ export const getBundleAutomationState = (projectId, bundleId) => {
57
+ return db
58
+ .prepare('SELECT * FROM bundle_automation_state WHERE project_id = ? AND worktree_bundle_id = ?')
59
+ .get(projectId, bundleId) ?? null;
60
+ };
61
+ const getBundleAutomationStateCacheKey = (projectId, bundleId) => {
62
+ return `${projectId}:${bundleId}`;
63
+ };
64
+ export const resolveBundleAutomationState = (projectId, bundleId, cache) => {
65
+ const key = getBundleAutomationStateCacheKey(projectId, bundleId);
66
+ if (cache?.has(key)) {
67
+ return cache.get(key) ?? null;
68
+ }
69
+ const state = getBundleAutomationState(projectId, bundleId);
70
+ cache?.set(key, state);
71
+ return state;
72
+ };
73
+ export const loadBundleAutomationStateMap = (projectId, bundleIds) => {
74
+ const cache = new Map();
75
+ if (bundleIds.length === 0) {
76
+ return cache;
77
+ }
78
+ const placeholders = bundleIds.map(() => '?').join(', ');
79
+ const rows = db
80
+ .prepare(`SELECT * FROM bundle_automation_state WHERE project_id = ? AND worktree_bundle_id IN (${placeholders})`)
81
+ .all(projectId, ...bundleIds);
82
+ for (const row of rows) {
83
+ cache.set(getBundleAutomationStateCacheKey(projectId, row.worktree_bundle_id), row);
84
+ }
85
+ for (const bundleId of bundleIds) {
86
+ const key = getBundleAutomationStateCacheKey(projectId, bundleId);
87
+ if (!cache.has(key)) {
88
+ cache.set(key, null);
89
+ }
90
+ }
91
+ return cache;
92
+ };
93
+ export const upsertBundleAutomationState = (projectId, bundleId, patch) => {
94
+ const existing = getBundleAutomationState(projectId, bundleId);
95
+ if (!existing) {
96
+ db.prepare(`
97
+ INSERT INTO bundle_automation_state (
98
+ project_id,
99
+ worktree_bundle_id,
100
+ review_iteration_count,
101
+ fix_loop_active,
102
+ automation_paused_reason,
103
+ automation_paused_at
104
+ )
105
+ VALUES (?, ?, ?, ?, ?, ?)
106
+ `).run(projectId, bundleId, patch.review_iteration_count ?? 0, patch.fix_loop_active ?? 0, patch.automation_paused_reason ?? null, patch.automation_paused_at ?? null);
107
+ return;
108
+ }
109
+ db.prepare(`
110
+ UPDATE bundle_automation_state
111
+ SET
112
+ review_iteration_count = ?,
113
+ fix_loop_active = ?,
114
+ automation_paused_reason = ?,
115
+ automation_paused_at = ?,
116
+ updated_at = CURRENT_TIMESTAMP
117
+ WHERE project_id = ? AND worktree_bundle_id = ?
118
+ `).run(patch.review_iteration_count ?? existing.review_iteration_count, patch.fix_loop_active ?? existing.fix_loop_active, patch.automation_paused_reason !== undefined
119
+ ? patch.automation_paused_reason
120
+ : existing.automation_paused_reason, patch.automation_paused_at !== undefined
121
+ ? patch.automation_paused_at
122
+ : existing.automation_paused_at, projectId, bundleId);
123
+ };
124
+ export const recordAutomationPause = (projectId, bundleId, reason) => {
125
+ upsertBundleAutomationState(projectId, bundleId, {
126
+ automation_paused_reason: reason,
127
+ automation_paused_at: new Date().toISOString(),
128
+ });
129
+ };
130
+ export const clearAutomationPause = (projectId, bundleId) => {
131
+ upsertBundleAutomationState(projectId, bundleId, {
132
+ automation_paused_reason: null,
133
+ automation_paused_at: null,
134
+ });
135
+ };
136
+ export const resetBundleAutomationLoop = (projectId, bundleId) => {
137
+ upsertBundleAutomationState(projectId, bundleId, {
138
+ review_iteration_count: 0,
139
+ fix_loop_active: 0,
140
+ });
141
+ };
142
+ export const countBlockingFindings = (findings, config) => {
143
+ return findings.filter(finding => severityBlocks(finding.severity, config.reviewSeverity)).length;
144
+ };
145
+ export const decideReviewAutomation = (config, bundleState, reviewRunId, parsedStatus, findings) => {
146
+ if (!isAutomationActive(config)) {
147
+ return { kind: 'manual' };
148
+ }
149
+ if (bundleState?.automation_paused_reason) {
150
+ return { kind: 'paused' };
151
+ }
152
+ if (!reviewRunId || parsedStatus !== 'completed') {
153
+ return { kind: 'parse_failed' };
154
+ }
155
+ const blockingCount = countBlockingFindings(findings, config);
156
+ const iteration = bundleState?.review_iteration_count ?? 0;
157
+ if (config.reviewFixEnabled && blockingCount > 0 && iteration < config.reviewMaxIterations) {
158
+ return { kind: 'fix_iteration', iteration: iteration + 1, max: config.reviewMaxIterations };
159
+ }
160
+ if (blockingCount > 0) {
161
+ return {
162
+ kind: 'pause_blocking',
163
+ reason: buildBlockingFindingsPauseReason(blockingCount, config.reviewSeverity, config.reviewFixEnabled, iteration),
164
+ };
165
+ }
166
+ return { kind: 'clean' };
167
+ };
168
+ export const buildBlockingFindingsPauseReason = (blockingCount, severity, fixEnabled, iteration) => {
169
+ if (!fixEnabled) {
170
+ return `blocking findings, auto-fix disabled (${blockingCount} at ${severity} or above)`;
171
+ }
172
+ const findingWord = blockingCount === 1 ? 'finding remains' : 'findings remain';
173
+ const iterationWord = iteration === 1 ? 'iteration' : 'iterations';
174
+ return `review fix loop exhausted, ${blockingCount} ${severity}+ ${findingWord} after ${iteration} ${iterationWord}`;
175
+ };
176
+ export const buildAutomationFixInstruction = (severity) => {
177
+ return `Fix the code review findings at or above "${severity}" severity. Address each blocking finding directly and minimally. Do not introduce unrelated changes, reformatting, or refactors. Do not commit.`;
178
+ };
179
+ export const buildAutomationFixStatusMessage = (iteration, max) => {
180
+ return `Automation: fixing review findings (iteration ${iteration} of ${max})`;
181
+ };
182
+ export const decideReviewFollowUpAutomation = (config, bundleState) => {
183
+ if (!isAutomationActive(config)) {
184
+ return { kind: 'manual' };
185
+ }
186
+ if (bundleState?.automation_paused_reason) {
187
+ return { kind: 'paused' };
188
+ }
189
+ if (bundleState?.fix_loop_active === 1) {
190
+ return { kind: 're_review' };
191
+ }
192
+ return { kind: 'fall_through' };
193
+ };
194
+ //# sourceMappingURL=ticketAutomation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticketAutomation.js","sourceRoot":"","sources":["../../../server/lib/ticketAutomation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ import config from './config.js';
2
+ import { buildCommitMessagePrompt, normalizeGeneratedCommitMessage, } from './commitMessage.js';
3
+ import { commitGitChanges, getGitStatus, getReviewDiffData, getSelectedGitUnifiedDiff, pushCurrentBranch, resolveWorktreePath, } from './git.js';
4
+ import { runLightweightPrompt } from './lightweightPrompt.js';
5
+ import { buildPullRequestContentPrompt, parsePullRequestContent, } from './pullRequestContent.js';
6
+ import { isProjectRootBundle } from './tickets.js';
7
+ import { createOrFindGitHubPullRequest, hasGitHubRemoteBranch } from './integrations/github.js';
8
+ import { getGitHubConnectionConfig } from './integrations/index.js';
9
+ import { hasOpenBundlePullRequest, syncTrackedBundlePullRequestIfNeeded, upsertBundlePullRequestFromGitHub, } from './bundlePullRequests.js';
10
+ import { recordAutomationPause } from './ticketAutomation.js';
11
+ import { getTicket } from './tickets.js';
12
+ const getErrorMessage = (error) => {
13
+ return error instanceof Error ? error.message : String(error);
14
+ };
15
+ export const evaluateCommitPrecondition = (gitStatus) => {
16
+ if (gitStatus.files.length === 0) {
17
+ return { ok: true };
18
+ }
19
+ if (gitStatus.operation_state !== 'idle') {
20
+ return { ok: false, reason: `worktree is mid-${gitStatus.operation_state}` };
21
+ }
22
+ return { ok: true };
23
+ };
24
+ export const evaluatePrPrecondition = (connectionConfig, bundle, gitStatus, hasRemoteBranch, existingTrackedPr) => {
25
+ if (!connectionConfig) {
26
+ return { ok: false, reason: 'GitHub integration not connected' };
27
+ }
28
+ if (isProjectRootBundle(bundle)) {
29
+ return { ok: false, reason: 'pull requests are not available for the project root bundle' };
30
+ }
31
+ if (!connectionConfig.default_base_branch) {
32
+ return { ok: false, reason: 'no default base branch configured for the GitHub connection' };
33
+ }
34
+ if (gitStatus.ahead > 0 || !hasRemoteBranch) {
35
+ return { ok: false, reason: 'branch must be pushed and up to date before opening a pull request' };
36
+ }
37
+ return { ok: true };
38
+ };
39
+ const buildCommitExecution = (project) => {
40
+ if (project.helper_model) {
41
+ return {
42
+ tool: 'opencode',
43
+ model: project.helper_model,
44
+ variant: project.helper_variant,
45
+ };
46
+ }
47
+ return { tool: config.tool ?? 'opencode' };
48
+ };
49
+ const generateCommitMessage = async (cwd, project, selectedPaths) => {
50
+ const gitStatus = getGitStatus(cwd, null, project);
51
+ const selectedPathSet = new Set(selectedPaths);
52
+ const selectedFiles = gitStatus.files
53
+ .filter(file => selectedPathSet.has(file.path))
54
+ .map(file => `${file.status}: ${file.path}`);
55
+ const prompt = buildCommitMessagePrompt({
56
+ commitMessageRules: project.commit_message_rules,
57
+ selectedFiles,
58
+ diff: getSelectedGitUnifiedDiff(cwd, selectedPaths),
59
+ });
60
+ const rawMessage = await runLightweightPrompt(buildCommitExecution(project), prompt, cwd);
61
+ return normalizeGeneratedCommitMessage(rawMessage);
62
+ };
63
+ const generatePullRequestContent = async (cwd, project, ticket, branch) => {
64
+ const diffData = getReviewDiffData({ cwd, branch, project });
65
+ if (!diffData.diff.trim()) {
66
+ return { title: ticket.title, body: ticket.description ?? '' };
67
+ }
68
+ try {
69
+ const githubConfig = getGitHubConnectionConfig(ticket.project_id ?? '');
70
+ const baseBranch = githubConfig?.default_base_branch ?? 'main';
71
+ const prompt = buildPullRequestContentPrompt({
72
+ ticketTitle: ticket.title,
73
+ ticketDescription: ticket.description,
74
+ diff: diffData.diff,
75
+ baseBranch,
76
+ });
77
+ const rawOutput = await runLightweightPrompt(buildCommitExecution(project), prompt, cwd);
78
+ const parsed = parsePullRequestContent(rawOutput);
79
+ if (parsed) {
80
+ return parsed;
81
+ }
82
+ }
83
+ catch {
84
+ // Fall back to ticket fields on any failure
85
+ }
86
+ return { title: ticket.title, body: ticket.description ?? '' };
87
+ };
88
+ const emitUpdated = (io, ticketId) => {
89
+ const updated = getTicket(ticketId);
90
+ if (updated) {
91
+ io.emit('ticket:updated', updated);
92
+ }
93
+ };
94
+ export const runAutomationCommitChain = async (ticket, project, bundle, automationConfig, io) => {
95
+ if (!ticket.project_id || !ticket.worktree_bundle_id) {
96
+ return;
97
+ }
98
+ const projectId = ticket.project_id;
99
+ const bundleId = ticket.worktree_bundle_id;
100
+ const branch = bundle?.branch ?? null;
101
+ if (!branch) {
102
+ recordAutomationPause(projectId, bundleId, 'automation commit chain skipped: bundle has no branch');
103
+ emitUpdated(io, ticket.id);
104
+ return;
105
+ }
106
+ const cwd = bundle?.kind === 'project_root'
107
+ ? project.repo_path
108
+ : resolveWorktreePath(branch, project);
109
+ const emitPaused = (reason) => {
110
+ recordAutomationPause(projectId, bundleId, reason);
111
+ emitUpdated(io, ticket.id);
112
+ };
113
+ // Commit leg (auto_commit and deeper)
114
+ try {
115
+ const gitStatus = getGitStatus(cwd, branch, project);
116
+ const commitCheck = evaluateCommitPrecondition(gitStatus);
117
+ if (!commitCheck.ok) {
118
+ emitPaused(commitCheck.reason);
119
+ return;
120
+ }
121
+ if (gitStatus.files.length > 0) {
122
+ const selectedPaths = gitStatus.files.map(file => file.path);
123
+ const message = await generateCommitMessage(cwd, project, selectedPaths);
124
+ if (!message) {
125
+ emitPaused('commit message generation produced an empty result');
126
+ return;
127
+ }
128
+ await commitGitChanges(cwd, branch, project, message, selectedPaths);
129
+ }
130
+ }
131
+ catch (error) {
132
+ emitPaused(`commit failed: ${getErrorMessage(error)}`);
133
+ return;
134
+ }
135
+ if (automationConfig.depth === 'auto_commit') {
136
+ emitUpdated(io, ticket.id);
137
+ return;
138
+ }
139
+ // Push leg (auto_push and deeper). pushCurrentBranch is idempotent — a no-op
140
+ // when the branch is already up to date — so no separate precondition is needed.
141
+ try {
142
+ await pushCurrentBranch(cwd, branch);
143
+ }
144
+ catch (error) {
145
+ emitPaused(`push failed: ${getErrorMessage(error)}`);
146
+ return;
147
+ }
148
+ if (automationConfig.depth === 'auto_push') {
149
+ emitUpdated(io, ticket.id);
150
+ return;
151
+ }
152
+ // PR leg (auto_pr)
153
+ try {
154
+ const githubConfig = getGitHubConnectionConfig(projectId);
155
+ const prGitStatus = getGitStatus(cwd, branch, project);
156
+ const hasRemoteBranch = hasGitHubRemoteBranch(cwd, branch);
157
+ const tracked = bundle
158
+ ? await syncTrackedBundlePullRequestIfNeeded(project, bundle, { force: true })
159
+ : null;
160
+ const prCheck = evaluatePrPrecondition(githubConfig, bundle, prGitStatus, hasRemoteBranch, tracked);
161
+ if (!prCheck.ok) {
162
+ emitPaused(prCheck.reason);
163
+ return;
164
+ }
165
+ if (hasOpenBundlePullRequest(tracked)) {
166
+ emitUpdated(io, ticket.id);
167
+ return;
168
+ }
169
+ if (!githubConfig) {
170
+ emitPaused('GitHub integration not connected');
171
+ return;
172
+ }
173
+ const baseBranch = githubConfig.default_base_branch ?? '';
174
+ const prContent = await generatePullRequestContent(cwd, project, ticket, branch);
175
+ const nextPullRequest = await createOrFindGitHubPullRequest(githubConfig, {
176
+ title: prContent.title,
177
+ body: prContent.body,
178
+ baseBranch,
179
+ headBranch: branch,
180
+ });
181
+ upsertBundlePullRequestFromGitHub(projectId, bundleId, githubConfig, nextPullRequest);
182
+ emitUpdated(io, ticket.id);
183
+ }
184
+ catch (error) {
185
+ emitPaused(`pull request failed: ${getErrorMessage(error)}`);
186
+ }
187
+ };
188
+ //# sourceMappingURL=ticketAutomationCommit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticketAutomationCommit.js","sourceRoot":"","sources":["../../../server/lib/ticketAutomationCommit.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import db from '../db.js';
2
2
  import { normalizeTicketModelId } from './models.js';
3
3
  import { normalizeSkillNames } from './skills.js';
4
+ import { isAutomationDepth } from './ticketAutomation.js';
4
5
  import { getTicket } from './tickets.js';
5
6
  const hasOwn = (object, key) => {
6
7
  return !!object && typeof object === 'object' && Object.prototype.hasOwnProperty.call(object, key);
@@ -15,11 +16,13 @@ export const isTicketAgentSettingsPayload = (payload) => {
15
16
  const hasModelField = hasOwn(payload, 'model');
16
17
  const hasVariantField = hasOwn(payload, 'variant');
17
18
  const hasSkillsField = hasOwn(payload, 'skills');
19
+ const hasAutomationDepthField = hasOwn(payload, 'automation_depth');
20
+ const hasAutomationFixField = hasOwn(payload, 'automation_review_fix_enabled');
18
21
  const hasEditableContentField = hasOwn(payload, 'title')
19
22
  || hasOwn(payload, 'description')
20
23
  || hasOwn(payload, 'project_id')
21
24
  || hasOwn(payload, 'worktree_bundle_id');
22
- return !hasEditableContentField && (hasModelField || hasVariantField || hasSkillsField);
25
+ return !hasEditableContentField && (hasModelField || hasVariantField || hasSkillsField || hasAutomationDepthField || hasAutomationFixField);
23
26
  };
24
27
  export const updateTicketAgentSettings = ({ ticketId, requestedProjectId, payload, broadcaster, }) => {
25
28
  const ticket = getTicket(ticketId);
@@ -32,6 +35,8 @@ export const updateTicketAgentSettings = ({ ticketId, requestedProjectId, payloa
32
35
  let resolvedModel = ticket.model;
33
36
  let resolvedVariant = ticket.variant;
34
37
  let resolvedSkills = ticket.skills;
38
+ let resolvedAutomationDepth = ticket.automation_depth ?? null;
39
+ let resolvedAutomationReviewFixEnabled = ticket.automation_review_fix_enabled ?? null;
35
40
  if (hasOwn(payload, 'model')) {
36
41
  if (payload?.model == null) {
37
42
  resolvedModel = null;
@@ -54,7 +59,35 @@ export const updateTicketAgentSettings = ({ ticketId, requestedProjectId, payloa
54
59
  if (hasOwn(payload, 'skills')) {
55
60
  resolvedSkills = normalizeSkillNames(payload?.skills);
56
61
  }
57
- db.prepare('UPDATE tickets SET model = ?, variant = ?, skills_json = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(resolvedModel, resolvedVariant, JSON.stringify(resolvedSkills), ticket.id);
62
+ if (hasOwn(payload, 'automation_depth')) {
63
+ const value = payload?.automation_depth;
64
+ if (value == null || value === '') {
65
+ resolvedAutomationDepth = null;
66
+ }
67
+ else if (isAutomationDepth(value)) {
68
+ resolvedAutomationDepth = value;
69
+ }
70
+ else {
71
+ return {
72
+ ok: false,
73
+ status: 400,
74
+ error: 'automation_depth must be one of: manual, auto_review, auto_commit, auto_push, auto_pr',
75
+ };
76
+ }
77
+ }
78
+ if (hasOwn(payload, 'automation_review_fix_enabled')) {
79
+ const value = payload?.automation_review_fix_enabled;
80
+ if (value == null) {
81
+ resolvedAutomationReviewFixEnabled = null;
82
+ }
83
+ else if (typeof value === 'boolean') {
84
+ resolvedAutomationReviewFixEnabled = value ? 1 : 0;
85
+ }
86
+ else {
87
+ return { ok: false, status: 400, error: 'automation_review_fix_enabled must be a boolean' };
88
+ }
89
+ }
90
+ db.prepare('UPDATE tickets SET model = ?, variant = ?, skills_json = ?, automation_depth = ?, automation_review_fix_enabled = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(resolvedModel, resolvedVariant, JSON.stringify(resolvedSkills), resolvedAutomationDepth, resolvedAutomationReviewFixEnabled, ticket.id);
58
91
  const updated = getTicket(ticket.id);
59
92
  broadcaster.emit('ticket:updated', updated);
60
93
  return { ok: true, status: 200, value: updated };
@@ -1 +1 @@
1
- {"version":3,"file":"ticketSettingsOperations.js","sourceRoot":"","sources":["../../../server/lib/ticketSettingsOperations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ticketSettingsOperations.js","sourceRoot":"","sources":["../../../server/lib/ticketSettingsOperations.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { prepareTicketForBuild } from './buildFlow.js';
5
5
  import { isBundleBuildBlocked } from './bundleActivity.js';
6
6
  import { getEffectiveProject } from './projects.js';
7
7
  import { assignTicketLaneOrder, autoParkTicketIfStale, getTicket, resolveTicketTool } from './tickets.js';
8
+ import { getBundleAutomationState, recordAutomationPause } from './ticketAutomation.js';
8
9
  import { startBuild } from '../workers/build.js';
9
10
  import { startReview } from '../workers/review.js';
10
11
  const VALID_TICKET_STATES = ['plan', 'build', 'review'];
@@ -46,6 +47,16 @@ export const transitionTicketState = ({ ticketId, requestedState, requestedProje
46
47
  if (requestedProjectId !== undefined && existing.project_id !== requestedProjectId) {
47
48
  return { ok: false, status: 404, error: 'Not found' };
48
49
  }
50
+ if (existing.project_id && existing.worktree_bundle_id) {
51
+ const bundleState = getBundleAutomationState(existing.project_id, existing.worktree_bundle_id);
52
+ if (bundleState && !bundleState.automation_paused_reason && bundleState.fix_loop_active === 1) {
53
+ recordAutomationPause(existing.project_id, existing.worktree_bundle_id, 'manual transition');
54
+ const pausedTicket = getTicket(existing.id);
55
+ if (pausedTicket) {
56
+ broadcaster.emit('ticket:updated', pausedTicket);
57
+ }
58
+ }
59
+ }
49
60
  if (ticketState === 'plan' && existing.state !== 'plan') {
50
61
  return { ok: false, status: 409, error: 'Tickets cannot be moved back to plan after work begins' };
51
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ticketWorkflowOperations.js","sourceRoot":"","sources":["../../../server/lib/ticketWorkflowOperations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ticketWorkflowOperations.js","sourceRoot":"","sources":["../../../server/lib/ticketWorkflowOperations.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ import { getGitHubConnectionConfig } from './integrations/index.js';
8
8
  import { getEffectiveProject, getProjectById, hasProjectRunIde } from './projects.js';
9
9
  import { getReviewContextState } from './reviewFindings.js';
10
10
  import { hasRunConfig, isRunning } from './run.js';
11
+ import { loadBundleAutomationStateMap, resolveAutomationConfig, resolveBundleAutomationState, } from './ticketAutomation.js';
11
12
  import { listTicketMessages, upsertTicketDescriptionMessage } from './ticketMessages.js';
12
13
  import { getTicketUndo } from './ticketUndo.js';
13
14
  const ticketSelect = `
@@ -445,7 +446,7 @@ export const serializeTicket = (row, options = {}) => {
445
446
  if (!row) {
446
447
  return null;
447
448
  }
448
- const { diffStatsCache, gitStatusCache, existingWorktreePaths, worktreeRecordsCache, includeDetail = true, includeMessages = includeDetail, includeLogs = includeDetail, includeUndo = includeDetail, includeDiffStats = includeDetail, includeStaleState = includeDetail, includeWorktreeState = includeDetail, bundleExecutionPositionByTicketId, githubConnectionCache, bundlePullRequestCache, } = options;
449
+ const { diffStatsCache, gitStatusCache, existingWorktreePaths, worktreeRecordsCache, includeDetail = true, includeMessages = includeDetail, includeLogs = includeDetail, includeUndo = includeDetail, includeDiffStats = includeDetail, includeStaleState = includeDetail, includeWorktreeState = includeDetail, bundleExecutionPositionByTicketId, githubConnectionCache, bundlePullRequestCache, bundleAutomationStateCache, } = options;
449
450
  const project = getEffectiveProject(row);
450
451
  const bundle = serializeBundle(row, {
451
452
  githubConnectionCache,
@@ -493,6 +494,14 @@ export const serializeTicket = (row, options = {}) => {
493
494
  const hasGitHubConnection = row.project_id
494
495
  ? resolveProjectGitHubConnection(row.project_id, githubConnectionCache)
495
496
  : false;
497
+ const automationConfig = resolveAutomationConfig({
498
+ automation_depth: row.automation_depth ?? null,
499
+ automation_review_fix_enabled: row.automation_review_fix_enabled ?? null,
500
+ project_id: row.project_id,
501
+ }, project);
502
+ const bundleAutomationState = row.project_id && row.worktree_bundle_id
503
+ ? resolveBundleAutomationState(row.project_id, row.worktree_bundle_id, bundleAutomationStateCache)
504
+ : null;
496
505
  const canReReview = reviewContextState.hasCompletedReview
497
506
  && reviewContextState.hasFollowUpSinceLastReview
498
507
  && row.agent_status !== 'running';
@@ -531,6 +540,13 @@ export const serializeTicket = (row, options = {}) => {
531
540
  external_source: parseExternalSource(row),
532
541
  origin_spec_session_id: row.origin_spec_session_id ?? null,
533
542
  origin_spec_snapshot_id: row.origin_spec_snapshot_id ?? null,
543
+ automation_depth: row.automation_depth ?? null,
544
+ automation_review_fix_enabled: row.automation_review_fix_enabled ?? null,
545
+ automation_config: automationConfig,
546
+ automation_paused_reason: bundleAutomationState?.automation_paused_reason ?? null,
547
+ automation_paused_at: bundleAutomationState?.automation_paused_at ?? null,
548
+ automation_review_iteration_count: bundleAutomationState?.review_iteration_count ?? 0,
549
+ automation_fix_loop_active: Boolean(bundleAutomationState?.fix_loop_active),
534
550
  ...parseUsageSnapshotJson(row.usage_snapshot_json),
535
551
  };
536
552
  const ticketWithOptionalFields = {
@@ -606,6 +622,11 @@ export const listTickets = (projectId, options = {}) => {
606
622
  tickets.updated_at DESC,
607
623
  tickets.id DESC`).all(projectId);
608
624
  const rowsLoadedAt = performance.now();
625
+ const bundleAutomationStateCache = projectId
626
+ ? loadBundleAutomationStateMap(projectId, rows
627
+ .filter(row => row.worktree_bundle_id)
628
+ .map(row => row.worktree_bundle_id))
629
+ : new Map();
609
630
  const serializedRows = rows
610
631
  .map(row => serializeTicket(row, {
611
632
  includeDetail: includeFullDetail,
@@ -620,6 +641,7 @@ export const listTickets = (projectId, options = {}) => {
620
641
  worktreeRecordsCache,
621
642
  githubConnectionCache,
622
643
  bundlePullRequestCache,
644
+ bundleAutomationStateCache,
623
645
  }))
624
646
  .filter((ticket) => ticket !== null);
625
647
  const rowsSerializedAt = performance.now();
@@ -804,10 +826,14 @@ export const listBoardTicketEnrichment = (projectId) => {
804
826
  };
805
827
  export const getTicket = (id) => {
806
828
  const row = db.prepare(`${ticketSelect} WHERE tickets.id = ?`).get(id);
829
+ const bundleAutomationStateCache = row?.project_id && row?.worktree_bundle_id
830
+ ? loadBundleAutomationStateMap(row.project_id, [row.worktree_bundle_id])
831
+ : new Map();
807
832
  const ticket = serializeTicket(row, {
808
833
  includeDetail: true,
809
834
  githubConnectionCache: new Map(),
810
835
  bundlePullRequestCache: new Map(),
836
+ bundleAutomationStateCache,
811
837
  });
812
838
  if (!ticket) {
813
839
  return null;
@@ -947,6 +973,9 @@ export const listTicketsInRunContext = (ticket, options = {}) => {
947
973
  CASE WHEN tickets.parked_at IS NULL THEN COALESCE(tickets.lane_order, 0) ELSE COALESCE(tickets.done_order, 0) END DESC,
948
974
  tickets.updated_at DESC,
949
975
  tickets.id DESC`).all(ticket.worktree_bundle_id, ticket.project_id);
976
+ const bundleAutomationStateCache = ticket.project_id
977
+ ? loadBundleAutomationStateMap(ticket.project_id, [ticket.worktree_bundle_id])
978
+ : new Map();
950
979
  return applyBundleExecutionPositions(rows
951
980
  .map(row => serializeTicket(row, {
952
981
  includeDetail,
@@ -962,6 +991,7 @@ export const listTicketsInRunContext = (ticket, options = {}) => {
962
991
  worktreeRecordsCache,
963
992
  githubConnectionCache,
964
993
  bundlePullRequestCache,
994
+ bundleAutomationStateCache,
965
995
  }))
966
996
  .filter((entry) => entry !== null));
967
997
  }