@auto-engineer/server-implementer 0.4.4 → 0.4.5
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/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-format.log +25 -23
- package/.turbo/turbo-lint.log +4 -5
- package/.turbo/turbo-test.log +12 -14
- package/.turbo/turbo-type-check.log +4 -5
- package/dist/cli/implement-server.d.ts +3 -0
- package/dist/cli/implement-server.d.ts.map +1 -0
- package/dist/cli/implement-server.js +39 -0
- package/dist/cli/implement-server.js.map +1 -0
- package/dist/commands/implement-server.d.ts +16 -0
- package/dist/commands/implement-server.d.ts.map +1 -0
- package/dist/commands/implement-server.js +91 -0
- package/dist/commands/implement-server.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +7 -1
- package/src/cli/implement-server.ts +46 -0
- package/src/commands/implement-server.ts +130 -0
- package/src/index.ts +7 -0
package/.turbo/turbo-build.log
CHANGED
package/.turbo/turbo-format.log
CHANGED
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
src/agent/runAllSlices.
|
|
10
|
-
src/agent/
|
|
11
|
-
src/agent/runFlows.
|
|
12
|
-
src/agent/
|
|
13
|
-
src/agent/runSlice.
|
|
14
|
-
src/agent/
|
|
15
|
-
src/agent/runTests.
|
|
16
|
-
src/
|
|
17
|
-
src/cli/index.js
|
|
18
|
-
src/cli/index.ts
|
|
19
|
-
src/
|
|
20
|
-
src/
|
|
21
|
-
src/
|
|
22
|
-
src/
|
|
23
|
-
|
|
1
|
+
|
|
2
|
+
> @auto-engineer/server-implementer@0.4.5 format /Users/sam/WebstormProjects/top/auto-engineer/packages/server-implementer
|
|
3
|
+
> prettier --write "**/*.{js,ts,json,md,yml,yaml}" --ignore-path ../../.prettierignore
|
|
4
|
+
|
|
5
|
+
CHANGELOG.md 18ms (unchanged)
|
|
6
|
+
DEBUG.md 3ms (unchanged)
|
|
7
|
+
package.json 14ms (unchanged)
|
|
8
|
+
src/agent/runAllSlices.js 10ms (unchanged)
|
|
9
|
+
src/agent/runAllSlices.ts 24ms (unchanged)
|
|
10
|
+
src/agent/runFlows.js 3ms (unchanged)
|
|
11
|
+
src/agent/runFlows.ts 5ms (unchanged)
|
|
12
|
+
src/agent/runSlice.js 20ms (unchanged)
|
|
13
|
+
src/agent/runSlice.ts 21ms (unchanged)
|
|
14
|
+
src/agent/runTests.js 6ms (unchanged)
|
|
15
|
+
src/agent/runTests.ts 7ms (unchanged)
|
|
16
|
+
src/cli/implement-server.ts 2ms (unchanged)
|
|
17
|
+
src/cli/index.js 1ms (unchanged)
|
|
18
|
+
src/cli/index.ts 2ms (unchanged)
|
|
19
|
+
src/commands/implement-server.ts 6ms (unchanged)
|
|
20
|
+
src/index.ts 1ms (unchanged)
|
|
21
|
+
src/prompts/systemPrompt.js 0ms (unchanged)
|
|
22
|
+
src/prompts/systemPrompt.ts 1ms (unchanged)
|
|
23
|
+
src/utils/extractCodeBlock.js 1ms (unchanged)
|
|
24
|
+
src/utils/extractCodeBlock.ts 1ms (unchanged)
|
|
25
|
+
tsconfig.json 1ms (unchanged)
|
package/.turbo/turbo-lint.log
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
|
|
2
|
+
> @auto-engineer/server-implementer@0.4.5 lint /Users/sam/WebstormProjects/top/auto-engineer/packages/server-implementer
|
|
3
|
+
> eslint 'src/**/*.ts' --max-warnings 0 --config ../../eslint.config.ts
|
|
4
|
+
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
[31m[39m
|
|
14
|
-
[?25h
|
|
1
|
+
|
|
2
|
+
> @auto-engineer/server-implementer@0.4.5 test /Users/sam/WebstormProjects/top/auto-engineer/packages/server-implementer
|
|
3
|
+
> vitest run
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
RUN v3.2.4 /Users/sam/WebstormProjects/top/auto-engineer/packages/server-implementer
|
|
7
|
+
|
|
8
|
+
No test files found, exiting with code 0
|
|
9
|
+
|
|
10
|
+
include: **/*.specs.{js,ts}
|
|
11
|
+
exclude: **/.tmp/**, **/node_modules/**, **/dist/**
|
|
12
|
+
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
|
|
2
|
+
> @auto-engineer/server-implementer@0.4.5 type-check /Users/sam/WebstormProjects/top/auto-engineer/packages/server-implementer
|
|
3
|
+
> tsc --noEmit
|
|
4
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement-server.d.ts","sourceRoot":"","sources":["../../src/cli/implement-server.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { implementServerCommandHandler } from '../commands/implement-server';
|
|
5
|
+
import createDebug from 'debug';
|
|
6
|
+
const debug = createDebug('server-impl:cli:implement');
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const isMain = process.argv[1] === __filename;
|
|
9
|
+
if (isMain) {
|
|
10
|
+
debug('CLI started with args: %o', process.argv.slice(2));
|
|
11
|
+
const serverDirectory = process.argv[2];
|
|
12
|
+
if (!serverDirectory) {
|
|
13
|
+
debug('ERROR: No server directory provided');
|
|
14
|
+
console.error('Usage: implement:server <server-directory>');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
debug('Server directory argument: %s', serverDirectory);
|
|
18
|
+
// Create command and execute handler
|
|
19
|
+
const command = {
|
|
20
|
+
type: 'ImplementServer',
|
|
21
|
+
data: {
|
|
22
|
+
serverDirectory,
|
|
23
|
+
},
|
|
24
|
+
timestamp: new Date(),
|
|
25
|
+
requestId: `cli-${Date.now()}`,
|
|
26
|
+
};
|
|
27
|
+
debug('Executing command handler');
|
|
28
|
+
void implementServerCommandHandler
|
|
29
|
+
.handle(command)
|
|
30
|
+
.then(() => {
|
|
31
|
+
debug('Command completed successfully');
|
|
32
|
+
})
|
|
33
|
+
.catch((error) => {
|
|
34
|
+
debug('Command failed: %O', error);
|
|
35
|
+
console.error('Failed to execute command:', error);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=implement-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement-server.js","sourceRoot":"","sources":["../../src/cli/implement-server.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,WAAW,MAAM,OAAO,CAAC;AAEhC,MAAM,KAAK,GAAG,WAAW,CAAC,2BAA2B,CAAC,CAAC;AAEvD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAElD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC;AAE9C,IAAI,MAAM,EAAE,CAAC;IACX,KAAK,CAAC,2BAA2B,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,+BAA+B,EAAE,eAAe,CAAC,CAAC;IAExD,qCAAqC;IACrC,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,iBAA0B;QAChC,IAAI,EAAE;YACJ,eAAe;SAChB;QACD,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,SAAS,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE;KAC/B,CAAC;IAEF,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACnC,KAAK,6BAA6B;SAC/B,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,EAAE;QACT,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC1C,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { type CommandHandler, type Command, type Event } from '@auto-engineer/message-bus';
|
|
3
|
+
export type ImplementServerCommand = Command<'ImplementServer', {
|
|
4
|
+
serverDirectory: string;
|
|
5
|
+
}>;
|
|
6
|
+
export type ServerImplementedEvent = Event<'ServerImplemented', {
|
|
7
|
+
serverDirectory: string;
|
|
8
|
+
flowsImplemented: number;
|
|
9
|
+
}>;
|
|
10
|
+
export type ServerImplementationFailedEvent = Event<'ServerImplementationFailed', {
|
|
11
|
+
serverDirectory: string;
|
|
12
|
+
error: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function handleImplementServerCommand(command: ImplementServerCommand): Promise<ServerImplementedEvent | ServerImplementationFailedEvent>;
|
|
15
|
+
export declare const implementServerCommandHandler: CommandHandler<ImplementServerCommand>;
|
|
16
|
+
//# sourceMappingURL=implement-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement-server.d.ts","sourceRoot":"","sources":["../../src/commands/implement-server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAW3F,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAC1C,iBAAiB,EACjB;IACE,eAAe,EAAE,MAAM,CAAC;CACzB,CACF,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,KAAK,CACxC,mBAAmB,EACnB;IACE,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CACF,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,KAAK,CACjD,4BAA4B,EAC5B;IACE,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,CACF,CAAC;AAEF,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,sBAAsB,GAAG,+BAA+B,CAAC,CAwEnE;AAED,eAAO,MAAM,6BAA6B,EAAE,cAAc,CAAC,sBAAsB,CAkBhF,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import { runFlows } from '../agent/runFlows';
|
|
5
|
+
import createDebug from 'debug';
|
|
6
|
+
const debug = createDebug('server-impl:command');
|
|
7
|
+
const debugHandler = createDebug('server-impl:command:handler');
|
|
8
|
+
const debugProcess = createDebug('server-impl:command:process');
|
|
9
|
+
const debugResult = createDebug('server-impl:command:result');
|
|
10
|
+
export async function handleImplementServerCommand(command) {
|
|
11
|
+
const { serverDirectory } = command.data;
|
|
12
|
+
debug('Handling ImplementServerCommand');
|
|
13
|
+
debug(' Server directory: %s', serverDirectory);
|
|
14
|
+
debug(' Request ID: %s', command.requestId);
|
|
15
|
+
debug(' Correlation ID: %s', command.correlationId ?? 'none');
|
|
16
|
+
try {
|
|
17
|
+
const serverRoot = path.resolve(serverDirectory);
|
|
18
|
+
const flowsDir = path.join(serverRoot, 'src', 'domain', 'flows');
|
|
19
|
+
debugHandler('Resolved paths:');
|
|
20
|
+
debugHandler(' Server root: %s', serverRoot);
|
|
21
|
+
debugHandler(' Flows directory: %s', flowsDir);
|
|
22
|
+
if (!existsSync(flowsDir)) {
|
|
23
|
+
debugHandler('ERROR: Flows directory not found at %s', flowsDir);
|
|
24
|
+
return {
|
|
25
|
+
type: 'ServerImplementationFailed',
|
|
26
|
+
data: {
|
|
27
|
+
serverDirectory,
|
|
28
|
+
error: `Flows directory not found at: ${flowsDir}`,
|
|
29
|
+
},
|
|
30
|
+
timestamp: new Date(),
|
|
31
|
+
requestId: command.requestId,
|
|
32
|
+
correlationId: command.correlationId,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
debugProcess('Starting flow runner for directory: %s', flowsDir);
|
|
36
|
+
// Run the flows directly without spawning
|
|
37
|
+
await runFlows(flowsDir);
|
|
38
|
+
debugProcess('Flow runner completed successfully');
|
|
39
|
+
// For now, we don't have a way to count flows, so we'll use 0
|
|
40
|
+
// This could be enhanced by having runFlows return statistics
|
|
41
|
+
const flowsImplemented = 0;
|
|
42
|
+
debugResult('Process succeeded');
|
|
43
|
+
debugResult('Flows implemented: %d', flowsImplemented);
|
|
44
|
+
const successEvent = {
|
|
45
|
+
type: 'ServerImplemented',
|
|
46
|
+
data: {
|
|
47
|
+
serverDirectory,
|
|
48
|
+
flowsImplemented,
|
|
49
|
+
},
|
|
50
|
+
timestamp: new Date(),
|
|
51
|
+
requestId: command.requestId,
|
|
52
|
+
correlationId: command.correlationId,
|
|
53
|
+
};
|
|
54
|
+
debugResult('Returning success event: ServerImplemented');
|
|
55
|
+
return successEvent;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
debug('ERROR: Exception caught: %O', error);
|
|
59
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
60
|
+
return {
|
|
61
|
+
type: 'ServerImplementationFailed',
|
|
62
|
+
data: {
|
|
63
|
+
serverDirectory,
|
|
64
|
+
error: errorMessage,
|
|
65
|
+
},
|
|
66
|
+
timestamp: new Date(),
|
|
67
|
+
requestId: command.requestId,
|
|
68
|
+
correlationId: command.correlationId,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export const implementServerCommandHandler = {
|
|
73
|
+
name: 'ImplementServer',
|
|
74
|
+
handle: async (command) => {
|
|
75
|
+
debug('CommandHandler executing for ImplementServer');
|
|
76
|
+
const result = await handleImplementServerCommand(command);
|
|
77
|
+
if (result.type === 'ServerImplemented') {
|
|
78
|
+
debug('Command handler completed: success');
|
|
79
|
+
console.log(`✅ Server implementation completed successfully`);
|
|
80
|
+
if (result.data.flowsImplemented > 0) {
|
|
81
|
+
console.log(` ${result.data.flowsImplemented} flows implemented`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
debug('Command handler completed: failure - %s', result.data.error);
|
|
86
|
+
console.error(`❌ Server implementation failed: ${result.data.error}`);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=implement-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement-server.js","sourceRoot":"","sources":["../../src/commands/implement-server.ts"],"names":[],"mappings":";AAEA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,WAAW,MAAM,OAAO,CAAC;AAEhC,MAAM,KAAK,GAAG,WAAW,CAAC,qBAAqB,CAAC,CAAC;AACjD,MAAM,YAAY,GAAG,WAAW,CAAC,6BAA6B,CAAC,CAAC;AAChE,MAAM,YAAY,GAAG,WAAW,CAAC,6BAA6B,CAAC,CAAC;AAChE,MAAM,WAAW,GAAG,WAAW,CAAC,4BAA4B,CAAC,CAAC;AAyB9D,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,OAA+B;IAE/B,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAEzC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACzC,KAAK,CAAC,wBAAwB,EAAE,eAAe,CAAC,CAAC;IACjD,KAAK,CAAC,kBAAkB,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,KAAK,CAAC,sBAAsB,EAAE,OAAO,CAAC,aAAa,IAAI,MAAM,CAAC,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEjE,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAChC,YAAY,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;QAC9C,YAAY,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,YAAY,CAAC,wCAAwC,EAAE,QAAQ,CAAC,CAAC;YACjE,OAAO;gBACL,IAAI,EAAE,4BAA4B;gBAClC,IAAI,EAAE;oBACJ,eAAe;oBACf,KAAK,EAAE,iCAAiC,QAAQ,EAAE;iBACnD;gBACD,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;aACrC,CAAC;QACJ,CAAC;QAED,YAAY,CAAC,wCAAwC,EAAE,QAAQ,CAAC,CAAC;QAEjE,0CAA0C;QAC1C,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEzB,YAAY,CAAC,oCAAoC,CAAC,CAAC;QAEnD,8DAA8D;QAC9D,8DAA8D;QAC9D,MAAM,gBAAgB,GAAG,CAAC,CAAC;QAE3B,WAAW,CAAC,mBAAmB,CAAC,CAAC;QACjC,WAAW,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;QAEvD,MAAM,YAAY,GAA2B;YAC3C,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE;gBACJ,eAAe;gBACf,gBAAgB;aACjB;YACD,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC;QAEF,WAAW,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,YAAY,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;QAEvF,OAAO;YACL,IAAI,EAAE,4BAA4B;YAClC,IAAI,EAAE;gBACJ,eAAe;gBACf,KAAK,EAAE,YAAY;aACpB;YACD,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAA2C;IACnF,IAAI,EAAE,iBAAiB;IACvB,MAAM,EAAE,KAAK,EAAE,OAA+B,EAAiB,EAAE;QAC/D,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC;QAE3D,IAAI,MAAM,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACxC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,oBAAoB,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,yCAAyC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpE,OAAO,CAAC,KAAK,CAAC,mCAAmC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,+BAA+B,GACrC,MAAM,6BAA6B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,GAI7B,MAAM,6BAA6B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@auto-engineer/server-implementer",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"implement-server": "./dist/cli/implement-server.js"
|
|
9
|
+
},
|
|
7
10
|
"publishConfig": {
|
|
8
11
|
"access": "public"
|
|
9
12
|
},
|
|
10
13
|
"dependencies": {
|
|
11
14
|
"@auto-engineer/ai-gateway": "^0.4.5",
|
|
15
|
+
"@auto-engineer/message-bus": "^0.4.5",
|
|
12
16
|
"@modelcontextprotocol/sdk": "^1.3.0",
|
|
17
|
+
"debug": "^4.3.4",
|
|
13
18
|
"fast-glob": "^3.3.3",
|
|
14
19
|
"vite": "^5.4.1"
|
|
15
20
|
},
|
|
@@ -25,6 +30,7 @@
|
|
|
25
30
|
},
|
|
26
31
|
"scripts": {
|
|
27
32
|
"implement": "tsx src/cli/index.ts",
|
|
33
|
+
"implement:server": "tsx src/cli/implement-server.ts",
|
|
28
34
|
"build": "tsc",
|
|
29
35
|
"dev": "tsc --watch",
|
|
30
36
|
"test": "vitest run",
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { implementServerCommandHandler } from '../commands/implement-server';
|
|
5
|
+
import createDebug from 'debug';
|
|
6
|
+
|
|
7
|
+
const debug = createDebug('server-impl:cli:implement');
|
|
8
|
+
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
|
|
11
|
+
const isMain = process.argv[1] === __filename;
|
|
12
|
+
|
|
13
|
+
if (isMain) {
|
|
14
|
+
debug('CLI started with args: %o', process.argv.slice(2));
|
|
15
|
+
|
|
16
|
+
const serverDirectory = process.argv[2];
|
|
17
|
+
if (!serverDirectory) {
|
|
18
|
+
debug('ERROR: No server directory provided');
|
|
19
|
+
console.error('Usage: implement:server <server-directory>');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
debug('Server directory argument: %s', serverDirectory);
|
|
24
|
+
|
|
25
|
+
// Create command and execute handler
|
|
26
|
+
const command = {
|
|
27
|
+
type: 'ImplementServer' as const,
|
|
28
|
+
data: {
|
|
29
|
+
serverDirectory,
|
|
30
|
+
},
|
|
31
|
+
timestamp: new Date(),
|
|
32
|
+
requestId: `cli-${Date.now()}`,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
debug('Executing command handler');
|
|
36
|
+
void implementServerCommandHandler
|
|
37
|
+
.handle(command)
|
|
38
|
+
.then(() => {
|
|
39
|
+
debug('Command completed successfully');
|
|
40
|
+
})
|
|
41
|
+
.catch((error) => {
|
|
42
|
+
debug('Command failed: %O', error);
|
|
43
|
+
console.error('Failed to execute command:', error);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { type CommandHandler, type Command, type Event } from '@auto-engineer/message-bus';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { existsSync } from 'fs';
|
|
5
|
+
import { runFlows } from '../agent/runFlows';
|
|
6
|
+
import createDebug from 'debug';
|
|
7
|
+
|
|
8
|
+
const debug = createDebug('server-impl:command');
|
|
9
|
+
const debugHandler = createDebug('server-impl:command:handler');
|
|
10
|
+
const debugProcess = createDebug('server-impl:command:process');
|
|
11
|
+
const debugResult = createDebug('server-impl:command:result');
|
|
12
|
+
|
|
13
|
+
export type ImplementServerCommand = Command<
|
|
14
|
+
'ImplementServer',
|
|
15
|
+
{
|
|
16
|
+
serverDirectory: string;
|
|
17
|
+
}
|
|
18
|
+
>;
|
|
19
|
+
|
|
20
|
+
export type ServerImplementedEvent = Event<
|
|
21
|
+
'ServerImplemented',
|
|
22
|
+
{
|
|
23
|
+
serverDirectory: string;
|
|
24
|
+
flowsImplemented: number;
|
|
25
|
+
}
|
|
26
|
+
>;
|
|
27
|
+
|
|
28
|
+
export type ServerImplementationFailedEvent = Event<
|
|
29
|
+
'ServerImplementationFailed',
|
|
30
|
+
{
|
|
31
|
+
serverDirectory: string;
|
|
32
|
+
error: string;
|
|
33
|
+
}
|
|
34
|
+
>;
|
|
35
|
+
|
|
36
|
+
export async function handleImplementServerCommand(
|
|
37
|
+
command: ImplementServerCommand,
|
|
38
|
+
): Promise<ServerImplementedEvent | ServerImplementationFailedEvent> {
|
|
39
|
+
const { serverDirectory } = command.data;
|
|
40
|
+
|
|
41
|
+
debug('Handling ImplementServerCommand');
|
|
42
|
+
debug(' Server directory: %s', serverDirectory);
|
|
43
|
+
debug(' Request ID: %s', command.requestId);
|
|
44
|
+
debug(' Correlation ID: %s', command.correlationId ?? 'none');
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
const serverRoot = path.resolve(serverDirectory);
|
|
48
|
+
const flowsDir = path.join(serverRoot, 'src', 'domain', 'flows');
|
|
49
|
+
|
|
50
|
+
debugHandler('Resolved paths:');
|
|
51
|
+
debugHandler(' Server root: %s', serverRoot);
|
|
52
|
+
debugHandler(' Flows directory: %s', flowsDir);
|
|
53
|
+
|
|
54
|
+
if (!existsSync(flowsDir)) {
|
|
55
|
+
debugHandler('ERROR: Flows directory not found at %s', flowsDir);
|
|
56
|
+
return {
|
|
57
|
+
type: 'ServerImplementationFailed',
|
|
58
|
+
data: {
|
|
59
|
+
serverDirectory,
|
|
60
|
+
error: `Flows directory not found at: ${flowsDir}`,
|
|
61
|
+
},
|
|
62
|
+
timestamp: new Date(),
|
|
63
|
+
requestId: command.requestId,
|
|
64
|
+
correlationId: command.correlationId,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
debugProcess('Starting flow runner for directory: %s', flowsDir);
|
|
69
|
+
|
|
70
|
+
// Run the flows directly without spawning
|
|
71
|
+
await runFlows(flowsDir);
|
|
72
|
+
|
|
73
|
+
debugProcess('Flow runner completed successfully');
|
|
74
|
+
|
|
75
|
+
// For now, we don't have a way to count flows, so we'll use 0
|
|
76
|
+
// This could be enhanced by having runFlows return statistics
|
|
77
|
+
const flowsImplemented = 0;
|
|
78
|
+
|
|
79
|
+
debugResult('Process succeeded');
|
|
80
|
+
debugResult('Flows implemented: %d', flowsImplemented);
|
|
81
|
+
|
|
82
|
+
const successEvent: ServerImplementedEvent = {
|
|
83
|
+
type: 'ServerImplemented',
|
|
84
|
+
data: {
|
|
85
|
+
serverDirectory,
|
|
86
|
+
flowsImplemented,
|
|
87
|
+
},
|
|
88
|
+
timestamp: new Date(),
|
|
89
|
+
requestId: command.requestId,
|
|
90
|
+
correlationId: command.correlationId,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
debugResult('Returning success event: ServerImplemented');
|
|
94
|
+
return successEvent;
|
|
95
|
+
} catch (error) {
|
|
96
|
+
debug('ERROR: Exception caught: %O', error);
|
|
97
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
98
|
+
|
|
99
|
+
return {
|
|
100
|
+
type: 'ServerImplementationFailed',
|
|
101
|
+
data: {
|
|
102
|
+
serverDirectory,
|
|
103
|
+
error: errorMessage,
|
|
104
|
+
},
|
|
105
|
+
timestamp: new Date(),
|
|
106
|
+
requestId: command.requestId,
|
|
107
|
+
correlationId: command.correlationId,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export const implementServerCommandHandler: CommandHandler<ImplementServerCommand> = {
|
|
113
|
+
name: 'ImplementServer',
|
|
114
|
+
handle: async (command: ImplementServerCommand): Promise<void> => {
|
|
115
|
+
debug('CommandHandler executing for ImplementServer');
|
|
116
|
+
const result = await handleImplementServerCommand(command);
|
|
117
|
+
|
|
118
|
+
if (result.type === 'ServerImplemented') {
|
|
119
|
+
debug('Command handler completed: success');
|
|
120
|
+
console.log(`✅ Server implementation completed successfully`);
|
|
121
|
+
if (result.data.flowsImplemented > 0) {
|
|
122
|
+
console.log(` ${result.data.flowsImplemented} flows implemented`);
|
|
123
|
+
}
|
|
124
|
+
} else {
|
|
125
|
+
debug('Command handler completed: failure - %s', result.data.error);
|
|
126
|
+
console.error(`❌ Server implementation failed: ${result.data.error}`);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
};
|