@qulib/core 0.7.0 → 0.9.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.
- package/README.md +30 -5
- package/bin/qulib.js +2 -3
- package/dist/__tests__/fixtures/api-fixture-repo/app/api/orders/route.d.ts +7 -0
- package/dist/__tests__/fixtures/api-fixture-repo/app/api/orders/route.d.ts.map +1 -0
- package/dist/__tests__/fixtures/api-fixture-repo/app/api/orders/route.js +7 -0
- package/dist/__tests__/fixtures/api-fixture-repo/app/api/users/route.d.ts +10 -0
- package/dist/__tests__/fixtures/api-fixture-repo/app/api/users/route.d.ts.map +1 -0
- package/dist/__tests__/fixtures/api-fixture-repo/app/api/users/route.js +9 -0
- package/dist/__tests__/fixtures/api-fixture-repo/pages/api/health.d.ts +9 -0
- package/dist/__tests__/fixtures/api-fixture-repo/pages/api/health.d.ts.map +1 -0
- package/dist/__tests__/fixtures/api-fixture-repo/pages/api/health.js +10 -0
- package/dist/__tests__/playwright-available.d.ts +32 -0
- package/dist/__tests__/playwright-available.d.ts.map +1 -0
- package/dist/__tests__/playwright-available.js +35 -0
- package/dist/adapters/api-adapter.d.ts +26 -0
- package/dist/adapters/api-adapter.d.ts.map +1 -1
- package/dist/adapters/api-adapter.js +156 -2
- package/dist/adapters/ci-results-adapter.d.ts +67 -0
- package/dist/adapters/ci-results-adapter.d.ts.map +1 -0
- package/dist/adapters/ci-results-adapter.js +143 -0
- package/dist/adapters/cypress-e2e-adapter.d.ts.map +1 -1
- package/dist/adapters/cypress-e2e-adapter.js +25 -2
- package/dist/adapters/playwright-adapter.d.ts.map +1 -1
- package/dist/adapters/playwright-adapter.js +94 -2
- package/dist/adapters/pr-metadata-adapter.d.ts +75 -0
- package/dist/adapters/pr-metadata-adapter.d.ts.map +1 -0
- package/dist/adapters/pr-metadata-adapter.js +146 -0
- package/dist/adapters/validate-specs.d.ts +55 -0
- package/dist/adapters/validate-specs.d.ts.map +1 -0
- package/dist/adapters/validate-specs.js +67 -0
- package/dist/baseline/baseline.d.ts +54 -0
- package/dist/baseline/baseline.d.ts.map +1 -0
- package/dist/baseline/baseline.js +252 -0
- package/dist/baseline/baseline.schema.d.ts +233 -0
- package/dist/baseline/baseline.schema.d.ts.map +1 -0
- package/dist/baseline/baseline.schema.js +59 -0
- package/dist/cli/confidence-run.d.ts +16 -0
- package/dist/cli/confidence-run.d.ts.map +1 -0
- package/dist/cli/confidence-run.js +158 -0
- package/dist/cli/index.d.ts +11 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +80 -4
- package/dist/cli/scaffold-run.d.ts +86 -0
- package/dist/cli/scaffold-run.d.ts.map +1 -0
- package/dist/cli/scaffold-run.js +232 -0
- package/dist/cli/score-automation-run.d.ts +25 -0
- package/dist/cli/score-automation-run.d.ts.map +1 -0
- package/dist/cli/score-automation-run.js +123 -0
- package/dist/examples/notquality-dogfood/fixture.d.ts +166 -0
- package/dist/examples/notquality-dogfood/fixture.d.ts.map +1 -0
- package/dist/examples/notquality-dogfood/fixture.js +174 -0
- package/dist/examples/notquality-dogfood/run.d.ts +34 -0
- package/dist/examples/notquality-dogfood/run.d.ts.map +1 -0
- package/dist/examples/notquality-dogfood/run.js +139 -0
- package/dist/index.d.ts +18 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/recipes/a11y.d.ts +36 -0
- package/dist/recipes/a11y.d.ts.map +1 -0
- package/dist/recipes/a11y.js +118 -0
- package/dist/recipes/auth.d.ts +38 -0
- package/dist/recipes/auth.d.ts.map +1 -0
- package/dist/recipes/auth.js +156 -0
- package/dist/recipes/index.d.ts +26 -0
- package/dist/recipes/index.d.ts.map +1 -0
- package/dist/recipes/index.js +41 -0
- package/dist/recipes/nav.d.ts +34 -0
- package/dist/recipes/nav.d.ts.map +1 -0
- package/dist/recipes/nav.js +128 -0
- package/dist/recipes/seed.d.ts +34 -0
- package/dist/recipes/seed.d.ts.map +1 -0
- package/dist/recipes/seed.js +87 -0
- package/dist/scaffold-tests.d.ts +21 -0
- package/dist/scaffold-tests.d.ts.map +1 -1
- package/dist/scaffold-tests.js +12 -2
- package/dist/schemas/automation-maturity.schema.d.ts +8 -8
- package/dist/schemas/automation-maturity.schema.d.ts.map +1 -1
- package/dist/schemas/automation-maturity.schema.js +1 -0
- package/dist/schemas/confidence.schema.d.ts +526 -0
- package/dist/schemas/confidence.schema.d.ts.map +1 -0
- package/dist/schemas/confidence.schema.js +161 -0
- package/dist/schemas/gap-analysis.schema.d.ts +8 -8
- package/dist/schemas/gap-analysis.schema.js +1 -1
- package/dist/schemas/index.d.ts +3 -0
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +3 -0
- package/dist/schemas/public-surface.schema.d.ts +5 -5
- package/dist/schemas/recipe.schema.d.ts +66 -0
- package/dist/schemas/recipe.schema.d.ts.map +1 -0
- package/dist/schemas/recipe.schema.js +45 -0
- package/dist/schemas/repo-analysis.schema.d.ts +7 -7
- package/dist/schemas/views.schema.d.ts +234 -0
- package/dist/schemas/views.schema.d.ts.map +1 -0
- package/dist/schemas/views.schema.js +82 -0
- package/dist/tools/repo/api-surface.d.ts +59 -0
- package/dist/tools/repo/api-surface.d.ts.map +1 -0
- package/dist/tools/repo/api-surface.js +414 -0
- package/dist/tools/scoring/api-coverage.d.ts +74 -0
- package/dist/tools/scoring/api-coverage.d.ts.map +1 -0
- package/dist/tools/scoring/api-coverage.js +158 -0
- package/dist/tools/scoring/automation-maturity.d.ts +11 -1
- package/dist/tools/scoring/automation-maturity.d.ts.map +1 -1
- package/dist/tools/scoring/automation-maturity.js +43 -9
- package/dist/tools/scoring/confidence-from-qulib.d.ts +34 -0
- package/dist/tools/scoring/confidence-from-qulib.d.ts.map +1 -0
- package/dist/tools/scoring/confidence-from-qulib.js +206 -0
- package/dist/tools/scoring/confidence-views.d.ts +40 -0
- package/dist/tools/scoring/confidence-views.d.ts.map +1 -0
- package/dist/tools/scoring/confidence-views.js +163 -0
- package/dist/tools/scoring/confidence.d.ts +32 -0
- package/dist/tools/scoring/confidence.d.ts.map +1 -0
- package/dist/tools/scoring/confidence.js +180 -0
- package/dist/tools/scoring/levels.d.ts +15 -0
- package/dist/tools/scoring/levels.d.ts.map +1 -0
- package/dist/tools/scoring/levels.js +21 -0
- package/package.json +15 -7
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 5-View schemas for the qulib Confidence Layer (P3).
|
|
3
|
+
*
|
|
4
|
+
* View 1 — Release Confidence: ReleaseConfidenceSchema (defined in confidence.schema.ts).
|
|
5
|
+
* View 2 — Delivery Traffic: time series of confidence summaries.
|
|
6
|
+
* View 3 — Inbox: human-judgment items derived from blocking / unknown signals.
|
|
7
|
+
* View 4 — Replay: provenance chain explaining how a verdict formed.
|
|
8
|
+
* View 5 — Audit Trail: append-only tamper-evident ledger.
|
|
9
|
+
*
|
|
10
|
+
* P3: ships schemas + pure projection functions (buildReplay, deriveInbox, toAuditEntry,
|
|
11
|
+
* diffConfidence). Persistence sinks (file/db) and accumulation are deferred to P4.
|
|
12
|
+
*
|
|
13
|
+
* All records carry tenantId (CLAUDE.md rule 17 — multi-tenant from day one).
|
|
14
|
+
*/
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
export declare const DeliveryTrafficPointSchema: z.ZodObject<{
|
|
17
|
+
subjectRef: z.ZodString;
|
|
18
|
+
tenantId: z.ZodDefault<z.ZodString>;
|
|
19
|
+
computedAt: z.ZodString;
|
|
20
|
+
confidenceScore: z.ZodNullable<z.ZodNumber>;
|
|
21
|
+
verdict: z.ZodEnum<["ship", "caution", "hold", "block"]>;
|
|
22
|
+
/** Change in confidenceScore vs the previous point (null when no prior exists). */
|
|
23
|
+
deltaFromPrev: z.ZodNullable<z.ZodNumber>;
|
|
24
|
+
}, "strip", z.ZodTypeAny, {
|
|
25
|
+
computedAt: string;
|
|
26
|
+
tenantId: string;
|
|
27
|
+
confidenceScore: number | null;
|
|
28
|
+
verdict: "ship" | "caution" | "hold" | "block";
|
|
29
|
+
subjectRef: string;
|
|
30
|
+
deltaFromPrev: number | null;
|
|
31
|
+
}, {
|
|
32
|
+
computedAt: string;
|
|
33
|
+
confidenceScore: number | null;
|
|
34
|
+
verdict: "ship" | "caution" | "hold" | "block";
|
|
35
|
+
subjectRef: string;
|
|
36
|
+
deltaFromPrev: number | null;
|
|
37
|
+
tenantId?: string | undefined;
|
|
38
|
+
}>;
|
|
39
|
+
export type DeliveryTrafficPoint = z.infer<typeof DeliveryTrafficPointSchema>;
|
|
40
|
+
export declare const InboxItemKindSchema: z.ZodEnum<["blocker", "unknown-signal", "approval-needed"]>;
|
|
41
|
+
export type InboxItemKind = z.infer<typeof InboxItemKindSchema>;
|
|
42
|
+
export declare const InboxItemSchema: z.ZodObject<{
|
|
43
|
+
id: z.ZodString;
|
|
44
|
+
subjectRef: z.ZodString;
|
|
45
|
+
tenantId: z.ZodDefault<z.ZodString>;
|
|
46
|
+
kind: z.ZodEnum<["blocker", "unknown-signal", "approval-needed"]>;
|
|
47
|
+
source: z.ZodEnum<["live-app-quality", "accessibility", "crawl-coverage", "test-automation", "api-coverage", "ci-results", "deploy-metadata", "error-telemetry", "feature-flags", "doc-health", "human-approval", "agent-evidence"]>;
|
|
48
|
+
summary: z.ZodString;
|
|
49
|
+
raisedAt: z.ZodString;
|
|
50
|
+
resolvedAt: z.ZodOptional<z.ZodString>;
|
|
51
|
+
}, "strip", z.ZodTypeAny, {
|
|
52
|
+
id: string;
|
|
53
|
+
source: "accessibility" | "live-app-quality" | "crawl-coverage" | "test-automation" | "api-coverage" | "ci-results" | "deploy-metadata" | "error-telemetry" | "feature-flags" | "doc-health" | "human-approval" | "agent-evidence";
|
|
54
|
+
summary: string;
|
|
55
|
+
kind: "blocker" | "unknown-signal" | "approval-needed";
|
|
56
|
+
tenantId: string;
|
|
57
|
+
subjectRef: string;
|
|
58
|
+
raisedAt: string;
|
|
59
|
+
resolvedAt?: string | undefined;
|
|
60
|
+
}, {
|
|
61
|
+
id: string;
|
|
62
|
+
source: "accessibility" | "live-app-quality" | "crawl-coverage" | "test-automation" | "api-coverage" | "ci-results" | "deploy-metadata" | "error-telemetry" | "feature-flags" | "doc-health" | "human-approval" | "agent-evidence";
|
|
63
|
+
summary: string;
|
|
64
|
+
kind: "blocker" | "unknown-signal" | "approval-needed";
|
|
65
|
+
subjectRef: string;
|
|
66
|
+
raisedAt: string;
|
|
67
|
+
tenantId?: string | undefined;
|
|
68
|
+
resolvedAt?: string | undefined;
|
|
69
|
+
}>;
|
|
70
|
+
export type InboxItem = z.infer<typeof InboxItemSchema>;
|
|
71
|
+
export declare const ReplayStepSchema: z.ZodObject<{
|
|
72
|
+
source: z.ZodEnum<["live-app-quality", "accessibility", "crawl-coverage", "test-automation", "api-coverage", "ci-results", "deploy-metadata", "error-telemetry", "feature-flags", "doc-health", "human-approval", "agent-evidence"]>;
|
|
73
|
+
tool: z.ZodString;
|
|
74
|
+
inputRef: z.ZodOptional<z.ZodString>;
|
|
75
|
+
score: z.ZodNullable<z.ZodNumber>;
|
|
76
|
+
weight: z.ZodNumber;
|
|
77
|
+
effectiveWeight: z.ZodNumber;
|
|
78
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
79
|
+
cost: z.ZodOptional<z.ZodObject<{
|
|
80
|
+
inputTokens: z.ZodNumber;
|
|
81
|
+
outputTokens: z.ZodNumber;
|
|
82
|
+
}, "strip", z.ZodTypeAny, {
|
|
83
|
+
inputTokens: number;
|
|
84
|
+
outputTokens: number;
|
|
85
|
+
}, {
|
|
86
|
+
inputTokens: number;
|
|
87
|
+
outputTokens: number;
|
|
88
|
+
}>>;
|
|
89
|
+
}, "strip", z.ZodTypeAny, {
|
|
90
|
+
source: "accessibility" | "live-app-quality" | "crawl-coverage" | "test-automation" | "api-coverage" | "ci-results" | "deploy-metadata" | "error-telemetry" | "feature-flags" | "doc-health" | "human-approval" | "agent-evidence";
|
|
91
|
+
score: number | null;
|
|
92
|
+
weight: number;
|
|
93
|
+
tool: string;
|
|
94
|
+
effectiveWeight: number;
|
|
95
|
+
durationMs?: number | undefined;
|
|
96
|
+
inputRef?: string | undefined;
|
|
97
|
+
cost?: {
|
|
98
|
+
inputTokens: number;
|
|
99
|
+
outputTokens: number;
|
|
100
|
+
} | undefined;
|
|
101
|
+
}, {
|
|
102
|
+
source: "accessibility" | "live-app-quality" | "crawl-coverage" | "test-automation" | "api-coverage" | "ci-results" | "deploy-metadata" | "error-telemetry" | "feature-flags" | "doc-health" | "human-approval" | "agent-evidence";
|
|
103
|
+
score: number | null;
|
|
104
|
+
weight: number;
|
|
105
|
+
tool: string;
|
|
106
|
+
effectiveWeight: number;
|
|
107
|
+
durationMs?: number | undefined;
|
|
108
|
+
inputRef?: string | undefined;
|
|
109
|
+
cost?: {
|
|
110
|
+
inputTokens: number;
|
|
111
|
+
outputTokens: number;
|
|
112
|
+
} | undefined;
|
|
113
|
+
}>;
|
|
114
|
+
export type ReplayStep = z.infer<typeof ReplayStepSchema>;
|
|
115
|
+
export declare const ReplayTraceSchema: z.ZodObject<{
|
|
116
|
+
subjectRef: z.ZodString;
|
|
117
|
+
computedAt: z.ZodString;
|
|
118
|
+
steps: z.ZodArray<z.ZodObject<{
|
|
119
|
+
source: z.ZodEnum<["live-app-quality", "accessibility", "crawl-coverage", "test-automation", "api-coverage", "ci-results", "deploy-metadata", "error-telemetry", "feature-flags", "doc-health", "human-approval", "agent-evidence"]>;
|
|
120
|
+
tool: z.ZodString;
|
|
121
|
+
inputRef: z.ZodOptional<z.ZodString>;
|
|
122
|
+
score: z.ZodNullable<z.ZodNumber>;
|
|
123
|
+
weight: z.ZodNumber;
|
|
124
|
+
effectiveWeight: z.ZodNumber;
|
|
125
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
126
|
+
cost: z.ZodOptional<z.ZodObject<{
|
|
127
|
+
inputTokens: z.ZodNumber;
|
|
128
|
+
outputTokens: z.ZodNumber;
|
|
129
|
+
}, "strip", z.ZodTypeAny, {
|
|
130
|
+
inputTokens: number;
|
|
131
|
+
outputTokens: number;
|
|
132
|
+
}, {
|
|
133
|
+
inputTokens: number;
|
|
134
|
+
outputTokens: number;
|
|
135
|
+
}>>;
|
|
136
|
+
}, "strip", z.ZodTypeAny, {
|
|
137
|
+
source: "accessibility" | "live-app-quality" | "crawl-coverage" | "test-automation" | "api-coverage" | "ci-results" | "deploy-metadata" | "error-telemetry" | "feature-flags" | "doc-health" | "human-approval" | "agent-evidence";
|
|
138
|
+
score: number | null;
|
|
139
|
+
weight: number;
|
|
140
|
+
tool: string;
|
|
141
|
+
effectiveWeight: number;
|
|
142
|
+
durationMs?: number | undefined;
|
|
143
|
+
inputRef?: string | undefined;
|
|
144
|
+
cost?: {
|
|
145
|
+
inputTokens: number;
|
|
146
|
+
outputTokens: number;
|
|
147
|
+
} | undefined;
|
|
148
|
+
}, {
|
|
149
|
+
source: "accessibility" | "live-app-quality" | "crawl-coverage" | "test-automation" | "api-coverage" | "ci-results" | "deploy-metadata" | "error-telemetry" | "feature-flags" | "doc-health" | "human-approval" | "agent-evidence";
|
|
150
|
+
score: number | null;
|
|
151
|
+
weight: number;
|
|
152
|
+
tool: string;
|
|
153
|
+
effectiveWeight: number;
|
|
154
|
+
durationMs?: number | undefined;
|
|
155
|
+
inputRef?: string | undefined;
|
|
156
|
+
cost?: {
|
|
157
|
+
inputTokens: number;
|
|
158
|
+
outputTokens: number;
|
|
159
|
+
} | undefined;
|
|
160
|
+
}>, "many">;
|
|
161
|
+
formula: z.ZodString;
|
|
162
|
+
finalVerdict: z.ZodEnum<["ship", "caution", "hold", "block"]>;
|
|
163
|
+
}, "strip", z.ZodTypeAny, {
|
|
164
|
+
steps: {
|
|
165
|
+
source: "accessibility" | "live-app-quality" | "crawl-coverage" | "test-automation" | "api-coverage" | "ci-results" | "deploy-metadata" | "error-telemetry" | "feature-flags" | "doc-health" | "human-approval" | "agent-evidence";
|
|
166
|
+
score: number | null;
|
|
167
|
+
weight: number;
|
|
168
|
+
tool: string;
|
|
169
|
+
effectiveWeight: number;
|
|
170
|
+
durationMs?: number | undefined;
|
|
171
|
+
inputRef?: string | undefined;
|
|
172
|
+
cost?: {
|
|
173
|
+
inputTokens: number;
|
|
174
|
+
outputTokens: number;
|
|
175
|
+
} | undefined;
|
|
176
|
+
}[];
|
|
177
|
+
computedAt: string;
|
|
178
|
+
subjectRef: string;
|
|
179
|
+
formula: string;
|
|
180
|
+
finalVerdict: "ship" | "caution" | "hold" | "block";
|
|
181
|
+
}, {
|
|
182
|
+
steps: {
|
|
183
|
+
source: "accessibility" | "live-app-quality" | "crawl-coverage" | "test-automation" | "api-coverage" | "ci-results" | "deploy-metadata" | "error-telemetry" | "feature-flags" | "doc-health" | "human-approval" | "agent-evidence";
|
|
184
|
+
score: number | null;
|
|
185
|
+
weight: number;
|
|
186
|
+
tool: string;
|
|
187
|
+
effectiveWeight: number;
|
|
188
|
+
durationMs?: number | undefined;
|
|
189
|
+
inputRef?: string | undefined;
|
|
190
|
+
cost?: {
|
|
191
|
+
inputTokens: number;
|
|
192
|
+
outputTokens: number;
|
|
193
|
+
} | undefined;
|
|
194
|
+
}[];
|
|
195
|
+
computedAt: string;
|
|
196
|
+
subjectRef: string;
|
|
197
|
+
formula: string;
|
|
198
|
+
finalVerdict: "ship" | "caution" | "hold" | "block";
|
|
199
|
+
}>;
|
|
200
|
+
export type ReplayTrace = z.infer<typeof ReplayTraceSchema>;
|
|
201
|
+
export declare const AuditEntrySchema: z.ZodObject<{
|
|
202
|
+
tenantId: z.ZodDefault<z.ZodString>;
|
|
203
|
+
subjectRef: z.ZodString;
|
|
204
|
+
computedAt: z.ZodString;
|
|
205
|
+
confidenceScore: z.ZodNullable<z.ZodNumber>;
|
|
206
|
+
verdict: z.ZodEnum<["ship", "caution", "hold", "block"]>;
|
|
207
|
+
evidenceSourceCount: z.ZodNumber;
|
|
208
|
+
blockers: z.ZodArray<z.ZodString, "many">;
|
|
209
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
210
|
+
/** SHA-256 hex digest over the canonical record — tamper-evident. */
|
|
211
|
+
recordHash: z.ZodString;
|
|
212
|
+
}, "strip", z.ZodTypeAny, {
|
|
213
|
+
computedAt: string;
|
|
214
|
+
tenantId: string;
|
|
215
|
+
schemaVersion: 1;
|
|
216
|
+
confidenceScore: number | null;
|
|
217
|
+
verdict: "ship" | "caution" | "hold" | "block";
|
|
218
|
+
blockers: string[];
|
|
219
|
+
subjectRef: string;
|
|
220
|
+
evidenceSourceCount: number;
|
|
221
|
+
recordHash: string;
|
|
222
|
+
}, {
|
|
223
|
+
computedAt: string;
|
|
224
|
+
schemaVersion: 1;
|
|
225
|
+
confidenceScore: number | null;
|
|
226
|
+
verdict: "ship" | "caution" | "hold" | "block";
|
|
227
|
+
blockers: string[];
|
|
228
|
+
subjectRef: string;
|
|
229
|
+
evidenceSourceCount: number;
|
|
230
|
+
recordHash: string;
|
|
231
|
+
tenantId?: string | undefined;
|
|
232
|
+
}>;
|
|
233
|
+
export type AuditEntry = z.infer<typeof AuditEntrySchema>;
|
|
234
|
+
//# sourceMappingURL=views.schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/views.schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,0BAA0B;;;;;;IAMrC,mFAAmF;;;;;;;;;;;;;;;;EAEnF,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAM9E,eAAO,MAAM,mBAAmB,6DAA2D,CAAC;AAC5F,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAMxD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAM5D,eAAO,MAAM,gBAAgB;;;;;;;;;IAS3B,qEAAqE;;;;;;;;;;;;;;;;;;;;;;EAErE,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 5-View schemas for the qulib Confidence Layer (P3).
|
|
3
|
+
*
|
|
4
|
+
* View 1 — Release Confidence: ReleaseConfidenceSchema (defined in confidence.schema.ts).
|
|
5
|
+
* View 2 — Delivery Traffic: time series of confidence summaries.
|
|
6
|
+
* View 3 — Inbox: human-judgment items derived from blocking / unknown signals.
|
|
7
|
+
* View 4 — Replay: provenance chain explaining how a verdict formed.
|
|
8
|
+
* View 5 — Audit Trail: append-only tamper-evident ledger.
|
|
9
|
+
*
|
|
10
|
+
* P3: ships schemas + pure projection functions (buildReplay, deriveInbox, toAuditEntry,
|
|
11
|
+
* diffConfidence). Persistence sinks (file/db) and accumulation are deferred to P4.
|
|
12
|
+
*
|
|
13
|
+
* All records carry tenantId (CLAUDE.md rule 17 — multi-tenant from day one).
|
|
14
|
+
*/
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
import { EvidenceSourceKindSchema, ConfidenceVerdictSchema } from './confidence.schema.js';
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// View 2 — Delivery Traffic
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
export const DeliveryTrafficPointSchema = z.object({
|
|
21
|
+
subjectRef: z.string(),
|
|
22
|
+
tenantId: z.string().default('default'),
|
|
23
|
+
computedAt: z.string().datetime(),
|
|
24
|
+
confidenceScore: z.number().min(0).max(100).nullable(),
|
|
25
|
+
verdict: ConfidenceVerdictSchema,
|
|
26
|
+
/** Change in confidenceScore vs the previous point (null when no prior exists). */
|
|
27
|
+
deltaFromPrev: z.number().nullable(),
|
|
28
|
+
});
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// View 3 — Inbox
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
export const InboxItemKindSchema = z.enum(['blocker', 'unknown-signal', 'approval-needed']);
|
|
33
|
+
export const InboxItemSchema = z.object({
|
|
34
|
+
id: z.string(),
|
|
35
|
+
subjectRef: z.string(),
|
|
36
|
+
tenantId: z.string().default('default'),
|
|
37
|
+
kind: InboxItemKindSchema,
|
|
38
|
+
source: EvidenceSourceKindSchema,
|
|
39
|
+
summary: z.string(),
|
|
40
|
+
raisedAt: z.string().datetime(),
|
|
41
|
+
resolvedAt: z.string().datetime().optional(),
|
|
42
|
+
});
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// View 4 — Replay
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
export const ReplayStepSchema = z.object({
|
|
47
|
+
source: EvidenceSourceKindSchema,
|
|
48
|
+
tool: z.string(),
|
|
49
|
+
inputRef: z.string().optional(),
|
|
50
|
+
score: z.number().min(0).max(100).nullable(),
|
|
51
|
+
weight: z.number(),
|
|
52
|
+
effectiveWeight: z.number(),
|
|
53
|
+
durationMs: z.number().optional(),
|
|
54
|
+
cost: z
|
|
55
|
+
.object({
|
|
56
|
+
inputTokens: z.number(),
|
|
57
|
+
outputTokens: z.number(),
|
|
58
|
+
})
|
|
59
|
+
.optional(),
|
|
60
|
+
});
|
|
61
|
+
export const ReplayTraceSchema = z.object({
|
|
62
|
+
subjectRef: z.string(),
|
|
63
|
+
computedAt: z.string().datetime(),
|
|
64
|
+
steps: z.array(ReplayStepSchema),
|
|
65
|
+
formula: z.string(),
|
|
66
|
+
finalVerdict: ConfidenceVerdictSchema,
|
|
67
|
+
});
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// View 5 — Audit Trail
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
export const AuditEntrySchema = z.object({
|
|
72
|
+
tenantId: z.string().default('default'),
|
|
73
|
+
subjectRef: z.string(),
|
|
74
|
+
computedAt: z.string().datetime(),
|
|
75
|
+
confidenceScore: z.number().min(0).max(100).nullable(),
|
|
76
|
+
verdict: ConfidenceVerdictSchema,
|
|
77
|
+
evidenceSourceCount: z.number().int().min(0),
|
|
78
|
+
blockers: z.array(z.string()),
|
|
79
|
+
schemaVersion: z.literal(1),
|
|
80
|
+
/** SHA-256 hex digest over the canonical record — tamper-evident. */
|
|
81
|
+
recordHash: z.string(),
|
|
82
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module tools/repo/api-surface
|
|
3
|
+
* @packageBoundary @qulib/core
|
|
4
|
+
*
|
|
5
|
+
* Evidence-only API surface discovery. Three tiers of confidence:
|
|
6
|
+
* Tier1 — OpenAPI / Swagger spec files (YAML or JSON). Only reads `summary` and
|
|
7
|
+
* `parameters` from a real spec; never fabricates endpoints.
|
|
8
|
+
* Tier2 — Framework route files: Next.js App-Router `route.ts` exports,
|
|
9
|
+
* Next.js Pages `pages/api/`, Express router calls from RepoAnalysis.routes,
|
|
10
|
+
* Fastify `fastify.{method}`, Hono `app.{method}`, NestJS decorators.
|
|
11
|
+
* Tier3 — Opt-in heuristics. Currently: tRPC router definition files.
|
|
12
|
+
* Only activated when `options.enableTier3 === true`.
|
|
13
|
+
*
|
|
14
|
+
* Every endpoint carries:
|
|
15
|
+
* sourceFile — repo-relative file path that evidence was read from
|
|
16
|
+
* sourceTier — 'openapi' | 'framework' | 'heuristic'
|
|
17
|
+
* confidence — 'high' | 'medium' | 'low'
|
|
18
|
+
*
|
|
19
|
+
* NEVER invents endpoints or parameters. When a spec file cannot be parsed,
|
|
20
|
+
* or a file pattern does not clearly indicate a route, the file is skipped.
|
|
21
|
+
*/
|
|
22
|
+
import type { RepoAnalysis } from '../../schemas/repo-analysis.schema.js';
|
|
23
|
+
export interface DiscoveredEndpoint {
|
|
24
|
+
/** HTTP method inferred from the source — 'unknown' when ambiguous */
|
|
25
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'unknown';
|
|
26
|
+
/** Path as extracted from source — may contain framework-specific params like [id] or :id */
|
|
27
|
+
path: string;
|
|
28
|
+
/** Repo-relative file path the evidence was read from */
|
|
29
|
+
sourceFile: string;
|
|
30
|
+
/** Discovery tier */
|
|
31
|
+
sourceTier: 'openapi' | 'framework' | 'heuristic';
|
|
32
|
+
/** Evidence confidence */
|
|
33
|
+
confidence: 'high' | 'medium' | 'low';
|
|
34
|
+
/** Human-readable summary from spec, if available (Tier1 only) */
|
|
35
|
+
summary?: string;
|
|
36
|
+
/** Parameter names extracted from spec (Tier1 only; never fabricated) */
|
|
37
|
+
parameterNames?: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface ApiSurface {
|
|
40
|
+
discoveredAt: string;
|
|
41
|
+
repoPath: string;
|
|
42
|
+
endpoints: DiscoveredEndpoint[];
|
|
43
|
+
/** Number of OpenAPI/Swagger spec files found and successfully parsed */
|
|
44
|
+
openApiSpecsFound: number;
|
|
45
|
+
/** Tier3 heuristics were enabled */
|
|
46
|
+
tier3Enabled: boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface DiscoverApiSurfaceOptions {
|
|
49
|
+
/** Enable Tier3 heuristic discovery (default false — opt-in) */
|
|
50
|
+
enableTier3?: boolean;
|
|
51
|
+
}
|
|
52
|
+
export declare function discoverApiSurface(repoPath: string, options?: DiscoverApiSurfaceOptions): Promise<ApiSurface>;
|
|
53
|
+
/**
|
|
54
|
+
* Variant that also incorporates RepoAnalysis.routes (Express routes already
|
|
55
|
+
* extracted by scanRepo). Use this when you already have a RepoAnalysis to avoid
|
|
56
|
+
* double-reading files.
|
|
57
|
+
*/
|
|
58
|
+
export declare function discoverApiSurfaceWithRepo(repoPath: string, repo: RepoAnalysis, options?: DiscoverApiSurfaceOptions): Promise<ApiSurface>;
|
|
59
|
+
//# sourceMappingURL=api-surface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-surface.d.ts","sourceRoot":"","sources":["../../../src/tools/repo/api-surface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAiC1E,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IAChE,6FAA6F;IAC7F,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,UAAU,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;IAClD,0BAA0B;IAC1B,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,yEAAyE;IACzE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oCAAoC;IACpC,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,gEAAgE;IAChE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAwXD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,UAAU,CAAC,CAoCrB;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,UAAU,CAAC,CAQrB"}
|