@specverse/engines 6.2.0 → 6.2.2
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/dist/ai/providers/claude-cli.d.ts +15 -0
- package/dist/ai/providers/claude-cli.d.ts.map +1 -1
- package/dist/ai/providers/claude-cli.js +48 -12
- package/dist/ai/providers/claude-cli.js.map +1 -1
- package/dist/analyse-prepass/adapters/typescript-prisma.d.ts +9 -0
- package/dist/analyse-prepass/adapters/typescript-prisma.d.ts.map +1 -1
- package/dist/analyse-prepass/adapters/typescript-prisma.js +19 -1
- package/dist/analyse-prepass/adapters/typescript-prisma.js.map +1 -1
- package/dist/libs/instance-factories/cli/templates/commander/command-generator.js +4 -1
- package/libs/instance-factories/cli/templates/commander/command-generator.ts +4 -1
- package/package.json +1 -1
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
import type { LanguageModelV3 } from '@ai-sdk/provider';
|
|
2
|
+
/**
|
|
3
|
+
* True when an error message indicates a recoverable session-state failure
|
|
4
|
+
* from claude-cli:
|
|
5
|
+
* - "Session ID already in use" — externally-managed sessionId collided
|
|
6
|
+
* with a still-live invocation (concurrent harness runs are the typical
|
|
7
|
+
* trigger).
|
|
8
|
+
* - "Session not found" / similar — `--resume` of a non-existent session,
|
|
9
|
+
* usually when our `initialized` flag is stale (the underlying
|
|
10
|
+
* claude-cli process exited and forgot the session, but the flag still
|
|
11
|
+
* says "resume me").
|
|
12
|
+
*
|
|
13
|
+
* Exported for unit testing and so harness code can apply the same predicate
|
|
14
|
+
* if it wants to wrap calls at a higher level.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isSessionError(message: string): boolean;
|
|
2
17
|
export interface ClaudeCliOptions {
|
|
3
18
|
/** Explicit path to the claude binary. Auto-detected if omitted. */
|
|
4
19
|
claudePath?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-cli.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/claude-cli.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yGAAyG;IACzG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBjE;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/D;AAmCD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"claude-cli.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/claude-cli.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yGAAyG;IACzG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBjE;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/D;AAmCD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CA+HzE"}
|
|
@@ -15,6 +15,23 @@ import { spawn, execSync } from 'child_process';
|
|
|
15
15
|
import { existsSync } from 'fs';
|
|
16
16
|
import { randomUUID } from 'crypto';
|
|
17
17
|
import { join } from 'path';
|
|
18
|
+
/**
|
|
19
|
+
* True when an error message indicates a recoverable session-state failure
|
|
20
|
+
* from claude-cli:
|
|
21
|
+
* - "Session ID already in use" — externally-managed sessionId collided
|
|
22
|
+
* with a still-live invocation (concurrent harness runs are the typical
|
|
23
|
+
* trigger).
|
|
24
|
+
* - "Session not found" / similar — `--resume` of a non-existent session,
|
|
25
|
+
* usually when our `initialized` flag is stale (the underlying
|
|
26
|
+
* claude-cli process exited and forgot the session, but the flag still
|
|
27
|
+
* says "resume me").
|
|
28
|
+
*
|
|
29
|
+
* Exported for unit testing and so harness code can apply the same predicate
|
|
30
|
+
* if it wants to wrap calls at a higher level.
|
|
31
|
+
*/
|
|
32
|
+
export function isSessionError(message) {
|
|
33
|
+
return /already in use|session.+not found|no.+session/i.test(message);
|
|
34
|
+
}
|
|
18
35
|
/**
|
|
19
36
|
* Find the first working `claude` binary. Tries:
|
|
20
37
|
* 1. Explicit path override if given
|
|
@@ -93,7 +110,7 @@ export function claudeCli(options = {}) {
|
|
|
93
110
|
const modelId = options.model ?? 'default';
|
|
94
111
|
// Use externally-managed sessionId when provided so multiple processes
|
|
95
112
|
// can share claude-cli's session state (Phase 5 of TODO #21).
|
|
96
|
-
|
|
113
|
+
let sessionId = options.sessionId || randomUUID();
|
|
97
114
|
let initialized = false;
|
|
98
115
|
async function spawnClaude(args, stdinPrompt) {
|
|
99
116
|
return new Promise((resolve, reject) => {
|
|
@@ -134,19 +151,38 @@ export function claudeCli(options = {}) {
|
|
|
134
151
|
supportedUrls: {},
|
|
135
152
|
async doGenerate(opts) {
|
|
136
153
|
const { system, user } = flattenPrompt(opts.prompt);
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if (
|
|
141
|
-
|
|
154
|
+
// Build args for either a fresh session or a resume of an existing one.
|
|
155
|
+
const buildArgs = (sid, asResume) => {
|
|
156
|
+
const a = ['--print'];
|
|
157
|
+
if (asResume) {
|
|
158
|
+
a.push('--resume', sid);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
a.push('--session-id', sid);
|
|
162
|
+
if (system)
|
|
163
|
+
a.push('--system-prompt', system);
|
|
164
|
+
}
|
|
165
|
+
if (modelId !== 'default')
|
|
166
|
+
a.push('--model', modelId);
|
|
167
|
+
a.push('-p', user);
|
|
168
|
+
return a;
|
|
169
|
+
};
|
|
170
|
+
// claude-cli rejects two related session-failure modes that we'd rather
|
|
171
|
+
// recover from than propagate as opaque errors. See `isSessionError`
|
|
172
|
+
// below for the patterns we recognise. Either way we recover by minting
|
|
173
|
+
// a fresh UUID and treating the next call as a first call. We retry
|
|
174
|
+
// ONCE; subsequent failures propagate.
|
|
175
|
+
let out;
|
|
176
|
+
try {
|
|
177
|
+
out = await spawnClaude(buildArgs(sessionId, initialized), user);
|
|
142
178
|
}
|
|
143
|
-
|
|
144
|
-
|
|
179
|
+
catch (e) {
|
|
180
|
+
if (!isSessionError(e?.message ?? ''))
|
|
181
|
+
throw e;
|
|
182
|
+
sessionId = randomUUID();
|
|
183
|
+
initialized = false;
|
|
184
|
+
out = await spawnClaude(buildArgs(sessionId, false), user);
|
|
145
185
|
}
|
|
146
|
-
if (modelId !== 'default')
|
|
147
|
-
args.push('--model', modelId);
|
|
148
|
-
args.push('-p', user);
|
|
149
|
-
const out = await spawnClaude(args, user);
|
|
150
186
|
initialized = true;
|
|
151
187
|
return {
|
|
152
188
|
content: [{ type: 'text', text: out.trim() }],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-cli.js","sourceRoot":"","sources":["../../../src/ai/providers/claude-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-cli.js","sourceRoot":"","sources":["../../../src/ai/providers/claude-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,6 +62,15 @@ export interface PrismaFacts {
|
|
|
62
62
|
* directly — it doesn't need any of the backend's call-graph or symbol
|
|
63
63
|
* indexing for Prisma extraction. Prisma's schema syntax is small enough
|
|
64
64
|
* that regex over the raw text is the right tool.
|
|
65
|
+
*
|
|
66
|
+
* Discovers Prisma sources via `**\/*.prisma` to cover both layouts:
|
|
67
|
+
* - Single-file: `schema.prisma` (the legacy default).
|
|
68
|
+
* - Multi-file: Prisma 5.18+ `prismaSchemaFolder` previewFeature, where
|
|
69
|
+
* models split across `prisma/schema/*.prisma`.
|
|
70
|
+
* Files lacking model/enum declarations (e.g. files containing only
|
|
71
|
+
* `generator` + `datasource` blocks) contribute nothing and are harmless.
|
|
72
|
+
* Duplicate model names across files emit a warning and the FIRST
|
|
73
|
+
* declaration wins (Prisma itself rejects duplicates at validate-time).
|
|
65
74
|
*/
|
|
66
75
|
export declare function extractTypeScriptPrisma(prepass: StructuralPrepass): Promise<PrismaFacts>;
|
|
67
76
|
//# sourceMappingURL=typescript-prisma.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript-prisma.d.ts","sourceRoot":"","sources":["../../../src/analyse-prepass/adapters/typescript-prisma.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,8FAA8F;IAC9F,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,aAAa,EAAE,cAAc,EAAE,CAAC;IAChC,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,0BAA0B;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED
|
|
1
|
+
{"version":3,"file":"typescript-prisma.d.ts","sourceRoot":"","sources":["../../../src/analyse-prepass/adapters/typescript-prisma.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,8FAA8F;IAC9F,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,aAAa,EAAE,cAAc,EAAE,CAAC;IAChC,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,0BAA0B;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAkH9F"}
|
|
@@ -5,14 +5,24 @@
|
|
|
5
5
|
* directly — it doesn't need any of the backend's call-graph or symbol
|
|
6
6
|
* indexing for Prisma extraction. Prisma's schema syntax is small enough
|
|
7
7
|
* that regex over the raw text is the right tool.
|
|
8
|
+
*
|
|
9
|
+
* Discovers Prisma sources via `**\/*.prisma` to cover both layouts:
|
|
10
|
+
* - Single-file: `schema.prisma` (the legacy default).
|
|
11
|
+
* - Multi-file: Prisma 5.18+ `prismaSchemaFolder` previewFeature, where
|
|
12
|
+
* models split across `prisma/schema/*.prisma`.
|
|
13
|
+
* Files lacking model/enum declarations (e.g. files containing only
|
|
14
|
+
* `generator` + `datasource` blocks) contribute nothing and are harmless.
|
|
15
|
+
* Duplicate model names across files emit a warning and the FIRST
|
|
16
|
+
* declaration wins (Prisma itself rejects duplicates at validate-time).
|
|
8
17
|
*/
|
|
9
18
|
export async function extractTypeScriptPrisma(prepass) {
|
|
10
|
-
const schemaFiles = await prepass.listFiles({ glob: '
|
|
19
|
+
const schemaFiles = await prepass.listFiles({ glob: '**/*.prisma' });
|
|
11
20
|
if (schemaFiles.length === 0) {
|
|
12
21
|
return { entities: [], relationships: [], enums: {}, schemaFiles: [] };
|
|
13
22
|
}
|
|
14
23
|
const enums = {};
|
|
15
24
|
const entities = [];
|
|
25
|
+
const seenModels = new Set();
|
|
16
26
|
const relationships = [];
|
|
17
27
|
for (const file of schemaFiles) {
|
|
18
28
|
const text = await prepass.fileSourceText(file);
|
|
@@ -31,6 +41,14 @@ export async function extractTypeScriptPrisma(prepass) {
|
|
|
31
41
|
// Extract model declarations
|
|
32
42
|
for (const match of text.matchAll(/model\s+(\w+)\s*\{([^}]+)\}/g)) {
|
|
33
43
|
const modelName = match[1];
|
|
44
|
+
if (seenModels.has(modelName)) {
|
|
45
|
+
// Prisma rejects duplicates at validate-time; we mirror that by
|
|
46
|
+
// taking the first declaration we encountered. Worth surfacing as
|
|
47
|
+
// a console warning so a misconfigured schema doesn't fail silently.
|
|
48
|
+
console.warn(`[prisma-adapter] duplicate model "${modelName}" in ${file} — first declaration wins`);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
seenModels.add(modelName);
|
|
34
52
|
const body = match[2];
|
|
35
53
|
const fields = parseFields(body);
|
|
36
54
|
// Detect lifecycle: a field of an enum type — the enum's values are
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript-prisma.js","sourceRoot":"","sources":["../../../src/analyse-prepass/adapters/typescript-prisma.ts"],"names":[],"mappings":"AA8DA
|
|
1
|
+
{"version":3,"file":"typescript-prisma.js","sourceRoot":"","sources":["../../../src/analyse-prepass/adapters/typescript-prisma.ts"],"names":[],"mappings":"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"}
|
|
@@ -352,7 +352,10 @@ import type { ParserEngine, InferenceEngine, RealizeEngine } from '@specverse/ty
|
|
|
352
352
|
if (typeof attrDef === 'string') {
|
|
353
353
|
const parts = attrDef.split(' ');
|
|
354
354
|
const kv = (key: string) => parts.find((p: string) => p.startsWith(key + '='))?.split('=')[1];
|
|
355
|
-
|
|
355
|
+
const auto = kv('auto');
|
|
356
|
+
const explicitCategory = kv('category');
|
|
357
|
+
const category = explicitCategory || (auto || attrName === 'id' ? 'metadata' : 'business');
|
|
358
|
+
return { name: attrName, type: parts[0], required: parts.includes('required'), unique: parts.includes('unique'), auto, category };
|
|
356
359
|
}
|
|
357
360
|
return { name: attrName, ...(typeof attrDef === 'object' ? attrDef : {}) };
|
|
358
361
|
});
|
|
@@ -407,7 +407,10 @@ import type { ParserEngine, InferenceEngine, RealizeEngine } from '@specverse/ty
|
|
|
407
407
|
if (typeof attrDef === 'string') {
|
|
408
408
|
const parts = attrDef.split(' ');
|
|
409
409
|
const kv = (key: string) => parts.find((p: string) => p.startsWith(key + '='))?.split('=')[1];
|
|
410
|
-
|
|
410
|
+
const auto = kv('auto');
|
|
411
|
+
const explicitCategory = kv('category');
|
|
412
|
+
const category = explicitCategory || (auto || attrName === 'id' ? 'metadata' : 'business');
|
|
413
|
+
return { name: attrName, type: parts[0], required: parts.includes('required'), unique: parts.includes('unique'), auto, category };
|
|
411
414
|
}
|
|
412
415
|
return { name: attrName, ...(typeof attrDef === 'object' ? attrDef : {}) };
|
|
413
416
|
});
|