@generacy-ai/generacy 0.0.0-preview-20260304013206
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/LICENSE +191 -0
- package/README.md +207 -0
- package/bin/generacy.js +11 -0
- package/dist/agency/index.d.ts +68 -0
- package/dist/agency/index.d.ts.map +1 -0
- package/dist/agency/index.js +28 -0
- package/dist/agency/index.js.map +1 -0
- package/dist/agency/network.d.ts +41 -0
- package/dist/agency/network.d.ts.map +1 -0
- package/dist/agency/network.js +133 -0
- package/dist/agency/network.js.map +1 -0
- package/dist/agency/subprocess.d.ts +58 -0
- package/dist/agency/subprocess.d.ts.map +1 -0
- package/dist/agency/subprocess.js +216 -0
- package/dist/agency/subprocess.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +10 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +216 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.js +51 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.js.map +1 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.js +68 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.js.map +1 -0
- package/dist/cli/commands/doctor/checks/config.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/config.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/config.js +81 -0
- package/dist/cli/commands/doctor/checks/config.js.map +1 -0
- package/dist/cli/commands/doctor/checks/devcontainer.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/devcontainer.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/devcontainer.js +58 -0
- package/dist/cli/commands/doctor/checks/devcontainer.js.map +1 -0
- package/dist/cli/commands/doctor/checks/docker.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/docker.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/docker.js +71 -0
- package/dist/cli/commands/doctor/checks/docker.js.map +1 -0
- package/dist/cli/commands/doctor/checks/env-file.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/env-file.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/env-file.js +56 -0
- package/dist/cli/commands/doctor/checks/env-file.js.map +1 -0
- package/dist/cli/commands/doctor/checks/github-token.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/github-token.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/github-token.js +99 -0
- package/dist/cli/commands/doctor/checks/github-token.js.map +1 -0
- package/dist/cli/commands/doctor/checks/npm-packages.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/npm-packages.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/npm-packages.js +117 -0
- package/dist/cli/commands/doctor/checks/npm-packages.js.map +1 -0
- package/dist/cli/commands/doctor/formatter.d.ts +27 -0
- package/dist/cli/commands/doctor/formatter.d.ts.map +1 -0
- package/dist/cli/commands/doctor/formatter.js +162 -0
- package/dist/cli/commands/doctor/formatter.js.map +1 -0
- package/dist/cli/commands/doctor/index.d.ts +5 -0
- package/dist/cli/commands/doctor/index.d.ts.map +1 -0
- package/dist/cli/commands/doctor/index.js +8 -0
- package/dist/cli/commands/doctor/index.js.map +1 -0
- package/dist/cli/commands/doctor/registry.d.ts +48 -0
- package/dist/cli/commands/doctor/registry.d.ts.map +1 -0
- package/dist/cli/commands/doctor/registry.js +166 -0
- package/dist/cli/commands/doctor/registry.js.map +1 -0
- package/dist/cli/commands/doctor/runner.d.ts +14 -0
- package/dist/cli/commands/doctor/runner.d.ts.map +1 -0
- package/dist/cli/commands/doctor/runner.js +257 -0
- package/dist/cli/commands/doctor/runner.js.map +1 -0
- package/dist/cli/commands/doctor/types.d.ts +87 -0
- package/dist/cli/commands/doctor/types.d.ts.map +1 -0
- package/dist/cli/commands/doctor/types.js +2 -0
- package/dist/cli/commands/doctor/types.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +12 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +97 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init/conflicts.d.ts +36 -0
- package/dist/cli/commands/init/conflicts.d.ts.map +1 -0
- package/dist/cli/commands/init/conflicts.js +165 -0
- package/dist/cli/commands/init/conflicts.js.map +1 -0
- package/dist/cli/commands/init/github.d.ts +32 -0
- package/dist/cli/commands/init/github.d.ts.map +1 -0
- package/dist/cli/commands/init/github.js +161 -0
- package/dist/cli/commands/init/github.js.map +1 -0
- package/dist/cli/commands/init/index.d.ts +21 -0
- package/dist/cli/commands/init/index.d.ts.map +1 -0
- package/dist/cli/commands/init/index.js +175 -0
- package/dist/cli/commands/init/index.js.map +1 -0
- package/dist/cli/commands/init/prompts.d.ts +15 -0
- package/dist/cli/commands/init/prompts.d.ts.map +1 -0
- package/dist/cli/commands/init/prompts.js +281 -0
- package/dist/cli/commands/init/prompts.js.map +1 -0
- package/dist/cli/commands/init/repo-utils.d.ts +32 -0
- package/dist/cli/commands/init/repo-utils.d.ts.map +1 -0
- package/dist/cli/commands/init/repo-utils.js +112 -0
- package/dist/cli/commands/init/repo-utils.js.map +1 -0
- package/dist/cli/commands/init/resolver.d.ts +20 -0
- package/dist/cli/commands/init/resolver.d.ts.map +1 -0
- package/dist/cli/commands/init/resolver.js +273 -0
- package/dist/cli/commands/init/resolver.js.map +1 -0
- package/dist/cli/commands/init/summary.d.ts +21 -0
- package/dist/cli/commands/init/summary.d.ts.map +1 -0
- package/dist/cli/commands/init/summary.js +100 -0
- package/dist/cli/commands/init/summary.js.map +1 -0
- package/dist/cli/commands/init/types.d.ts +53 -0
- package/dist/cli/commands/init/types.d.ts.map +1 -0
- package/dist/cli/commands/init/types.js +2 -0
- package/dist/cli/commands/init/types.js.map +1 -0
- package/dist/cli/commands/init/writer.d.ts +22 -0
- package/dist/cli/commands/init/writer.d.ts.map +1 -0
- package/dist/cli/commands/init/writer.js +96 -0
- package/dist/cli/commands/init/writer.js.map +1 -0
- package/dist/cli/commands/orchestrator.d.ts +11 -0
- package/dist/cli/commands/orchestrator.d.ts.map +1 -0
- package/dist/cli/commands/orchestrator.js +291 -0
- package/dist/cli/commands/orchestrator.js.map +1 -0
- package/dist/cli/commands/run.d.ts +10 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +167 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup/auth.d.ts +11 -0
- package/dist/cli/commands/setup/auth.d.ts.map +1 -0
- package/dist/cli/commands/setup/auth.js +108 -0
- package/dist/cli/commands/setup/auth.js.map +1 -0
- package/dist/cli/commands/setup/build.d.ts +11 -0
- package/dist/cli/commands/setup/build.d.ts.map +1 -0
- package/dist/cli/commands/setup/build.js +212 -0
- package/dist/cli/commands/setup/build.js.map +1 -0
- package/dist/cli/commands/setup/services.d.ts +11 -0
- package/dist/cli/commands/setup/services.d.ts.map +1 -0
- package/dist/cli/commands/setup/services.js +294 -0
- package/dist/cli/commands/setup/services.js.map +1 -0
- package/dist/cli/commands/setup/workspace.d.ts +11 -0
- package/dist/cli/commands/setup/workspace.d.ts.map +1 -0
- package/dist/cli/commands/setup/workspace.js +215 -0
- package/dist/cli/commands/setup/workspace.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +7 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +19 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +10 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +164 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/worker.d.ts +10 -0
- package/dist/cli/commands/worker.d.ts.map +1 -0
- package/dist/cli/commands/worker.js +224 -0
- package/dist/cli/commands/worker.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +68 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/config.d.ts +49 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/config.js +110 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/cli/utils/exec.d.ts +39 -0
- package/dist/cli/utils/exec.d.ts.map +1 -0
- package/dist/cli/utils/exec.js +68 -0
- package/dist/cli/utils/exec.js.map +1 -0
- package/dist/cli/utils/logger.d.ts +47 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +97 -0
- package/dist/cli/utils/logger.js.map +1 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +13 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +104 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +266 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +304 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +160 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/validator.d.ts +60 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +112 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/health/server.d.ts +47 -0
- package/dist/health/server.d.ts.map +1 -0
- package/dist/health/server.js +92 -0
- package/dist/health/server.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/async-event-queue.d.ts +28 -0
- package/dist/orchestrator/async-event-queue.d.ts.map +1 -0
- package/dist/orchestrator/async-event-queue.js +57 -0
- package/dist/orchestrator/async-event-queue.js.map +1 -0
- package/dist/orchestrator/client.d.ts +110 -0
- package/dist/orchestrator/client.d.ts.map +1 -0
- package/dist/orchestrator/client.js +288 -0
- package/dist/orchestrator/client.js.map +1 -0
- package/dist/orchestrator/event-bus.d.ts +195 -0
- package/dist/orchestrator/event-bus.d.ts.map +1 -0
- package/dist/orchestrator/event-bus.js +557 -0
- package/dist/orchestrator/event-bus.js.map +1 -0
- package/dist/orchestrator/heartbeat.d.ts +71 -0
- package/dist/orchestrator/heartbeat.d.ts.map +1 -0
- package/dist/orchestrator/heartbeat.js +116 -0
- package/dist/orchestrator/heartbeat.js.map +1 -0
- package/dist/orchestrator/index.d.ts +25 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +15 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/job-handler.d.ts +109 -0
- package/dist/orchestrator/job-handler.d.ts.map +1 -0
- package/dist/orchestrator/job-handler.js +612 -0
- package/dist/orchestrator/job-handler.js.map +1 -0
- package/dist/orchestrator/job-queue.d.ts +81 -0
- package/dist/orchestrator/job-queue.d.ts.map +1 -0
- package/dist/orchestrator/job-queue.js +206 -0
- package/dist/orchestrator/job-queue.js.map +1 -0
- package/dist/orchestrator/label-monitor-bridge.d.ts +25 -0
- package/dist/orchestrator/label-monitor-bridge.d.ts.map +1 -0
- package/dist/orchestrator/label-monitor-bridge.js +57 -0
- package/dist/orchestrator/label-monitor-bridge.js.map +1 -0
- package/dist/orchestrator/log-buffer.d.ts +74 -0
- package/dist/orchestrator/log-buffer.d.ts.map +1 -0
- package/dist/orchestrator/log-buffer.js +104 -0
- package/dist/orchestrator/log-buffer.js.map +1 -0
- package/dist/orchestrator/redis-job-queue.d.ts +44 -0
- package/dist/orchestrator/redis-job-queue.d.ts.map +1 -0
- package/dist/orchestrator/redis-job-queue.js +300 -0
- package/dist/orchestrator/redis-job-queue.js.map +1 -0
- package/dist/orchestrator/router.d.ts +125 -0
- package/dist/orchestrator/router.d.ts.map +1 -0
- package/dist/orchestrator/router.js +143 -0
- package/dist/orchestrator/router.js.map +1 -0
- package/dist/orchestrator/server.d.ts +62 -0
- package/dist/orchestrator/server.d.ts.map +1 -0
- package/dist/orchestrator/server.js +711 -0
- package/dist/orchestrator/server.js.map +1 -0
- package/dist/orchestrator/types.d.ts +184 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +6 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/orchestrator/worker-registry.d.ts +110 -0
- package/dist/orchestrator/worker-registry.d.ts.map +1 -0
- package/dist/orchestrator/worker-registry.js +191 -0
- package/dist/orchestrator/worker-registry.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator command implementation.
|
|
3
|
+
* Starts the orchestrator HTTP server for worker coordination.
|
|
4
|
+
* Optionally enables label monitoring to watch GitHub repos for process:* labels.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { getLogger } from '../utils/logger.js';
|
|
8
|
+
import { createOrchestratorServer } from '../../orchestrator/index.js';
|
|
9
|
+
import { createJobQueue } from '../../orchestrator/redis-job-queue.js';
|
|
10
|
+
import { LabelMonitorBridge } from '../../orchestrator/label-monitor-bridge.js';
|
|
11
|
+
/**
|
|
12
|
+
* Create the orchestrator command
|
|
13
|
+
*/
|
|
14
|
+
export function orchestratorCommand() {
|
|
15
|
+
const command = new Command('orchestrator');
|
|
16
|
+
command
|
|
17
|
+
.description('Start the orchestrator server that coordinates workers and distributes jobs')
|
|
18
|
+
.option('-p, --port <port>', 'HTTP server port', '3100')
|
|
19
|
+
.option('-h, --host <host>', 'Host to bind to', '0.0.0.0')
|
|
20
|
+
.option('--worker-timeout <ms>', 'Worker heartbeat timeout in milliseconds', '60000')
|
|
21
|
+
.option('--auth-token <token>', 'Authentication token (or set ORCHESTRATOR_TOKEN env var)')
|
|
22
|
+
.option('--redis-url <url>', 'Redis URL for persistent job queue (or set REDIS_URL env var)')
|
|
23
|
+
.option('--label-monitor', 'Enable GitHub label monitoring (or set LABEL_MONITOR_ENABLED=true)')
|
|
24
|
+
.option('--poll-interval <ms>', 'Label monitor poll interval in milliseconds (or set POLL_INTERVAL_MS)')
|
|
25
|
+
.option('--monitored-repos <repos>', 'Comma-separated owner/repo list (or set MONITORED_REPOS)')
|
|
26
|
+
.action(async (options) => {
|
|
27
|
+
const logger = getLogger();
|
|
28
|
+
const port = parseInt(options['port'], 10);
|
|
29
|
+
const host = options['host'];
|
|
30
|
+
const workerTimeout = parseInt(options['workerTimeout'], 10);
|
|
31
|
+
const authToken = options['authToken'];
|
|
32
|
+
const redisUrl = options['redisUrl'] ?? process.env['REDIS_URL'];
|
|
33
|
+
// Validate port
|
|
34
|
+
if (isNaN(port) || port < 1 || port > 65535) {
|
|
35
|
+
logger.error('Invalid port number. Must be between 1 and 65535.');
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
// Validate timeout
|
|
39
|
+
if (isNaN(workerTimeout) || workerTimeout < 1000) {
|
|
40
|
+
logger.error('Invalid worker timeout. Must be at least 1000ms.');
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
const loggerAdapter = {
|
|
44
|
+
info: (message, data) => logger.info(data ?? {}, message),
|
|
45
|
+
warn: (message, data) => logger.warn(data ?? {}, message),
|
|
46
|
+
error: (message, data) => logger.error(data ?? {}, message),
|
|
47
|
+
};
|
|
48
|
+
logger.info({
|
|
49
|
+
port,
|
|
50
|
+
host,
|
|
51
|
+
workerTimeout,
|
|
52
|
+
authEnabled: !!(authToken || process.env['ORCHESTRATOR_TOKEN']),
|
|
53
|
+
redisUrl: redisUrl ? redisUrl.replace(/\/\/.*@/, '//***@') : undefined,
|
|
54
|
+
}, 'Starting orchestrator server');
|
|
55
|
+
// Create job queue (Redis if URL provided, in-memory fallback)
|
|
56
|
+
const jobQueue = await createJobQueue(redisUrl, loggerAdapter);
|
|
57
|
+
// Create server with pino logger adapter
|
|
58
|
+
const server = createOrchestratorServer({
|
|
59
|
+
port,
|
|
60
|
+
host,
|
|
61
|
+
workerTimeout,
|
|
62
|
+
authToken,
|
|
63
|
+
jobQueue,
|
|
64
|
+
logger: loggerAdapter,
|
|
65
|
+
});
|
|
66
|
+
// Label monitor setup
|
|
67
|
+
const labelMonitorEnabled = options['labelMonitor'] === true ||
|
|
68
|
+
process.env['LABEL_MONITOR_ENABLED'] === 'true';
|
|
69
|
+
let labelMonitorSetup = null;
|
|
70
|
+
if (labelMonitorEnabled) {
|
|
71
|
+
labelMonitorSetup = await setupLabelMonitor(options, redisUrl, server, loggerAdapter, logger);
|
|
72
|
+
}
|
|
73
|
+
// Graceful shutdown handler
|
|
74
|
+
let isShuttingDown = false;
|
|
75
|
+
const shutdown = async (signal) => {
|
|
76
|
+
if (isShuttingDown) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
isShuttingDown = true;
|
|
80
|
+
logger.info({ signal }, 'Received shutdown signal, stopping orchestrator...');
|
|
81
|
+
try {
|
|
82
|
+
// Stop label monitor and smee receiver before closing the server
|
|
83
|
+
if (labelMonitorSetup) {
|
|
84
|
+
labelMonitorSetup.monitor.stopPolling();
|
|
85
|
+
if (labelMonitorSetup.smeeReceiver) {
|
|
86
|
+
labelMonitorSetup.smeeReceiver.stop();
|
|
87
|
+
}
|
|
88
|
+
logger.info('Label monitor stopped');
|
|
89
|
+
}
|
|
90
|
+
// Give a brief grace period for in-flight requests
|
|
91
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
92
|
+
await server.close();
|
|
93
|
+
logger.info('Orchestrator shutdown complete');
|
|
94
|
+
process.exit(0);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
logger.error({ error: String(error) }, 'Error during shutdown');
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
// Handle signals
|
|
102
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
103
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
104
|
+
// Handle uncaught errors
|
|
105
|
+
process.on('uncaughtException', (error) => {
|
|
106
|
+
logger.error({ error: error.message, stack: error.stack }, 'Uncaught exception');
|
|
107
|
+
shutdown('uncaughtException');
|
|
108
|
+
});
|
|
109
|
+
process.on('unhandledRejection', (reason) => {
|
|
110
|
+
logger.error({ reason: String(reason) }, 'Unhandled rejection');
|
|
111
|
+
shutdown('unhandledRejection');
|
|
112
|
+
});
|
|
113
|
+
// Start the server
|
|
114
|
+
try {
|
|
115
|
+
await server.listen();
|
|
116
|
+
logger.info({
|
|
117
|
+
port: server.getPort(),
|
|
118
|
+
host,
|
|
119
|
+
labelMonitor: labelMonitorEnabled,
|
|
120
|
+
endpoints: [
|
|
121
|
+
'GET /api/health',
|
|
122
|
+
'POST /api/workers/register',
|
|
123
|
+
'DELETE /api/workers/:workerId',
|
|
124
|
+
'POST /api/workers/:workerId/heartbeat',
|
|
125
|
+
'GET /api/jobs/poll',
|
|
126
|
+
'GET /api/jobs/:jobId',
|
|
127
|
+
'PUT /api/jobs/:jobId/status',
|
|
128
|
+
'POST /api/jobs/:jobId/result',
|
|
129
|
+
'POST /api/jobs/:jobId/cancel',
|
|
130
|
+
],
|
|
131
|
+
}, 'Orchestrator server ready and listening');
|
|
132
|
+
// Start label monitoring after server is ready
|
|
133
|
+
if (labelMonitorSetup) {
|
|
134
|
+
// Start smee receiver for real-time webhook events (if configured)
|
|
135
|
+
if (labelMonitorSetup.smeeReceiver) {
|
|
136
|
+
labelMonitorSetup.smeeReceiver.start().catch((error) => {
|
|
137
|
+
logger.error({ error: String(error) }, 'Smee webhook receiver failed');
|
|
138
|
+
});
|
|
139
|
+
logger.info('Smee webhook receiver started');
|
|
140
|
+
}
|
|
141
|
+
// Start polling as primary (no smee) or fallback (with smee)
|
|
142
|
+
labelMonitorSetup.monitor.startPolling().catch((error) => {
|
|
143
|
+
logger.error({ error: String(error) }, 'Label monitor polling failed');
|
|
144
|
+
});
|
|
145
|
+
logger.info({ mode: labelMonitorSetup.smeeReceiver ? 'smee+polling-fallback' : 'polling-only' }, 'Label monitor started');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
logger.error({ error: String(error) }, 'Failed to start orchestrator server');
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return command;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Default poll interval when smee.io webhooks are active.
|
|
157
|
+
* Polling serves as a fallback only, so it can be very infrequent.
|
|
158
|
+
*/
|
|
159
|
+
const SMEE_FALLBACK_POLL_INTERVAL_MS = 300_000; // 5 minutes
|
|
160
|
+
/**
|
|
161
|
+
* Setup label monitoring when enabled.
|
|
162
|
+
* Dynamically imports orchestrator services to avoid loading them when disabled.
|
|
163
|
+
* Returns both the monitor service and an optional smee receiver.
|
|
164
|
+
*/
|
|
165
|
+
async function setupLabelMonitor(options, redisUrl, server, loggerAdapter, logger) {
|
|
166
|
+
// Dynamic import to avoid loading orchestrator deps when label monitor is disabled
|
|
167
|
+
const { LabelMonitorService, LabelSyncService, SmeeWebhookReceiver, PhaseTrackerService, WebhookSetupService, resolveClusterIdentity } = await import('@generacy-ai/orchestrator');
|
|
168
|
+
const { createGitHubClient } = await import('@generacy-ai/workflow-engine');
|
|
169
|
+
const { Redis: IORedis } = await import('ioredis');
|
|
170
|
+
// Parse repositories
|
|
171
|
+
const reposStr = options['monitoredRepos'] ??
|
|
172
|
+
process.env['MONITORED_REPOS'] ?? '';
|
|
173
|
+
const repositories = reposStr
|
|
174
|
+
.split(',')
|
|
175
|
+
.map(r => r.trim())
|
|
176
|
+
.filter(Boolean)
|
|
177
|
+
.map(r => {
|
|
178
|
+
const [owner, repo] = r.split('/');
|
|
179
|
+
if (!owner || !repo) {
|
|
180
|
+
logger.warn({ repo: r }, 'Invalid repository format, expected owner/repo');
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
return { owner, repo };
|
|
184
|
+
})
|
|
185
|
+
.filter((r) => r !== null);
|
|
186
|
+
if (repositories.length === 0) {
|
|
187
|
+
logger.error('Label monitor enabled but no valid repositories configured. Set MONITORED_REPOS.');
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
// Check for smee.io channel URL
|
|
191
|
+
const smeeChannelUrl = process.env['SMEE_CHANNEL_URL'];
|
|
192
|
+
const useSmee = !!smeeChannelUrl;
|
|
193
|
+
// When smee is active, polling is just a fallback — use a much longer interval
|
|
194
|
+
const configuredPollMs = parseInt(options['pollInterval'] ??
|
|
195
|
+
process.env['POLL_INTERVAL_MS'] ?? '30000', 10);
|
|
196
|
+
const pollIntervalMs = useSmee ? SMEE_FALLBACK_POLL_INTERVAL_MS : configuredPollMs;
|
|
197
|
+
// Create Redis connection for phase tracker (reuse URL from job queue)
|
|
198
|
+
let phaseTrackerRedis = null;
|
|
199
|
+
if (redisUrl) {
|
|
200
|
+
try {
|
|
201
|
+
phaseTrackerRedis = new IORedis(redisUrl);
|
|
202
|
+
await phaseTrackerRedis.ping();
|
|
203
|
+
logger.info('Phase tracker Redis connected');
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
logger.warn({ error: String(error) }, 'Failed to connect Redis for phase tracker, dedup will be disabled');
|
|
207
|
+
phaseTrackerRedis = null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Pino-compatible logger adapter for LabelMonitorService
|
|
211
|
+
// The service calls logger.info(obj, msg) or logger.info(msg)
|
|
212
|
+
const monitorLogger = {
|
|
213
|
+
info: (msgOrObj, msg) => {
|
|
214
|
+
if (typeof msgOrObj === 'string') {
|
|
215
|
+
logger.info(msgOrObj);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
logger.info(msgOrObj, msg ?? '');
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
warn: (msgOrObj, msg) => {
|
|
222
|
+
if (typeof msgOrObj === 'string') {
|
|
223
|
+
logger.warn(msgOrObj);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
logger.warn(msgOrObj, msg ?? '');
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
error: (msgOrObj, msg) => {
|
|
230
|
+
if (typeof msgOrObj === 'string') {
|
|
231
|
+
logger.error(msgOrObj);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
logger.error(msgOrObj, msg ?? '');
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
// Sync workflow labels to all monitored repositories
|
|
239
|
+
const labelSyncService = new LabelSyncService(monitorLogger, createGitHubClient);
|
|
240
|
+
try {
|
|
241
|
+
const syncResult = await labelSyncService.syncAll(repositories);
|
|
242
|
+
logger.info({ successful: syncResult.successfulRepos, failed: syncResult.failedRepos, total: syncResult.totalRepos }, 'Label sync complete');
|
|
243
|
+
if (syncResult.failedRepos > 0) {
|
|
244
|
+
logger.warn(`Label sync: ${syncResult.failedRepos} repo(s) failed`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
logger.warn({ error: String(error) }, 'Label sync failed (continuing with startup)');
|
|
249
|
+
}
|
|
250
|
+
const phaseTracker = new PhaseTrackerService(monitorLogger, phaseTrackerRedis);
|
|
251
|
+
const bridge = new LabelMonitorBridge(server, createGitHubClient, loggerAdapter);
|
|
252
|
+
// Resolve cluster identity for assignee-based issue filtering
|
|
253
|
+
const clusterGithubUsername = await resolveClusterIdentity(process.env['CLUSTER_GITHUB_USERNAME'], monitorLogger);
|
|
254
|
+
const monitor = new LabelMonitorService(monitorLogger, createGitHubClient, phaseTracker, bridge, { pollIntervalMs, maxConcurrentPolls: 5, adaptivePolling: !useSmee }, repositories, clusterGithubUsername);
|
|
255
|
+
// Create smee receiver if channel URL is configured
|
|
256
|
+
let smeeReceiver = null;
|
|
257
|
+
if (useSmee) {
|
|
258
|
+
const watchedRepos = new Set(repositories.map(r => `${r.owner}/${r.repo}`));
|
|
259
|
+
smeeReceiver = new SmeeWebhookReceiver(monitorLogger, monitor, {
|
|
260
|
+
channelUrl: smeeChannelUrl,
|
|
261
|
+
watchedRepos,
|
|
262
|
+
});
|
|
263
|
+
logger.info({ channelUrl: smeeChannelUrl, pollFallbackMs: pollIntervalMs }, 'Smee.io webhook receiver configured (polling reduced to fallback)');
|
|
264
|
+
// Auto-configure GitHub webhooks for all monitored repositories
|
|
265
|
+
logger.info('Configuring GitHub webhooks...');
|
|
266
|
+
try {
|
|
267
|
+
const webhookService = new WebhookSetupService(monitorLogger);
|
|
268
|
+
const summary = await webhookService.ensureWebhooks(smeeChannelUrl, repositories);
|
|
269
|
+
logger.info({
|
|
270
|
+
total: summary.total,
|
|
271
|
+
created: summary.created,
|
|
272
|
+
skipped: summary.skipped,
|
|
273
|
+
reactivated: summary.reactivated,
|
|
274
|
+
failed: summary.failed,
|
|
275
|
+
}, 'Webhook auto-configuration complete');
|
|
276
|
+
// Warn if any webhooks failed to set up
|
|
277
|
+
if (summary.failed > 0) {
|
|
278
|
+
const failedRepos = summary.results
|
|
279
|
+
.filter((r) => r.action === 'failed')
|
|
280
|
+
.map((r) => `${r.owner}/${r.repo}`);
|
|
281
|
+
logger.warn({ failedRepos }, 'Some webhooks failed to configure - these repos will use polling fallback');
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
logger.warn({ error: String(error) }, 'Webhook auto-configuration failed (falling back to polling)');
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
logger.info({ repositories: repositories.length, pollIntervalMs, smee: useSmee }, 'Label monitor configured');
|
|
289
|
+
return { monitor, smeeReceiver };
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/cli/commands/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCpC;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAoHpC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run command implementation.
|
|
3
|
+
* Loads and executes a workflow from a file.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { resolve } from 'node:path';
|
|
7
|
+
import { loadWorkflow, prepareWorkflow, WorkflowExecutor, registerBuiltinActions, } from '@generacy-ai/workflow-engine';
|
|
8
|
+
import { getLogger, createWorkflowLogger } from '../utils/logger.js';
|
|
9
|
+
/**
|
|
10
|
+
* Parse input arguments in key=value format
|
|
11
|
+
*/
|
|
12
|
+
function parseInputs(inputs) {
|
|
13
|
+
const result = {};
|
|
14
|
+
for (const input of inputs) {
|
|
15
|
+
const eqIndex = input.indexOf('=');
|
|
16
|
+
if (eqIndex === -1) {
|
|
17
|
+
throw new Error(`Invalid input format: ${input}. Expected key=value`);
|
|
18
|
+
}
|
|
19
|
+
const key = input.substring(0, eqIndex);
|
|
20
|
+
const value = input.substring(eqIndex + 1);
|
|
21
|
+
// Try to parse as JSON, otherwise use as string
|
|
22
|
+
try {
|
|
23
|
+
result[key] = JSON.parse(value);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
result[key] = value;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create the run command
|
|
33
|
+
*/
|
|
34
|
+
export function runCommand() {
|
|
35
|
+
const command = new Command('run');
|
|
36
|
+
command
|
|
37
|
+
.description('Execute a workflow from a file')
|
|
38
|
+
.argument('<workflow>', 'Path to workflow YAML file')
|
|
39
|
+
.option('-i, --input <key=value...>', 'Input values for the workflow', [])
|
|
40
|
+
.option('-w, --workdir <path>', 'Working directory for execution', process.cwd())
|
|
41
|
+
.option('--dry-run', 'Validate workflow without executing')
|
|
42
|
+
.option('-v, --verbose', 'Enable verbose output')
|
|
43
|
+
.action(async (workflowPath, options) => {
|
|
44
|
+
const logger = getLogger();
|
|
45
|
+
const workflowLogger = createWorkflowLogger(logger);
|
|
46
|
+
try {
|
|
47
|
+
// Resolve workflow path
|
|
48
|
+
const resolvedPath = resolve(options.workdir, workflowPath);
|
|
49
|
+
logger.info({ path: resolvedPath }, 'Loading workflow');
|
|
50
|
+
// Load and validate workflow
|
|
51
|
+
const definition = await loadWorkflow(resolvedPath);
|
|
52
|
+
logger.info({ name: definition.name }, 'Workflow loaded');
|
|
53
|
+
// Parse inputs
|
|
54
|
+
const inputs = parseInputs(options.input || []);
|
|
55
|
+
if (Object.keys(inputs).length > 0) {
|
|
56
|
+
logger.info({ inputs: Object.keys(inputs) }, 'Parsed inputs');
|
|
57
|
+
}
|
|
58
|
+
// Prepare workflow for execution
|
|
59
|
+
const workflow = prepareWorkflow(definition, inputs);
|
|
60
|
+
// Register builtin actions
|
|
61
|
+
registerBuiltinActions();
|
|
62
|
+
// Create executor
|
|
63
|
+
const executor = new WorkflowExecutor({
|
|
64
|
+
logger: workflowLogger,
|
|
65
|
+
});
|
|
66
|
+
// Set up event listener for progress
|
|
67
|
+
const eventListener = (event) => {
|
|
68
|
+
if (options.verbose) {
|
|
69
|
+
logger.debug({ event }, 'Execution event');
|
|
70
|
+
}
|
|
71
|
+
switch (event.type) {
|
|
72
|
+
case 'execution:start':
|
|
73
|
+
logger.info({ workflow: event.workflowName }, 'Starting workflow');
|
|
74
|
+
break;
|
|
75
|
+
case 'phase:start':
|
|
76
|
+
logger.info({ phase: event.phaseName }, 'Starting phase');
|
|
77
|
+
break;
|
|
78
|
+
case 'step:start':
|
|
79
|
+
logger.info({ step: event.stepName }, 'Starting step');
|
|
80
|
+
break;
|
|
81
|
+
case 'step:complete':
|
|
82
|
+
logger.info({ step: event.stepName }, 'Step completed');
|
|
83
|
+
break;
|
|
84
|
+
case 'step:error':
|
|
85
|
+
logger.error({ step: event.stepName, error: event.message }, 'Step failed');
|
|
86
|
+
break;
|
|
87
|
+
case 'phase:complete':
|
|
88
|
+
logger.info({ phase: event.phaseName }, 'Phase completed');
|
|
89
|
+
break;
|
|
90
|
+
case 'execution:complete':
|
|
91
|
+
logger.info({ workflow: event.workflowName }, 'Workflow completed');
|
|
92
|
+
break;
|
|
93
|
+
case 'execution:error':
|
|
94
|
+
logger.error({ workflow: event.workflowName, error: event.message }, 'Workflow failed');
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
const subscription = executor.addEventListener(eventListener);
|
|
99
|
+
let result;
|
|
100
|
+
if (options.dryRun) {
|
|
101
|
+
// Validate only
|
|
102
|
+
logger.info('Running in dry-run mode (validation only)');
|
|
103
|
+
result = await executor.validate(workflow, process.env);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// Full execution
|
|
107
|
+
result = await executor.execute(workflow, {
|
|
108
|
+
mode: 'normal',
|
|
109
|
+
cwd: options.workdir,
|
|
110
|
+
env: process.env,
|
|
111
|
+
}, inputs);
|
|
112
|
+
}
|
|
113
|
+
// Clean up listener
|
|
114
|
+
subscription.dispose();
|
|
115
|
+
// Display results
|
|
116
|
+
displayResult(result, logger);
|
|
117
|
+
// Exit with appropriate code
|
|
118
|
+
if (result.status === 'failed' || result.status === 'cancelled') {
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
logger.error({ error }, 'Failed to execute workflow');
|
|
124
|
+
if (error instanceof Error) {
|
|
125
|
+
console.error(`Error: ${error.message}`);
|
|
126
|
+
}
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
return command;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Display execution result summary
|
|
134
|
+
*/
|
|
135
|
+
function displayResult(result, logger) {
|
|
136
|
+
const durationSec = result.duration !== undefined ? (result.duration / 1000).toFixed(2) : '?';
|
|
137
|
+
console.log('\n' + '='.repeat(60));
|
|
138
|
+
console.log('EXECUTION SUMMARY');
|
|
139
|
+
console.log('='.repeat(60));
|
|
140
|
+
console.log(`Status: ${result.status.toUpperCase()}`);
|
|
141
|
+
console.log(`Duration: ${durationSec}s`);
|
|
142
|
+
if (result.phaseResults.length > 0) {
|
|
143
|
+
console.log('\nPhases:');
|
|
144
|
+
for (const phase of result.phaseResults) {
|
|
145
|
+
const phaseIcon = phase.status === 'completed' ? '✓' : phase.status === 'failed' ? '✗' : '○';
|
|
146
|
+
console.log(` ${phaseIcon} ${phase.phaseName} (${phase.stepResults.length} steps)`);
|
|
147
|
+
for (const step of phase.stepResults) {
|
|
148
|
+
const stepIcon = step.status === 'completed' ? '✓' : step.status === 'failed' ? '✗' : '○';
|
|
149
|
+
const stepDuration = step.duration ? ` (${(step.duration / 1000).toFixed(2)}s)` : '';
|
|
150
|
+
console.log(` ${stepIcon} ${step.stepName}${stepDuration}`);
|
|
151
|
+
if (step.error) {
|
|
152
|
+
console.log(` Error: ${step.error}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Check if any phase failed and show error
|
|
158
|
+
const failedPhase = result.phaseResults.find((p) => p.status === 'failed');
|
|
159
|
+
if (failedPhase) {
|
|
160
|
+
const failedStep = failedPhase.stepResults.find(s => s.status === 'failed');
|
|
161
|
+
if (failedStep?.error) {
|
|
162
|
+
console.log(`\nError: ${failedStep.error}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
console.log('='.repeat(60) + '\n');
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup auth subcommand.
|
|
3
|
+
* Configures git credentials and GitHub CLI authentication.
|
|
4
|
+
* Replaces .devcontainer/ensure-auth.sh
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Create the `setup auth` subcommand.
|
|
9
|
+
*/
|
|
10
|
+
export declare function setupAuthCommand(): Command;
|
|
11
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/setup/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAyG1C"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup auth subcommand.
|
|
3
|
+
* Configures git credentials and GitHub CLI authentication.
|
|
4
|
+
* Replaces .devcontainer/ensure-auth.sh
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { getLogger } from '../../utils/logger.js';
|
|
11
|
+
import { exec, execSafe } from '../../utils/exec.js';
|
|
12
|
+
/**
|
|
13
|
+
* Resolve auth config with three-tier priority: defaults → env vars → CLI args.
|
|
14
|
+
*/
|
|
15
|
+
function resolveAuthConfig(cliArgs) {
|
|
16
|
+
return {
|
|
17
|
+
email: cliArgs.email ?? process.env['GH_EMAIL'],
|
|
18
|
+
username: cliArgs.username ?? process.env['GH_USERNAME'],
|
|
19
|
+
token: cliArgs.token ?? process.env['GH_TOKEN'],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create the `setup auth` subcommand.
|
|
24
|
+
*/
|
|
25
|
+
export function setupAuthCommand() {
|
|
26
|
+
const command = new Command('auth');
|
|
27
|
+
command
|
|
28
|
+
.description('Configure git credentials and GitHub CLI authentication')
|
|
29
|
+
.option('--email <email>', 'Git user email (or GH_EMAIL env)')
|
|
30
|
+
.option('--username <name>', 'Git user name (or GH_USERNAME env)')
|
|
31
|
+
.action(async (options) => {
|
|
32
|
+
const logger = getLogger();
|
|
33
|
+
const config = resolveAuthConfig(options);
|
|
34
|
+
logger.info('Configuring CLI authentication');
|
|
35
|
+
// Step 1: Configure git identity
|
|
36
|
+
if (config.username && config.email) {
|
|
37
|
+
exec(`git config --global user.name "${config.username}"`);
|
|
38
|
+
exec(`git config --global user.email "${config.email}"`);
|
|
39
|
+
logger.info({ username: config.username, email: config.email }, 'Git user configured');
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
if (config.username) {
|
|
43
|
+
exec(`git config --global user.name "${config.username}"`);
|
|
44
|
+
logger.info({ username: config.username }, 'Git user.name configured');
|
|
45
|
+
}
|
|
46
|
+
if (config.email) {
|
|
47
|
+
exec(`git config --global user.email "${config.email}"`);
|
|
48
|
+
logger.info({ email: config.email }, 'Git user.email configured');
|
|
49
|
+
}
|
|
50
|
+
if (!config.username) {
|
|
51
|
+
logger.warn('GH_USERNAME not set — git user.name not configured');
|
|
52
|
+
}
|
|
53
|
+
if (!config.email) {
|
|
54
|
+
logger.warn('GH_EMAIL not set — git user.email not configured');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Step 2: Configure git credential helper
|
|
58
|
+
if (config.token) {
|
|
59
|
+
exec('git config --global credential.helper store');
|
|
60
|
+
const home = homedir();
|
|
61
|
+
mkdirSync(home, { recursive: true });
|
|
62
|
+
const credentialsPath = join(home, '.git-credentials');
|
|
63
|
+
const credentialUser = config.username ?? 'git';
|
|
64
|
+
writeFileSync(credentialsPath, `https://${credentialUser}:${config.token}@github.com\n`, { mode: 0o600 });
|
|
65
|
+
logger.info('Git credentials configured for github.com');
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
logger.warn('GH_TOKEN not set — git push/pull to private repos will require manual authentication');
|
|
69
|
+
}
|
|
70
|
+
// Step 3: Configure gh CLI auth
|
|
71
|
+
if (config.token) {
|
|
72
|
+
const authCheck = execSafe('gh auth status');
|
|
73
|
+
if (authCheck.ok) {
|
|
74
|
+
logger.info('GitHub CLI authenticated via GH_TOKEN env var');
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// Pipe token to gh auth login
|
|
78
|
+
const loginResult = execSafe(`echo "${config.token}" | gh auth login --with-token`);
|
|
79
|
+
if (loginResult.ok) {
|
|
80
|
+
logger.info('GitHub CLI authenticated via GH_TOKEN');
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
logger.error({ stderr: loginResult.stderr }, 'Failed to authenticate GitHub CLI');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
const authCheck = execSafe('gh auth status');
|
|
89
|
+
if (authCheck.ok) {
|
|
90
|
+
logger.info('GitHub CLI is authenticated');
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
logger.warn('GitHub CLI is not authenticated — set GH_TOKEN in agent.env or run: gh auth login');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Step 4: Verify authentication
|
|
97
|
+
const verification = execSafe('gh auth status');
|
|
98
|
+
if (verification.ok) {
|
|
99
|
+
logger.info({ stdout: verification.stdout }, 'Authentication verified');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
logger.error({ stderr: verification.stderr }, 'Authentication verification failed');
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
return command;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/cli/commands/setup/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup build subcommand.
|
|
3
|
+
* Cleans stale Claude plugin state, builds Agency and Generacy packages.
|
|
4
|
+
* Replaces .devcontainer/setup-plugins.sh
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Create the `setup build` subcommand.
|
|
9
|
+
*/
|
|
10
|
+
export declare function setupBuildCommand(): Command;
|
|
11
|
+
//# sourceMappingURL=build.d.ts.map
|