@qulib/core 0.3.1 → 0.4.0

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.
Files changed (70) hide show
  1. package/dist/analyze.d.ts +2 -0
  2. package/dist/analyze.d.ts.map +1 -1
  3. package/dist/analyze.js +29 -1
  4. package/dist/harness/decision-logger.d.ts +1 -0
  5. package/dist/harness/decision-logger.d.ts.map +1 -1
  6. package/dist/harness/decision-logger.js +15 -22
  7. package/dist/harness/run-options.d.ts +3 -0
  8. package/dist/harness/run-options.d.ts.map +1 -1
  9. package/dist/harness/state-manager.d.ts +3 -0
  10. package/dist/harness/state-manager.d.ts.map +1 -1
  11. package/dist/harness/state-manager.js +15 -18
  12. package/dist/index.d.ts +9 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +5 -0
  15. package/dist/llm/cost-intelligence.d.ts +13 -0
  16. package/dist/llm/cost-intelligence.d.ts.map +1 -1
  17. package/dist/llm/cost-intelligence.js +13 -0
  18. package/dist/llm/provider-registry.d.ts +9 -0
  19. package/dist/llm/provider-registry.d.ts.map +1 -0
  20. package/dist/llm/provider-registry.js +15 -0
  21. package/dist/llm/provider.d.ts +9 -11
  22. package/dist/llm/provider.d.ts.map +1 -1
  23. package/dist/llm/provider.interface.d.ts +16 -0
  24. package/dist/llm/provider.interface.d.ts.map +1 -0
  25. package/dist/llm/provider.interface.js +1 -0
  26. package/dist/llm/provider.js +8 -51
  27. package/dist/llm/providers/anthropic.d.ts +16 -0
  28. package/dist/llm/providers/anthropic.d.ts.map +1 -0
  29. package/dist/llm/providers/anthropic.js +104 -0
  30. package/dist/phases/act.d.ts.map +1 -1
  31. package/dist/phases/act.js +20 -6
  32. package/dist/phases/observe.d.ts.map +1 -1
  33. package/dist/phases/observe.js +20 -2
  34. package/dist/phases/think-finalize.d.ts.map +1 -1
  35. package/dist/phases/think-finalize.js +12 -3
  36. package/dist/phases/think.d.ts.map +1 -1
  37. package/dist/phases/think.js +14 -2
  38. package/dist/schemas/automation-maturity.schema.d.ts +78 -0
  39. package/dist/schemas/automation-maturity.schema.d.ts.map +1 -0
  40. package/dist/schemas/automation-maturity.schema.js +24 -0
  41. package/dist/schemas/config.schema.d.ts +37 -0
  42. package/dist/schemas/config.schema.d.ts.map +1 -1
  43. package/dist/schemas/config.schema.js +11 -0
  44. package/dist/schemas/gap-analysis.schema.d.ts +6 -6
  45. package/dist/schemas/index.d.ts +2 -1
  46. package/dist/schemas/index.d.ts.map +1 -1
  47. package/dist/schemas/index.js +2 -1
  48. package/dist/schemas/public-surface.schema.d.ts +4 -4
  49. package/dist/schemas/repo-analysis.schema.d.ts +134 -0
  50. package/dist/schemas/repo-analysis.schema.d.ts.map +1 -1
  51. package/dist/schemas/repo-analysis.schema.js +29 -0
  52. package/dist/telemetry/emit.d.ts +3 -0
  53. package/dist/telemetry/emit.d.ts.map +1 -0
  54. package/dist/telemetry/emit.js +11 -0
  55. package/dist/telemetry/telemetry.interface.d.ts +13 -0
  56. package/dist/telemetry/telemetry.interface.d.ts.map +1 -0
  57. package/dist/telemetry/telemetry.interface.js +3 -0
  58. package/dist/tools/automation-maturity.d.ts +4 -0
  59. package/dist/tools/automation-maturity.d.ts.map +1 -0
  60. package/dist/tools/automation-maturity.js +163 -0
  61. package/dist/tools/framework-detector.d.ts +15 -0
  62. package/dist/tools/framework-detector.d.ts.map +1 -0
  63. package/dist/tools/framework-detector.js +153 -0
  64. package/dist/tools/gap-engine.d.ts +1 -1
  65. package/dist/tools/gap-engine.d.ts.map +1 -1
  66. package/dist/tools/gap-engine.js +13 -3
  67. package/dist/tools/repo-scanner.d.ts +16 -0
  68. package/dist/tools/repo-scanner.d.ts.map +1 -1
  69. package/dist/tools/repo-scanner.js +31 -2
  70. package/package.json +1 -1
@@ -0,0 +1,104 @@
1
+ import { emitTelemetry } from '../../telemetry/emit.js';
2
+ const DEFAULT_MODEL = 'claude-sonnet-4-20250514';
3
+ function estimateTokensFromChars(chars) {
4
+ return Math.max(0, Math.ceil(chars / 4));
5
+ }
6
+ export class AnthropicProvider {
7
+ name = 'anthropic';
8
+ model;
9
+ telemetry;
10
+ sessionId;
11
+ constructor(options) {
12
+ this.model = options?.model ?? DEFAULT_MODEL;
13
+ this.telemetry = options?.telemetry;
14
+ this.sessionId = options?.sessionId ?? 'anonymous';
15
+ }
16
+ async call(prompt, maxOutputTokens) {
17
+ const apiKey = process.env.ANTHROPIC_API_KEY;
18
+ if (!apiKey)
19
+ throw new Error('ANTHROPIC_API_KEY is not set');
20
+ const started = Date.now();
21
+ emitTelemetry(this.telemetry, 'llm.call.started', this.sessionId, {
22
+ model: this.model,
23
+ promptLength: prompt.length,
24
+ provider: this.name,
25
+ });
26
+ try {
27
+ const response = await fetch('https://api.anthropic.com/v1/messages', {
28
+ method: 'POST',
29
+ headers: {
30
+ 'x-api-key': apiKey,
31
+ 'anthropic-version': '2023-06-01',
32
+ 'content-type': 'application/json',
33
+ },
34
+ body: JSON.stringify({
35
+ model: this.model,
36
+ max_tokens: maxOutputTokens,
37
+ messages: [{ role: 'user', content: prompt }],
38
+ }),
39
+ });
40
+ if (!response.ok) {
41
+ const errBody = await response.text();
42
+ emitTelemetry(this.telemetry, 'llm.call.failed', this.sessionId, {
43
+ model: this.model,
44
+ error: `${response.status} ${errBody.slice(0, 500)}`,
45
+ provider: this.name,
46
+ });
47
+ throw new Error(`LLM call failed: ${response.status} ${errBody}`);
48
+ }
49
+ const data = (await response.json());
50
+ const text = data.content.find((b) => b.type === 'text')?.text ?? '';
51
+ const inTok = data.usage?.input_tokens;
52
+ const outTok = data.usage?.output_tokens;
53
+ const durationMs = Date.now() - started;
54
+ let result;
55
+ if (typeof inTok === 'number' && typeof outTok === 'number') {
56
+ result = {
57
+ text,
58
+ usage: {
59
+ provider: this.name,
60
+ model: data.model ?? this.model,
61
+ inputTokens: inTok,
62
+ outputTokens: outTok,
63
+ dataQuality: 'actual',
64
+ },
65
+ };
66
+ }
67
+ else {
68
+ const inputTokens = estimateTokensFromChars(prompt.length);
69
+ const outputTokens = estimateTokensFromChars(text.length);
70
+ result = {
71
+ text,
72
+ usage: {
73
+ provider: this.name,
74
+ model: data.model ?? this.model,
75
+ inputTokens,
76
+ outputTokens,
77
+ dataQuality: 'estimated',
78
+ },
79
+ };
80
+ }
81
+ const u = result.usage;
82
+ emitTelemetry(this.telemetry, 'llm.call.completed', this.sessionId, {
83
+ model: this.model,
84
+ inputTokens: u.inputTokens,
85
+ outputTokens: u.outputTokens,
86
+ durationMs,
87
+ provider: this.name,
88
+ });
89
+ return result;
90
+ }
91
+ catch (err) {
92
+ if (err instanceof Error && err.message.startsWith('LLM call failed:')) {
93
+ throw err;
94
+ }
95
+ const msg = err instanceof Error ? err.message : String(err);
96
+ emitTelemetry(this.telemetry, 'llm.call.failed', this.sessionId, {
97
+ model: this.model,
98
+ error: msg.slice(0, 500),
99
+ provider: this.name,
100
+ });
101
+ throw err;
102
+ }
103
+ }
104
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/phases/act.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAIrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,wBAAsB,GAAG,CACvB,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,mBAA8C,GACxD,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
1
+ {"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/phases/act.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAIrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAIrE,wBAAsB,GAAG,CACvB,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,mBAA8C,GACxD,OAAO,CAAC,IAAI,CAAC,CA6Df"}
@@ -2,20 +2,30 @@ import { join } from 'node:path';
2
2
  import { writeJsonReport } from '../reporters/json-reporter.js';
3
3
  import { writeMarkdownReport } from '../reporters/markdown-reporter.js';
4
4
  import { logDecision } from '../harness/decision-logger.js';
5
+ import { emitTelemetry } from '../telemetry/emit.js';
6
+ import { resolveScanStateBaseDir } from '../harness/state-manager.js';
5
7
  export async function act(analysis, config, artifacts = { writeArtifacts: true }) {
6
- const outputDir = join(process.cwd(), 'output');
7
- const logOpts = { persist: artifacts.writeArtifacts, memory: artifacts.decisionMemory };
8
+ const sessionId = artifacts.telemetrySessionId ?? 'none';
9
+ const reportDir = join(process.cwd(), 'output');
10
+ const logOpts = {
11
+ persist: artifacts.writeArtifacts,
12
+ memory: artifacts.decisionMemory,
13
+ outputDir: config.outputDir,
14
+ };
8
15
  const log = artifacts.writeArtifacts ? console.log : console.error;
16
+ emitTelemetry(artifacts.telemetry, 'phase.act.started', sessionId, {
17
+ writeArtifacts: artifacts.writeArtifacts,
18
+ });
9
19
  if (artifacts.writeArtifacts) {
10
- await writeJsonReport(analysis, outputDir);
11
- await writeMarkdownReport(analysis, outputDir);
20
+ await writeJsonReport(analysis, reportDir);
21
+ await writeMarkdownReport(analysis, reportDir);
12
22
  }
13
23
  await logDecision({
14
24
  timestamp: new Date().toISOString(),
15
25
  phase: 'act',
16
26
  decision: 'reports-written',
17
27
  reason: artifacts.writeArtifacts
18
- ? `Wrote JSON and Markdown reports to ${outputDir}`
28
+ ? `Wrote JSON and Markdown reports to ${reportDir}`
19
29
  : 'Skipped writing reports (ephemeral run)',
20
30
  metadata: {
21
31
  gapCount: analysis.gaps.length,
@@ -24,6 +34,10 @@ export async function act(analysis, config, artifacts = { writeArtifacts: true }
24
34
  requireHumanReview: config.requireHumanReview,
25
35
  },
26
36
  }, logOpts);
37
+ emitTelemetry(artifacts.telemetry, 'phase.act.completed', sessionId, {
38
+ gapCount: analysis.gaps.length,
39
+ wroteReports: artifacts.writeArtifacts,
40
+ });
27
41
  log('\n[qulib] Analysis complete');
28
42
  log(` Gaps found: ${analysis.gaps.length}`);
29
43
  log(` Scenarios generated: ${analysis.scenarios.length}`);
@@ -35,7 +49,7 @@ export async function act(analysis, config, artifacts = { writeArtifacts: true }
35
49
  log('\n[qulib] Human review required before applying any generated output.');
36
50
  if (artifacts.writeArtifacts) {
37
51
  log(' Reports: output/report.json and output/report.md');
38
- log(' Decisions: .scan-state/decision-log.json');
52
+ log(` Decisions: ${join(resolveScanStateBaseDir(config.outputDir), 'decision-log.json')}`);
39
53
  }
40
54
  else {
41
55
  log(' Ephemeral run: inspect JSON printed to stdout (no files written).');
@@ -1 +1 @@
1
- {"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../src/phases/observe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACjG,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAK3F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,mBAA8C,GACxD,OAAO,CAAC,aAAa,CAAC,CAoDxB"}
1
+ {"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../src/phases/observe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACjG,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAK3F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGrE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,mBAA8C,GACxD,OAAO,CAAC,aAAa,CAAC,CAuExB"}
@@ -4,10 +4,20 @@ import { createExplorer } from '../tools/explorer-factory.js';
4
4
  import { scanRepo } from '../tools/repo-scanner.js';
5
5
  import { StateManager } from '../harness/state-manager.js';
6
6
  import { logDecision } from '../harness/decision-logger.js';
7
+ import { emitTelemetry } from '../telemetry/emit.js';
7
8
  export async function observe(baseUrl, repoPath, config, artifacts = { writeArtifacts: true }) {
9
+ const sessionId = artifacts.telemetrySessionId ?? 'none';
8
10
  const explorer = createExplorer(config.explorer);
9
- const stateManager = new StateManager();
10
- const logOpts = { persist: artifacts.writeArtifacts, memory: artifacts.decisionMemory };
11
+ const stateManager = new StateManager(config.outputDir);
12
+ const logOpts = {
13
+ persist: artifacts.writeArtifacts,
14
+ memory: artifacts.decisionMemory,
15
+ outputDir: config.outputDir,
16
+ };
17
+ emitTelemetry(artifacts.telemetry, 'phase.observe.started', sessionId, {
18
+ baseUrl,
19
+ hasRepoPath: Boolean(repoPath),
20
+ });
11
21
  const rawRoutes = await explorer.explore(baseUrl, config, artifacts);
12
22
  const routes = RouteInventorySchema.parse(rawRoutes);
13
23
  if (artifacts.writeArtifacts) {
@@ -29,6 +39,10 @@ export async function observe(baseUrl, repoPath, config, artifacts = { writeArti
29
39
  if (repoPath) {
30
40
  const rawRepo = await scanRepo(repoPath);
31
41
  repo = RepoAnalysisSchema.parse(rawRepo);
42
+ emitTelemetry(artifacts.telemetry, 'repo.scanned', sessionId, {
43
+ routeCount: repo.routes.length,
44
+ testFileCount: repo.testFiles.length,
45
+ });
32
46
  if (artifacts.writeArtifacts) {
33
47
  await stateManager.writeState('repo-inventory.json', repo, RepoAnalysisSchema);
34
48
  }
@@ -44,5 +58,9 @@ export async function observe(baseUrl, repoPath, config, artifacts = { writeArti
44
58
  },
45
59
  }, logOpts);
46
60
  }
61
+ emitTelemetry(artifacts.telemetry, 'phase.observe.completed', sessionId, {
62
+ routeCount: routes.routes.length,
63
+ repoScanned: Boolean(repo),
64
+ });
47
65
  return { routes, repo };
48
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"think-finalize.d.ts","sourceRoot":"","sources":["../../src/phases/think-finalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACnG,OAAO,EAA4C,KAAK,WAAW,EAAwB,MAAM,mCAAmC,CAAC;AAQrI,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,gBAAgB,GAAG,kBAAkB,CAAC,CAAC;AAEtG,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,mBAA8C,EACzD,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB,GAAG,mBAAmB,GAAG,MAAM,CAAC,GAC9F,OAAO,CAAC,WAAW,CAAC,CAwKtB"}
1
+ {"version":3,"file":"think-finalize.d.ts","sourceRoot":"","sources":["../../src/phases/think-finalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACnG,OAAO,EAA4C,KAAK,WAAW,EAAwB,MAAM,mCAAmC,CAAC;AAQrI,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,gBAAgB,GAAG,kBAAkB,CAAC,CAAC;AAEtG,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,mBAA8C,EACzD,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB,GAAG,mBAAmB,GAAG,MAAM,CAAC,GAC9F,OAAO,CAAC,WAAW,CAAC,CAiLtB"}
@@ -7,8 +7,12 @@ import { buildGapPrompt } from '../llm/context-builder.js';
7
7
  import { assembleCostIntelligence } from '../llm/cost-intelligence.js';
8
8
  import { hashForCostIntelligence } from '../llm/content-hash.js';
9
9
  export async function finalizeGapAnalysisFromDraft(draft, config, artifacts = { writeArtifacts: true }, costContext) {
10
- const stateManager = new StateManager();
11
- const logOpts = { persist: artifacts.writeArtifacts, memory: artifacts.decisionMemory };
10
+ const stateManager = new StateManager(config.outputDir);
11
+ const logOpts = {
12
+ persist: artifacts.writeArtifacts,
13
+ memory: artifacts.decisionMemory,
14
+ outputDir: config.outputDir,
15
+ };
12
16
  const partialAnalysis = GapAnalysisSchema.parse({
13
17
  ...draft,
14
18
  scenarios: [],
@@ -60,7 +64,12 @@ export async function finalizeGapAnalysisFromDraft(draft, config, artifacts = {
60
64
  const prompt = buildGapPrompt(partialAnalysis.gaps, config.testGenerationLimit);
61
65
  const promptHash = hashForCostIntelligence(prompt);
62
66
  try {
63
- const llmResult = await callLLM(prompt, maxOut);
67
+ const llmResult = await callLLM(prompt, maxOut, {
68
+ llmProvider: config.llmProvider,
69
+ llmModel: config.llmModel,
70
+ telemetry: artifacts.telemetry,
71
+ telemetrySessionId: artifacts.telemetrySessionId,
72
+ });
64
73
  const resultHash = hashForCostIntelligence(llmResult.text);
65
74
  const usage = llmResult.usage;
66
75
  llmRecords.push({
@@ -1 +1 @@
1
- {"version":3,"file":"think.d.ts","sourceRoot":"","sources":["../../src/phases/think.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,mCAAmC,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGrE,wBAAsB,KAAK,CACzB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,mBAA8C,GACxD,OAAO,CAAC,WAAW,CAAC,CAqCtB;AAED,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"think.d.ts","sourceRoot":"","sources":["../../src/phases/think.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,mCAAmC,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAIrE,wBAAsB,KAAK,CACzB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,mBAA8C,GACxD,OAAO,CAAC,WAAW,CAAC,CAmDtB;AAED,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -2,9 +2,16 @@ import { GapAnalysisSchema } from '../schemas/gap-analysis.schema.js';
2
2
  import { analyzeGaps } from '../tools/gap-engine.js';
3
3
  import { logDecision } from '../harness/decision-logger.js';
4
4
  import { finalizeGapAnalysisFromDraft } from './think-finalize.js';
5
+ import { emitTelemetry } from '../telemetry/emit.js';
5
6
  export async function think(observed, config, artifacts = { writeArtifacts: true }) {
7
+ const sessionId = artifacts.telemetrySessionId ?? 'none';
6
8
  const mode = observed.repo ? 'url-repo' : 'url-only';
7
- const logOpts = { persist: artifacts.writeArtifacts, memory: artifacts.decisionMemory };
9
+ const logOpts = {
10
+ persist: artifacts.writeArtifacts,
11
+ memory: artifacts.decisionMemory,
12
+ outputDir: config.outputDir,
13
+ };
14
+ emitTelemetry(artifacts.telemetry, 'phase.think.started', sessionId, { mode });
8
15
  const gapBlock = analyzeGaps(observed.routes, observed.repo, mode, config);
9
16
  const draft = {
10
17
  analyzedAt: gapBlock.analyzedAt,
@@ -31,6 +38,11 @@ export async function think(observed, config, artifacts = { writeArtifacts: true
31
38
  releaseConfidence: partialAnalysis.releaseConfidence,
32
39
  },
33
40
  }, logOpts);
34
- return finalizeGapAnalysisFromDraft(draft, config, artifacts);
41
+ const finalized = await finalizeGapAnalysisFromDraft(draft, config, artifacts);
42
+ emitTelemetry(artifacts.telemetry, 'phase.think.completed', sessionId, {
43
+ gapCount: finalized.gaps.length,
44
+ mode: finalized.mode,
45
+ });
46
+ return finalized;
35
47
  }
36
48
  export { finalizeGapAnalysisFromDraft } from './think-finalize.js';
@@ -0,0 +1,78 @@
1
+ import { z } from 'zod';
2
+ export declare const AutomationMaturityDimensionSchema: z.ZodObject<{
3
+ dimension: z.ZodEnum<["test-coverage-breadth", "framework-adoption", "test-id-hygiene", "ci-integration", "auth-test-coverage", "component-test-ratio"]>;
4
+ score: z.ZodNumber;
5
+ weight: z.ZodNumber;
6
+ evidence: z.ZodArray<z.ZodString, "many">;
7
+ recommendations: z.ZodArray<z.ZodString, "many">;
8
+ }, "strip", z.ZodTypeAny, {
9
+ recommendations: string[];
10
+ dimension: "test-coverage-breadth" | "framework-adoption" | "test-id-hygiene" | "ci-integration" | "auth-test-coverage" | "component-test-ratio";
11
+ score: number;
12
+ weight: number;
13
+ evidence: string[];
14
+ }, {
15
+ recommendations: string[];
16
+ dimension: "test-coverage-breadth" | "framework-adoption" | "test-id-hygiene" | "ci-integration" | "auth-test-coverage" | "component-test-ratio";
17
+ score: number;
18
+ weight: number;
19
+ evidence: string[];
20
+ }>;
21
+ export declare const AutomationMaturitySchema: z.ZodObject<{
22
+ computedAt: z.ZodString;
23
+ repoPath: z.ZodString;
24
+ overallScore: z.ZodNumber;
25
+ level: z.ZodNumber;
26
+ label: z.ZodString;
27
+ dimensions: z.ZodArray<z.ZodObject<{
28
+ dimension: z.ZodEnum<["test-coverage-breadth", "framework-adoption", "test-id-hygiene", "ci-integration", "auth-test-coverage", "component-test-ratio"]>;
29
+ score: z.ZodNumber;
30
+ weight: z.ZodNumber;
31
+ evidence: z.ZodArray<z.ZodString, "many">;
32
+ recommendations: z.ZodArray<z.ZodString, "many">;
33
+ }, "strip", z.ZodTypeAny, {
34
+ recommendations: string[];
35
+ dimension: "test-coverage-breadth" | "framework-adoption" | "test-id-hygiene" | "ci-integration" | "auth-test-coverage" | "component-test-ratio";
36
+ score: number;
37
+ weight: number;
38
+ evidence: string[];
39
+ }, {
40
+ recommendations: string[];
41
+ dimension: "test-coverage-breadth" | "framework-adoption" | "test-id-hygiene" | "ci-integration" | "auth-test-coverage" | "component-test-ratio";
42
+ score: number;
43
+ weight: number;
44
+ evidence: string[];
45
+ }>, "many">;
46
+ topRecommendations: z.ZodArray<z.ZodString, "many">;
47
+ }, "strip", z.ZodTypeAny, {
48
+ label: string;
49
+ level: number;
50
+ computedAt: string;
51
+ repoPath: string;
52
+ overallScore: number;
53
+ dimensions: {
54
+ recommendations: string[];
55
+ dimension: "test-coverage-breadth" | "framework-adoption" | "test-id-hygiene" | "ci-integration" | "auth-test-coverage" | "component-test-ratio";
56
+ score: number;
57
+ weight: number;
58
+ evidence: string[];
59
+ }[];
60
+ topRecommendations: string[];
61
+ }, {
62
+ label: string;
63
+ level: number;
64
+ computedAt: string;
65
+ repoPath: string;
66
+ overallScore: number;
67
+ dimensions: {
68
+ recommendations: string[];
69
+ dimension: "test-coverage-breadth" | "framework-adoption" | "test-id-hygiene" | "ci-integration" | "auth-test-coverage" | "component-test-ratio";
70
+ score: number;
71
+ weight: number;
72
+ evidence: string[];
73
+ }[];
74
+ topRecommendations: string[];
75
+ }>;
76
+ export type AutomationMaturityDimension = z.infer<typeof AutomationMaturityDimensionSchema>;
77
+ export type AutomationMaturity = z.infer<typeof AutomationMaturitySchema>;
78
+ //# sourceMappingURL=automation-maturity.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation-maturity.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/automation-maturity.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;EAa5C,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQnC,CAAC;AAEH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAC5F,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ export const AutomationMaturityDimensionSchema = z.object({
3
+ dimension: z.enum([
4
+ 'test-coverage-breadth',
5
+ 'framework-adoption',
6
+ 'test-id-hygiene',
7
+ 'ci-integration',
8
+ 'auth-test-coverage',
9
+ 'component-test-ratio',
10
+ ]),
11
+ score: z.number().min(0).max(100),
12
+ weight: z.number().min(0).max(1),
13
+ evidence: z.array(z.string()),
14
+ recommendations: z.array(z.string()),
15
+ });
16
+ export const AutomationMaturitySchema = z.object({
17
+ computedAt: z.string().datetime(),
18
+ repoPath: z.string(),
19
+ overallScore: z.number().min(0).max(100),
20
+ level: z.number().int().min(1).max(5),
21
+ label: z.string(),
22
+ dimensions: z.array(AutomationMaturityDimensionSchema),
23
+ topRecommendations: z.array(z.string()),
24
+ });
@@ -177,6 +177,25 @@ export declare const HarnessConfigSchema: z.ZodObject<{
177
177
  explorer: z.ZodDefault<z.ZodEnum<["playwright", "cypress"]>>;
178
178
  defaultAdapter: z.ZodDefault<z.ZodEnum<["playwright", "cypress-e2e", "cypress-component", "api", "accessibility"]>>;
179
179
  adapters: z.ZodDefault<z.ZodArray<z.ZodEnum<["playwright", "cypress-e2e", "cypress-component", "api", "accessibility"]>, "many">>;
180
+ llmProvider: z.ZodOptional<z.ZodEnum<["anthropic"]>>;
181
+ llmModel: z.ZodOptional<z.ZodString>;
182
+ outputDir: z.ZodOptional<z.ZodString>;
183
+ scoringWeights: z.ZodOptional<z.ZodObject<{
184
+ critical: z.ZodOptional<z.ZodNumber>;
185
+ high: z.ZodOptional<z.ZodNumber>;
186
+ medium: z.ZodOptional<z.ZodNumber>;
187
+ low: z.ZodOptional<z.ZodNumber>;
188
+ }, "strip", z.ZodTypeAny, {
189
+ critical?: number | undefined;
190
+ high?: number | undefined;
191
+ medium?: number | undefined;
192
+ low?: number | undefined;
193
+ }, {
194
+ critical?: number | undefined;
195
+ high?: number | undefined;
196
+ medium?: number | undefined;
197
+ low?: number | undefined;
198
+ }>>;
180
199
  auth: z.ZodOptional<z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
181
200
  type: z.ZodLiteral<"form-login">;
182
201
  loginUrl: z.ZodString;
@@ -271,6 +290,15 @@ export declare const HarnessConfigSchema: z.ZodObject<{
271
290
  defaultAdapter: "playwright" | "cypress-e2e" | "cypress-component" | "api" | "accessibility";
272
291
  adapters: ("playwright" | "cypress-e2e" | "cypress-component" | "api" | "accessibility")[];
273
292
  llmMaxOutputTokensPerCall?: number | undefined;
293
+ llmProvider?: "anthropic" | undefined;
294
+ llmModel?: string | undefined;
295
+ outputDir?: string | undefined;
296
+ scoringWeights?: {
297
+ critical?: number | undefined;
298
+ high?: number | undefined;
299
+ medium?: number | undefined;
300
+ low?: number | undefined;
301
+ } | undefined;
274
302
  auth?: {
275
303
  type: "form-login";
276
304
  loginUrl: string;
@@ -307,6 +335,15 @@ export declare const HarnessConfigSchema: z.ZodObject<{
307
335
  explorer?: "playwright" | "cypress" | undefined;
308
336
  defaultAdapter?: "playwright" | "cypress-e2e" | "cypress-component" | "api" | "accessibility" | undefined;
309
337
  adapters?: ("playwright" | "cypress-e2e" | "cypress-component" | "api" | "accessibility")[] | undefined;
338
+ llmProvider?: "anthropic" | undefined;
339
+ llmModel?: string | undefined;
340
+ outputDir?: string | undefined;
341
+ scoringWeights?: {
342
+ critical?: number | undefined;
343
+ high?: number | undefined;
344
+ medium?: number | undefined;
345
+ low?: number | undefined;
346
+ } | undefined;
310
347
  auth?: {
311
348
  type: "form-login";
312
349
  loginUrl: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/config.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,CAAC;AACpD,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,aAAa,GAAG,mBAAmB,GAAG,KAAK,GAAG,eAAe,CAAC;AAEvG,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBvB,CAAC;AAEH,QAAA,MAAM,sBAAsB;;;;;;;;;EAG1B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAA8E,CAAC;AAE5G,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC5E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE9E;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmB7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAcrC,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASzB,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAehC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
1
+ {"version":3,"file":"config.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/config.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,CAAC;AACpD,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,aAAa,GAAG,mBAAmB,GAAG,KAAK,GAAG,eAAe,CAAC;AAEvG,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBvB,CAAC;AAEH,QAAA,MAAM,sBAAsB;;;;;;;;;EAG1B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAA8E,CAAC;AAE5G,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC5E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0C9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE9E;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmB7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAcrC,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASzB,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAehC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -49,6 +49,17 @@ export const HarnessConfigSchema = z.object({
49
49
  explorer: z.enum(['playwright', 'cypress']).default('playwright'),
50
50
  defaultAdapter: z.enum(['playwright', 'cypress-e2e', 'cypress-component', 'api', 'accessibility']).default('playwright'),
51
51
  adapters: z.array(z.enum(['playwright', 'cypress-e2e', 'cypress-component', 'api', 'accessibility'])).default(['playwright']),
52
+ llmProvider: z.enum(['anthropic']).optional(),
53
+ llmModel: z.string().optional(),
54
+ outputDir: z.string().optional(),
55
+ scoringWeights: z
56
+ .object({
57
+ critical: z.number().min(0).max(100).optional(),
58
+ high: z.number().min(0).max(100).optional(),
59
+ medium: z.number().min(0).max(100).optional(),
60
+ low: z.number().min(0).max(100).optional(),
61
+ })
62
+ .optional(),
52
63
  auth: AuthConfigSchema.optional(),
53
64
  });
54
65
  export function resolveMaxOutputTokensPerLlmCall(config) {
@@ -10,7 +10,7 @@ export declare const GapSchema: z.ZodObject<{
10
10
  }, "strip", z.ZodTypeAny, {
11
11
  path: string;
12
12
  id: string;
13
- severity: "high" | "medium" | "low" | "critical";
13
+ severity: "critical" | "high" | "medium" | "low";
14
14
  reason: string;
15
15
  category: "untested-route" | "a11y" | "console-error" | "broken-link" | "auth-surface" | "coverage";
16
16
  recommendation?: string | undefined;
@@ -18,7 +18,7 @@ export declare const GapSchema: z.ZodObject<{
18
18
  }, {
19
19
  path: string;
20
20
  id: string;
21
- severity: "high" | "medium" | "low" | "critical";
21
+ severity: "critical" | "high" | "medium" | "low";
22
22
  reason: string;
23
23
  category: "untested-route" | "a11y" | "console-error" | "broken-link" | "auth-surface" | "coverage";
24
24
  recommendation?: string | undefined;
@@ -169,7 +169,7 @@ export declare const GapAnalysisSchema: z.ZodObject<{
169
169
  }, "strip", z.ZodTypeAny, {
170
170
  path: string;
171
171
  id: string;
172
- severity: "high" | "medium" | "low" | "critical";
172
+ severity: "critical" | "high" | "medium" | "low";
173
173
  reason: string;
174
174
  category: "untested-route" | "a11y" | "console-error" | "broken-link" | "auth-surface" | "coverage";
175
175
  recommendation?: string | undefined;
@@ -177,7 +177,7 @@ export declare const GapAnalysisSchema: z.ZodObject<{
177
177
  }, {
178
178
  path: string;
179
179
  id: string;
180
- severity: "high" | "medium" | "low" | "critical";
180
+ severity: "critical" | "high" | "medium" | "low";
181
181
  reason: string;
182
182
  category: "untested-route" | "a11y" | "console-error" | "broken-link" | "auth-surface" | "coverage";
183
183
  recommendation?: string | undefined;
@@ -443,7 +443,7 @@ export declare const GapAnalysisSchema: z.ZodObject<{
443
443
  gaps: {
444
444
  path: string;
445
445
  id: string;
446
- severity: "high" | "medium" | "low" | "critical";
446
+ severity: "critical" | "high" | "medium" | "low";
447
447
  reason: string;
448
448
  category: "untested-route" | "a11y" | "console-error" | "broken-link" | "auth-surface" | "coverage";
449
449
  recommendation?: string | undefined;
@@ -522,7 +522,7 @@ export declare const GapAnalysisSchema: z.ZodObject<{
522
522
  gaps: {
523
523
  path: string;
524
524
  id: string;
525
- severity: "high" | "medium" | "low" | "critical";
525
+ severity: "critical" | "high" | "medium" | "low";
526
526
  reason: string;
527
527
  category: "untested-route" | "a11y" | "console-error" | "broken-link" | "auth-surface" | "coverage";
528
528
  recommendation?: string | undefined;
@@ -3,6 +3,7 @@ export { DecisionLogEntrySchema, type DecisionLogEntry, } from './decision-log.s
3
3
  export { RouteInventorySchema, RouteSchema, A11yViolationSchema, BrokenLinkSchema, type RouteInventory, type Route, } from './route-inventory.schema.js';
4
4
  export { GapAnalysisSchema, GapSchema, NeutralScenarioSchema, GeneratedTestSchema, TestStepSchema, FrameworkRecommendationSchema, type GapAnalysis, type Gap, type NeutralScenario, type GeneratedTest, type TestStep, type FrameworkRecommendation, } from './gap-analysis.schema.js';
5
5
  export { CostIntelligenceSchema, LlmUsageRecordSchema, LlmDataQualitySchema, LlmOperationTypeSchema, RepeatedAiPatternSchema, DeterministicMaturitySchema, type CostIntelligence, type LlmUsageRecord, type LlmDataQuality, type LlmOperationType, type RepeatedAiPattern, type DeterministicMaturity, } from './cost-intelligence.schema.js';
6
- export { RepoAnalysisSchema, type RepoAnalysis, } from './repo-analysis.schema.js';
6
+ export { RepoAnalysisSchema, FrameworkDetectionSchema, DetectedFrameworkPrimarySchema, FrameworkDetectionConfidenceSchema, TestFrameworkDetectedSchema, type RepoAnalysis, type FrameworkDetectionResult, type DetectedFrameworkPrimary, } from './repo-analysis.schema.js';
7
+ export { AutomationMaturitySchema, AutomationMaturityDimensionSchema, type AutomationMaturity, type AutomationMaturityDimension, } from './automation-maturity.schema.js';
7
8
  export { PublicSurfaceSchema, PublicSurfaceViolationSchema, PublicSurfaceBrokenLinkSchema, type PublicSurface, type PublicSurfaceViolation, type PublicSurfaceBrokenLink, } from './public-surface.schema.js';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,gCAAgC,EAChC,gBAAgB,EAChB,kBAAkB,EAClB,0BAA0B,EAC1B,cAAc,EACd,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EACb,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,sBAAsB,EACtB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,KAAK,GACX,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,6BAA6B,EAC7B,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,uBAAuB,GAC7B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,2BAA2B,EAC3B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,KAAK,YAAY,GAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,6BAA6B,EAC7B,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,gCAAgC,EAChC,gBAAgB,EAChB,kBAAkB,EAClB,0BAA0B,EAC1B,cAAc,EACd,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EACb,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,sBAAsB,EACtB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,KAAK,GACX,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,6BAA6B,EAC7B,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,uBAAuB,GAC7B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,2BAA2B,EAC3B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,8BAA8B,EAC9B,kCAAkC,EAClC,2BAA2B,EAC3B,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,GAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,wBAAwB,EACxB,iCAAiC,EACjC,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,GACjC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,6BAA6B,EAC7B,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,4BAA4B,CAAC"}
@@ -3,5 +3,6 @@ export { DecisionLogEntrySchema, } from './decision-log.schema.js';
3
3
  export { RouteInventorySchema, RouteSchema, A11yViolationSchema, BrokenLinkSchema, } from './route-inventory.schema.js';
4
4
  export { GapAnalysisSchema, GapSchema, NeutralScenarioSchema, GeneratedTestSchema, TestStepSchema, FrameworkRecommendationSchema, } from './gap-analysis.schema.js';
5
5
  export { CostIntelligenceSchema, LlmUsageRecordSchema, LlmDataQualitySchema, LlmOperationTypeSchema, RepeatedAiPatternSchema, DeterministicMaturitySchema, } from './cost-intelligence.schema.js';
6
- export { RepoAnalysisSchema, } from './repo-analysis.schema.js';
6
+ export { RepoAnalysisSchema, FrameworkDetectionSchema, DetectedFrameworkPrimarySchema, FrameworkDetectionConfidenceSchema, TestFrameworkDetectedSchema, } from './repo-analysis.schema.js';
7
+ export { AutomationMaturitySchema, AutomationMaturityDimensionSchema, } from './automation-maturity.schema.js';
7
8
  export { PublicSurfaceSchema, PublicSurfaceViolationSchema, PublicSurfaceBrokenLinkSchema, } from './public-surface.schema.js';
@@ -124,7 +124,7 @@ export declare const PublicSurfaceSchema: z.ZodObject<{
124
124
  }, "strip", z.ZodTypeAny, {
125
125
  path: string;
126
126
  id: string;
127
- severity: "high" | "medium" | "low" | "critical";
127
+ severity: "critical" | "high" | "medium" | "low";
128
128
  reason: string;
129
129
  category: "untested-route" | "a11y" | "console-error" | "broken-link" | "auth-surface" | "coverage";
130
130
  recommendation?: string | undefined;
@@ -132,7 +132,7 @@ export declare const PublicSurfaceSchema: z.ZodObject<{
132
132
  }, {
133
133
  path: string;
134
134
  id: string;
135
- severity: "high" | "medium" | "low" | "critical";
135
+ severity: "critical" | "high" | "medium" | "low";
136
136
  reason: string;
137
137
  category: "untested-route" | "a11y" | "console-error" | "broken-link" | "auth-surface" | "coverage";
138
138
  recommendation?: string | undefined;
@@ -179,7 +179,7 @@ export declare const PublicSurfaceSchema: z.ZodObject<{
179
179
  gaps: {
180
180
  path: string;
181
181
  id: string;
182
- severity: "high" | "medium" | "low" | "critical";
182
+ severity: "critical" | "high" | "medium" | "low";
183
183
  reason: string;
184
184
  category: "untested-route" | "a11y" | "console-error" | "broken-link" | "auth-surface" | "coverage";
185
185
  recommendation?: string | undefined;
@@ -222,7 +222,7 @@ export declare const PublicSurfaceSchema: z.ZodObject<{
222
222
  gaps: {
223
223
  path: string;
224
224
  id: string;
225
- severity: "high" | "medium" | "low" | "critical";
225
+ severity: "critical" | "high" | "medium" | "low";
226
226
  reason: string;
227
227
  category: "untested-route" | "a11y" | "console-error" | "broken-link" | "auth-surface" | "coverage";
228
228
  recommendation?: string | undefined;