@specverse/engines 6.0.10 → 6.0.12

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.
@@ -0,0 +1,64 @@
1
+ import type { LanguageModel } from 'ai';
2
+ import { type RunManifest, type RunCaseEntry } from './run-paths.js';
3
+ export interface RunAnalyseOptions {
4
+ /**
5
+ * Path to the source under analysis. The runner does NOT copy this into
6
+ * outputDir/input/ — that's the caller's responsibility (the harness has
7
+ * its own corpus-shape conventions; CLI commands will copy explicitly).
8
+ */
9
+ sourceDir: string;
10
+ /**
11
+ * Where to write the structured run output (input/, facts/, prompts/,
12
+ * llm-output/, specs/, project/).
13
+ */
14
+ outputDir: string;
15
+ /** Pre-extracted facts file injected as the prompt preamble. */
16
+ factsPath?: string;
17
+ /** Auto-extract facts via `runPrepass` before calling the analyse prompt. */
18
+ autoFacts?: boolean;
19
+ /** Run verify-analyse after the draft pass. */
20
+ verify?: boolean;
21
+ /** Materialize project/ via `spv init` + `spv realize all`. */
22
+ realize?: boolean;
23
+ /** Pre-resolved LanguageModel (for cross-call session caching). */
24
+ model?: LanguageModel;
25
+ /** Per-call timeout. Default 15 min. */
26
+ timeoutMs?: number;
27
+ /** Identity fields recorded in manifest. */
28
+ prompt?: string;
29
+ providerId?: string;
30
+ modelId?: string;
31
+ experimentRunId?: string;
32
+ caseName?: string;
33
+ /** Loose case meta for the manifest (kind: 'analyse' is fixed). */
34
+ caseMeta?: RunCaseEntry;
35
+ }
36
+ export interface RunAnalyseResult {
37
+ outputDir: string;
38
+ draftSpecPath: string;
39
+ /** Canonical spec path = outputDir/specs/main.specly. Always present. */
40
+ finalSpecPath: string;
41
+ /** Stage that produced the canonical spec ("draft" if no verify). */
42
+ finalStage: 'draft' | 'verified';
43
+ validateFinal: {
44
+ ok: boolean;
45
+ errors: string;
46
+ };
47
+ realize: {
48
+ ok: boolean;
49
+ error?: string;
50
+ } | null;
51
+ draftDurationMs: number;
52
+ verifyDurationMs: number;
53
+ wallTimeMs: number;
54
+ manifest: RunManifest;
55
+ draftRetried: boolean;
56
+ validateAfterDraftOk: boolean;
57
+ }
58
+ /**
59
+ * Execute the full analyse pipeline against a source directory and write
60
+ * the structured run output. Returns paths + status; caller composes
61
+ * scoring / README finalization separately.
62
+ */
63
+ export declare function runAnalyse(opts: RunAnalyseOptions): Promise<RunAnalyseResult>;
64
+ //# sourceMappingURL=analyse-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyse-runner.d.ts","sourceRoot":"","sources":["../../src/ai/analyse-runner.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAGL,KAAK,WAAW,EAAE,KAAK,YAAY,EACpC,MAAM,gBAAgB,CAAC;AAIxB,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,UAAU,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,aAAa,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,OAAO,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAqCD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuLnF"}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * `runAnalyse()` — high-level orchestrator for analysing a source codebase
3
+ * into a SpecVerse spec.
4
+ *
5
+ * Public API for `spv ai analyse` (TODO #21 phase 4) and the eval harness.
6
+ * One call, full pipeline:
7
+ *
8
+ * 1. (optional) inject pre-extracted structural facts via runPrepass
9
+ * 2. assemble + call the analyse prompt → specs/draft.specly + main.specly
10
+ * 3. spv validate; if invalid, retry once with the parser error fed back
11
+ * 4. (optional) verify-analyse pass → specs/verified.specly + main.specly
12
+ * 5. spv validate; record validate.txt
13
+ * 6. (optional) materialize project/ via spv init + spv realize
14
+ *
15
+ * Caller responsibilities:
16
+ * - Materialize source into `inputDir` (or just point to an existing dir)
17
+ * - Decide where outputs go via `outputDir`
18
+ * - Score against expected_* fields if running eval
19
+ * - Compose final README + manifest with caseMeta + score
20
+ *
21
+ * The runner returns enough information for the caller to compose those
22
+ * artifacts. It writes manifest.json itself with what it knows; callers
23
+ * can re-write it with additional fields after scoring.
24
+ */
25
+ import { writeFileSync, readFileSync, existsSync, rmSync, cpSync } from 'fs';
26
+ import { join } from 'path';
27
+ import { execSync, spawnSync } from 'child_process';
28
+ import { promptsDir, llmOutputDir, factsDir, specsDir, ensureSubdirs, writeStageSpec, writeProjectReadme, writeManifest, } from './run-paths.js';
29
+ import { runPrompt, extractSpec } from './prompt-runner.js';
30
+ import { resolveModel, resolveProviderId } from './model-resolver.js';
31
+ function runValidate(specPath) {
32
+ const result = spawnSync('spv', ['validate', specPath], {
33
+ encoding: 'utf8',
34
+ timeout: 30_000,
35
+ });
36
+ if (result.status === 0)
37
+ return { ok: true, errors: '' };
38
+ const errors = (result.stderr || '') + (result.stdout || '');
39
+ return { ok: false, errors: errors.trim() };
40
+ }
41
+ async function realizeProject(outputDir) {
42
+ const projectPath = join(outputDir, 'project');
43
+ const mainSpec = join(specsDir(outputDir), 'main.specly');
44
+ if (!existsSync(mainSpec))
45
+ return { ok: false, error: 'specs/main.specly missing' };
46
+ if (existsSync(projectPath))
47
+ rmSync(projectPath, { recursive: true, force: true });
48
+ try {
49
+ execSync(`spv init project --template default`, {
50
+ cwd: outputDir, stdio: 'pipe', timeout: 60_000,
51
+ });
52
+ }
53
+ catch (err) {
54
+ return { ok: false, error: `spv init failed: ${err.message}` };
55
+ }
56
+ cpSync(mainSpec, join(projectPath, 'specs', 'main.specly'));
57
+ try {
58
+ execSync(`spv realize all specs/main.specly`, {
59
+ cwd: projectPath, stdio: 'pipe', timeout: 15 * 60_000,
60
+ });
61
+ }
62
+ catch (err) {
63
+ const e = err;
64
+ const stderr = e.stderr ? String(e.stderr).slice(0, 500) : '';
65
+ return { ok: false, error: `spv realize failed: ${stderr || e.message}` };
66
+ }
67
+ return { ok: true };
68
+ }
69
+ /**
70
+ * Execute the full analyse pipeline against a source directory and write
71
+ * the structured run output. Returns paths + status; caller composes
72
+ * scoring / README finalization separately.
73
+ */
74
+ export async function runAnalyse(opts) {
75
+ const startedAt = new Date().toISOString();
76
+ const t0 = Date.now();
77
+ ensureSubdirs(opts.outputDir);
78
+ // 1. Resolve facts content (if any). Two sources: --facts <path> (manual)
79
+ // or runPrepass on sourceDir (--auto-facts). Manual wins if both passed.
80
+ let factsContent = '';
81
+ let factsSource = null;
82
+ if (opts.autoFacts && !opts.factsPath) {
83
+ const { runPrepass, formatFactsAsMarkdown } = await import('./../analyse-prepass/index.js');
84
+ const facts = await runPrepass(opts.sourceDir);
85
+ factsContent = formatFactsAsMarkdown(facts);
86
+ factsSource = `auto (${facts.meta.backend}, adapters: ${facts.meta.adaptersRun.join(', ') || 'none'})`;
87
+ writeFileSync(join(factsDir(opts.outputDir), 'facts.md'), factsContent);
88
+ try {
89
+ writeFileSync(join(factsDir(opts.outputDir), 'facts.json'), JSON.stringify(facts, null, 2));
90
+ }
91
+ catch { /* non-serializable; skip */ }
92
+ }
93
+ else if (opts.factsPath) {
94
+ factsContent = readFileSync(opts.factsPath, 'utf8');
95
+ factsSource = `manual (${opts.factsPath})`;
96
+ writeFileSync(join(factsDir(opts.outputDir), 'facts.md'), factsContent);
97
+ }
98
+ const userPrefix = factsContent
99
+ ? 'Before reading the source, here is a deterministic structural\n' +
100
+ 'inventory extracted from the source (NOT LLM judgment). Treat as\n' +
101
+ 'ground truth for what symbols/files exist; verify SpecVerse semantics\n' +
102
+ '(attributes, relationship cardinality, lifecycle states) by reading\n' +
103
+ 'source. Do not invent entities not in this inventory.\n\n' +
104
+ '---BEGIN STRUCTURAL FACTS---\n' +
105
+ factsContent.trim() + '\n' +
106
+ '---END STRUCTURAL FACTS---\n\n'
107
+ : '';
108
+ // 2. Resolve model (caller may have pre-built one for session caching).
109
+ const model = opts.model ?? resolveModel({ timeout: opts.timeoutMs ?? 15 * 60_000 });
110
+ // 3. Analyse pass.
111
+ const draftResult = await runPrompt({
112
+ operation: 'analyse',
113
+ values: {
114
+ implementationPath: opts.sourceDir,
115
+ spec: '',
116
+ environment: 'development',
117
+ },
118
+ model,
119
+ timeoutMs: opts.timeoutMs ?? 15 * 60_000,
120
+ userPrefix,
121
+ onAssembled: ({ system, user }) => {
122
+ writeFileSync(join(promptsDir(opts.outputDir), 'analyse-system.txt'), system);
123
+ writeFileSync(join(promptsDir(opts.outputDir), 'analyse-user.txt'), user);
124
+ },
125
+ });
126
+ let draftSpec = extractSpec(draftResult.text);
127
+ const draftSpecPath = writeStageSpec(opts.outputDir, 'draft', draftSpec);
128
+ writeFileSync(join(llmOutputDir(opts.outputDir), 'analyse.txt'), draftResult.text);
129
+ // 4. Validate draft; retry once if invalid.
130
+ let validateAfterDraft = runValidate(draftSpecPath);
131
+ let draftRetried = false;
132
+ if (!validateAfterDraft.ok) {
133
+ writeFileSync(join(opts.outputDir, 'validate-error-1.txt'), validateAfterDraft.errors);
134
+ try {
135
+ const retryResult = await runPrompt({
136
+ operation: 'analyse',
137
+ values: {
138
+ implementationPath: opts.sourceDir,
139
+ spec: '',
140
+ environment: 'development',
141
+ },
142
+ model,
143
+ timeoutMs: opts.timeoutMs ?? 15 * 60_000,
144
+ userPrefix: 'Your previous draft failed `spv validate` with the following error:\n\n' +
145
+ '```\n' + validateAfterDraft.errors + '\n```\n\n' +
146
+ 'Your previous output:\n```specly\n' + draftSpec + '\n```\n\n' +
147
+ 'Fix the error and emit a corrected spec. Keep everything else identical.\n\n',
148
+ onAssembled: ({ system, user }) => {
149
+ writeFileSync(join(promptsDir(opts.outputDir), 'analyse-retry-system.txt'), system);
150
+ writeFileSync(join(promptsDir(opts.outputDir), 'analyse-retry-user.txt'), user);
151
+ },
152
+ });
153
+ const retrySpec = extractSpec(retryResult.text);
154
+ writeFileSync(join(specsDir(opts.outputDir), 'draft-retry.specly'), retrySpec);
155
+ writeFileSync(join(llmOutputDir(opts.outputDir), 'analyse-retry.txt'), retryResult.text);
156
+ const validateAfterRetry = runValidate(join(specsDir(opts.outputDir), 'draft-retry.specly'));
157
+ writeFileSync(join(opts.outputDir, 'validate-after-retry.txt'), validateAfterRetry.ok ? 'OK' : validateAfterRetry.errors);
158
+ if (validateAfterRetry.ok) {
159
+ draftSpec = retrySpec;
160
+ writeStageSpec(opts.outputDir, 'draft', retrySpec);
161
+ validateAfterDraft = validateAfterRetry;
162
+ draftRetried = true;
163
+ }
164
+ }
165
+ catch { /* retry failed; continue with original draft */ }
166
+ }
167
+ // 5. Verify pass (optional).
168
+ let finalSpec = draftSpec;
169
+ let finalStage = 'draft';
170
+ let verifyDurationMs = 0;
171
+ if (opts.verify) {
172
+ try {
173
+ const verifyResult = await runPrompt({
174
+ operation: 'verify-analyse',
175
+ values: {
176
+ implementationPath: opts.sourceDir,
177
+ draft: draftSpec,
178
+ structuralFacts: factsContent ||
179
+ '(no structural facts available — extract-facts pre-pass was not run)',
180
+ },
181
+ model,
182
+ timeoutMs: opts.timeoutMs ?? 15 * 60_000,
183
+ onAssembled: ({ system, user }) => {
184
+ writeFileSync(join(promptsDir(opts.outputDir), 'verify-system.txt'), system);
185
+ writeFileSync(join(promptsDir(opts.outputDir), 'verify-user.txt'), user);
186
+ },
187
+ });
188
+ finalSpec = extractSpec(verifyResult.text);
189
+ writeFileSync(join(llmOutputDir(opts.outputDir), 'verify.txt'), verifyResult.text);
190
+ verifyDurationMs = verifyResult.duration_ms;
191
+ writeStageSpec(opts.outputDir, 'verified', finalSpec);
192
+ finalStage = 'verified';
193
+ }
194
+ catch { /* fallback: keep draft as final */ }
195
+ }
196
+ // 6. Final validation.
197
+ const finalSpecPath = join(specsDir(opts.outputDir), 'main.specly');
198
+ const validateFinal = runValidate(finalSpecPath);
199
+ writeFileSync(join(opts.outputDir, 'validate.txt'), validateFinal.ok ? 'OK' : validateFinal.errors);
200
+ // 7. Optional realize.
201
+ let realize = null;
202
+ if (opts.realize && validateFinal.ok) {
203
+ realize = await realizeProject(opts.outputDir);
204
+ }
205
+ writeProjectReadme(opts.outputDir, {
206
+ caseName: opts.caseName ?? opts.caseMeta?.name ?? 'spec',
207
+ realized: realize,
208
+ });
209
+ // 8. Manifest.
210
+ const wallTimeMs = Date.now() - t0;
211
+ const draftDurationMs = draftResult.duration_ms;
212
+ const manifest = {
213
+ kind: 'analyse',
214
+ case: opts.caseName ?? opts.caseMeta?.name ?? 'spec',
215
+ runFolder: opts.outputDir.split('/').pop() ?? '',
216
+ startedAt,
217
+ endedAt: new Date().toISOString(),
218
+ wallTimeMs,
219
+ provider: opts.providerId ?? resolveProviderId(),
220
+ model: opts.modelId ?? 'default',
221
+ prompt: opts.prompt ?? 'analyse-v9',
222
+ workflow: opts.verify
223
+ ? 'analyse → spv-validate → verify-analyse → spv-validate'
224
+ : 'analyse → spv-validate',
225
+ verify: !!opts.verify,
226
+ factsPath: factsSource,
227
+ validateFinal: validateFinal.ok ? 'OK' : validateFinal.errors.slice(0, 200),
228
+ realize: opts.realize ? (realize?.ok ? 'OK' : realize?.error || 'skipped') : false,
229
+ sourcePath: opts.sourceDir,
230
+ experimentRunId: opts.experimentRunId ?? null,
231
+ };
232
+ writeManifest(opts.outputDir, manifest);
233
+ return {
234
+ outputDir: opts.outputDir,
235
+ draftSpecPath,
236
+ finalSpecPath,
237
+ finalStage,
238
+ validateFinal,
239
+ realize,
240
+ draftDurationMs,
241
+ verifyDurationMs,
242
+ wallTimeMs,
243
+ manifest,
244
+ draftRetried,
245
+ validateAfterDraftOk: validateAfterDraft.ok,
246
+ };
247
+ }
248
+ //# sourceMappingURL=analyse-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyse-runner.js","sourceRoot":"","sources":["../../src/ai/analyse-runner.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,12 @@ export type { ProviderId, ResolveModelOptions } from './model-resolver.js';
31
31
  export { claudeCli, isClaudeCliAvailable, detectClaudePath } from './providers/claude-cli.js';
32
32
  export type { ClaudeCliOptions } from './providers/claude-cli.js';
33
33
  export { stubModel } from './providers/stub.js';
34
+ export { loadPrompt, substitute, assembleSystem, assembleUser, buildRunModel, runPrompt, extractSpec, } from './prompt-runner.js';
35
+ export type { PromptYaml, BuildRunModelOptions, RunPromptOptions, RunPromptResult, } from './prompt-runner.js';
36
+ export { runAnalyse } from './analyse-runner.js';
37
+ export type { RunAnalyseOptions, RunAnalyseResult } from './analyse-runner.js';
38
+ export { buildRunFolder, caseRunPath, ensureSubdirs, inputDir, factsDir, promptsDir, llmOutputDir, specsDir, projectDir, writeStageSpec, writeProjectReadme, writeManifest, writeScore, writeReadme, SUBDIRS, } from './run-paths.js';
39
+ export type { RunKind, BuildRunFolderOptions, RunCaseEntry, RunManifest, RunScore, ScoreCoverage, ScoreDimension, ProjectReadmeOptions, ReadmeInfo, } from './run-paths.js';
34
40
  export { detectInstalledSkill } from './skill-detection.js';
35
41
  import type { SpecVerseEngine, EngineInfo } from '@specverse/types';
36
42
  export interface AIEngine extends SpecVerseEngine {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,cAAc,qBAAqB,CAAC;AAIpC,cAAc,oCAAoC,CAAC;AAGnD,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,YAAY,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAIlG,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAGpG,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC9F,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAI3E,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC9F,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAKhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAM5D,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGpE,MAAM,WAAW,QAAS,SAAQ,eAAe;IAC/C,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,yEAAyE;IACzE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,cAAM,iBAAkB,YAAW,QAAQ;IACzC,IAAI,SAAQ;IACZ,OAAO,SAAW;IAClB,YAAY,WAAoE;IAEhF,OAAO,CAAC,OAAO,CAAa;IAEtB,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlE,OAAO,IAAI,UAAU;IAIf,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IA+F1D,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAK3D;;;;OAIG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkBnF,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;CAgClE;AAED,eAAO,MAAM,MAAM,mBAA0B,CAAC;AAC9C,eAAe,MAAM,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"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"}
package/dist/ai/index.js CHANGED
@@ -38,6 +38,18 @@ export { resolveModel, resolveProviderId, describeActiveProvider } from './model
38
38
  // consumers should use resolveModel() rather than calling these directly.
39
39
  export { claudeCli, isClaudeCliAvailable, detectClaudePath } from './providers/claude-cli.js';
40
40
  export { stubModel } from './providers/stub.js';
41
+ // Prompt runner — load + assemble + call a SpecVerse prompt YAML through
42
+ // the active provider. Used by analyse-runner / create-runner; also useful
43
+ // for eval harnesses that want to invoke prompts directly.
44
+ export { loadPrompt, substitute, assembleSystem, assembleUser, buildRunModel, runPrompt, extractSpec, } from './prompt-runner.js';
45
+ // Analyse runner — high-level orchestrator for `spv ai analyse`. Takes a
46
+ // source dir, runs the LLM workflow (facts → analyse → validate → verify
47
+ // → validate → optional realize), writes the structured run output.
48
+ export { runAnalyse } from './analyse-runner.js';
49
+ // Run-paths — structured per-case run dir layout. Used by `spv ai analyse`
50
+ // / `spv ai create` (when those land via TODO #21) and the eval harness.
51
+ // One writer; consistent layout regardless of caller.
52
+ export { buildRunFolder, caseRunPath, ensureSubdirs, inputDir, factsDir, promptsDir, llmOutputDir, specsDir, projectDir, writeStageSpec, writeProjectReadme, writeManifest, writeScore, writeReadme, SUBDIRS, } from './run-paths.js';
41
53
  // Skill detection — true if the SpecVerse skill is installed in a location
42
54
  // Claude Code will auto-load. Used by behavior-ai-service to decide whether
43
55
  // to skip the fullContext block in the system prompt.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { type LanguageModel } from 'ai';
2
+ import { type ResolveModelOptions } from './model-resolver.js';
3
+ /** Loose shape of a SpecVerse prompt YAML — system block + user.template. */
4
+ export interface PromptYaml {
5
+ name?: string;
6
+ version?: string;
7
+ system?: {
8
+ role?: string;
9
+ minimalContext?: string;
10
+ fullContext?: string;
11
+ context?: string;
12
+ };
13
+ user?: {
14
+ template?: string;
15
+ };
16
+ }
17
+ /** Resolve the canonical prompt YAML for a given operation. */
18
+ export declare function loadPrompt(operation: string): PromptYaml;
19
+ /** Substitute {{var}} placeholders in `text` from `values` + auto-filled schema paths. */
20
+ export declare function substitute(text: string, values: Record<string, string | undefined>): string;
21
+ /** Assemble the system message from a prompt YAML. */
22
+ export declare function assembleSystem(prompt: PromptYaml): string;
23
+ /** Assemble the user message — substitute case variables into user.template. */
24
+ export declare function assembleUser(prompt: PromptYaml, values: Record<string, string | undefined>): string;
25
+ export interface BuildRunModelOptions extends ResolveModelOptions {
26
+ timeoutMs?: number;
27
+ }
28
+ /**
29
+ * Build a single model instance for a whole run. Pass the returned model to
30
+ * every runPrompt call in the run so the claude-cli provider's session-resume
31
+ * (--session-id then --resume) actually fires across cases — first case pays
32
+ * the system-prompt cost, subsequent cases hit cache. ~75% input-token
33
+ * reduction on a typical 8-case run.
34
+ */
35
+ export declare function buildRunModel({ timeoutMs, ...modelOptions }?: BuildRunModelOptions): LanguageModel;
36
+ export interface RunPromptOptions {
37
+ operation: string;
38
+ values: Record<string, string | undefined>;
39
+ model?: LanguageModel;
40
+ modelOptions?: ResolveModelOptions;
41
+ timeoutMs?: number;
42
+ onAssembled?: (parts: {
43
+ system: string;
44
+ user: string;
45
+ }) => void;
46
+ userPrefix?: string;
47
+ }
48
+ export interface RunPromptResult {
49
+ text: string;
50
+ tokens: {
51
+ input: number | null;
52
+ output: number | null;
53
+ };
54
+ duration_ms: number;
55
+ system: string;
56
+ user: string;
57
+ providerId: string;
58
+ modelId: string;
59
+ }
60
+ /**
61
+ * Run a prompt with given values. Returns the LLM's text + telemetry.
62
+ */
63
+ export declare function runPrompt({ operation, values, model, modelOptions, timeoutMs, onAssembled, userPrefix, }: RunPromptOptions): Promise<RunPromptResult>;
64
+ /** Strip a markdown ```yaml/```specly fence + leading prose from a model output. */
65
+ export declare function extractSpec(text: string): string;
66
+ //# sourceMappingURL=prompt-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-runner.d.ts","sourceRoot":"","sources":["../../src/ai/prompt-runner.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AAEtD,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAe7E,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CA8BxD;AAED,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAM3F;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAQzD;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAGnG;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,SAAuB,EAAE,GAAG,YAAY,EAAE,GAAE,oBAAyB,GAAG,aAAa,CAEpH;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,EAC9B,SAAS,EACT,MAAM,EACN,KAAK,EACL,YAAiB,EACjB,SAAmB,EACnB,WAAW,EACX,UAAe,GAChB,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAoC7C;AAED,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhD"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Prompt runner — fills a prompt YAML's user.template with case variables,
3
+ * assembles the full system + user message pair, calls generateText through
4
+ * the active SpecVerse provider, returns the raw text + tokens + duration.
5
+ *
6
+ * Schema-path variables ({{aiSchemaPath}}, {{referenceSchemaPath}},
7
+ * {{referenceExamplePath}}) are auto-filled with absolute paths into
8
+ * @specverse/entities/schema/ — same convention the in-tree MCP prompts use.
9
+ *
10
+ * Originally lived in `specverse-demo-self/harness/lib/prompt-runner.mjs`;
11
+ * promoted into `@specverse/engines/ai` as part of TODO #21 phase 2 so the
12
+ * forthcoming `spv ai analyse` / `spv ai create` commands can call it directly.
13
+ */
14
+ import { readFileSync, existsSync } from 'fs';
15
+ import { createRequire } from 'module';
16
+ import { dirname, join } from 'path';
17
+ import { generateText } from 'ai';
18
+ import yaml from 'js-yaml';
19
+ import { resolveModel } from './model-resolver.js';
20
+ const require = createRequire(import.meta.url);
21
+ function resolveEntitiesFile(rel) {
22
+ const pkg = require.resolve('@specverse/entities/package.json');
23
+ return join(dirname(pkg), rel);
24
+ }
25
+ const SCHEMA_VAR_PATHS = {
26
+ aiSchemaPath: resolveEntitiesFile('schema/SPECVERSE-SCHEMA-AI.yaml'),
27
+ referenceSchemaPath: resolveEntitiesFile('schema/MINIMAL-SYNTAX-REFERENCE.specly'),
28
+ referenceExamplePath: resolveEntitiesFile('schema/MINIMAL-SYNTAX-REFERENCE.specly'),
29
+ };
30
+ /** Resolve the canonical prompt YAML for a given operation. */
31
+ export function loadPrompt(operation) {
32
+ // Prompts moved from @specverse/engines/assets/prompts to
33
+ // @specverse/assets/prompts on 2026-04-25 (see specverse-self/docs/plans/
34
+ // 2026-04-25-CONTENT-PACKAGE-REFACTOR.md). Try assets first; fall back
35
+ // to engines for older installs.
36
+ const candidates = [];
37
+ try {
38
+ const assetsPkg = require.resolve('@specverse/assets/package.json');
39
+ candidates.push(join(dirname(assetsPkg), 'prompts/core/standard/default', `${operation}.prompt.yaml`));
40
+ }
41
+ catch {
42
+ /* @specverse/assets not installed — fall through */
43
+ }
44
+ try {
45
+ const enginesPkg = require.resolve('@specverse/engines/package.json');
46
+ candidates.push(join(dirname(enginesPkg), 'assets/prompts/core/standard/default', `${operation}.prompt.yaml`));
47
+ }
48
+ catch {
49
+ /* engines also not installed — defer to error below */
50
+ }
51
+ for (const p of candidates) {
52
+ if (existsSync(p))
53
+ return yaml.load(readFileSync(p, 'utf8'));
54
+ }
55
+ throw new Error(`prompt file not found for "${operation}". Tried:\n ${candidates.join('\n ')}\n` +
56
+ 'Ensure @specverse/assets is installed (npm install @specverse/assets).');
57
+ }
58
+ /** Substitute {{var}} placeholders in `text` from `values` + auto-filled schema paths. */
59
+ export function substitute(text, values) {
60
+ return text.replace(/\{\{\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\}\}/g, (m, name) => {
61
+ if (name in values && values[name] !== undefined)
62
+ return values[name];
63
+ if (name in SCHEMA_VAR_PATHS)
64
+ return SCHEMA_VAR_PATHS[name];
65
+ return m;
66
+ });
67
+ }
68
+ /** Assemble the system message from a prompt YAML. */
69
+ export function assembleSystem(prompt) {
70
+ const sys = prompt?.system ?? {};
71
+ const parts = [];
72
+ if (sys.role)
73
+ parts.push(sys.role.trim());
74
+ if (sys.minimalContext)
75
+ parts.push(sys.minimalContext.trim());
76
+ if (sys.fullContext)
77
+ parts.push(sys.fullContext.trim());
78
+ if (sys.context)
79
+ parts.push(sys.context.trim()); // older shape support
80
+ return parts.filter(Boolean).join('\n\n');
81
+ }
82
+ /** Assemble the user message — substitute case variables into user.template. */
83
+ export function assembleUser(prompt, values) {
84
+ const tmpl = prompt?.user?.template ?? '';
85
+ return substitute(tmpl, values);
86
+ }
87
+ /**
88
+ * Build a single model instance for a whole run. Pass the returned model to
89
+ * every runPrompt call in the run so the claude-cli provider's session-resume
90
+ * (--session-id then --resume) actually fires across cases — first case pays
91
+ * the system-prompt cost, subsequent cases hit cache. ~75% input-token
92
+ * reduction on a typical 8-case run.
93
+ */
94
+ export function buildRunModel({ timeoutMs = 15 * 60_000, ...modelOptions } = {}) {
95
+ return resolveModel({ ...modelOptions, timeout: timeoutMs });
96
+ }
97
+ /**
98
+ * Run a prompt with given values. Returns the LLM's text + telemetry.
99
+ */
100
+ export async function runPrompt({ operation, values, model, modelOptions = {}, timeoutMs = 300_000, onAssembled, userPrefix = '', }) {
101
+ const prompt = loadPrompt(operation);
102
+ const system = assembleSystem(prompt);
103
+ const baseUser = assembleUser(prompt, values);
104
+ // userPrefix is an optional preamble (used for structural-prepass facts
105
+ // injection — kept separate from the canonical prompt template so the
106
+ // experiment is reversible by simply not passing it).
107
+ const user = userPrefix ? userPrefix + baseUser : baseUser;
108
+ // Hook for saving prompts before the LLM call (so we have artifacts on timeout).
109
+ if (typeof onAssembled === 'function')
110
+ onAssembled({ system, user });
111
+ const llm = model ?? resolveModel({ ...modelOptions, timeout: timeoutMs });
112
+ const t0 = Date.now();
113
+ const result = await generateText({
114
+ model: llm,
115
+ system,
116
+ prompt: user,
117
+ abortSignal: AbortSignal.timeout(timeoutMs),
118
+ providerOptions: {
119
+ anthropic: { cacheControl: { type: 'ephemeral' } },
120
+ },
121
+ });
122
+ const duration_ms = Date.now() - t0;
123
+ return {
124
+ text: result.text,
125
+ tokens: {
126
+ input: result.usage?.inputTokens?.total ?? null,
127
+ output: result.usage?.outputTokens?.total ?? null,
128
+ },
129
+ duration_ms,
130
+ system,
131
+ user,
132
+ providerId: llm.provider,
133
+ modelId: llm.modelId,
134
+ };
135
+ }
136
+ /** Strip a markdown ```yaml/```specly fence + leading prose from a model output. */
137
+ export function extractSpec(text) {
138
+ const fence = text.match(/```(?:yaml|specly|yml)?\n([\s\S]*?)```/);
139
+ if (fence)
140
+ return fence[1].trim();
141
+ return text.trim();
142
+ }
143
+ //# sourceMappingURL=prompt-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-runner.js","sourceRoot":"","sources":["../../src/ai/prompt-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ export type RunKind = 'analyse' | 'create';
2
+ export interface BuildRunFolderOptions {
3
+ /** Prompt name, e.g. `analyse-v9`, `create-v9`. Used in default folder name when no `label`. */
4
+ prompt?: string;
5
+ /** Provider id, e.g. `claude-cli`, `anthropic`, `stub`. */
6
+ providerId?: string;
7
+ /** Model id (claude-opus-4-7, etc.) — coerced to filesystem-safe form. */
8
+ modelId?: string;
9
+ /** Optional intent-driven label that overrides the auto-derived tail. */
10
+ label?: string;
11
+ }
12
+ /** Subset of case.yaml fields used for README rendering. Authoritative
13
+ * shape lives in the harness's case-loader; this is the loosest contract
14
+ * needed to render. */
15
+ export interface RunCaseEntry {
16
+ name: string;
17
+ kind?: RunKind;
18
+ class?: number;
19
+ stack?: string;
20
+ upstream?: {
21
+ repo?: string;
22
+ pin_sha?: string;
23
+ pin_date?: string;
24
+ };
25
+ domain_notes?: string;
26
+ nl_request?: string;
27
+ expected_spec_path?: string;
28
+ [key: string]: unknown;
29
+ }
30
+ /** The run config snapshot written to manifest.json. Loose by design —
31
+ * callers add provider-specific fields freely. */
32
+ export interface RunManifest {
33
+ kind: RunKind;
34
+ case: string;
35
+ runFolder: string;
36
+ startedAt: string;
37
+ endedAt?: string;
38
+ wallTimeMs?: number;
39
+ provider: string;
40
+ model: string;
41
+ prompt: string;
42
+ workflow?: string;
43
+ verify?: boolean;
44
+ realize?: string | boolean | null;
45
+ factsPath?: string | null;
46
+ validateFinal?: string | null;
47
+ sourcePath?: string | null;
48
+ experimentRunId?: string | null;
49
+ /** True iff the manifest was backfilled from a legacy run dir. */
50
+ backfilled?: boolean;
51
+ [key: string]: unknown;
52
+ }
53
+ /** Loose scoring shape — typically validity + round_trip / domain_coverage. */
54
+ export interface RunScore {
55
+ validity?: Record<string, boolean>;
56
+ round_trip?: ScoreCoverage;
57
+ domain_coverage?: ScoreCoverage;
58
+ [key: string]: unknown;
59
+ }
60
+ export interface ScoreCoverage {
61
+ parse_ok?: boolean;
62
+ errors?: string[];
63
+ entities?: ScoreDimension;
64
+ relationships?: ScoreDimension;
65
+ lifecycles?: ScoreDimension;
66
+ operations?: ScoreDimension;
67
+ }
68
+ export interface ScoreDimension {
69
+ expected?: number;
70
+ matched?: number;
71
+ missing?: string[];
72
+ extra?: string[];
73
+ }
74
+ export interface ProjectReadmeOptions {
75
+ caseName: string;
76
+ /** Realize attempt result; null = realize never ran (recipe form). */
77
+ realized?: {
78
+ ok: boolean;
79
+ error?: string;
80
+ } | null;
81
+ }
82
+ export interface ReadmeInfo {
83
+ caseEntry: RunCaseEntry;
84
+ manifest: RunManifest;
85
+ score?: RunScore;
86
+ runFolder: string;
87
+ kind: RunKind;
88
+ }
89
+ /** Folder name for one per-case run. */
90
+ export declare function buildRunFolder({ prompt, providerId, modelId, label }: BuildRunFolderOptions): string;
91
+ /** Absolute path for one per-case run folder. */
92
+ export declare function caseRunPath(rootDir: string, kind: RunKind, caseName: string, runFolder: string): string;
93
+ /** Standard per-run subdir paths. */
94
+ export declare const SUBDIRS: readonly ["input", "facts", "prompts", "llm-output", "specs", "project"];
95
+ export declare const inputDir: (caseRunDir: string) => string;
96
+ export declare const factsDir: (caseRunDir: string) => string;
97
+ export declare const promptsDir: (caseRunDir: string) => string;
98
+ export declare const llmOutputDir: (caseRunDir: string) => string;
99
+ export declare const specsDir: (caseRunDir: string) => string;
100
+ export declare const projectDir: (caseRunDir: string) => string;
101
+ /** Pre-create all subdirs at the start of a run. Idempotent. */
102
+ export declare function ensureSubdirs(caseRunDir: string): void;
103
+ /**
104
+ * Write a stage's spec to specs/{stage}.specly AND copy into specs/main.specly.
105
+ * No symlinks: main.specly is always a real file, overwritten by each new stage.
106
+ * Returns the path to the stage-specific file.
107
+ */
108
+ export declare function writeStageSpec(caseRunDir: string, stage: string, content: string): string;
109
+ /**
110
+ * Write a project/README.md. Three shapes depending on `realized`:
111
+ * - null/undefined → recipe form (project/ is empty)
112
+ * - { ok: true } → "materialized" — describes layout + how to run
113
+ * - { ok: false } → "realize failed" — captures error + retry recipe
114
+ */
115
+ export declare function writeProjectReadme(caseRunDir: string, opts: ProjectReadmeOptions): void;
116
+ /** Write manifest.json — machine-readable run config + result. */
117
+ export declare function writeManifest(caseRunDir: string, manifest: RunManifest): void;
118
+ /** Write score.json. */
119
+ export declare function writeScore(caseRunDir: string, score: RunScore): void;
120
+ /** Write a human-readable README.md orienting a future reader to the run. */
121
+ export declare function writeReadme(caseRunDir: string, info: ReadmeInfo): void;
122
+ //# sourceMappingURL=run-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-paths.d.ts","sourceRoot":"","sources":["../../src/ai/run-paths.ts"],"names":[],"mappings":"AA0CA,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,qBAAqB;IACpC,gGAAgG;IAChG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;wBAEwB;AACxB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;mDACmD;AACnD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,+EAA+E;AAC/E,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,eAAe,CAAC,EAAE,aAAa,CAAC;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,YAAY,CAAC;IACxB,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACf;AAMD,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,qBAAqB,GAAG,MAAM,CAOpG;AAED,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvG;AAED,qCAAqC;AACrC,eAAO,MAAM,OAAO,0EAA2E,CAAC;AAEhG,eAAO,MAAM,QAAQ,GAAI,YAAY,MAAM,KAAG,MAAmC,CAAC;AAClF,eAAO,MAAM,QAAQ,GAAI,YAAY,MAAM,KAAG,MAAmC,CAAC;AAClF,eAAO,MAAM,UAAU,GAAI,YAAY,MAAM,KAAG,MAAqC,CAAC;AACtF,eAAO,MAAM,YAAY,GAAI,YAAY,MAAM,KAAG,MAAwC,CAAC;AAC3F,eAAO,MAAM,QAAQ,GAAI,YAAY,MAAM,KAAG,MAAmC,CAAC;AAClF,eAAO,MAAM,UAAU,GAAI,YAAY,MAAM,KAAG,MAAqC,CAAC;AAEtF,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAOzF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAiEvF;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,CAG7E;AAED,wBAAwB;AACxB,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAGpE;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAgItE"}
@@ -0,0 +1,297 @@
1
+ /**
2
+ * Run-paths helper — computes the structured per-case output layout
3
+ * and writes navigation aids (README, manifest, score) into it.
4
+ *
5
+ * Layout:
6
+ * runs/{kind}/{case}/{YYYY-MM-DD-HHMM}_{label}/
7
+ * README.md ← human-readable orientation
8
+ * manifest.json ← machine-readable run config
9
+ * score.json ← scoring detail (optional)
10
+ * validate.txt ← `spv validate` output on the canonical spec
11
+ *
12
+ * input/ ← what we analysed (source) or what was requested (NL)
13
+ * facts/ ← structural pre-pass output (analyse only)
14
+ * facts.md ← markdown injected into the prompt as preamble
15
+ * facts.json ← SpecVerseFacts JSON when an adapter ran (optional)
16
+ * prompts/ ← assembled LLM prompts (system + user, per pass)
17
+ * llm-output/ ← raw LLM responses (before code-fence extraction)
18
+ * specs/ ← spec progression — same shape as `spv init`'s specs/
19
+ * draft.specly ← always present; written after the analyse/create pass
20
+ * verified.specly ← present iff verify ran
21
+ * optimized.specly ← present iff optimize ran (future)
22
+ * main.specly ← real file copy of the latest stage; canonical "final"
23
+ * project/ ← empty until materialized via spv init + spv realize
24
+ * README.md ← recipe for manual realize
25
+ * (after realize:)
26
+ * specs/main.specly + manifests/ + generated/code/ ...
27
+ *
28
+ * No symlinks anywhere — `specs/main.specly` is a real-file copy of
29
+ * the latest stage's output. Survives moves/copies/zips intact.
30
+ *
31
+ * Originally lived in `specverse-demo-self/harness/lib/run-paths.mjs`;
32
+ * promoted into `@specverse/engines/ai` as part of TODO #21 so end-user
33
+ * `spv ai analyse` / `spv ai create` commands and the eval harness
34
+ * share one writer.
35
+ */
36
+ import { mkdirSync, writeFileSync } from 'fs';
37
+ import { join } from 'path';
38
+ // ─────────────────────────────────────────────────────────────────────
39
+ // Path helpers
40
+ // ─────────────────────────────────────────────────────────────────────
41
+ /** Folder name for one per-case run. */
42
+ export function buildRunFolder({ prompt, providerId, modelId, label }) {
43
+ const stamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 16).replace('T', '-');
44
+ const compact = stamp.replace(/-(\d\d)-(\d\d)$/, '-$1$2');
45
+ if (label)
46
+ return `${compact}_${label}`;
47
+ const safeModel = (modelId || 'default').replace(/[^a-zA-Z0-9-]/g, '-');
48
+ const tail = [prompt, providerId, safeModel].filter(Boolean).join('_');
49
+ return `${compact}_${tail}`;
50
+ }
51
+ /** Absolute path for one per-case run folder. */
52
+ export function caseRunPath(rootDir, kind, caseName, runFolder) {
53
+ return join(rootDir, 'runs', kind, caseName, runFolder);
54
+ }
55
+ /** Standard per-run subdir paths. */
56
+ export const SUBDIRS = ['input', 'facts', 'prompts', 'llm-output', 'specs', 'project'];
57
+ export const inputDir = (caseRunDir) => join(caseRunDir, 'input');
58
+ export const factsDir = (caseRunDir) => join(caseRunDir, 'facts');
59
+ export const promptsDir = (caseRunDir) => join(caseRunDir, 'prompts');
60
+ export const llmOutputDir = (caseRunDir) => join(caseRunDir, 'llm-output');
61
+ export const specsDir = (caseRunDir) => join(caseRunDir, 'specs');
62
+ export const projectDir = (caseRunDir) => join(caseRunDir, 'project');
63
+ /** Pre-create all subdirs at the start of a run. Idempotent. */
64
+ export function ensureSubdirs(caseRunDir) {
65
+ mkdirSync(caseRunDir, { recursive: true });
66
+ for (const sub of SUBDIRS) {
67
+ mkdirSync(join(caseRunDir, sub), { recursive: true });
68
+ }
69
+ }
70
+ /**
71
+ * Write a stage's spec to specs/{stage}.specly AND copy into specs/main.specly.
72
+ * No symlinks: main.specly is always a real file, overwritten by each new stage.
73
+ * Returns the path to the stage-specific file.
74
+ */
75
+ export function writeStageSpec(caseRunDir, stage, content) {
76
+ mkdirSync(specsDir(caseRunDir), { recursive: true });
77
+ const stagePath = join(specsDir(caseRunDir), `${stage}.specly`);
78
+ const mainPath = join(specsDir(caseRunDir), 'main.specly');
79
+ writeFileSync(stagePath, content);
80
+ writeFileSync(mainPath, content);
81
+ return stagePath;
82
+ }
83
+ /**
84
+ * Write a project/README.md. Three shapes depending on `realized`:
85
+ * - null/undefined → recipe form (project/ is empty)
86
+ * - { ok: true } → "materialized" — describes layout + how to run
87
+ * - { ok: false } → "realize failed" — captures error + retry recipe
88
+ */
89
+ export function writeProjectReadme(caseRunDir, opts) {
90
+ const { caseName, realized = null } = opts;
91
+ const lines = [];
92
+ mkdirSync(projectDir(caseRunDir), { recursive: true });
93
+ if (realized?.ok) {
94
+ lines.push(`# ${caseName} — project (materialized)`);
95
+ lines.push('');
96
+ lines.push('Materialized from `../specs/main.specly` via `spv init` + `spv realize all`.');
97
+ lines.push('Equivalent shell commands:');
98
+ lines.push('');
99
+ lines.push('```bash');
100
+ lines.push('rm -rf project/');
101
+ lines.push('spv init project --template default');
102
+ lines.push('cp specs/main.specly project/specs/main.specly');
103
+ lines.push('cd project && spv realize all specs/main.specly');
104
+ lines.push('```');
105
+ lines.push('');
106
+ lines.push('Layout (standard `spv init` output):');
107
+ lines.push('- `specs/main.specly` — the canonical spec from this run');
108
+ lines.push('- `manifests/implementation.yaml` — Fastify + Prisma + React (default template)');
109
+ lines.push('- `generated/code/backend/` — Fastify + Prisma + generated CLI');
110
+ lines.push('- `generated/code/frontend/` — React app');
111
+ lines.push('- `generated/code/tools/` — MCP server, VSCode extension');
112
+ lines.push('');
113
+ lines.push('To run: `cd project && npm install && npm run dev:backend` (terminal 1)');
114
+ lines.push('and `npm run dev:frontend` (terminal 2).');
115
+ }
116
+ else if (realized && !realized.ok) {
117
+ lines.push(`# ${caseName} — project (realize failed)`);
118
+ lines.push('');
119
+ lines.push('The realize step was attempted but failed:');
120
+ lines.push('');
121
+ lines.push('```');
122
+ lines.push(realized.error || '(unknown error)');
123
+ lines.push('```');
124
+ lines.push('');
125
+ lines.push('Manual recipe to retry:');
126
+ lines.push('');
127
+ lines.push('```bash');
128
+ lines.push('rm -rf project/');
129
+ lines.push('spv init project --template default');
130
+ lines.push('cp specs/main.specly project/specs/main.specly');
131
+ lines.push('cd project && spv realize all specs/main.specly');
132
+ lines.push('```');
133
+ }
134
+ else {
135
+ lines.push(`# ${caseName} — project (empty until materialized)`);
136
+ lines.push('');
137
+ lines.push('This directory becomes a SpecVerse project once you materialize the');
138
+ lines.push('canonical spec. Recipe:');
139
+ lines.push('');
140
+ lines.push('```bash');
141
+ lines.push('rm -rf project/ # clear this README-only stub');
142
+ lines.push('spv init project --template default');
143
+ lines.push('cp specs/main.specly project/specs/main.specly');
144
+ lines.push('cd project && spv realize all specs/main.specly');
145
+ lines.push('```');
146
+ lines.push('');
147
+ lines.push('After realize completes, `generated/code/` contains the produced');
148
+ lines.push('backend / frontend / tools — equivalent to what `spv init` + `spv');
149
+ lines.push('realize` would have built from this spec ground-up.');
150
+ lines.push('');
151
+ lines.push('`spv ai analyse` and `spv ai create` can do this automatically with `--realize`.');
152
+ }
153
+ lines.push('');
154
+ writeFileSync(join(projectDir(caseRunDir), 'README.md'), lines.join('\n'));
155
+ }
156
+ /** Write manifest.json — machine-readable run config + result. */
157
+ export function writeManifest(caseRunDir, manifest) {
158
+ mkdirSync(caseRunDir, { recursive: true });
159
+ writeFileSync(join(caseRunDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
160
+ }
161
+ /** Write score.json. */
162
+ export function writeScore(caseRunDir, score) {
163
+ mkdirSync(caseRunDir, { recursive: true });
164
+ writeFileSync(join(caseRunDir, 'score.json'), JSON.stringify(score, null, 2));
165
+ }
166
+ /** Write a human-readable README.md orienting a future reader to the run. */
167
+ export function writeReadme(caseRunDir, info) {
168
+ const lines = [];
169
+ const c = info.caseEntry;
170
+ const m = info.manifest;
171
+ const s = info.score;
172
+ lines.push(`# ${c.name} — ${info.runFolder}`);
173
+ lines.push('');
174
+ // What's being analysed/created
175
+ lines.push(`## What's being ${info.kind === 'create' ? 'created' : 'analysed'}`);
176
+ if (c.upstream) {
177
+ const up = c.upstream;
178
+ lines.push(`**Source:** ${up.repo || '(no repo declared)'}` +
179
+ (up.pin_sha ? ` @ \`${up.pin_sha.slice(0, 8)}\`` : '') +
180
+ (up.pin_date ? ` (${up.pin_date})` : ''));
181
+ }
182
+ if (c.stack)
183
+ lines.push(`**Stack:** ${c.stack}`);
184
+ if (c.class)
185
+ lines.push(`**Class:** ${c.class}` +
186
+ (c.class === 2 ? ' (hand-written upstream, not SpecVerse-realized)' : ''));
187
+ if (c.nl_request) {
188
+ const firstLine = c.nl_request.trim().split('\n')[0];
189
+ lines.push(`**Request:** "${firstLine.slice(0, 200)}${firstLine.length > 200 ? '…' : ''}"`);
190
+ }
191
+ if (c.domain_notes) {
192
+ const firstSentence = c.domain_notes.trim().split(/\.\s/)[0] + '.';
193
+ lines.push(`**Domain:** ${firstSentence.replace(/\n/g, ' ').slice(0, 200)}`);
194
+ }
195
+ lines.push('');
196
+ // Run config
197
+ lines.push('## Run configuration');
198
+ lines.push(`- **Started:** ${m.startedAt}`);
199
+ lines.push(`- **Provider:** ${m.provider} (${m.model})`);
200
+ lines.push(`- **Prompt:** ${m.prompt}`);
201
+ if (m.workflow)
202
+ lines.push(`- **Workflow:** ${m.workflow}`);
203
+ if (m.factsPath)
204
+ lines.push(`- **Structural facts:** \`${m.factsPath}\``);
205
+ if (m.verify)
206
+ lines.push(`- **Verify pass:** enabled (two-stage)`);
207
+ if (m.realize)
208
+ lines.push(`- **Realize pass:** enabled (project/ materialized)`);
209
+ if (m.wallTimeMs != null)
210
+ lines.push(`- **Wall time:** ${(m.wallTimeMs / 1000).toFixed(1)}s`);
211
+ lines.push('');
212
+ // Results
213
+ lines.push('## Results');
214
+ if (m.validateFinal)
215
+ lines.push(`- \`spv validate\` final: **${m.validateFinal === 'OK' ? '✓ pass' : '✗ ' + m.validateFinal}**`);
216
+ if (s?.validity) {
217
+ const order = ['parse', 'schema', 'infer', 'realize', 'tsc', 'tests'];
218
+ const bits = order.filter(k => s.validity[k] !== undefined)
219
+ .map(k => `${k}=${s.validity[k] ? '✓' : '✗'}`).join(' · ');
220
+ lines.push(`- Validity battery: ${bits}`);
221
+ }
222
+ const r = s?.round_trip ?? s?.domain_coverage;
223
+ if (r) {
224
+ let total = 0, matched = 0;
225
+ for (const dim of ['entities', 'relationships', 'lifecycles', 'operations']) {
226
+ const x = r[dim];
227
+ if (x?.expected !== undefined) {
228
+ total += x.expected;
229
+ matched += x.matched || 0;
230
+ }
231
+ }
232
+ lines.push(`- Domain coverage: ${matched}/${total} (${total ? ((matched / total) * 100).toFixed(0) : 0}%)`);
233
+ for (const dim of ['entities', 'relationships', 'lifecycles', 'operations']) {
234
+ const x = r[dim];
235
+ if (x?.expected !== undefined) {
236
+ lines.push(` - ${dim}: ${x.matched || 0}/${x.expected}` +
237
+ (x.missing?.length ? ` (missing: ${x.missing.join(', ')})` : '') +
238
+ (x.extra?.length ? ` (extra: ${x.extra.join(', ')})` : ''));
239
+ }
240
+ }
241
+ }
242
+ lines.push('');
243
+ // Layout
244
+ lines.push('## Layout');
245
+ lines.push('```');
246
+ lines.push('├── README.md this file');
247
+ lines.push('├── manifest.json machine-readable run config');
248
+ lines.push('├── score.json scoring detail');
249
+ lines.push('├── validate.txt `spv validate` output on specs/main.specly');
250
+ lines.push('├── input/ ' + (info.kind === 'analyse' ? 'source under analysis' : 'requirements.md (the NL request)'));
251
+ if (info.kind === 'analyse') {
252
+ lines.push('├── facts/ structural pre-pass output');
253
+ lines.push('│ ├── facts.md markdown injected as preamble');
254
+ lines.push('│ └── facts.json SpecVerseFacts (when adapter ran)');
255
+ }
256
+ lines.push('├── prompts/ assembled LLM prompts (system + user, per pass)');
257
+ lines.push('├── llm-output/ raw LLM responses (before code-fence extraction)');
258
+ lines.push('├── specs/ spec progression');
259
+ lines.push('│ ├── draft.specly after first pass');
260
+ if (m.verify)
261
+ lines.push('│ ├── verified.specly after verify pass');
262
+ lines.push('│ └── main.specly canonical (= latest stage)');
263
+ lines.push('└── project/ SpecVerse project shape; populated when --realize runs');
264
+ lines.push('```');
265
+ lines.push('');
266
+ // Source re-indexing tip — how to re-run gitnexus natively
267
+ if (info.kind === 'analyse') {
268
+ lines.push('## Re-index the source with gitnexus (optional)');
269
+ lines.push('');
270
+ lines.push('The structural index (`.gitnexus/`) is excluded from `input/` to keep');
271
+ lines.push('the run dir lean. To inspect the call graph or re-extract facts:');
272
+ lines.push('');
273
+ lines.push('```bash');
274
+ lines.push('cd input/');
275
+ lines.push('gitnexus analyze .');
276
+ lines.push('gitnexus cypher --repo $(basename $PWD) "MATCH (c:Class) RETURN c.name LIMIT 20"');
277
+ lines.push('```');
278
+ lines.push('');
279
+ }
280
+ // See also
281
+ lines.push('## See also');
282
+ const caseDirRel = `../../../../corpus/${info.kind}/${c.name}`;
283
+ lines.push(`- Case definition: \`${caseDirRel}/case.yaml\``);
284
+ if (c.expected_spec_path) {
285
+ const baselineRel = c.expected_spec_path.split(`/corpus/${info.kind}/${c.name}/`)[1];
286
+ if (baselineRel) {
287
+ lines.push(`- Frozen baseline: \`${caseDirRel}/${baselineRel}\``);
288
+ }
289
+ }
290
+ if (m.experimentRunId) {
291
+ lines.push(`- Experiment-batch report: \`../../../../reports/${m.experimentRunId}.json\``);
292
+ }
293
+ lines.push('');
294
+ mkdirSync(caseRunDir, { recursive: true });
295
+ writeFileSync(join(caseRunDir, 'README.md'), lines.join('\n'));
296
+ }
297
+ //# sourceMappingURL=run-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-paths.js","sourceRoot":"","sources":["../../src/ai/run-paths.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@specverse/engines",
3
- "version": "6.0.10",
3
+ "version": "6.0.12",
4
4
  "description": "SpecVerse toolchain — parser, inference, realize, generators, AI, registry, bundles",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",