@autocode-cli/autocode 0.0.22
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 +172 -0
- package/bin/autocode +2 -0
- package/dist/cli/commands/comment.d.ts +9 -0
- package/dist/cli/commands/comment.d.ts.map +1 -0
- package/dist/cli/commands/comment.js +37 -0
- package/dist/cli/commands/comment.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +41 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +9 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +78 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/move.d.ts +9 -0
- package/dist/cli/commands/move.d.ts.map +1 -0
- package/dist/cli/commands/move.js +59 -0
- package/dist/cli/commands/move.js.map +1 -0
- package/dist/cli/commands/new.d.ts +9 -0
- package/dist/cli/commands/new.d.ts.map +1 -0
- package/dist/cli/commands/new.js +74 -0
- package/dist/cli/commands/new.js.map +1 -0
- package/dist/cli/commands/next.d.ts +9 -0
- package/dist/cli/commands/next.d.ts.map +1 -0
- package/dist/cli/commands/next.js +46 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +9 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +55 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/show.d.ts +9 -0
- package/dist/cli/commands/show.d.ts.map +1 -0
- package/dist/cli/commands/show.js +91 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/parser.d.ts +13 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +54 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/core/column.d.ts +53 -0
- package/dist/core/column.d.ts.map +1 -0
- package/dist/core/column.js +128 -0
- package/dist/core/column.js.map +1 -0
- package/dist/core/ticket.d.ts +50 -0
- package/dist/core/ticket.d.ts.map +1 -0
- package/dist/core/ticket.js +228 -0
- package/dist/core/ticket.js.map +1 -0
- package/dist/core/workflow.d.ts +66 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +176 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/server/api.d.ts +9 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +313 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/dashboard.d.ts +8 -0
- package/dist/server/dashboard.d.ts.map +1 -0
- package/dist/server/dashboard.js +1865 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +94 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/watcher.d.ts +13 -0
- package/dist/server/watcher.d.ts.map +1 -0
- package/dist/server/watcher.js +62 -0
- package/dist/server/watcher.js.map +1 -0
- package/dist/server/websocket.d.ts +26 -0
- package/dist/server/websocket.d.ts.map +1 -0
- package/dist/server/websocket.js +165 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/services/claude.d.ts +52 -0
- package/dist/services/claude.d.ts.map +1 -0
- package/dist/services/claude.js +304 -0
- package/dist/services/claude.js.map +1 -0
- package/dist/services/ticket-io.d.ts +76 -0
- package/dist/services/ticket-io.d.ts.map +1 -0
- package/dist/services/ticket-io.js +248 -0
- package/dist/services/ticket-io.js.map +1 -0
- package/dist/types/index.d.ts +79 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config.d.ts +93 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +96 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fs.d.ts +60 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +129 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +23 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +56 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +57 -0
- package/templates/columns/00_backlog.en.md +31 -0
- package/templates/columns/00_backlog.fr.md +31 -0
- package/templates/columns/01_ready.en.md +30 -0
- package/templates/columns/01_ready.fr.md +30 -0
- package/templates/columns/02_in-progress.en.md +30 -0
- package/templates/columns/02_in-progress.fr.md +30 -0
- package/templates/columns/03_review-best-practices.en.md +31 -0
- package/templates/columns/03_review-best-practices.fr.md +31 -0
- package/templates/columns/04_review-no-duplication.en.md +30 -0
- package/templates/columns/04_review-no-duplication.fr.md +30 -0
- package/templates/columns/05_review-consistency.en.md +31 -0
- package/templates/columns/05_review-consistency.fr.md +31 -0
- package/templates/columns/06_review-security.en.md +32 -0
- package/templates/columns/06_review-security.fr.md +32 -0
- package/templates/columns/07_testing-playwright.en.md +30 -0
- package/templates/columns/07_testing-playwright.fr.md +30 -0
- package/templates/columns/08_testing-cypress.en.md +31 -0
- package/templates/columns/08_testing-cypress.fr.md +31 -0
- package/templates/columns/09_update-docs.en.md +29 -0
- package/templates/columns/09_update-docs.fr.md +29 -0
- package/templates/columns/10_deploy-staging.en.md +29 -0
- package/templates/columns/10_deploy-staging.fr.md +29 -0
- package/templates/columns/11_validate-staging.en.md +32 -0
- package/templates/columns/11_validate-staging.fr.md +32 -0
- package/templates/columns/12_done.en.md +23 -0
- package/templates/columns/12_done.fr.md +23 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/server/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuF7D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Server
|
|
3
|
+
*/
|
|
4
|
+
import { createServer } from 'node:http';
|
|
5
|
+
import { generateDashboard } from './dashboard.js';
|
|
6
|
+
import { handleApiRequest } from './api.js';
|
|
7
|
+
import { handleWebSocketUpgrade, setupPingInterval, getClientCount } from './websocket.js';
|
|
8
|
+
import { startWatcher, stopWatcher } from './watcher.js';
|
|
9
|
+
import { getConfig } from '../utils/config.js';
|
|
10
|
+
import { logger } from '../utils/logger.js';
|
|
11
|
+
import { findActionableTicket } from '../core/ticket.js';
|
|
12
|
+
import { processTicketWithClaude } from '../services/claude.js';
|
|
13
|
+
/**
|
|
14
|
+
* Start the HTTP server
|
|
15
|
+
*/
|
|
16
|
+
export async function startServer(port) {
|
|
17
|
+
const server = createServer(async (req, res) => {
|
|
18
|
+
const url = req.url || '/';
|
|
19
|
+
// Handle API requests
|
|
20
|
+
if (url.startsWith('/api')) {
|
|
21
|
+
await handleApiRequest(req, res);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// Handle dashboard
|
|
25
|
+
if (url === '/' || url === '/index.html') {
|
|
26
|
+
const html = generateDashboard();
|
|
27
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
28
|
+
res.end(html);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Health check
|
|
32
|
+
if (url === '/health') {
|
|
33
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
34
|
+
res.end(JSON.stringify({
|
|
35
|
+
status: 'ok',
|
|
36
|
+
clients: getClientCount(),
|
|
37
|
+
timestamp: new Date().toISOString(),
|
|
38
|
+
}));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// 404
|
|
42
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
43
|
+
res.end('Not Found');
|
|
44
|
+
});
|
|
45
|
+
// Handle WebSocket upgrades
|
|
46
|
+
server.on('upgrade', (req, socket, head) => {
|
|
47
|
+
if (req.url === '/ws') {
|
|
48
|
+
handleWebSocketUpgrade(req, socket, head);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
socket.destroy();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// Setup ping interval
|
|
55
|
+
const pingInterval = setupPingInterval();
|
|
56
|
+
// Setup automatic ticket processing loop
|
|
57
|
+
let isProcessing = false;
|
|
58
|
+
const processInterval = setInterval(async () => {
|
|
59
|
+
if (isProcessing)
|
|
60
|
+
return; // Avoid concurrent processing
|
|
61
|
+
const config = getConfig();
|
|
62
|
+
const ticket = findActionableTicket(config.root);
|
|
63
|
+
if (ticket) {
|
|
64
|
+
isProcessing = true;
|
|
65
|
+
logger.info(`🤖 Processing ${ticket.key}...`);
|
|
66
|
+
try {
|
|
67
|
+
await processTicketWithClaude(ticket.key, { autoAdvance: true });
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
logger.error(`Failed to process ${ticket.key}: ${error}`);
|
|
71
|
+
}
|
|
72
|
+
isProcessing = false;
|
|
73
|
+
}
|
|
74
|
+
}, 10000); // 10 seconds
|
|
75
|
+
// Handle server close
|
|
76
|
+
server.on('close', () => {
|
|
77
|
+
clearInterval(pingInterval);
|
|
78
|
+
clearInterval(processInterval);
|
|
79
|
+
stopWatcher();
|
|
80
|
+
});
|
|
81
|
+
// Start listening
|
|
82
|
+
return new Promise((resolve) => {
|
|
83
|
+
server.listen(port, () => {
|
|
84
|
+
const config = getConfig();
|
|
85
|
+
logger.success(`Dashboard running at http://localhost:${port}`);
|
|
86
|
+
// Start file watcher for live updates
|
|
87
|
+
startWatcher(config.root);
|
|
88
|
+
logger.info('🤖 Auto-processing enabled (10s interval)');
|
|
89
|
+
logger.info('Press Ctrl+C to stop');
|
|
90
|
+
resolve();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File watcher for real-time dashboard updates
|
|
3
|
+
* Uses native fs.watch with recursive option
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Start watching the autodoc directory for changes
|
|
7
|
+
*/
|
|
8
|
+
export declare function startWatcher(root: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Stop the file watcher
|
|
11
|
+
*/
|
|
12
|
+
export declare function stopWatcher(): void;
|
|
13
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/server/watcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAqC/C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CASlC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File watcher for real-time dashboard updates
|
|
3
|
+
* Uses native fs.watch with recursive option
|
|
4
|
+
*/
|
|
5
|
+
import { watch } from 'node:fs';
|
|
6
|
+
import { notifyRefresh } from './websocket.js';
|
|
7
|
+
import { pathExists } from '../utils/fs.js';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
let watcher = null;
|
|
10
|
+
let debounceTimer = null;
|
|
11
|
+
/**
|
|
12
|
+
* Start watching the autodoc directory for changes
|
|
13
|
+
*/
|
|
14
|
+
export function startWatcher(root) {
|
|
15
|
+
if (watcher) {
|
|
16
|
+
stopWatcher();
|
|
17
|
+
}
|
|
18
|
+
if (!pathExists(root)) {
|
|
19
|
+
logger.warn(`Watch directory not found: ${root}`);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
watcher = watch(root, { recursive: true }, (_eventType, filename) => {
|
|
24
|
+
if (!filename)
|
|
25
|
+
return;
|
|
26
|
+
// Ignore temp/hidden files
|
|
27
|
+
if (filename.startsWith('.') || filename.includes('~'))
|
|
28
|
+
return;
|
|
29
|
+
// Only react to relevant file types
|
|
30
|
+
if (filename.endsWith('.json') || filename.endsWith('.md')) {
|
|
31
|
+
// Debounce rapid changes (300ms)
|
|
32
|
+
if (debounceTimer)
|
|
33
|
+
clearTimeout(debounceTimer);
|
|
34
|
+
debounceTimer = setTimeout(() => {
|
|
35
|
+
notifyRefresh();
|
|
36
|
+
debounceTimer = null;
|
|
37
|
+
}, 300);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
watcher.on('error', (error) => {
|
|
41
|
+
logger.warn(`Watcher error: ${error.message}`);
|
|
42
|
+
});
|
|
43
|
+
logger.info('Watching for file changes...');
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
logger.warn(`Failed to start watcher: ${error instanceof Error ? error.message : 'Unknown'}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Stop the file watcher
|
|
51
|
+
*/
|
|
52
|
+
export function stopWatcher() {
|
|
53
|
+
if (debounceTimer) {
|
|
54
|
+
clearTimeout(debounceTimer);
|
|
55
|
+
debounceTimer = null;
|
|
56
|
+
}
|
|
57
|
+
if (watcher) {
|
|
58
|
+
watcher.close();
|
|
59
|
+
watcher = null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/server/watcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAa,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,IAAI,OAAO,GAAqB,IAAI,CAAC;AACrC,IAAI,aAAa,GAA0B,IAAI,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;YAClE,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAEtB,2BAA2B;YAC3B,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO;YAE/D,oCAAoC;YACpC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3D,iCAAiC;gBACjC,IAAI,aAAa;oBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;gBAE/C,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,aAAa,EAAE,CAAC;oBAChB,aAAa,GAAG,IAAI,CAAC;gBACvB,CAAC,EAAE,GAAG,CAAC,CAAC;YACV,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC5B,MAAM,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,aAAa,EAAE,CAAC;QAClB,YAAY,CAAC,aAAa,CAAC,CAAC;QAC5B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket handler for real-time updates
|
|
3
|
+
*/
|
|
4
|
+
import type { IncomingMessage } from 'node:http';
|
|
5
|
+
import type { Duplex } from 'node:stream';
|
|
6
|
+
/**
|
|
7
|
+
* Handle WebSocket upgrade
|
|
8
|
+
*/
|
|
9
|
+
export declare function handleWebSocketUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer): void;
|
|
10
|
+
/**
|
|
11
|
+
* Broadcast message to all clients
|
|
12
|
+
*/
|
|
13
|
+
export declare function broadcast(message: object): void;
|
|
14
|
+
/**
|
|
15
|
+
* Notify clients to refresh
|
|
16
|
+
*/
|
|
17
|
+
export declare function notifyRefresh(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Get connected client count
|
|
20
|
+
*/
|
|
21
|
+
export declare function getClientCount(): number;
|
|
22
|
+
/**
|
|
23
|
+
* Setup ping interval to keep connections alive
|
|
24
|
+
*/
|
|
25
|
+
export declare function setupPingInterval(intervalMs?: number): NodeJS.Timeout;
|
|
26
|
+
//# sourceMappingURL=websocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/server/websocket.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAU1C;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,IAAI,CAiDN;AAuFD;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAU/C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,SAAQ,GAAG,MAAM,CAAC,OAAO,CAgBpE"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket handler for real-time updates
|
|
3
|
+
*/
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
const clients = new Set();
|
|
6
|
+
/**
|
|
7
|
+
* Handle WebSocket upgrade
|
|
8
|
+
*/
|
|
9
|
+
export function handleWebSocketUpgrade(req, socket, head) {
|
|
10
|
+
const key = req.headers['sec-websocket-key'];
|
|
11
|
+
if (!key) {
|
|
12
|
+
socket.destroy();
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
// Generate accept key
|
|
16
|
+
const acceptKey = createHash('sha1')
|
|
17
|
+
.update(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')
|
|
18
|
+
.digest('base64');
|
|
19
|
+
// Send handshake response
|
|
20
|
+
const response = [
|
|
21
|
+
'HTTP/1.1 101 Switching Protocols',
|
|
22
|
+
'Upgrade: websocket',
|
|
23
|
+
'Connection: Upgrade',
|
|
24
|
+
`Sec-WebSocket-Accept: ${acceptKey}`,
|
|
25
|
+
'',
|
|
26
|
+
'',
|
|
27
|
+
].join('\r\n');
|
|
28
|
+
socket.write(response);
|
|
29
|
+
// Create client
|
|
30
|
+
const client = {
|
|
31
|
+
socket,
|
|
32
|
+
isAlive: true,
|
|
33
|
+
};
|
|
34
|
+
clients.add(client);
|
|
35
|
+
// Handle incoming messages
|
|
36
|
+
socket.on('data', (buffer) => {
|
|
37
|
+
const frame = parseFrame(buffer);
|
|
38
|
+
if (frame) {
|
|
39
|
+
handleFrame(client, frame);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
// Handle close
|
|
43
|
+
socket.on('close', () => {
|
|
44
|
+
clients.delete(client);
|
|
45
|
+
});
|
|
46
|
+
socket.on('error', () => {
|
|
47
|
+
clients.delete(client);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Parse WebSocket frame
|
|
52
|
+
*/
|
|
53
|
+
function parseFrame(buffer) {
|
|
54
|
+
if (buffer.length < 2)
|
|
55
|
+
return null;
|
|
56
|
+
const opcode = buffer[0] & 0x0f;
|
|
57
|
+
const masked = (buffer[1] & 0x80) !== 0;
|
|
58
|
+
let payloadLength = buffer[1] & 0x7f;
|
|
59
|
+
let offset = 2;
|
|
60
|
+
if (payloadLength === 126) {
|
|
61
|
+
payloadLength = buffer.readUInt16BE(2);
|
|
62
|
+
offset = 4;
|
|
63
|
+
}
|
|
64
|
+
else if (payloadLength === 127) {
|
|
65
|
+
// We don't support 64-bit lengths
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
if (masked) {
|
|
69
|
+
const maskKey = buffer.slice(offset, offset + 4);
|
|
70
|
+
offset += 4;
|
|
71
|
+
const payload = buffer.slice(offset, offset + payloadLength);
|
|
72
|
+
// Unmask
|
|
73
|
+
for (let i = 0; i < payload.length; i++) {
|
|
74
|
+
payload[i] ^= maskKey[i % 4];
|
|
75
|
+
}
|
|
76
|
+
return { opcode, payload };
|
|
77
|
+
}
|
|
78
|
+
return { opcode, payload: buffer.slice(offset, offset + payloadLength) };
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Handle WebSocket frame
|
|
82
|
+
*/
|
|
83
|
+
function handleFrame(client, frame) {
|
|
84
|
+
switch (frame.opcode) {
|
|
85
|
+
case 0x08: // Close
|
|
86
|
+
client.socket.end();
|
|
87
|
+
clients.delete(client);
|
|
88
|
+
break;
|
|
89
|
+
case 0x09: // Ping
|
|
90
|
+
sendPong(client, frame.payload);
|
|
91
|
+
break;
|
|
92
|
+
case 0x0a: // Pong
|
|
93
|
+
client.isAlive = true;
|
|
94
|
+
break;
|
|
95
|
+
case 0x01: // Text
|
|
96
|
+
// Handle text message if needed
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Send pong frame
|
|
102
|
+
*/
|
|
103
|
+
function sendPong(client, payload) {
|
|
104
|
+
const frame = Buffer.alloc(2 + payload.length);
|
|
105
|
+
frame[0] = 0x8a; // Pong
|
|
106
|
+
frame[1] = payload.length;
|
|
107
|
+
payload.copy(frame, 2);
|
|
108
|
+
client.socket.write(frame);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Send message to a client
|
|
112
|
+
*/
|
|
113
|
+
function sendMessage(client, message) {
|
|
114
|
+
const payload = Buffer.from(message, 'utf-8');
|
|
115
|
+
const frame = Buffer.alloc(2 + payload.length);
|
|
116
|
+
frame[0] = 0x81; // Text frame
|
|
117
|
+
frame[1] = payload.length;
|
|
118
|
+
payload.copy(frame, 2);
|
|
119
|
+
client.socket.write(frame);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Broadcast message to all clients
|
|
123
|
+
*/
|
|
124
|
+
export function broadcast(message) {
|
|
125
|
+
const data = JSON.stringify(message);
|
|
126
|
+
for (const client of clients) {
|
|
127
|
+
try {
|
|
128
|
+
sendMessage(client, data);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
clients.delete(client);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Notify clients to refresh
|
|
137
|
+
*/
|
|
138
|
+
export function notifyRefresh() {
|
|
139
|
+
broadcast({ type: 'refresh' });
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get connected client count
|
|
143
|
+
*/
|
|
144
|
+
export function getClientCount() {
|
|
145
|
+
return clients.size;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Setup ping interval to keep connections alive
|
|
149
|
+
*/
|
|
150
|
+
export function setupPingInterval(intervalMs = 30000) {
|
|
151
|
+
return setInterval(() => {
|
|
152
|
+
for (const client of clients) {
|
|
153
|
+
if (!client.isAlive) {
|
|
154
|
+
client.socket.destroy();
|
|
155
|
+
clients.delete(client);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
client.isAlive = false;
|
|
159
|
+
// Send ping
|
|
160
|
+
const frame = Buffer.from([0x89, 0x00]);
|
|
161
|
+
client.socket.write(frame);
|
|
162
|
+
}
|
|
163
|
+
}, intervalMs);
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/server/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude CLI integration service
|
|
3
|
+
*/
|
|
4
|
+
import type { Ticket } from '../types/index.js';
|
|
5
|
+
interface ClaudeResult {
|
|
6
|
+
success: boolean;
|
|
7
|
+
output?: string;
|
|
8
|
+
error?: string;
|
|
9
|
+
duration?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Get the ACTION.md content for a column
|
|
13
|
+
*/
|
|
14
|
+
export declare function getActionContent(columnSlug: string, lang?: string): string | null;
|
|
15
|
+
/**
|
|
16
|
+
* Build prompt for Claude based on ticket and column
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildPrompt(ticket: Ticket, actionContent: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Write prompt to file for Claude
|
|
21
|
+
*/
|
|
22
|
+
export declare function writePromptFile(ticket: Ticket, prompt: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Execute Claude CLI with a prompt (with live logging to file)
|
|
25
|
+
*/
|
|
26
|
+
export declare function executeClaudeCLI(promptFile: string, ticketKey?: string): Promise<ClaudeResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Process a ticket with Claude
|
|
29
|
+
*/
|
|
30
|
+
export declare function processTicketWithClaude(key: string, options?: {
|
|
31
|
+
autoAdvance?: boolean;
|
|
32
|
+
}): Promise<{
|
|
33
|
+
success: boolean;
|
|
34
|
+
ticket?: Ticket;
|
|
35
|
+
error?: string;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Process all actionable tickets with Claude
|
|
39
|
+
*/
|
|
40
|
+
export declare function processAllTickets(options?: {
|
|
41
|
+
autoAdvance?: boolean;
|
|
42
|
+
limit?: number;
|
|
43
|
+
}): Promise<{
|
|
44
|
+
processed: number;
|
|
45
|
+
errors: number;
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* Check if Claude CLI is available
|
|
49
|
+
*/
|
|
50
|
+
export declare function isClaudeAvailable(): boolean;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,SAAO,GAAG,MAAM,GAAG,IAAI,CAI/E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAqCzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAWtE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAsKpG;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiDhE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACtD,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BhD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C"}
|