@auto-engineer/server-implementer 0.4.2 → 0.4.4
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 +23 -14
- package/.turbo/turbo-lint.log +5 -4
- package/.turbo/turbo-test.log +1 -1
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +8 -0
- package/DEBUG.md +128 -0
- package/dist/agent/runFlows.d.ts.map +1 -1
- package/dist/agent/runFlows.js +21 -2
- package/dist/agent/runFlows.js.map +1 -1
- package/dist/agent/runSlice.js +1 -1
- package/dist/agent/runSlice.js.map +1 -1
- package/dist/cli/index.js +18 -1
- package/dist/cli/index.js.map +1 -1
- package/package.json +2 -2
- package/src/agent/runAllSlices.js +11 -0
- package/src/agent/runFlows.js +16 -0
- package/src/agent/runFlows.ts +29 -2
- package/src/agent/runSlice.js +328 -0
- package/src/agent/runSlice.ts +1 -1
- package/src/agent/runTests.js +100 -0
- package/src/cli/index.js +21 -0
- package/src/cli/index.ts +22 -1
- package/src/prompts/systemPrompt.js +43 -0
- package/src/utils/extractCodeBlock.js +6 -0
package/.turbo/turbo-build.log
CHANGED
package/.turbo/turbo-format.log
CHANGED
|
@@ -1,14 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
src/agent/
|
|
10
|
-
src/agent/
|
|
11
|
-
src/
|
|
12
|
-
src/
|
|
13
|
-
src/
|
|
14
|
-
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> @auto-engineer/server-implementer@0.4.4 format /Users/sam/WebstormProjects/top/auto-engineer/packages/server-implementer
|
|
4
|
+
> prettier --write "**/*.{js,ts,json,md,yml,yaml}" --ignore-path ../../.prettierignore
|
|
5
|
+
|
|
6
|
+
CHANGELOG.md[2K[1G[90mCHANGELOG.md[39m 22ms (unchanged)
|
|
7
|
+
DEBUG.md[2K[1G[90mDEBUG.md[39m 5ms (unchanged)
|
|
8
|
+
package.json[2K[1G[90mpackage.json[39m 19ms (unchanged)
|
|
9
|
+
src/agent/runAllSlices.js[2K[1G[90msrc/agent/runAllSlices.js[39m 14ms (unchanged)
|
|
10
|
+
src/agent/runAllSlices.ts[2K[1G[90msrc/agent/runAllSlices.ts[39m 28ms (unchanged)
|
|
11
|
+
src/agent/runFlows.js[2K[1G[90msrc/agent/runFlows.js[39m 4ms (unchanged)
|
|
12
|
+
src/agent/runFlows.ts[2K[1G[90msrc/agent/runFlows.ts[39m 10ms (unchanged)
|
|
13
|
+
src/agent/runSlice.js[2K[1G[90msrc/agent/runSlice.js[39m 27ms (unchanged)
|
|
14
|
+
src/agent/runSlice.ts[2K[1G[90msrc/agent/runSlice.ts[39m 26ms (unchanged)
|
|
15
|
+
src/agent/runTests.js[2K[1G[90msrc/agent/runTests.js[39m 8ms (unchanged)
|
|
16
|
+
src/agent/runTests.ts[2K[1G[90msrc/agent/runTests.ts[39m 13ms (unchanged)
|
|
17
|
+
src/cli/index.js[2K[1G[90msrc/cli/index.js[39m 1ms (unchanged)
|
|
18
|
+
src/cli/index.ts[2K[1G[90msrc/cli/index.ts[39m 2ms (unchanged)
|
|
19
|
+
src/prompts/systemPrompt.js[2K[1G[90msrc/prompts/systemPrompt.js[39m 6ms (unchanged)
|
|
20
|
+
src/prompts/systemPrompt.ts[2K[1G[90msrc/prompts/systemPrompt.ts[39m 1ms (unchanged)
|
|
21
|
+
src/utils/extractCodeBlock.js[2K[1G[90msrc/utils/extractCodeBlock.js[39m 1ms (unchanged)
|
|
22
|
+
src/utils/extractCodeBlock.ts[2K[1G[90msrc/utils/extractCodeBlock.ts[39m 1ms (unchanged)
|
|
23
|
+
tsconfig.json[2K[1G[90mtsconfig.json[39m 1ms (unchanged)
|
package/.turbo/turbo-lint.log
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> @auto-engineer/server-implementer@0.4.4 lint /Users/sam/WebstormProjects/top/auto-engineer/packages/server-implementer
|
|
4
|
+
> eslint 'src/**/*.ts' --max-warnings 0 --config ../../eslint.config.ts
|
|
5
|
+
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @auto-engineer/server-implementer@0.4.
|
|
3
|
+
> @auto-engineer/server-implementer@0.4.4 test /Users/sam/WebstormProjects/top/auto-engineer/packages/server-implementer
|
|
4
4
|
> vitest run
|
|
5
5
|
|
|
6
6
|
[?25l
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @auto-engineer/server-implementer@0.4.
|
|
3
|
+
> @auto-engineer/server-implementer@0.4.4 type-check /Users/sam/WebstormProjects/top/auto-engineer/packages/server-implementer
|
|
4
4
|
> tsc --noEmit
|
|
5
5
|
|
package/CHANGELOG.md
CHANGED
package/DEBUG.md
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Debug Logging - Server Implementer
|
|
2
|
+
|
|
3
|
+
This package uses the [debug](https://www.npmjs.com/package/debug) library for conditional logging.
|
|
4
|
+
|
|
5
|
+
## Available Debug Namespaces
|
|
6
|
+
|
|
7
|
+
- `server-impl:cli` - CLI operations and initialization
|
|
8
|
+
- `server-impl:flows` - Flow directory processing
|
|
9
|
+
- `server-impl:flows:flow` - Individual flow processing
|
|
10
|
+
|
|
11
|
+
## Enabling Debug Output
|
|
12
|
+
|
|
13
|
+
Set the `DEBUG` environment variable to enable logging:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Enable all server-implementer logging
|
|
17
|
+
DEBUG=server-impl:* pnpm implement:server
|
|
18
|
+
|
|
19
|
+
# Enable specific namespace
|
|
20
|
+
DEBUG=server-impl:cli pnpm implement:server
|
|
21
|
+
|
|
22
|
+
# Enable flow processing only
|
|
23
|
+
DEBUG=server-impl:flows:* pnpm implement:server
|
|
24
|
+
|
|
25
|
+
# Enable all logging
|
|
26
|
+
DEBUG=* pnpm implement:server
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Examples
|
|
30
|
+
|
|
31
|
+
### Debug CLI Operations
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
DEBUG=server-impl:cli pnpm implement:server ./server
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Output example:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
server-impl:cli CLI started with args: [ './server' ]
|
|
41
|
+
server-impl:cli Server root argument: ./server
|
|
42
|
+
server-impl:cli Resolved server root: /Users/project/server
|
|
43
|
+
server-impl:cli Flows directory: /Users/project/server/src/domain/flows
|
|
44
|
+
server-impl:cli Flows directory exists, starting flow runner
|
|
45
|
+
server-impl:cli Flow runner completed
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Debug Flow Processing
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
DEBUG=server-impl:flows pnpm implement:server
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Output example:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
server-impl:flows Running flows from base directory: /Users/project/server/src/domain/flows
|
|
58
|
+
server-impl:flows Found 3 flow directories
|
|
59
|
+
server-impl:flows Flow directories: [ 'shopping-assistant', 'order-management', 'user-profile' ]
|
|
60
|
+
server-impl:flows All 3 flows processed successfully
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Debug Individual Flow Processing
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
DEBUG=server-impl:flows:flow pnpm implement:server
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Output example:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
server-impl:flows:flow Processing flow: shopping-assistant
|
|
73
|
+
server-impl:flows:flow Path: /Users/project/server/src/domain/flows/shopping-assistant
|
|
74
|
+
server-impl:flows:flow Flow shopping-assistant completed successfully
|
|
75
|
+
server-impl:flows:flow Processing flow: order-management
|
|
76
|
+
server-impl:flows:flow Path: /Users/project/server/src/domain/flows/order-management
|
|
77
|
+
server-impl:flows:flow Flow order-management completed successfully
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Common Use Cases
|
|
81
|
+
|
|
82
|
+
### Debug Full Server Implementation
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
DEBUG=server-impl:* pnpm implement:server
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Debug with AI Gateway
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
DEBUG=server-impl:*,ai-gateway:* pnpm implement:server
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Debug Flow Errors
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
DEBUG=server-impl:flows:flow pnpm implement:server 2>&1 | grep ERROR
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Save Debug Output
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
DEBUG=server-impl:* pnpm implement:server 2> server-impl-debug.log
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Error Debugging
|
|
107
|
+
|
|
108
|
+
When errors occur, enable all namespaces to get full context:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
DEBUG=server-impl:* pnpm implement:server
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Error output example:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
server-impl:cli ERROR: No server root path provided
|
|
118
|
+
server-impl:flows:flow ERROR: Flow shopping-assistant failed: Missing required files
|
|
119
|
+
server-impl:cli ERROR: Flow runner failed: Error: Missing required files
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Tips
|
|
123
|
+
|
|
124
|
+
- Start with `DEBUG=server-impl:*` to see all operations
|
|
125
|
+
- Use `DEBUG=server-impl:flows:flow` to focus on individual flow processing
|
|
126
|
+
- Combine with other packages: `DEBUG=server-impl:*,emmett:*`
|
|
127
|
+
- Filter errors: `DEBUG=server-impl:* pnpm implement:server 2>&1 | grep ERROR`
|
|
128
|
+
- Timestamp output: `DEBUG=server-impl:* pnpm implement:server 2>&1 | ts`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runFlows.d.ts","sourceRoot":"","sources":["../../src/agent/runFlows.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runFlows.d.ts","sourceRoot":"","sources":["../../src/agent/runFlows.ts"],"names":[],"mappings":"AAQA,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC7D"}
|
package/dist/agent/runFlows.js
CHANGED
|
@@ -1,17 +1,36 @@
|
|
|
1
1
|
import fg from 'fast-glob';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { runAllSlices } from './runAllSlices';
|
|
4
|
+
import createDebug from 'debug';
|
|
5
|
+
const debug = createDebug('server-impl:flows');
|
|
6
|
+
const debugFlow = createDebug('server-impl:flows:flow');
|
|
4
7
|
export async function runFlows(baseDir) {
|
|
8
|
+
debug('Running flows from base directory: %s', baseDir);
|
|
5
9
|
const flowDirs = await fg('*', {
|
|
6
10
|
cwd: baseDir,
|
|
7
11
|
onlyDirectories: true,
|
|
8
12
|
absolute: true,
|
|
9
13
|
});
|
|
14
|
+
debug('Found %d flow directories', flowDirs.length);
|
|
15
|
+
if (flowDirs.length > 0) {
|
|
16
|
+
debug('Flow directories: %o', flowDirs.map((d) => path.basename(d)));
|
|
17
|
+
}
|
|
10
18
|
console.log(`🚀 Found ${flowDirs.length} flows`);
|
|
11
19
|
for (const flowDir of flowDirs) {
|
|
12
|
-
|
|
13
|
-
|
|
20
|
+
const flowName = path.basename(flowDir);
|
|
21
|
+
debugFlow('Processing flow: %s', flowName);
|
|
22
|
+
debugFlow(' Path: %s', flowDir);
|
|
23
|
+
console.log(`📂 Processing flow: ${flowName}`);
|
|
24
|
+
try {
|
|
25
|
+
await runAllSlices(flowDir);
|
|
26
|
+
debugFlow('Flow %s completed successfully', flowName);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
debugFlow('ERROR: Flow %s failed: %O', flowName, error);
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
14
32
|
}
|
|
33
|
+
debug('All %d flows processed successfully', flowDirs.length);
|
|
15
34
|
console.log('✅ All flows processed');
|
|
16
35
|
}
|
|
17
36
|
//# sourceMappingURL=runFlows.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runFlows.js","sourceRoot":"","sources":["../../src/agent/runFlows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"runFlows.js","sourceRoot":"","sources":["../../src/agent/runFlows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,WAAW,MAAM,OAAO,CAAC;AAEhC,MAAM,KAAK,GAAG,WAAW,CAAC,mBAAmB,CAAC,CAAC;AAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,wBAAwB,CAAC,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe;IAC5C,KAAK,CAAC,uCAAuC,EAAE,OAAO,CAAC,CAAC;IAExD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,GAAG,EAAE;QAC7B,GAAG,EAAE,OAAO;QACZ,eAAe,EAAE,IAAI;QACrB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,KAAK,CAAC,2BAA2B,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CACH,sBAAsB,EACtB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CACtC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC;IACjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxC,SAAS,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;QAC3C,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAEjC,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;QAE/C,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YAC5B,SAAS,CAAC,gCAAgC,EAAE,QAAQ,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,CAAC,2BAA2B,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YACxD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,qCAAqC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACvC,CAAC"}
|
package/dist/agent/runSlice.js
CHANGED
|
@@ -9,7 +9,7 @@ import { runTests } from './runTests';
|
|
|
9
9
|
const availableProviders = getAvailableProviders();
|
|
10
10
|
const AI_PROVIDER = availableProviders[0];
|
|
11
11
|
if (availableProviders.length === 0) {
|
|
12
|
-
console.error('❌ No AI providers configured. Please set one of: OPENAI_API_KEY, ANTHROPIC_API_KEY,
|
|
12
|
+
console.error('❌ No AI providers configured. Please set one of: OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, or XAI_API_KEY');
|
|
13
13
|
process.exit(1);
|
|
14
14
|
}
|
|
15
15
|
export async function runSlice(sliceDir, flow) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runSlice.js","sourceRoot":"","sources":["../../src/agent/runSlice.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runSlice.js","sourceRoot":"","sources":["../../src/agent/runSlice.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -3,20 +3,37 @@ import path from 'path';
|
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
import { existsSync } from 'fs';
|
|
5
5
|
import { runFlows } from '../agent/runFlows';
|
|
6
|
+
import createDebug from 'debug';
|
|
7
|
+
const debug = createDebug('server-impl:cli');
|
|
6
8
|
const __filename = fileURLToPath(import.meta.url);
|
|
7
9
|
const isMain = process.argv[1] === __filename;
|
|
8
10
|
if (isMain) {
|
|
11
|
+
debug('CLI started with args: %o', process.argv.slice(2));
|
|
9
12
|
const base = process.argv[2];
|
|
10
13
|
if (!base) {
|
|
14
|
+
debug('ERROR: No server root path provided');
|
|
11
15
|
console.error('Usage: tsx src/cli/index.ts path/to/server/root');
|
|
12
16
|
process.exit(1);
|
|
13
17
|
}
|
|
18
|
+
debug('Server root argument: %s', base);
|
|
14
19
|
const serverRoot = path.resolve(base);
|
|
20
|
+
debug('Resolved server root: %s', serverRoot);
|
|
15
21
|
const flowsDir = path.join(serverRoot, 'src', 'domain', 'flows');
|
|
22
|
+
debug('Flows directory: %s', flowsDir);
|
|
16
23
|
if (!existsSync(flowsDir)) {
|
|
24
|
+
debug('ERROR: Flows directory does not exist at %s', flowsDir);
|
|
17
25
|
console.error(`❌ Flows directory not found at: ${flowsDir}`);
|
|
18
26
|
process.exit(1);
|
|
19
27
|
}
|
|
20
|
-
|
|
28
|
+
debug('Flows directory exists, starting flow runner');
|
|
29
|
+
void runFlows(flowsDir)
|
|
30
|
+
.then(() => {
|
|
31
|
+
debug('Flow runner completed');
|
|
32
|
+
})
|
|
33
|
+
.catch((error) => {
|
|
34
|
+
debug('ERROR: Flow runner failed: %O', error);
|
|
35
|
+
console.error('Flow runner failed:', error);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
});
|
|
21
38
|
}
|
|
22
39
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,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,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,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,iBAAiB,CAAC,CAAC;AAE7C,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,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC;IAExC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjE,KAAK,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;IAEvC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,6CAA6C,EAAE,QAAQ,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACtD,KAAK,QAAQ,CAAC,QAAQ,CAAC;SACpB,IAAI,CAAC,GAAG,EAAE;QACT,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACjC,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@auto-engineer/server-implementer",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"access": "public"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@auto-engineer/ai-gateway": "^0.4.
|
|
11
|
+
"@auto-engineer/ai-gateway": "^0.4.5",
|
|
12
12
|
"@modelcontextprotocol/sdk": "^1.3.0",
|
|
13
13
|
"fast-glob": "^3.3.3",
|
|
14
14
|
"vite": "^5.4.1"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import fg from 'fast-glob';
|
|
2
|
+
import { runSlice } from './runSlice';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
export async function runAllSlices(flowDir) {
|
|
5
|
+
const flowName = path.basename(flowDir);
|
|
6
|
+
const sliceDirs = await fg(`${flowDir}/**/*/`, { onlyDirectories: true });
|
|
7
|
+
for (const sliceDir of sliceDirs) {
|
|
8
|
+
await runSlice(sliceDir, flowName);
|
|
9
|
+
}
|
|
10
|
+
console.log('✅ All slices processed');
|
|
11
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import fg from 'fast-glob';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { runAllSlices } from './runAllSlices';
|
|
4
|
+
export async function runFlows(baseDir) {
|
|
5
|
+
const flowDirs = await fg('*', {
|
|
6
|
+
cwd: baseDir,
|
|
7
|
+
onlyDirectories: true,
|
|
8
|
+
absolute: true,
|
|
9
|
+
});
|
|
10
|
+
console.log(`🚀 Found ${flowDirs.length} flows`);
|
|
11
|
+
for (const flowDir of flowDirs) {
|
|
12
|
+
console.log(`📂 Processing flow: ${path.basename(flowDir)}`);
|
|
13
|
+
await runAllSlices(flowDir);
|
|
14
|
+
}
|
|
15
|
+
console.log('✅ All flows processed');
|
|
16
|
+
}
|
package/src/agent/runFlows.ts
CHANGED
|
@@ -1,18 +1,45 @@
|
|
|
1
1
|
import fg from 'fast-glob';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { runAllSlices } from './runAllSlices';
|
|
4
|
+
import createDebug from 'debug';
|
|
5
|
+
|
|
6
|
+
const debug = createDebug('server-impl:flows');
|
|
7
|
+
const debugFlow = createDebug('server-impl:flows:flow');
|
|
4
8
|
|
|
5
9
|
export async function runFlows(baseDir: string): Promise<void> {
|
|
10
|
+
debug('Running flows from base directory: %s', baseDir);
|
|
11
|
+
|
|
6
12
|
const flowDirs = await fg('*', {
|
|
7
13
|
cwd: baseDir,
|
|
8
14
|
onlyDirectories: true,
|
|
9
15
|
absolute: true,
|
|
10
16
|
});
|
|
17
|
+
|
|
18
|
+
debug('Found %d flow directories', flowDirs.length);
|
|
19
|
+
if (flowDirs.length > 0) {
|
|
20
|
+
debug(
|
|
21
|
+
'Flow directories: %o',
|
|
22
|
+
flowDirs.map((d) => path.basename(d)),
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
11
26
|
console.log(`🚀 Found ${flowDirs.length} flows`);
|
|
12
27
|
for (const flowDir of flowDirs) {
|
|
13
|
-
|
|
14
|
-
|
|
28
|
+
const flowName = path.basename(flowDir);
|
|
29
|
+
debugFlow('Processing flow: %s', flowName);
|
|
30
|
+
debugFlow(' Path: %s', flowDir);
|
|
31
|
+
|
|
32
|
+
console.log(`📂 Processing flow: ${flowName}`);
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
await runAllSlices(flowDir);
|
|
36
|
+
debugFlow('Flow %s completed successfully', flowName);
|
|
37
|
+
} catch (error) {
|
|
38
|
+
debugFlow('ERROR: Flow %s failed: %O', flowName, error);
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
15
41
|
}
|
|
16
42
|
|
|
43
|
+
debug('All %d flows processed successfully', flowDirs.length);
|
|
17
44
|
console.log('✅ All flows processed');
|
|
18
45
|
}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fg from 'fast-glob';
|
|
3
|
+
import { generateTextWithAI, getAvailableProviders } from '@auto-engineer/ai-gateway';
|
|
4
|
+
import { readFile, writeFile, access } from 'fs/promises';
|
|
5
|
+
import { execa } from 'execa';
|
|
6
|
+
import { SYSTEM_PROMPT } from '../prompts/systemPrompt';
|
|
7
|
+
import { extractCodeBlock } from '../utils/extractCodeBlock';
|
|
8
|
+
import { runTests } from './runTests';
|
|
9
|
+
const availableProviders = getAvailableProviders();
|
|
10
|
+
const AI_PROVIDER = availableProviders[0];
|
|
11
|
+
if (availableProviders.length === 0) {
|
|
12
|
+
console.error(
|
|
13
|
+
'❌ No AI providers configured. Please set one of: OPENAI_API_KEY, ANTHROPIC_API_KEY, GOOGLE_GENERATIVE_AI_API_KEY, or XAI_API_KEY',
|
|
14
|
+
);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
export async function runSlice(sliceDir, flow) {
|
|
18
|
+
const sliceName = path.basename(sliceDir);
|
|
19
|
+
console.log(`✏️ Implementing slice: ${sliceName} for flow: ${flow}`);
|
|
20
|
+
const contextFiles = await loadContextFiles(sliceDir);
|
|
21
|
+
const filesToImplement = findFilesToImplement(contextFiles);
|
|
22
|
+
for (const [targetFile] of filesToImplement) {
|
|
23
|
+
await implementFileFromAI(sliceDir, targetFile, contextFiles);
|
|
24
|
+
}
|
|
25
|
+
const result = await runTestsAndTypecheck(sliceDir);
|
|
26
|
+
reportTestAndTypecheckResults(sliceDir, flow, result);
|
|
27
|
+
if (result.success) {
|
|
28
|
+
console.log(`✅ All tests and checks passed on first attempt.`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
await retryFailedFiles(sliceDir, flow, result);
|
|
32
|
+
if (result.failedTestFiles.length > 0) {
|
|
33
|
+
await retryFailedTests(sliceDir, flow, result);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function retryFailedFiles(sliceDir, flow, initialResult) {
|
|
37
|
+
let contextFiles = await loadContextFiles(sliceDir);
|
|
38
|
+
let result = initialResult;
|
|
39
|
+
for (let attempt = 1; attempt <= 5; attempt++) {
|
|
40
|
+
if (result.failedTypecheckFiles.length === 0) {
|
|
41
|
+
console.log(`✅ Typecheck issues resolved after attempt ${attempt - 1}`);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
console.log(`🔁 Typecheck retry attempt ${attempt} for ${result.failedTypecheckFiles.length} files...`);
|
|
45
|
+
contextFiles = await loadContextFiles(sliceDir);
|
|
46
|
+
for (const filePath of result.failedTypecheckFiles) {
|
|
47
|
+
const fileName = path.basename(filePath);
|
|
48
|
+
const retryPrompt = buildRetryPrompt(fileName, contextFiles, result.testErrors, result.typecheckErrors);
|
|
49
|
+
console.log(`🔧 Retrying typecheck error in ${fileName} in flow ${flow}...`);
|
|
50
|
+
const aiOutput = await generateTextWithAI(retryPrompt, AI_PROVIDER);
|
|
51
|
+
const cleanedCode = extractCodeBlock(aiOutput);
|
|
52
|
+
await writeFile(path.join(sliceDir, fileName), cleanedCode, 'utf-8');
|
|
53
|
+
console.log(`♻️ Updated ${fileName} to fix typecheck errors`);
|
|
54
|
+
}
|
|
55
|
+
result = await runTestsAndTypecheck(sliceDir);
|
|
56
|
+
reportTestAndTypecheckResults(sliceDir, flow, result);
|
|
57
|
+
}
|
|
58
|
+
if (result.failedTypecheckFiles.length > 0) {
|
|
59
|
+
console.log(`⚠️ Fixing tests caused typecheck errors. Retrying typecheck fixes...`);
|
|
60
|
+
const typecheckOnlyResult = {
|
|
61
|
+
...result,
|
|
62
|
+
testErrors: '', // Clear test errors since we're only fixing typecheck
|
|
63
|
+
failedTestFiles: [], // Clear failed test files
|
|
64
|
+
};
|
|
65
|
+
result = await retryFailedFiles(sliceDir, path.basename(sliceDir), typecheckOnlyResult);
|
|
66
|
+
// After fixing typecheck, re-run everything to get fresh results
|
|
67
|
+
const freshResult = await runTestsAndTypecheck(sliceDir);
|
|
68
|
+
reportTestAndTypecheckResults(sliceDir, flow, freshResult);
|
|
69
|
+
result = freshResult;
|
|
70
|
+
if (result.failedTestFiles.length === 0) {
|
|
71
|
+
console.log(`✅ All test issues resolved after fixing type errors.`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
async function loadContextFiles(sliceDir) {
|
|
77
|
+
const files = await fg(['*.ts'], { cwd: sliceDir });
|
|
78
|
+
const context = {};
|
|
79
|
+
for (const file of files) {
|
|
80
|
+
const absPath = path.join(sliceDir, file);
|
|
81
|
+
context[file] = await readFile(absPath, 'utf-8');
|
|
82
|
+
}
|
|
83
|
+
return context;
|
|
84
|
+
}
|
|
85
|
+
function findFilesToImplement(contextFiles) {
|
|
86
|
+
return Object.entries(contextFiles).filter(
|
|
87
|
+
([, content]) => content.includes('TODO:') || content.includes('IMPLEMENTATION INSTRUCTIONS'),
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
function buildInitialPrompt(targetFile, context) {
|
|
91
|
+
return `
|
|
92
|
+
${SYSTEM_PROMPT}
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
📄 Target file to implement: ${targetFile}
|
|
96
|
+
|
|
97
|
+
${context[targetFile]}
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
🧠 Other files in the same slice:
|
|
101
|
+
${Object.entries(context)
|
|
102
|
+
.filter(([name]) => name !== targetFile)
|
|
103
|
+
.map(([name, content]) => `// File: ${name}\n${content}`)
|
|
104
|
+
.join('\n\n')}
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
Return only the whole updated file of ${targetFile}. Do not remove existing imports or types that are still referenced or required in the file. The file returned has to be production ready.
|
|
108
|
+
`.trim();
|
|
109
|
+
}
|
|
110
|
+
function buildRetryPrompt(targetFile, context, testErrors, typeErrors) {
|
|
111
|
+
return `
|
|
112
|
+
${SYSTEM_PROMPT}
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
The previous implementation of ${targetFile} caused test or type-check failures.
|
|
116
|
+
|
|
117
|
+
📄 File to fix: ${targetFile}
|
|
118
|
+
|
|
119
|
+
${context[targetFile]}
|
|
120
|
+
|
|
121
|
+
🧠 Other files in the same slice:
|
|
122
|
+
${Object.entries(context)
|
|
123
|
+
.filter(([name]) => name !== targetFile)
|
|
124
|
+
.map(([name, content]) => `// File: ${name}\n${content}`)
|
|
125
|
+
.join('\n\n')}
|
|
126
|
+
|
|
127
|
+
🧪 Test errors:
|
|
128
|
+
${testErrors || 'None'}
|
|
129
|
+
|
|
130
|
+
📐 Typecheck errors:
|
|
131
|
+
${typeErrors || 'None'}
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
Return only the corrected full contents of ${targetFile}, no commentary, no markdown.
|
|
135
|
+
`.trim();
|
|
136
|
+
}
|
|
137
|
+
async function implementFileFromAI(sliceDir, targetFile, contextFiles) {
|
|
138
|
+
const filePath = path.join(sliceDir, targetFile);
|
|
139
|
+
const prompt = buildInitialPrompt(targetFile, contextFiles);
|
|
140
|
+
console.log(`🔮 Analysing and Implementing ${targetFile}`);
|
|
141
|
+
const aiOutput = await generateTextWithAI(prompt, AI_PROVIDER);
|
|
142
|
+
//console.log('AI output:', aiOutput);
|
|
143
|
+
const cleanedCode = extractCodeBlock(aiOutput);
|
|
144
|
+
await writeFile(filePath, cleanedCode, 'utf-8');
|
|
145
|
+
console.log(`♻ Implemented ${targetFile}`);
|
|
146
|
+
}
|
|
147
|
+
export async function runTestsAndTypecheck(sliceDir) {
|
|
148
|
+
const rootDir = await findProjectRoot(sliceDir);
|
|
149
|
+
const testResult = await runTests(sliceDir, rootDir);
|
|
150
|
+
const typecheckResult = await runTypecheck(sliceDir, rootDir);
|
|
151
|
+
return {
|
|
152
|
+
success: testResult.success && typecheckResult.success,
|
|
153
|
+
failedTestFiles: testResult.failedTestFiles,
|
|
154
|
+
failedTypecheckFiles: typecheckResult.failedTypecheckFiles,
|
|
155
|
+
testErrors: testResult.testErrors,
|
|
156
|
+
typecheckErrors: typecheckResult.typecheckErrors,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
async function retryFailedTests(sliceDir, flow, result) {
|
|
160
|
+
let contextFiles = await loadContextFiles(sliceDir);
|
|
161
|
+
for (let attempt = 1; attempt <= 5; attempt++) {
|
|
162
|
+
if (result.failedTestFiles.length === 0) {
|
|
163
|
+
console.log(`✅ Test failures resolved after attempt ${attempt - 1}`);
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
console.log(`🔁 Test retry attempt ${attempt} for ${result.failedTestFiles.length} files...`);
|
|
167
|
+
const smartPrompt = `
|
|
168
|
+
${SYSTEM_PROMPT}
|
|
169
|
+
---
|
|
170
|
+
🧪 The current implementation has test failures.
|
|
171
|
+
|
|
172
|
+
📄 Test errors:
|
|
173
|
+
${result.testErrors || 'None'}
|
|
174
|
+
|
|
175
|
+
🧠 Full slice context:
|
|
176
|
+
${Object.entries(contextFiles)
|
|
177
|
+
.map(([name, content]) => `// File: ${name}\n${content}`)
|
|
178
|
+
.join('\n\n')}
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
Please return the full corrected content of a single file (not a test file) that should be updated to fix the failing tests.
|
|
182
|
+
|
|
183
|
+
Use this format:
|
|
184
|
+
\`\`\`ts
|
|
185
|
+
// File: <fileName>.ts
|
|
186
|
+
<corrected code>
|
|
187
|
+
\`\`\`
|
|
188
|
+
|
|
189
|
+
No commentary or markdown outside the code block.
|
|
190
|
+
`.trim();
|
|
191
|
+
console.log('🔮 Asking AI to suggest a fix for test failures...');
|
|
192
|
+
const aiOutput = await generateTextWithAI(smartPrompt, AI_PROVIDER);
|
|
193
|
+
const cleaned = extractCodeBlock(aiOutput);
|
|
194
|
+
const match = cleaned.match(/^\/\/ File: (.+?)\n([\s\S]*)/m);
|
|
195
|
+
if (!match) {
|
|
196
|
+
console.warn(`⚠️ Skipping retry. AI output didn't match expected format.`);
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
const [, fileName, code] = match;
|
|
200
|
+
const absPath = path.join(sliceDir, fileName.trim());
|
|
201
|
+
console.log('🔧 Applying AI fix to:', absPath);
|
|
202
|
+
await writeFile(absPath, code.trim(), 'utf-8');
|
|
203
|
+
console.log(`♻️ Updated ${fileName.trim()} to fix tests`);
|
|
204
|
+
contextFiles = await loadContextFiles(sliceDir);
|
|
205
|
+
result = await runTestsAndTypecheck(sliceDir);
|
|
206
|
+
reportTestAndTypecheckResults(sliceDir, flow, result);
|
|
207
|
+
// If test fix introduced a new type error, handle it before continuing
|
|
208
|
+
if (result.failedTypecheckFiles.length > 0) {
|
|
209
|
+
console.log(`⚠️ Fixing tests caused typecheck errors. Retrying typecheck fixes...`);
|
|
210
|
+
result = await retryFailedFiles(sliceDir, flow, result);
|
|
211
|
+
if (result.failedTestFiles.length === 0) {
|
|
212
|
+
console.log(`✅ All test issues resolved after fixing type errors.`);
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
contextFiles = await loadContextFiles(sliceDir);
|
|
217
|
+
}
|
|
218
|
+
if (result.failedTestFiles.length > 0) {
|
|
219
|
+
console.error(`❌ Some test failures remain after retry attempts.`);
|
|
220
|
+
for (const file of result.failedTestFiles) {
|
|
221
|
+
console.log(` - ${path.relative(sliceDir, file)}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async function runTypecheck(sliceDir, rootDir) {
|
|
226
|
+
try {
|
|
227
|
+
const result = await execa('npx', ['tsc', '--noEmit'], {
|
|
228
|
+
cwd: rootDir,
|
|
229
|
+
stdio: 'pipe',
|
|
230
|
+
reject: false,
|
|
231
|
+
});
|
|
232
|
+
const output = (result.stdout ?? '') + (result.stderr ?? '');
|
|
233
|
+
if (result.exitCode !== 0 || output.includes('error')) {
|
|
234
|
+
return await processTypecheckOutput(output, sliceDir, rootDir);
|
|
235
|
+
}
|
|
236
|
+
return { success: true, typecheckErrors: '', failedTypecheckFiles: [] };
|
|
237
|
+
} catch (err) {
|
|
238
|
+
const execaErr = err;
|
|
239
|
+
const output = (execaErr.stdout ?? '') + (execaErr.stderr ?? '');
|
|
240
|
+
console.error('TypeScript execution error:', output);
|
|
241
|
+
const files = await fg(['*.ts'], { cwd: sliceDir, absolute: true });
|
|
242
|
+
return { success: false, typecheckErrors: output, failedTypecheckFiles: files };
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
function getTypecheckPatterns() {
|
|
246
|
+
return [
|
|
247
|
+
/^([^:]+\.ts)\(\d+,\d+\): error/gm,
|
|
248
|
+
/error TS\d+: (.+) '([^']+\.ts)'/gm,
|
|
249
|
+
/^([^:]+\.ts):\d+:\d+\s+-\s+error/gm,
|
|
250
|
+
];
|
|
251
|
+
}
|
|
252
|
+
function extractFailedFiles(output, patterns, rootDir, sliceDir) {
|
|
253
|
+
const failedFiles = new Set();
|
|
254
|
+
for (const pattern of patterns) {
|
|
255
|
+
for (const match of output.matchAll(pattern)) {
|
|
256
|
+
const filePath = match[1] ? path.resolve(rootDir, match[1]) : '';
|
|
257
|
+
const notNodeModules = !filePath.includes('node_modules');
|
|
258
|
+
const inSlice = sliceDir === undefined || filePath.startsWith(sliceDir);
|
|
259
|
+
if (notNodeModules && inSlice) {
|
|
260
|
+
failedFiles.add(filePath);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return Array.from(failedFiles);
|
|
265
|
+
}
|
|
266
|
+
async function processTypecheckOutput(output, sliceDir, rootDir) {
|
|
267
|
+
const relativePath = path.relative(rootDir, sliceDir);
|
|
268
|
+
const filtered = output
|
|
269
|
+
.split('\n')
|
|
270
|
+
.filter((line) => {
|
|
271
|
+
const hasError = line.includes('error TS') || line.includes('): error');
|
|
272
|
+
const notNodeModules = !line.includes('node_modules');
|
|
273
|
+
const hasSlicePath = line.includes(relativePath) || line.includes(sliceDir);
|
|
274
|
+
return hasError && notNodeModules && hasSlicePath;
|
|
275
|
+
})
|
|
276
|
+
.join('\n');
|
|
277
|
+
if (filtered.trim() === '') {
|
|
278
|
+
return { success: true, typecheckErrors: '', failedTypecheckFiles: [] };
|
|
279
|
+
}
|
|
280
|
+
const failedFiles = await processTypecheckFailure(filtered, rootDir, sliceDir);
|
|
281
|
+
return {
|
|
282
|
+
success: false,
|
|
283
|
+
typecheckErrors: filtered,
|
|
284
|
+
failedTypecheckFiles: failedFiles,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
async function processTypecheckFailure(output, rootDir, sliceDir) {
|
|
288
|
+
const patterns = getTypecheckPatterns();
|
|
289
|
+
let failed = extractFailedFiles(output, patterns, rootDir, sliceDir);
|
|
290
|
+
if (failed.length === 0 && output.includes('error')) {
|
|
291
|
+
failed = await fg(['*.ts'], { cwd: sliceDir, absolute: true });
|
|
292
|
+
}
|
|
293
|
+
return failed;
|
|
294
|
+
}
|
|
295
|
+
async function findProjectRoot(startDir) {
|
|
296
|
+
let dir = startDir;
|
|
297
|
+
while (dir !== path.dirname(dir)) {
|
|
298
|
+
try {
|
|
299
|
+
await access(path.join(dir, 'package.json'));
|
|
300
|
+
return dir;
|
|
301
|
+
} catch {
|
|
302
|
+
dir = path.dirname(dir);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
throw new Error('❌ Could not find project root');
|
|
306
|
+
}
|
|
307
|
+
function reportTestAndTypecheckResults(sliceDir, flow, result) {
|
|
308
|
+
const sliceName = path.basename(sliceDir);
|
|
309
|
+
if (result.success) {
|
|
310
|
+
console.log(`✅ All Tests and checks passed for: ${sliceName} in flow ${flow}`);
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
console.error(`❌ ${sliceName} in floe ${flow} failed tests or type-checks.`);
|
|
314
|
+
if (result.failedTestFiles.length) {
|
|
315
|
+
const files = result.failedTestFiles.map((f) => path.relative(sliceDir, f));
|
|
316
|
+
console.log(`🧪 Failed test files: ${files.join(', ')}`);
|
|
317
|
+
if (result.testErrors) {
|
|
318
|
+
console.log(`📝 Test errors:\n${result.testErrors}`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
if (result.failedTypecheckFiles.length) {
|
|
322
|
+
const files = result.failedTypecheckFiles.map((f) => path.relative(sliceDir, f));
|
|
323
|
+
console.log(`📐 Failed typecheck files: ${files.join(', ')}`);
|
|
324
|
+
if (result.typecheckErrors) {
|
|
325
|
+
console.log(`📝 Typecheck errors:\n${result.typecheckErrors}`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
package/src/agent/runSlice.ts
CHANGED
|
@@ -12,7 +12,7 @@ const AI_PROVIDER = availableProviders[0];
|
|
|
12
12
|
|
|
13
13
|
if (availableProviders.length === 0) {
|
|
14
14
|
console.error(
|
|
15
|
-
'❌ No AI providers configured. Please set one of: OPENAI_API_KEY, ANTHROPIC_API_KEY,
|
|
15
|
+
'❌ No AI providers configured. Please set one of: OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, or XAI_API_KEY',
|
|
16
16
|
);
|
|
17
17
|
process.exit(1);
|
|
18
18
|
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fg from 'fast-glob';
|
|
3
|
+
import { execa } from 'execa';
|
|
4
|
+
import { existsSync } from 'fs';
|
|
5
|
+
import { unlink } from 'fs/promises';
|
|
6
|
+
import { readFile } from 'fs/promises';
|
|
7
|
+
// eslint-disable-next-line complexity
|
|
8
|
+
export async function runTests(sliceDir, rootDir) {
|
|
9
|
+
console.log(`🔍 Running tests in ${path.basename(sliceDir)}...`);
|
|
10
|
+
const testFiles = await fg(['*.spec.ts', '*.specs.ts'], { cwd: sliceDir });
|
|
11
|
+
if (testFiles.length === 0) {
|
|
12
|
+
console.warn(`⚠️ No test files found in ${sliceDir}`);
|
|
13
|
+
return { success: true, testErrors: '', failedTestFiles: [] };
|
|
14
|
+
} else {
|
|
15
|
+
console.log(`🔍 Found test files in ${path.basename(sliceDir)}:`, testFiles);
|
|
16
|
+
}
|
|
17
|
+
const relativePaths = testFiles.map((f) => path.join(sliceDir, f).replace(`${rootDir}/`, ''));
|
|
18
|
+
const reportPath = path.join(sliceDir, 'vitest-results.json');
|
|
19
|
+
try {
|
|
20
|
+
const { stdout, stderr } = await execa(
|
|
21
|
+
'npx',
|
|
22
|
+
['vitest', 'run', '--reporter=json', `--outputFile=${reportPath}`, ...relativePaths],
|
|
23
|
+
{
|
|
24
|
+
cwd: rootDir,
|
|
25
|
+
stdio: 'pipe',
|
|
26
|
+
reject: false,
|
|
27
|
+
},
|
|
28
|
+
);
|
|
29
|
+
// Wait a bit for the file to be written
|
|
30
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
31
|
+
// Check if the report file exists and read it
|
|
32
|
+
if (existsSync(reportPath)) {
|
|
33
|
+
try {
|
|
34
|
+
const reportRaw = await readFile(reportPath, 'utf-8');
|
|
35
|
+
const report = JSON.parse(reportRaw);
|
|
36
|
+
const testResults = report.testResults ?? [];
|
|
37
|
+
const failedFiles = testResults
|
|
38
|
+
.filter((r) => r.status === 'failed')
|
|
39
|
+
.map((r) => {
|
|
40
|
+
const fileName = r.name ?? r.file;
|
|
41
|
+
if (!fileName) {
|
|
42
|
+
console.warn('⚠️ Skipping test result with missing name or file:', r);
|
|
43
|
+
return path.join(sliceDir, 'unknown');
|
|
44
|
+
}
|
|
45
|
+
return path.join(sliceDir, path.basename(fileName));
|
|
46
|
+
});
|
|
47
|
+
const failedTestSummaries = testResults
|
|
48
|
+
.filter((r) => r.status === 'failed')
|
|
49
|
+
.map((r) => {
|
|
50
|
+
const fileName = path.basename(r.name ?? r.file ?? 'unknown');
|
|
51
|
+
if (r.assertionResults.length > 0) {
|
|
52
|
+
const lines = r.assertionResults
|
|
53
|
+
.filter((a) => a.status === 'failed')
|
|
54
|
+
.map((a) => `❌ ${a.fullName}\n${a.failureMessages?.join('\n') ?? ''}`);
|
|
55
|
+
return `📄 ${fileName}\n${lines.join('\n')}`;
|
|
56
|
+
}
|
|
57
|
+
// fallback: use top-level message
|
|
58
|
+
if ('message' in r && typeof r.message === 'string' && r.message.trim() !== '') {
|
|
59
|
+
return `📄 ${fileName}\n${r.message}`;
|
|
60
|
+
}
|
|
61
|
+
return `📄 ${fileName}\n⚠️ Test suite failed but no assertion or error message found.`;
|
|
62
|
+
})
|
|
63
|
+
.join('\n\n');
|
|
64
|
+
return {
|
|
65
|
+
success: failedFiles.length === 0,
|
|
66
|
+
testErrors: failedTestSummaries || stdout || stderr || 'Tests failed but no error details available',
|
|
67
|
+
failedTestFiles: failedFiles,
|
|
68
|
+
};
|
|
69
|
+
} catch (parseErr) {
|
|
70
|
+
console.error('Failed to parse test results:', parseErr);
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
testErrors: stdout || stderr || 'Failed to parse test results',
|
|
74
|
+
failedTestFiles: testFiles.map((f) => path.join(sliceDir, f)),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
// No report file, use stdout/stderr
|
|
79
|
+
return {
|
|
80
|
+
success: false,
|
|
81
|
+
testErrors: stdout || stderr || 'Test execution failed - no report generated',
|
|
82
|
+
failedTestFiles: testFiles.map((f) => path.join(sliceDir, f)),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
} catch (err) {
|
|
86
|
+
const execaErr = err;
|
|
87
|
+
const output = (execaErr.stdout ?? '') + (execaErr.stderr ?? '');
|
|
88
|
+
console.error('Test execution error:', output);
|
|
89
|
+
return {
|
|
90
|
+
success: false,
|
|
91
|
+
testErrors: output || 'Test execution failed with no output',
|
|
92
|
+
failedTestFiles: testFiles.map((f) => path.join(sliceDir, f)),
|
|
93
|
+
};
|
|
94
|
+
} finally {
|
|
95
|
+
// Clean up the report file
|
|
96
|
+
if (existsSync(reportPath)) {
|
|
97
|
+
await unlink(reportPath).catch(() => {});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
package/src/cli/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import 'dotenv/config';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { existsSync } from 'fs';
|
|
5
|
+
import { runFlows } from '../agent/runFlows';
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const isMain = process.argv[1] === __filename;
|
|
8
|
+
if (isMain) {
|
|
9
|
+
const base = process.argv[2];
|
|
10
|
+
if (!base) {
|
|
11
|
+
console.error('Usage: tsx src/cli/index.ts path/to/server/root');
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const serverRoot = path.resolve(base);
|
|
15
|
+
const flowsDir = path.join(serverRoot, 'src', 'domain', 'flows');
|
|
16
|
+
if (!existsSync(flowsDir)) {
|
|
17
|
+
console.error(`❌ Flows directory not found at: ${flowsDir}`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
void runFlows(flowsDir);
|
|
21
|
+
}
|
package/src/cli/index.ts
CHANGED
|
@@ -3,25 +3,46 @@ import path from 'path';
|
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
import { existsSync } from 'fs';
|
|
5
5
|
import { runFlows } from '../agent/runFlows';
|
|
6
|
+
import createDebug from 'debug';
|
|
7
|
+
|
|
8
|
+
const debug = createDebug('server-impl:cli');
|
|
6
9
|
|
|
7
10
|
const __filename = fileURLToPath(import.meta.url);
|
|
8
11
|
|
|
9
12
|
const isMain = process.argv[1] === __filename;
|
|
10
13
|
|
|
11
14
|
if (isMain) {
|
|
15
|
+
debug('CLI started with args: %o', process.argv.slice(2));
|
|
16
|
+
|
|
12
17
|
const base = process.argv[2];
|
|
13
18
|
if (!base) {
|
|
19
|
+
debug('ERROR: No server root path provided');
|
|
14
20
|
console.error('Usage: tsx src/cli/index.ts path/to/server/root');
|
|
15
21
|
process.exit(1);
|
|
16
22
|
}
|
|
17
23
|
|
|
24
|
+
debug('Server root argument: %s', base);
|
|
25
|
+
|
|
18
26
|
const serverRoot = path.resolve(base);
|
|
27
|
+
debug('Resolved server root: %s', serverRoot);
|
|
28
|
+
|
|
19
29
|
const flowsDir = path.join(serverRoot, 'src', 'domain', 'flows');
|
|
30
|
+
debug('Flows directory: %s', flowsDir);
|
|
20
31
|
|
|
21
32
|
if (!existsSync(flowsDir)) {
|
|
33
|
+
debug('ERROR: Flows directory does not exist at %s', flowsDir);
|
|
22
34
|
console.error(`❌ Flows directory not found at: ${flowsDir}`);
|
|
23
35
|
process.exit(1);
|
|
24
36
|
}
|
|
25
37
|
|
|
26
|
-
|
|
38
|
+
debug('Flows directory exists, starting flow runner');
|
|
39
|
+
void runFlows(flowsDir)
|
|
40
|
+
.then(() => {
|
|
41
|
+
debug('Flow runner completed');
|
|
42
|
+
})
|
|
43
|
+
.catch((error) => {
|
|
44
|
+
debug('ERROR: Flow runner failed: %O', error);
|
|
45
|
+
console.error('Flow runner failed:', error);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
});
|
|
27
48
|
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export const SYSTEM_PROMPT = `
|
|
2
|
+
You are a software engineer implementing missing logic in a sliced event-driven TypeScript backend. Each slice contains partially scaffolded code, and your task is to complete the logic following implementation instructions embedded in each file.
|
|
3
|
+
|
|
4
|
+
Project Characteristics:
|
|
5
|
+
- Architecture: sliced event-sourced CQRS (Command, Query, Reaction slices)
|
|
6
|
+
- Language: TypeScript with type-graphql and Emmett
|
|
7
|
+
- Each slice has scaffolded files with implementation instructions clearly marked with comments (e.g., '## IMPLEMENTATION INSTRUCTIONS ##') or TODOs.
|
|
8
|
+
- Tests (e.g., *.specs.ts) must pass.
|
|
9
|
+
- Type errors are not allowed.
|
|
10
|
+
|
|
11
|
+
Your Goal:
|
|
12
|
+
- Read the implementation instructions from the provided file.
|
|
13
|
+
- Generate only the code needed to fulfill the instructions, nothing extra and provide back the whole file without the instructions.
|
|
14
|
+
- Maintain immutability and adhere to functional best practices.
|
|
15
|
+
- Use only the types and domain constructs already present in the slice.
|
|
16
|
+
- Do not remove existing imports or types that are still referenced or required in the file.
|
|
17
|
+
- Return the entire updated file, not just the modified parts and remove any TODO comments or instructions after implementing the logic
|
|
18
|
+
|
|
19
|
+
Key rules:
|
|
20
|
+
- Never modify code outside the TODO or instruction areas.
|
|
21
|
+
- Ensure the code is production-ready and type-safe.
|
|
22
|
+
- Follow the slice type conventions:
|
|
23
|
+
- **Command slice**: validate command, inspect state, emit events, never mutate state. Uses graphql mutations.
|
|
24
|
+
- **Reaction slice**: respond to events with commands.
|
|
25
|
+
- **Query slice**: maintain projections based on events, do not emit or throw. Uses graphql queries.
|
|
26
|
+
- All code must be TypeScript compliant and follow functional patterns.
|
|
27
|
+
- If a test exists, make it pass.
|
|
28
|
+
- Keep implementations minimal and idiomatic.
|
|
29
|
+
|
|
30
|
+
Avoid:
|
|
31
|
+
- Adding new dependencies.
|
|
32
|
+
- Refactoring unrelated code.
|
|
33
|
+
- Changing the structure of already scaffolded files unless instructed.
|
|
34
|
+
|
|
35
|
+
You will receive:
|
|
36
|
+
- The path of the file to implement.
|
|
37
|
+
- The current contents of the file, with instruction comments.
|
|
38
|
+
- Other relevant files from the same slice (e.g., types, test, state, etc.).
|
|
39
|
+
|
|
40
|
+
You must:
|
|
41
|
+
- Return the entire updated file (no commentary and remove all implementation instructions).
|
|
42
|
+
- Ensure the output is valid TypeScript.
|
|
43
|
+
`;
|