hungry-ghost-hive 0.18.2 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -0
- package/dist/agents/tech-lead.js +2 -2
- package/dist/agents/tech-lead.js.map +1 -1
- package/dist/cli/commands/assign.d.ts.map +1 -1
- package/dist/cli/commands/assign.js +12 -0
- package/dist/cli/commands/assign.js.map +1 -1
- package/dist/cli/commands/cluster.d.ts +3 -0
- package/dist/cli/commands/cluster.d.ts.map +1 -0
- package/dist/cli/commands/cluster.js +84 -0
- package/dist/cli/commands/cluster.js.map +1 -0
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/manager.d.ts.map +1 -1
- package/dist/cli/commands/manager.js +80 -100
- package/dist/cli/commands/manager.js.map +1 -1
- package/dist/cli/commands/pr.d.ts.map +1 -1
- package/dist/cli/commands/pr.js +30 -19
- package/dist/cli/commands/pr.js.map +1 -1
- package/dist/cli/commands/req.d.ts.map +1 -1
- package/dist/cli/commands/req.js +22 -6
- package/dist/cli/commands/req.js.map +1 -1
- package/dist/cli/commands/resume.d.ts.map +1 -1
- package/dist/cli/commands/resume.js +3 -2
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli-runtimes/index.d.ts +12 -0
- package/dist/cli-runtimes/index.d.ts.map +1 -1
- package/dist/cli-runtimes/index.js +43 -0
- package/dist/cli-runtimes/index.js.map +1 -1
- package/dist/cli-runtimes/index.test.js +33 -1
- package/dist/cli-runtimes/index.test.js.map +1 -1
- package/dist/cluster/distributed-edge-cases.test.d.ts +2 -0
- package/dist/cluster/distributed-edge-cases.test.d.ts.map +1 -0
- package/dist/cluster/distributed-edge-cases.test.js +476 -0
- package/dist/cluster/distributed-edge-cases.test.js.map +1 -0
- package/dist/cluster/distributed-runtime-coverage.test.d.ts +2 -0
- package/dist/cluster/distributed-runtime-coverage.test.d.ts.map +1 -0
- package/dist/cluster/distributed-runtime-coverage.test.js +614 -0
- package/dist/cluster/distributed-runtime-coverage.test.js.map +1 -0
- package/dist/cluster/distributed-system.test.d.ts +2 -0
- package/dist/cluster/distributed-system.test.d.ts.map +1 -0
- package/dist/cluster/distributed-system.test.js +505 -0
- package/dist/cluster/distributed-system.test.js.map +1 -0
- package/dist/cluster/index.d.ts +4 -0
- package/dist/cluster/index.d.ts.map +1 -0
- package/dist/cluster/index.js +2 -0
- package/dist/cluster/index.js.map +1 -0
- package/dist/cluster/integration.test.d.ts +2 -0
- package/dist/cluster/integration.test.d.ts.map +1 -0
- package/dist/cluster/integration.test.js +170 -0
- package/dist/cluster/integration.test.js.map +1 -0
- package/dist/cluster/raft-store.d.ts +61 -0
- package/dist/cluster/raft-store.d.ts.map +1 -0
- package/dist/cluster/raft-store.js +195 -0
- package/dist/cluster/raft-store.js.map +1 -0
- package/dist/cluster/replication.d.ts +26 -0
- package/dist/cluster/replication.d.ts.map +1 -0
- package/dist/cluster/replication.js +944 -0
- package/dist/cluster/replication.js.map +1 -0
- package/dist/cluster/replication.test.d.ts +2 -0
- package/dist/cluster/replication.test.d.ts.map +1 -0
- package/dist/cluster/replication.test.js +113 -0
- package/dist/cluster/replication.test.js.map +1 -0
- package/dist/cluster/runtime.d.ts +83 -0
- package/dist/cluster/runtime.d.ts.map +1 -0
- package/dist/cluster/runtime.js +561 -0
- package/dist/cluster/runtime.js.map +1 -0
- package/dist/cluster/runtime.test.d.ts +2 -0
- package/dist/cluster/runtime.test.d.ts.map +1 -0
- package/dist/cluster/runtime.test.js +138 -0
- package/dist/cluster/runtime.test.js.map +1 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +15 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/loader.test.d.ts +2 -0
- package/dist/config/loader.test.d.ts.map +1 -0
- package/dist/config/loader.test.js +44 -0
- package/dist/config/loader.test.js.map +1 -0
- package/dist/config/schema.d.ts +164 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +62 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/config/schema.test.js +33 -2
- package/dist/config/schema.test.js.map +1 -1
- package/dist/context-files/index.test.js +14 -0
- package/dist/context-files/index.test.js.map +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +8 -0
- package/dist/db/client.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/orchestrator/scheduler.d.ts +2 -3
- package/dist/orchestrator/scheduler.d.ts.map +1 -1
- package/dist/orchestrator/scheduler.js +11 -19
- package/dist/orchestrator/scheduler.js.map +1 -1
- package/dist/orchestrator/scheduler.test.js +15 -1
- package/dist/orchestrator/scheduler.test.js.map +1 -1
- package/dist/utils/pr-sync.d.ts.map +1 -1
- package/dist/utils/pr-sync.js +47 -22
- package/dist/utils/pr-sync.js.map +1 -1
- package/dist/utils/pr-sync.test.js +33 -0
- package/dist/utils/pr-sync.test.js.map +1 -1
- package/package.json +1 -1
- package/src/agents/tech-lead.ts +2 -2
- package/src/cli/commands/assign.ts +21 -0
- package/src/cli/commands/cluster.ts +124 -0
- package/src/cli/commands/index.ts +1 -0
- package/src/cli/commands/manager.ts +118 -127
- package/src/cli/commands/pr.ts +32 -19
- package/src/cli/commands/req.ts +38 -6
- package/src/cli/commands/resume.ts +11 -2
- package/src/cli-runtimes/index.test.ts +43 -0
- package/src/cli-runtimes/index.ts +47 -0
- package/src/cluster/distributed-edge-cases.test.ts +675 -0
- package/src/cluster/distributed-runtime-coverage.test.ts +768 -0
- package/src/cluster/distributed-system.test.ts +730 -0
- package/src/cluster/index.ts +3 -0
- package/src/cluster/integration.test.ts +231 -0
- package/src/cluster/raft-store.ts +282 -0
- package/src/cluster/replication.test.ts +179 -0
- package/src/cluster/replication.ts +1279 -0
- package/src/cluster/runtime.test.ts +174 -0
- package/src/cluster/runtime.ts +773 -0
- package/src/config/loader.test.ts +57 -0
- package/src/config/loader.ts +21 -0
- package/src/config/schema.test.ts +37 -2
- package/src/config/schema.ts +66 -2
- package/src/context-files/index.test.ts +14 -0
- package/src/db/client.ts +16 -0
- package/src/index.ts +2 -0
- package/src/orchestrator/scheduler.test.ts +18 -1
- package/src/orchestrator/scheduler.ts +15 -15
- package/src/utils/pr-sync.test.ts +44 -0
- package/src/utils/pr-sync.ts +75 -32
package/README.md
CHANGED
|
@@ -209,6 +209,10 @@ hive manager health
|
|
|
209
209
|
# Nudge a specific agent
|
|
210
210
|
hive manager nudge <session>
|
|
211
211
|
hive manager nudge hive-senior-alpha -m "Check the failing tests"
|
|
212
|
+
|
|
213
|
+
# Cluster status (when cluster.enabled=true)
|
|
214
|
+
hive cluster status
|
|
215
|
+
hive cluster status --json
|
|
212
216
|
```
|
|
213
217
|
|
|
214
218
|
### Communication
|
|
@@ -309,8 +313,35 @@ qa:
|
|
|
309
313
|
- npm run type-check
|
|
310
314
|
build_command: npm run build
|
|
311
315
|
test_command: npm test
|
|
316
|
+
|
|
317
|
+
# Optional distributed mode (HTTP + peer replication)
|
|
318
|
+
cluster:
|
|
319
|
+
enabled: false
|
|
320
|
+
node_id: node-a
|
|
321
|
+
listen_host: 0.0.0.0
|
|
322
|
+
listen_port: 8787
|
|
323
|
+
public_url: http://203.0.113.10:8787
|
|
324
|
+
peers:
|
|
325
|
+
- id: node-b
|
|
326
|
+
url: http://198.51.100.20:8787
|
|
327
|
+
- id: node-c
|
|
328
|
+
url: http://192.0.2.30:8787
|
|
329
|
+
heartbeat_interval_ms: 2000
|
|
330
|
+
election_timeout_min_ms: 3000
|
|
331
|
+
election_timeout_max_ms: 6000
|
|
332
|
+
sync_interval_ms: 5000
|
|
333
|
+
request_timeout_ms: 5000
|
|
334
|
+
story_similarity_threshold: 0.92
|
|
312
335
|
```
|
|
313
336
|
|
|
337
|
+
### Distributed Mode
|
|
338
|
+
|
|
339
|
+
- Run `hive manager start` on every host in the same cluster.
|
|
340
|
+
- Each host runs manager/scheduler runtime, but only one node is elected leader at a time.
|
|
341
|
+
- Leader is the only node allowed to run orchestration decisions (`assign`, scheduler loops, tech lead spawn).
|
|
342
|
+
- Followers stay in sync and do not schedule work.
|
|
343
|
+
- State replication is logical row/event sync over HTTP (no centralized DB).
|
|
344
|
+
|
|
314
345
|
## Escalation Protocol
|
|
315
346
|
|
|
316
347
|
When agents get stuck, they escalate:
|
package/dist/agents/tech-lead.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getCliRuntimeBuilder } from '../cli-runtimes/index.js';
|
|
1
|
+
import { getCliRuntimeBuilder, resolveRuntimeModelForCli } from '../cli-runtimes/index.js';
|
|
2
2
|
import { loadConfig } from '../config/index.js';
|
|
3
3
|
import { queryAll } from '../db/client.js';
|
|
4
4
|
import { createAgent, getAgentsByType, updateAgent } from '../db/queries/agents.js';
|
|
@@ -215,7 +215,7 @@ Respond in JSON format:
|
|
|
215
215
|
const config = loadConfig(paths.hiveDir);
|
|
216
216
|
const agentConfig = config.models.senior;
|
|
217
217
|
const cliTool = agentConfig.cli_tool;
|
|
218
|
-
const model = agentConfig.model;
|
|
218
|
+
const model = resolveRuntimeModelForCli(agentConfig.model, cliTool);
|
|
219
219
|
// Build spawn command using CLI runtime builder (spawn fresh session, will be resumed later)
|
|
220
220
|
const runtimeBuilder = getCliRuntimeBuilder(cliTool);
|
|
221
221
|
const commandArray = runtimeBuilder.buildSpawnCommand(model);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tech-lead.js","sourceRoot":"","sources":["../../src/agents/tech-lead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"tech-lead.js","sourceRoot":"","sources":["../../src/agents/tech-lead.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assign.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/assign.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"assign.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/assign.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,aAAa,SA0KtB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import ora from 'ora';
|
|
4
|
+
import { fetchLocalClusterStatus } from '../../cluster/runtime.js';
|
|
4
5
|
import { loadConfig } from '../../config/loader.js';
|
|
5
6
|
import { getRequirementById } from '../../db/queries/requirements.js';
|
|
6
7
|
import { getPlannedStories } from '../../db/queries/stories.js';
|
|
@@ -18,6 +19,17 @@ export const assignCommand = new Command('assign')
|
|
|
18
19
|
const spinner = ora('Assigning stories...').start();
|
|
19
20
|
try {
|
|
20
21
|
const config = loadConfig(paths.hiveDir);
|
|
22
|
+
if (config.cluster.enabled) {
|
|
23
|
+
const clusterStatus = await fetchLocalClusterStatus(config.cluster);
|
|
24
|
+
if (!clusterStatus) {
|
|
25
|
+
spinner.fail(chalk.red('Cluster mode is enabled, but local cluster runtime is unavailable. Start manager first.'));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
if (!clusterStatus.is_leader) {
|
|
29
|
+
spinner.fail(chalk.red(`Only the cluster leader can assign stories (leader: ${clusterStatus.leader_id || 'unknown'}).`));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
21
33
|
// Check if godmode is active
|
|
22
34
|
const plannedStories = getPlannedStories(db.db);
|
|
23
35
|
let godmodeActive = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assign.js","sourceRoot":"","sources":["../../../src/cli/commands/assign.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"assign.js","sourceRoot":"","sources":["../../../src/cli/commands/assign.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cluster.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,cAAc,SAAuE,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { fetchClusterStatusFromUrl, fetchLocalClusterStatus } from '../../cluster/runtime.js';
|
|
4
|
+
import { loadConfig } from '../../config/loader.js';
|
|
5
|
+
import { findHiveRoot, getHivePaths } from '../../utils/paths.js';
|
|
6
|
+
export const clusterCommand = new Command('cluster').description('Distributed cluster operations');
|
|
7
|
+
clusterCommand
|
|
8
|
+
.command('status')
|
|
9
|
+
.description('Show local and peer cluster status')
|
|
10
|
+
.option('--json', 'Output as JSON')
|
|
11
|
+
.action(async (options) => {
|
|
12
|
+
const root = findHiveRoot();
|
|
13
|
+
if (!root) {
|
|
14
|
+
console.error(chalk.red('Not in a Hive workspace.'));
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const paths = getHivePaths(root);
|
|
18
|
+
const config = loadConfig(paths.hiveDir);
|
|
19
|
+
if (!config.cluster.enabled) {
|
|
20
|
+
if (options.json) {
|
|
21
|
+
console.log(JSON.stringify({
|
|
22
|
+
enabled: false,
|
|
23
|
+
message: 'Cluster mode is disabled (set cluster.enabled=true in .hive/hive.config.yaml).',
|
|
24
|
+
}, null, 2));
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
console.log(chalk.yellow('Cluster mode is disabled.'));
|
|
28
|
+
console.log(chalk.gray('Set `cluster.enabled: true` in `.hive/hive.config.yaml` to enable.'));
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const local = await fetchLocalClusterStatus(config.cluster);
|
|
33
|
+
const peerStatuses = await Promise.all(config.cluster.peers.map(async (peer) => {
|
|
34
|
+
const status = await fetchClusterStatusFromUrl(`${peer.url.replace(/\/$/, '')}/cluster/v1/status`, {
|
|
35
|
+
authToken: config.cluster.auth_token,
|
|
36
|
+
timeoutMs: config.cluster.request_timeout_ms,
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
id: peer.id,
|
|
40
|
+
url: peer.url,
|
|
41
|
+
reachable: status !== null,
|
|
42
|
+
status,
|
|
43
|
+
};
|
|
44
|
+
}));
|
|
45
|
+
const payload = {
|
|
46
|
+
enabled: true,
|
|
47
|
+
quorum: Math.floor((config.cluster.peers.length + 1) / 2) + 1,
|
|
48
|
+
local,
|
|
49
|
+
peers: peerStatuses,
|
|
50
|
+
};
|
|
51
|
+
if (options.json) {
|
|
52
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
console.log(chalk.bold('\nCluster Status\n'));
|
|
56
|
+
console.log(chalk.gray(`Node ID: ${config.cluster.node_id}`));
|
|
57
|
+
console.log(chalk.gray(`Public URL: ${config.cluster.public_url}`));
|
|
58
|
+
console.log(chalk.gray(`Quorum: ${payload.quorum}`));
|
|
59
|
+
if (!local) {
|
|
60
|
+
console.log(chalk.red('\nLocal runtime: unavailable'));
|
|
61
|
+
console.log(chalk.gray('Start it with: hive manager start'));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const roleColor = local.is_leader ? chalk.green : chalk.yellow;
|
|
65
|
+
console.log(chalk.bold('\nLocal Runtime'));
|
|
66
|
+
console.log(`${roleColor(local.role.toUpperCase())} term=${local.term} leader=${local.leader_id || 'unknown'} voted_for=${local.voted_for || '-'}`);
|
|
67
|
+
console.log(chalk.gray(`Raft: commit=${local.raft_commit_index} applied=${local.raft_last_applied} last_log=${local.raft_last_log_index}`));
|
|
68
|
+
}
|
|
69
|
+
console.log(chalk.bold('\nPeers'));
|
|
70
|
+
if (peerStatuses.length === 0) {
|
|
71
|
+
console.log(chalk.gray('No peers configured.'));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
for (const peer of peerStatuses) {
|
|
75
|
+
if (!peer.reachable || !peer.status) {
|
|
76
|
+
console.log(`${chalk.red('UNREACHABLE')} ${peer.id} ${chalk.gray(peer.url)}`);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const marker = peer.status.is_leader ? chalk.green('LEADER') : chalk.yellow(peer.status.role);
|
|
80
|
+
console.log(`${marker} ${peer.id} term=${peer.status.term} leader=${peer.status.leader_id || 'unknown'} ${chalk.gray(peer.url)}`);
|
|
81
|
+
}
|
|
82
|
+
console.log();
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=cluster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster.js","sourceRoot":"","sources":["../../../src/cli/commands/cluster.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ export { addRepoCommand } from './add-repo.js';
|
|
|
2
2
|
export { agentsCommand } from './agents.js';
|
|
3
3
|
export { assignCommand } from './assign.js';
|
|
4
4
|
export { cleanupCommand } from './cleanup.js';
|
|
5
|
+
export { clusterCommand } from './cluster.js';
|
|
5
6
|
export { configCommand } from './config.js';
|
|
6
7
|
export { escalationsCommand } from './escalations.js';
|
|
7
8
|
export { initCommand } from './init.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -2,6 +2,7 @@ export { addRepoCommand } from './add-repo.js';
|
|
|
2
2
|
export { agentsCommand } from './agents.js';
|
|
3
3
|
export { assignCommand } from './assign.js';
|
|
4
4
|
export { cleanupCommand } from './cleanup.js';
|
|
5
|
+
export { clusterCommand } from './cluster.js';
|
|
5
6
|
export { configCommand } from './config.js';
|
|
6
7
|
export { escalationsCommand } from './escalations.js';
|
|
7
8
|
export { initCommand } from './init.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4FpC,eAAO,MAAM,cAAc,SAE1B,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { Command } from 'commander';
|
|
3
|
-
import { execa } from 'execa';
|
|
4
3
|
import { join } from 'path';
|
|
4
|
+
import { ClusterRuntime, fetchLocalClusterStatus } from '../../cluster/runtime.js';
|
|
5
5
|
import { loadConfig } from '../../config/loader.js';
|
|
6
6
|
import { queryAll, withTransaction } from '../../db/client.js';
|
|
7
7
|
import { acquireLock } from '../../db/lock.js';
|
|
@@ -11,14 +11,12 @@ import { createLog } from '../../db/queries/logs.js';
|
|
|
11
11
|
import { getAllPendingMessages, markMessagesRead, } from '../../db/queries/messages.js';
|
|
12
12
|
import { backfillGithubPrNumbers, getMergeQueue, getPullRequestsByStatus, updatePullRequest, } from '../../db/queries/pull-requests.js';
|
|
13
13
|
import { getStoriesByStatus, updateStory, updateStoryAssignment, } from '../../db/queries/stories.js';
|
|
14
|
-
import { getAllTeams } from '../../db/queries/teams.js';
|
|
15
14
|
import { Scheduler } from '../../orchestrator/scheduler.js';
|
|
16
|
-
import { autoApprovePermission, captureTmuxPane, forceBypassMode, getHiveSessions, isManagerRunning, killTmuxSession, sendEnterToTmuxSession, sendMessageWithConfirmation, sendToTmuxSession, stopManager as stopManagerSession, } from '../../tmux/manager.js';
|
|
15
|
+
import { autoApprovePermission, captureTmuxPane, forceBypassMode, getHiveSessions, isManagerRunning, isTmuxSessionRunning, killTmuxSession, sendEnterToTmuxSession, sendMessageWithConfirmation, sendToTmuxSession, stopManager as stopManagerSession, } from '../../tmux/manager.js';
|
|
17
16
|
import { autoMergeApprovedPRs } from '../../utils/auto-merge.js';
|
|
18
17
|
import { ClaudeCodeState, detectClaudeCodeState, getStateDescription, } from '../../utils/claude-code-state.js';
|
|
19
18
|
import { buildAutoRecoveryReminder, getAvailableCommands, } from '../../utils/cli-commands.js';
|
|
20
|
-
import {
|
|
21
|
-
import { extractStoryIdFromBranch } from '../../utils/story-id.js';
|
|
19
|
+
import { syncAllTeamOpenPRs, syncMergedPRsFromGitHub } from '../../utils/pr-sync.js';
|
|
22
20
|
import { withHiveContext, withHiveRoot } from '../../utils/with-hive-context.js';
|
|
23
21
|
// --- Named constants (extracted from inline magic numbers) ---
|
|
24
22
|
/** Number of tmux pane lines to capture for agent state detection */
|
|
@@ -37,10 +35,6 @@ const IDLE_SPINDOWN_DELAY_MS = 500;
|
|
|
37
35
|
const POST_NUDGE_DELAY_MS = 100;
|
|
38
36
|
/** Delay in ms between forwarding messages to an agent */
|
|
39
37
|
const MESSAGE_FORWARD_DELAY_MS = 100;
|
|
40
|
-
/** Limit for GitHub PR list queries */
|
|
41
|
-
const GITHUB_PR_LIST_LIMIT = 20;
|
|
42
|
-
/** Minutes a story can be in_progress before being considered stuck */
|
|
43
|
-
const STUCK_STORY_THRESHOLD_MINUTES = 30;
|
|
44
38
|
// In-memory state tracking per agent session
|
|
45
39
|
const agentStates = new Map();
|
|
46
40
|
export const managerCommand = new Command('manager').description('Micromanager daemon that keeps agents productive');
|
|
@@ -54,6 +48,7 @@ managerCommand
|
|
|
54
48
|
const { root, paths } = withHiveRoot(ctx => ctx);
|
|
55
49
|
// Load config first to get all settings
|
|
56
50
|
const config = loadConfig(paths.hiveDir);
|
|
51
|
+
let clusterRuntime = null;
|
|
57
52
|
const lockPath = join(paths.hiveDir, 'manager.lock');
|
|
58
53
|
// Acquire manager lock to ensure singleton
|
|
59
54
|
let releaseLock = null;
|
|
@@ -72,20 +67,30 @@ managerCommand
|
|
|
72
67
|
await releaseLock();
|
|
73
68
|
console.log(chalk.gray('\nManager lock released'));
|
|
74
69
|
}
|
|
70
|
+
if (clusterRuntime) {
|
|
71
|
+
await clusterRuntime.stop();
|
|
72
|
+
}
|
|
75
73
|
process.exit(0);
|
|
76
74
|
};
|
|
77
75
|
process.on('SIGINT', cleanup);
|
|
78
76
|
process.on('SIGTERM', cleanup);
|
|
77
|
+
if (config.cluster.enabled) {
|
|
78
|
+
clusterRuntime = new ClusterRuntime(config.cluster, { hiveDir: paths.hiveDir });
|
|
79
|
+
await clusterRuntime.start();
|
|
80
|
+
console.log(chalk.gray(`Cluster runtime started for ${config.cluster.node_id} (${config.cluster.public_url})`));
|
|
81
|
+
}
|
|
79
82
|
// Support two modes: legacy single-interval and new two-tier polling
|
|
80
83
|
const useTwoTier = options.interval === '60' && config.manager;
|
|
81
84
|
if (useTwoTier) {
|
|
82
85
|
// Two-tier polling - use slow interval (60s) by default to reduce interruptions
|
|
83
|
-
const slowInterval = config.
|
|
86
|
+
const slowInterval = config.cluster.enabled
|
|
87
|
+
? Math.min(config.manager.slow_poll_interval, config.cluster.sync_interval_ms)
|
|
88
|
+
: config.manager.slow_poll_interval;
|
|
84
89
|
console.log(chalk.cyan(`Manager started (polling every ${slowInterval / 1000}s)`));
|
|
85
90
|
console.log(chalk.gray('Press Ctrl+C to stop\n'));
|
|
86
91
|
const runCheck = async () => {
|
|
87
92
|
try {
|
|
88
|
-
await managerCheck(root, config);
|
|
93
|
+
await managerCheck(root, config, clusterRuntime);
|
|
89
94
|
}
|
|
90
95
|
catch (err) {
|
|
91
96
|
console.error(chalk.red('Manager error:'), err);
|
|
@@ -97,16 +102,22 @@ managerCommand
|
|
|
97
102
|
}
|
|
98
103
|
else if (releaseLock) {
|
|
99
104
|
await releaseLock();
|
|
105
|
+
if (clusterRuntime) {
|
|
106
|
+
await clusterRuntime.stop();
|
|
107
|
+
}
|
|
100
108
|
}
|
|
101
109
|
}
|
|
102
110
|
else {
|
|
103
111
|
// Legacy mode: single interval
|
|
104
|
-
const
|
|
105
|
-
|
|
112
|
+
const requestedInterval = parseInt(options.interval, 10) * 1000;
|
|
113
|
+
const interval = config.cluster.enabled
|
|
114
|
+
? Math.min(requestedInterval, config.cluster.sync_interval_ms)
|
|
115
|
+
: requestedInterval;
|
|
116
|
+
console.log(chalk.cyan(`Manager started (checking every ${interval / 1000}s)`));
|
|
106
117
|
console.log(chalk.gray('Press Ctrl+C to stop\n'));
|
|
107
118
|
const runCheck = async () => {
|
|
108
119
|
try {
|
|
109
|
-
await managerCheck(root, config);
|
|
120
|
+
await managerCheck(root, config, clusterRuntime);
|
|
110
121
|
}
|
|
111
122
|
catch (err) {
|
|
112
123
|
console.error(chalk.red('Manager error:'), err);
|
|
@@ -118,6 +129,9 @@ managerCommand
|
|
|
118
129
|
}
|
|
119
130
|
else if (releaseLock) {
|
|
120
131
|
await releaseLock();
|
|
132
|
+
if (clusterRuntime) {
|
|
133
|
+
await clusterRuntime.stop();
|
|
134
|
+
}
|
|
121
135
|
}
|
|
122
136
|
}
|
|
123
137
|
});
|
|
@@ -128,6 +142,17 @@ managerCommand
|
|
|
128
142
|
.action(async () => {
|
|
129
143
|
const { root, paths } = withHiveRoot(ctx => ctx);
|
|
130
144
|
const config = loadConfig(paths.hiveDir);
|
|
145
|
+
if (config.cluster.enabled) {
|
|
146
|
+
const clusterStatus = await fetchLocalClusterStatus(config.cluster);
|
|
147
|
+
if (!clusterStatus) {
|
|
148
|
+
console.error(chalk.red('Cluster mode is enabled, but local cluster runtime is unavailable. Start manager first.'));
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
if (!clusterStatus.is_leader) {
|
|
152
|
+
console.log(chalk.yellow(`Skipping manager check on follower node (leader: ${clusterStatus.leader_id || 'unknown'}).`));
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
131
156
|
await managerCheck(root, config);
|
|
132
157
|
});
|
|
133
158
|
// Run health check to sync agents with tmux
|
|
@@ -137,6 +162,17 @@ managerCommand
|
|
|
137
162
|
.action(async () => {
|
|
138
163
|
await withHiveContext(async ({ root, paths, db }) => {
|
|
139
164
|
const config = loadConfig(paths.hiveDir);
|
|
165
|
+
if (config.cluster.enabled) {
|
|
166
|
+
const clusterStatus = await fetchLocalClusterStatus(config.cluster);
|
|
167
|
+
if (!clusterStatus) {
|
|
168
|
+
console.error(chalk.red('Cluster mode is enabled, but local cluster runtime is unavailable. Start manager first.'));
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
if (!clusterStatus.is_leader) {
|
|
172
|
+
console.log(chalk.yellow(`Skipping health orchestration on follower node (leader: ${clusterStatus.leader_id || 'unknown'}).`));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
140
176
|
const scheduler = new Scheduler(db.db, {
|
|
141
177
|
scaling: config.scaling,
|
|
142
178
|
models: config.models,
|
|
@@ -204,7 +240,7 @@ managerCommand
|
|
|
204
240
|
console.log(chalk.green(`Nudged ${session}`));
|
|
205
241
|
});
|
|
206
242
|
});
|
|
207
|
-
async function managerCheck(root, config) {
|
|
243
|
+
async function managerCheck(root, config, clusterRuntime) {
|
|
208
244
|
const timestamp = new Date().toLocaleTimeString();
|
|
209
245
|
console.log(chalk.gray(`[${timestamp}] Manager checking...`));
|
|
210
246
|
await withHiveContext(async ({ paths, db }) => {
|
|
@@ -212,6 +248,30 @@ async function managerCheck(root, config) {
|
|
|
212
248
|
if (!config) {
|
|
213
249
|
config = loadConfig(paths.hiveDir);
|
|
214
250
|
}
|
|
251
|
+
if (clusterRuntime?.isEnabled()) {
|
|
252
|
+
const syncResult = await clusterRuntime.sync(db.db);
|
|
253
|
+
if (!clusterRuntime.isLeader()) {
|
|
254
|
+
const status = clusterRuntime.getStatus();
|
|
255
|
+
if (await isTmuxSessionRunning('hive-tech-lead')) {
|
|
256
|
+
await killTmuxSession('hive-tech-lead');
|
|
257
|
+
}
|
|
258
|
+
const details = [];
|
|
259
|
+
if (syncResult.local_events_emitted > 0) {
|
|
260
|
+
details.push(`${syncResult.local_events_emitted} local events`);
|
|
261
|
+
}
|
|
262
|
+
if (syncResult.imported_events_applied > 0) {
|
|
263
|
+
details.push(`${syncResult.imported_events_applied} imported events`);
|
|
264
|
+
}
|
|
265
|
+
if (syncResult.merged_duplicate_stories > 0) {
|
|
266
|
+
details.push(`${syncResult.merged_duplicate_stories} merged stories`);
|
|
267
|
+
}
|
|
268
|
+
console.log(chalk.gray(` Cluster follower mode (leader: ${status.leader_id || 'unknown'})${details.length > 0 ? `, ${details.join(', ')}` : ''}`));
|
|
269
|
+
db.save();
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const leaderStatus = clusterRuntime.getStatus();
|
|
273
|
+
console.log(chalk.gray(` Cluster leader mode (${leaderStatus.node_id}, term ${leaderStatus.term})`));
|
|
274
|
+
}
|
|
215
275
|
const ctx = {
|
|
216
276
|
root,
|
|
217
277
|
config,
|
|
@@ -294,13 +354,13 @@ async function runAutoMerge(ctx) {
|
|
|
294
354
|
}
|
|
295
355
|
}
|
|
296
356
|
async function syncMergedPRs(ctx) {
|
|
297
|
-
const mergedSynced = await syncMergedPRsFromGitHub(ctx.root, ctx.db);
|
|
357
|
+
const mergedSynced = await syncMergedPRsFromGitHub(ctx.root, ctx.db.db, () => ctx.db.save());
|
|
298
358
|
if (mergedSynced > 0) {
|
|
299
359
|
console.log(chalk.green(` Synced ${mergedSynced} merged story(ies) from GitHub`));
|
|
300
360
|
}
|
|
301
361
|
}
|
|
302
362
|
async function syncOpenPRs(ctx) {
|
|
303
|
-
const syncedPRs = await
|
|
363
|
+
const syncedPRs = await syncAllTeamOpenPRs(ctx.root, ctx.db.db, () => ctx.db.save());
|
|
304
364
|
if (syncedPRs > 0) {
|
|
305
365
|
console.log(chalk.yellow(` Synced ${syncedPRs} GitHub PR(s) into merge queue`));
|
|
306
366
|
await ctx.scheduler.checkMergeQueue();
|
|
@@ -605,9 +665,11 @@ async function spinDownIdleAgents(ctx) {
|
|
|
605
665
|
}
|
|
606
666
|
}
|
|
607
667
|
async function nudgeStuckStories(ctx) {
|
|
668
|
+
const stuckThresholdMs = Math.max(1, ctx.config.manager.stuck_threshold_ms);
|
|
669
|
+
const staleUpdatedAt = new Date(Date.now() - stuckThresholdMs).toISOString();
|
|
608
670
|
const stuckStories = queryAll(ctx.db.db, `SELECT * FROM stories
|
|
609
671
|
WHERE status = 'in_progress'
|
|
610
|
-
AND updated_at <
|
|
672
|
+
AND updated_at < ?`, [staleUpdatedAt]).filter(story => !['merged', 'completed'].includes(story.status));
|
|
611
673
|
for (const story of stuckStories) {
|
|
612
674
|
if (!story.assigned_agent_id)
|
|
613
675
|
continue;
|
|
@@ -723,87 +785,5 @@ async function forwardMessages(sessionName, messages, cliTool = 'claude') {
|
|
|
723
785
|
await new Promise(resolve => setTimeout(resolve, MESSAGE_FORWARD_DELAY_MS));
|
|
724
786
|
}
|
|
725
787
|
}
|
|
726
|
-
async function syncMergedPRsFromGitHub(root, db) {
|
|
727
|
-
const teams = getAllTeams(db.db);
|
|
728
|
-
if (teams.length === 0)
|
|
729
|
-
return 0;
|
|
730
|
-
let storiesUpdated = 0;
|
|
731
|
-
for (const team of teams) {
|
|
732
|
-
if (!team.repo_path)
|
|
733
|
-
continue;
|
|
734
|
-
const repoDir = `${root}/${team.repo_path}`;
|
|
735
|
-
try {
|
|
736
|
-
// Get recently merged PRs from GitHub
|
|
737
|
-
const result = await execa('gh', [
|
|
738
|
-
'pr',
|
|
739
|
-
'list',
|
|
740
|
-
'--json',
|
|
741
|
-
'number,headRefName,mergedAt',
|
|
742
|
-
'--state',
|
|
743
|
-
'merged',
|
|
744
|
-
'--limit',
|
|
745
|
-
String(GITHUB_PR_LIST_LIMIT),
|
|
746
|
-
], {
|
|
747
|
-
cwd: repoDir,
|
|
748
|
-
});
|
|
749
|
-
const mergedPRs = JSON.parse(result.stdout);
|
|
750
|
-
for (const pr of mergedPRs) {
|
|
751
|
-
// Extract story ID from branch name using unified pattern
|
|
752
|
-
const storyId = extractStoryIdFromBranch(pr.headRefName);
|
|
753
|
-
if (!storyId)
|
|
754
|
-
continue;
|
|
755
|
-
// Check if story exists and isn't already merged
|
|
756
|
-
const story = queryAll(db.db, "SELECT * FROM stories WHERE id = ? AND status != 'merged'", [storyId]);
|
|
757
|
-
if (story.length > 0) {
|
|
758
|
-
// Update story to merged (atomic transaction)
|
|
759
|
-
await withTransaction(db.db, () => {
|
|
760
|
-
updateStory(db.db, storyId, { status: 'merged', assignedAgentId: null });
|
|
761
|
-
// Log the sync
|
|
762
|
-
createLog(db.db, {
|
|
763
|
-
agentId: 'manager',
|
|
764
|
-
storyId: storyId,
|
|
765
|
-
eventType: 'STORY_MERGED',
|
|
766
|
-
message: `Story synced to merged from GitHub PR #${pr.number}`,
|
|
767
|
-
});
|
|
768
|
-
});
|
|
769
|
-
storiesUpdated++;
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
catch (_error) {
|
|
774
|
-
// gh CLI might not be authenticated or repo might not have remote
|
|
775
|
-
continue;
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
if (storiesUpdated > 0) {
|
|
779
|
-
db.save();
|
|
780
|
-
}
|
|
781
|
-
return storiesUpdated;
|
|
782
|
-
}
|
|
783
|
-
async function syncGitHubPRs(root, db, _hiveDir) {
|
|
784
|
-
const teams = getAllTeams(db.db);
|
|
785
|
-
if (teams.length === 0)
|
|
786
|
-
return 0;
|
|
787
|
-
// Include ALL branch names (including merged/closed) to prevent duplicate entries
|
|
788
|
-
const { existingBranches, existingPrNumbers } = getExistingPRIdentifiers(db.db, true);
|
|
789
|
-
let synced = 0;
|
|
790
|
-
for (const team of teams) {
|
|
791
|
-
if (!team.repo_path)
|
|
792
|
-
continue;
|
|
793
|
-
const repoDir = `${root}/${team.repo_path}`;
|
|
794
|
-
try {
|
|
795
|
-
const result = await syncOpenGitHubPRs(db.db, repoDir, team.id, existingBranches, existingPrNumbers);
|
|
796
|
-
synced += result.synced;
|
|
797
|
-
}
|
|
798
|
-
catch (_error) {
|
|
799
|
-
// gh CLI might not be authenticated or repo might not have remote
|
|
800
|
-
continue;
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
if (synced > 0) {
|
|
804
|
-
db.save();
|
|
805
|
-
}
|
|
806
|
-
return synced;
|
|
807
|
-
}
|
|
808
788
|
// autoMergeApprovedPRs moved to src/utils/auto-merge.ts for reuse in pr.ts
|
|
809
789
|
//# sourceMappingURL=manager.js.map
|