@thinkai/tai-api-contract 2.126.0 → 2.127.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/dist/generated/openapi.d.ts +268 -0
- package/dist/generated/openapi.d.ts.map +1 -1
- package/openapi/openapi.yaml +305 -1
- package/package.json +2 -2
- package/src/generated/openapi.ts +268 -0
package/openapi/openapi.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
openapi: 3.0.3
|
|
2
2
|
info:
|
|
3
3
|
title: ThinkAI API
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.127.0
|
|
5
5
|
description: >
|
|
6
6
|
Contract surface for the AI Driven SDLC backend used by ThinkAI.
|
|
7
7
|
Workspace-scoped routes use `/workspaces/{workspaceId}/...`.
|
|
@@ -86,6 +86,12 @@ tags:
|
|
|
86
86
|
(LOC, cyclomatic complexity, duplication), hotspots, and playbook-threshold
|
|
87
87
|
findings collected during readiness scans. Every metric carries
|
|
88
88
|
`measured | derived | estimated | unavailable` provenance.
|
|
89
|
+
- name: TestPyramidInsights
|
|
90
|
+
description: >
|
|
91
|
+
Test pyramid assessment (`/insights/test-pyramid`) — workspace and per-repo
|
|
92
|
+
classified test-file inventory (unit, integration, acceptance/BDD, contract, E2E)
|
|
93
|
+
with count-based presence and advisory 70/20/10 shape. Distinct from Agentic
|
|
94
|
+
Foundation readiness `/readiness/test-pyramid*` (signal-inclusive presence).
|
|
89
95
|
|
|
90
96
|
paths:
|
|
91
97
|
/admin/users/{userId}:
|
|
@@ -3831,6 +3837,84 @@ paths:
|
|
|
3831
3837
|
schema:
|
|
3832
3838
|
$ref: "#/components/schemas/ErrorMessageDto"
|
|
3833
3839
|
|
|
3840
|
+
/workspaces/{workspaceId}/insights/test-pyramid/summary:
|
|
3841
|
+
get:
|
|
3842
|
+
tags: [TestPyramidInsights]
|
|
3843
|
+
summary: Test pyramid assessment — workspace summary
|
|
3844
|
+
operationId: getInsightsTestPyramidSummary
|
|
3845
|
+
description: >
|
|
3846
|
+
Org-level Test pyramid assessment for `/insights/test-pyramid`. Aggregates each
|
|
3847
|
+
active repo's **latest** readiness-scan test-pyramid snapshot. Layer **presence
|
|
3848
|
+
is count-based** (`fileCount > 0`); CI/dependency-only AF `present` flags are
|
|
3849
|
+
ignored. Shape uses fixed advisory targets (base ~70% unit, middle ~20%
|
|
3850
|
+
integration+contract+acceptance/BDD, top ~10% E2E) and returns
|
|
3851
|
+
`insufficient_data` when total classified test files < 10. Does not change
|
|
3852
|
+
Agentic Foundation `/readiness/test-pyramid*` responses.
|
|
3853
|
+
parameters:
|
|
3854
|
+
- $ref: "#/components/parameters/WorkspaceId"
|
|
3855
|
+
responses:
|
|
3856
|
+
"200":
|
|
3857
|
+
description: Test pyramid assessment workspace summary
|
|
3858
|
+
content:
|
|
3859
|
+
application/json:
|
|
3860
|
+
schema:
|
|
3861
|
+
$ref: "#/components/schemas/InsightsTestPyramidSummaryDto"
|
|
3862
|
+
"401":
|
|
3863
|
+
$ref: "#/components/responses/Unauthorized"
|
|
3864
|
+
"403":
|
|
3865
|
+
$ref: "#/components/responses/Forbidden"
|
|
3866
|
+
"404":
|
|
3867
|
+
description: Workspace does not exist or malformed workspaceId
|
|
3868
|
+
"501":
|
|
3869
|
+
description: Test pyramid history not supported by store
|
|
3870
|
+
content:
|
|
3871
|
+
application/json:
|
|
3872
|
+
schema:
|
|
3873
|
+
$ref: "#/components/schemas/ErrorMessageDto"
|
|
3874
|
+
|
|
3875
|
+
/workspaces/{workspaceId}/insights/test-pyramid/repos:
|
|
3876
|
+
get:
|
|
3877
|
+
tags: [TestPyramidInsights]
|
|
3878
|
+
summary: Test pyramid assessment — per-repo list (paginated)
|
|
3879
|
+
operationId: listInsightsTestPyramidRepos
|
|
3880
|
+
description: >
|
|
3881
|
+
Page of repos with latest classified test-file counts, count-based presence,
|
|
3882
|
+
presence maturity, and shape assessment. Use `gapsByLayer` on the summary
|
|
3883
|
+
endpoint (or filter this list via layerPresent) to answer “who lacks layer X?”.
|
|
3884
|
+
No v1 repo-detail Insights route — link repo names to AF readiness inventory.
|
|
3885
|
+
parameters:
|
|
3886
|
+
- $ref: "#/components/parameters/WorkspaceId"
|
|
3887
|
+
- $ref: "#/components/parameters/PaginationLimit"
|
|
3888
|
+
- $ref: "#/components/parameters/PaginationOffset"
|
|
3889
|
+
- $ref: "#/components/parameters/InsightsTestPyramidRepoSort"
|
|
3890
|
+
- $ref: "#/components/parameters/PaginationOrder"
|
|
3891
|
+
- $ref: "#/components/parameters/InsightsTestPyramidRepoSearch"
|
|
3892
|
+
responses:
|
|
3893
|
+
"200":
|
|
3894
|
+
description: Paginated test pyramid assessment repo rows
|
|
3895
|
+
content:
|
|
3896
|
+
application/json:
|
|
3897
|
+
schema:
|
|
3898
|
+
$ref: "#/components/schemas/InsightsTestPyramidRepoListDto"
|
|
3899
|
+
"400":
|
|
3900
|
+
description: Invalid pagination or sort query
|
|
3901
|
+
content:
|
|
3902
|
+
application/json:
|
|
3903
|
+
schema:
|
|
3904
|
+
$ref: "#/components/schemas/ErrorMessageDto"
|
|
3905
|
+
"401":
|
|
3906
|
+
$ref: "#/components/responses/Unauthorized"
|
|
3907
|
+
"403":
|
|
3908
|
+
$ref: "#/components/responses/Forbidden"
|
|
3909
|
+
"404":
|
|
3910
|
+
description: Workspace does not exist or malformed workspaceId
|
|
3911
|
+
"501":
|
|
3912
|
+
description: Test pyramid history not supported by store
|
|
3913
|
+
content:
|
|
3914
|
+
application/json:
|
|
3915
|
+
schema:
|
|
3916
|
+
$ref: "#/components/schemas/ErrorMessageDto"
|
|
3917
|
+
|
|
3834
3918
|
/workspaces/{workspaceId}/integrations/ai-tool/{provider}/members:
|
|
3835
3919
|
get:
|
|
3836
3920
|
tags: [Workspace]
|
|
@@ -10051,6 +10135,23 @@ components:
|
|
|
10051
10135
|
description: Case-insensitive substring filter on repo name / provider slug.
|
|
10052
10136
|
schema:
|
|
10053
10137
|
type: string
|
|
10138
|
+
InsightsTestPyramidRepoSort:
|
|
10139
|
+
name: sort
|
|
10140
|
+
in: query
|
|
10141
|
+
required: false
|
|
10142
|
+
description: Allowlisted Test pyramid assessment repo sort field.
|
|
10143
|
+
schema:
|
|
10144
|
+
type: string
|
|
10145
|
+
enum: [repoName, totalClassifiedFiles, scannedAt, maturity]
|
|
10146
|
+
default: repoName
|
|
10147
|
+
InsightsTestPyramidRepoSearch:
|
|
10148
|
+
name: search
|
|
10149
|
+
in: query
|
|
10150
|
+
required: false
|
|
10151
|
+
description: Case-insensitive substring filter on repository name.
|
|
10152
|
+
schema:
|
|
10153
|
+
type: string
|
|
10154
|
+
maxLength: 256
|
|
10054
10155
|
ReadinessRepoSearch:
|
|
10055
10156
|
name: search
|
|
10056
10157
|
in: query
|
|
@@ -21508,3 +21609,206 @@ components:
|
|
|
21508
21609
|
description: Org top-10 complexity hotspots by `ccMax` (current per-repo snapshots).
|
|
21509
21610
|
sonar:
|
|
21510
21611
|
$ref: "#/components/schemas/CodeInsightsSonarDto"
|
|
21612
|
+
|
|
21613
|
+
InsightsTestPyramidMaturityDto:
|
|
21614
|
+
type: string
|
|
21615
|
+
enum: [missing, emerging, established, mature]
|
|
21616
|
+
description: >
|
|
21617
|
+
Presence maturity (model A) using count-based layer presence
|
|
21618
|
+
(`fileCount > 0`), not AF signal-inclusive `present`.
|
|
21619
|
+
|
|
21620
|
+
InsightsTestPyramidShapeLabelDto:
|
|
21621
|
+
type: string
|
|
21622
|
+
enum: [insufficient_data, base_heavy, balanced, top_heavy, middle_heavy]
|
|
21623
|
+
description: >
|
|
21624
|
+
Advisory shape label vs fixed 70/20/10. `insufficient_data` when total
|
|
21625
|
+
classified test files < 10 (band percents are null).
|
|
21626
|
+
|
|
21627
|
+
InsightsTestPyramidShapeDto:
|
|
21628
|
+
type: object
|
|
21629
|
+
required: [label, totalClassifiedFiles, basePercent, middlePercent, topPercent, targets]
|
|
21630
|
+
properties:
|
|
21631
|
+
label:
|
|
21632
|
+
$ref: "#/components/schemas/InsightsTestPyramidShapeLabelDto"
|
|
21633
|
+
totalClassifiedFiles:
|
|
21634
|
+
type: integer
|
|
21635
|
+
minimum: 0
|
|
21636
|
+
description: Sum of classified test **files** across the five layers (not test cases).
|
|
21637
|
+
basePercent:
|
|
21638
|
+
type: number
|
|
21639
|
+
nullable: true
|
|
21640
|
+
description: Share of classified files in unit (base). Null when insufficient_data.
|
|
21641
|
+
middlePercent:
|
|
21642
|
+
type: number
|
|
21643
|
+
nullable: true
|
|
21644
|
+
description: >
|
|
21645
|
+
Share in integration + contract + acceptance_bdd (middle). Null when
|
|
21646
|
+
insufficient_data.
|
|
21647
|
+
topPercent:
|
|
21648
|
+
type: number
|
|
21649
|
+
nullable: true
|
|
21650
|
+
description: Share in e2e (top). Null when insufficient_data.
|
|
21651
|
+
targets:
|
|
21652
|
+
type: object
|
|
21653
|
+
required: [basePercent, middlePercent, topPercent]
|
|
21654
|
+
properties:
|
|
21655
|
+
basePercent: { type: number, enum: [70] }
|
|
21656
|
+
middlePercent: { type: number, enum: [20] }
|
|
21657
|
+
topPercent: { type: number, enum: [10] }
|
|
21658
|
+
|
|
21659
|
+
InsightsTestPyramidLayerCountsDto:
|
|
21660
|
+
type: object
|
|
21661
|
+
required: [unit, integration, acceptance_bdd, contract, e2e]
|
|
21662
|
+
properties:
|
|
21663
|
+
unit: { type: integer, minimum: 0 }
|
|
21664
|
+
integration: { type: integer, minimum: 0 }
|
|
21665
|
+
acceptance_bdd: { type: integer, minimum: 0 }
|
|
21666
|
+
contract: { type: integer, minimum: 0 }
|
|
21667
|
+
e2e: { type: integer, minimum: 0 }
|
|
21668
|
+
|
|
21669
|
+
InsightsTestPyramidLayerPresentDto:
|
|
21670
|
+
type: object
|
|
21671
|
+
required: [unit, integration, acceptance_bdd, contract, e2e]
|
|
21672
|
+
properties:
|
|
21673
|
+
unit: { type: boolean }
|
|
21674
|
+
integration: { type: boolean }
|
|
21675
|
+
acceptance_bdd: { type: boolean }
|
|
21676
|
+
contract: { type: boolean }
|
|
21677
|
+
e2e: { type: boolean }
|
|
21678
|
+
|
|
21679
|
+
InsightsTestPyramidLayerPresenceDto:
|
|
21680
|
+
type: object
|
|
21681
|
+
required: [presentRepos, applicableRepos, percent, missingRepoIds, missingRepoNames]
|
|
21682
|
+
properties:
|
|
21683
|
+
presentRepos: { type: integer, minimum: 0 }
|
|
21684
|
+
applicableRepos: { type: integer, minimum: 0 }
|
|
21685
|
+
percent:
|
|
21686
|
+
type: integer
|
|
21687
|
+
nullable: true
|
|
21688
|
+
minimum: 0
|
|
21689
|
+
maximum: 100
|
|
21690
|
+
missingRepoIds:
|
|
21691
|
+
type: array
|
|
21692
|
+
items: { type: string, format: uuid }
|
|
21693
|
+
missingRepoNames:
|
|
21694
|
+
type: array
|
|
21695
|
+
items: { type: string }
|
|
21696
|
+
|
|
21697
|
+
InsightsTestPyramidGapRepoDto:
|
|
21698
|
+
type: object
|
|
21699
|
+
required: [repoId, repoName]
|
|
21700
|
+
properties:
|
|
21701
|
+
repoId: { type: string, format: uuid }
|
|
21702
|
+
repoName: { type: string }
|
|
21703
|
+
|
|
21704
|
+
InsightsTestPyramidGapsByLayerDto:
|
|
21705
|
+
type: object
|
|
21706
|
+
required: [unit, integration, acceptance_bdd, contract, e2e]
|
|
21707
|
+
properties:
|
|
21708
|
+
unit:
|
|
21709
|
+
type: array
|
|
21710
|
+
items: { $ref: "#/components/schemas/InsightsTestPyramidGapRepoDto" }
|
|
21711
|
+
integration:
|
|
21712
|
+
type: array
|
|
21713
|
+
items: { $ref: "#/components/schemas/InsightsTestPyramidGapRepoDto" }
|
|
21714
|
+
acceptance_bdd:
|
|
21715
|
+
type: array
|
|
21716
|
+
items: { $ref: "#/components/schemas/InsightsTestPyramidGapRepoDto" }
|
|
21717
|
+
contract:
|
|
21718
|
+
type: array
|
|
21719
|
+
items: { $ref: "#/components/schemas/InsightsTestPyramidGapRepoDto" }
|
|
21720
|
+
e2e:
|
|
21721
|
+
type: array
|
|
21722
|
+
items: { $ref: "#/components/schemas/InsightsTestPyramidGapRepoDto" }
|
|
21723
|
+
|
|
21724
|
+
InsightsTestPyramidMaturityCountsDto:
|
|
21725
|
+
type: object
|
|
21726
|
+
required: [missing, emerging, established, mature]
|
|
21727
|
+
properties:
|
|
21728
|
+
missing: { type: integer, minimum: 0 }
|
|
21729
|
+
emerging: { type: integer, minimum: 0 }
|
|
21730
|
+
established: { type: integer, minimum: 0 }
|
|
21731
|
+
mature: { type: integer, minimum: 0 }
|
|
21732
|
+
|
|
21733
|
+
InsightsTestPyramidLayerPresenceMapDto:
|
|
21734
|
+
type: object
|
|
21735
|
+
required: [unit, integration, acceptance_bdd, contract, e2e]
|
|
21736
|
+
properties:
|
|
21737
|
+
unit: { $ref: "#/components/schemas/InsightsTestPyramidLayerPresenceDto" }
|
|
21738
|
+
integration: { $ref: "#/components/schemas/InsightsTestPyramidLayerPresenceDto" }
|
|
21739
|
+
acceptance_bdd: { $ref: "#/components/schemas/InsightsTestPyramidLayerPresenceDto" }
|
|
21740
|
+
contract: { $ref: "#/components/schemas/InsightsTestPyramidLayerPresenceDto" }
|
|
21741
|
+
e2e: { $ref: "#/components/schemas/InsightsTestPyramidLayerPresenceDto" }
|
|
21742
|
+
|
|
21743
|
+
InsightsTestPyramidSummaryDto:
|
|
21744
|
+
type: object
|
|
21745
|
+
required:
|
|
21746
|
+
- workspaceId
|
|
21747
|
+
- generatedAt
|
|
21748
|
+
- reposWithPyramid
|
|
21749
|
+
- reposFromDegradedRuns
|
|
21750
|
+
- totalClassifiedFiles
|
|
21751
|
+
- shape
|
|
21752
|
+
- layerPresence
|
|
21753
|
+
- maturityCounts
|
|
21754
|
+
- gapsByLayer
|
|
21755
|
+
properties:
|
|
21756
|
+
workspaceId: { type: string, format: uuid }
|
|
21757
|
+
generatedAt: { type: string, format: date-time }
|
|
21758
|
+
reposWithPyramid: { type: integer, minimum: 0 }
|
|
21759
|
+
reposFromDegradedRuns:
|
|
21760
|
+
type: array
|
|
21761
|
+
items: { type: string, format: uuid }
|
|
21762
|
+
description: Repos whose newest pyramid came from a non-succeeded readiness run.
|
|
21763
|
+
totalClassifiedFiles:
|
|
21764
|
+
type: integer
|
|
21765
|
+
minimum: 0
|
|
21766
|
+
description: Workspace sum of classified test files (not cases).
|
|
21767
|
+
shape:
|
|
21768
|
+
$ref: "#/components/schemas/InsightsTestPyramidShapeDto"
|
|
21769
|
+
layerPresence:
|
|
21770
|
+
$ref: "#/components/schemas/InsightsTestPyramidLayerPresenceMapDto"
|
|
21771
|
+
maturityCounts:
|
|
21772
|
+
$ref: "#/components/schemas/InsightsTestPyramidMaturityCountsDto"
|
|
21773
|
+
gapsByLayer:
|
|
21774
|
+
$ref: "#/components/schemas/InsightsTestPyramidGapsByLayerDto"
|
|
21775
|
+
|
|
21776
|
+
InsightsTestPyramidRepoItemDto:
|
|
21777
|
+
type: object
|
|
21778
|
+
required:
|
|
21779
|
+
- repoId
|
|
21780
|
+
- repoName
|
|
21781
|
+
- scannedAt
|
|
21782
|
+
- currentRunStatus
|
|
21783
|
+
- maturity
|
|
21784
|
+
- layerFileCounts
|
|
21785
|
+
- layerPresent
|
|
21786
|
+
- totalClassifiedFiles
|
|
21787
|
+
- shape
|
|
21788
|
+
properties:
|
|
21789
|
+
repoId: { type: string, format: uuid }
|
|
21790
|
+
repoName: { type: string }
|
|
21791
|
+
scannedAt: { type: string, format: date-time }
|
|
21792
|
+
currentRunStatus:
|
|
21793
|
+
$ref: "#/components/schemas/TestPyramidRunStatusDto"
|
|
21794
|
+
maturity:
|
|
21795
|
+
$ref: "#/components/schemas/InsightsTestPyramidMaturityDto"
|
|
21796
|
+
layerFileCounts:
|
|
21797
|
+
$ref: "#/components/schemas/InsightsTestPyramidLayerCountsDto"
|
|
21798
|
+
layerPresent:
|
|
21799
|
+
$ref: "#/components/schemas/InsightsTestPyramidLayerPresentDto"
|
|
21800
|
+
totalClassifiedFiles: { type: integer, minimum: 0 }
|
|
21801
|
+
shape:
|
|
21802
|
+
$ref: "#/components/schemas/InsightsTestPyramidShapeDto"
|
|
21803
|
+
|
|
21804
|
+
InsightsTestPyramidRepoListDto:
|
|
21805
|
+
type: object
|
|
21806
|
+
required: [items, total, limit, offset]
|
|
21807
|
+
properties:
|
|
21808
|
+
items:
|
|
21809
|
+
type: array
|
|
21810
|
+
items:
|
|
21811
|
+
$ref: "#/components/schemas/InsightsTestPyramidRepoItemDto"
|
|
21812
|
+
total: { type: integer, minimum: 0 }
|
|
21813
|
+
limit: { type: integer, minimum: 1 }
|
|
21814
|
+
offset: { type: integer, minimum: 0 }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thinkai/tai-api-contract",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.127.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@stoplight/spectral-cli": "^6.16.3",
|
|
23
|
-
"@types/node": "^26.4.
|
|
23
|
+
"@types/node": "^26.4.1",
|
|
24
24
|
"jsonpath-plus": "^10.3.0",
|
|
25
25
|
"openapi-typescript": "^7.13.0",
|
|
26
26
|
"typescript": "~6.0.3"
|
package/src/generated/openapi.ts
CHANGED
|
@@ -1394,6 +1394,46 @@ export interface paths {
|
|
|
1394
1394
|
patch?: never;
|
|
1395
1395
|
trace?: never;
|
|
1396
1396
|
};
|
|
1397
|
+
"/workspaces/{workspaceId}/insights/test-pyramid/summary": {
|
|
1398
|
+
parameters: {
|
|
1399
|
+
query?: never;
|
|
1400
|
+
header?: never;
|
|
1401
|
+
path?: never;
|
|
1402
|
+
cookie?: never;
|
|
1403
|
+
};
|
|
1404
|
+
/**
|
|
1405
|
+
* Test pyramid assessment — workspace summary
|
|
1406
|
+
* @description Org-level Test pyramid assessment for `/insights/test-pyramid`. Aggregates each active repo's **latest** readiness-scan test-pyramid snapshot. Layer **presence is count-based** (`fileCount > 0`); CI/dependency-only AF `present` flags are ignored. Shape uses fixed advisory targets (base ~70% unit, middle ~20% integration+contract+acceptance/BDD, top ~10% E2E) and returns `insufficient_data` when total classified test files < 10. Does not change Agentic Foundation `/readiness/test-pyramid*` responses.
|
|
1407
|
+
*/
|
|
1408
|
+
get: operations["getInsightsTestPyramidSummary"];
|
|
1409
|
+
put?: never;
|
|
1410
|
+
post?: never;
|
|
1411
|
+
delete?: never;
|
|
1412
|
+
options?: never;
|
|
1413
|
+
head?: never;
|
|
1414
|
+
patch?: never;
|
|
1415
|
+
trace?: never;
|
|
1416
|
+
};
|
|
1417
|
+
"/workspaces/{workspaceId}/insights/test-pyramid/repos": {
|
|
1418
|
+
parameters: {
|
|
1419
|
+
query?: never;
|
|
1420
|
+
header?: never;
|
|
1421
|
+
path?: never;
|
|
1422
|
+
cookie?: never;
|
|
1423
|
+
};
|
|
1424
|
+
/**
|
|
1425
|
+
* Test pyramid assessment — per-repo list (paginated)
|
|
1426
|
+
* @description Page of repos with latest classified test-file counts, count-based presence, presence maturity, and shape assessment. Use `gapsByLayer` on the summary endpoint (or filter this list via layerPresent) to answer “who lacks layer X?”. No v1 repo-detail Insights route — link repo names to AF readiness inventory.
|
|
1427
|
+
*/
|
|
1428
|
+
get: operations["listInsightsTestPyramidRepos"];
|
|
1429
|
+
put?: never;
|
|
1430
|
+
post?: never;
|
|
1431
|
+
delete?: never;
|
|
1432
|
+
options?: never;
|
|
1433
|
+
head?: never;
|
|
1434
|
+
patch?: never;
|
|
1435
|
+
trace?: never;
|
|
1436
|
+
};
|
|
1397
1437
|
"/workspaces/{workspaceId}/integrations/ai-tool/{provider}/members": {
|
|
1398
1438
|
parameters: {
|
|
1399
1439
|
query?: never;
|
|
@@ -9544,6 +9584,115 @@ export interface components {
|
|
|
9544
9584
|
topHotspots: components["schemas"]["CodeInsightsOrgHotspotDto"][];
|
|
9545
9585
|
sonar: components["schemas"]["CodeInsightsSonarDto"];
|
|
9546
9586
|
};
|
|
9587
|
+
/**
|
|
9588
|
+
* @description Presence maturity (model A) using count-based layer presence (`fileCount > 0`), not AF signal-inclusive `present`.
|
|
9589
|
+
* @enum {string}
|
|
9590
|
+
*/
|
|
9591
|
+
InsightsTestPyramidMaturityDto: "missing" | "emerging" | "established" | "mature";
|
|
9592
|
+
/**
|
|
9593
|
+
* @description Advisory shape label vs fixed 70/20/10. `insufficient_data` when total classified test files < 10 (band percents are null).
|
|
9594
|
+
* @enum {string}
|
|
9595
|
+
*/
|
|
9596
|
+
InsightsTestPyramidShapeLabelDto: "insufficient_data" | "base_heavy" | "balanced" | "top_heavy" | "middle_heavy";
|
|
9597
|
+
InsightsTestPyramidShapeDto: {
|
|
9598
|
+
label: components["schemas"]["InsightsTestPyramidShapeLabelDto"];
|
|
9599
|
+
/** @description Sum of classified test **files** across the five layers (not test cases). */
|
|
9600
|
+
totalClassifiedFiles: number;
|
|
9601
|
+
/** @description Share of classified files in unit (base). Null when insufficient_data. */
|
|
9602
|
+
basePercent: number | null;
|
|
9603
|
+
/** @description Share in integration + contract + acceptance_bdd (middle). Null when insufficient_data. */
|
|
9604
|
+
middlePercent: number | null;
|
|
9605
|
+
/** @description Share in e2e (top). Null when insufficient_data. */
|
|
9606
|
+
topPercent: number | null;
|
|
9607
|
+
targets: {
|
|
9608
|
+
/** @enum {number} */
|
|
9609
|
+
basePercent: 70;
|
|
9610
|
+
/** @enum {number} */
|
|
9611
|
+
middlePercent: 20;
|
|
9612
|
+
/** @enum {number} */
|
|
9613
|
+
topPercent: 10;
|
|
9614
|
+
};
|
|
9615
|
+
};
|
|
9616
|
+
InsightsTestPyramidLayerCountsDto: {
|
|
9617
|
+
unit: number;
|
|
9618
|
+
integration: number;
|
|
9619
|
+
acceptance_bdd: number;
|
|
9620
|
+
contract: number;
|
|
9621
|
+
e2e: number;
|
|
9622
|
+
};
|
|
9623
|
+
InsightsTestPyramidLayerPresentDto: {
|
|
9624
|
+
unit: boolean;
|
|
9625
|
+
integration: boolean;
|
|
9626
|
+
acceptance_bdd: boolean;
|
|
9627
|
+
contract: boolean;
|
|
9628
|
+
e2e: boolean;
|
|
9629
|
+
};
|
|
9630
|
+
InsightsTestPyramidLayerPresenceDto: {
|
|
9631
|
+
presentRepos: number;
|
|
9632
|
+
applicableRepos: number;
|
|
9633
|
+
percent: number | null;
|
|
9634
|
+
missingRepoIds: string[];
|
|
9635
|
+
missingRepoNames: string[];
|
|
9636
|
+
};
|
|
9637
|
+
InsightsTestPyramidGapRepoDto: {
|
|
9638
|
+
/** Format: uuid */
|
|
9639
|
+
repoId: string;
|
|
9640
|
+
repoName: string;
|
|
9641
|
+
};
|
|
9642
|
+
InsightsTestPyramidGapsByLayerDto: {
|
|
9643
|
+
unit: components["schemas"]["InsightsTestPyramidGapRepoDto"][];
|
|
9644
|
+
integration: components["schemas"]["InsightsTestPyramidGapRepoDto"][];
|
|
9645
|
+
acceptance_bdd: components["schemas"]["InsightsTestPyramidGapRepoDto"][];
|
|
9646
|
+
contract: components["schemas"]["InsightsTestPyramidGapRepoDto"][];
|
|
9647
|
+
e2e: components["schemas"]["InsightsTestPyramidGapRepoDto"][];
|
|
9648
|
+
};
|
|
9649
|
+
InsightsTestPyramidMaturityCountsDto: {
|
|
9650
|
+
missing: number;
|
|
9651
|
+
emerging: number;
|
|
9652
|
+
established: number;
|
|
9653
|
+
mature: number;
|
|
9654
|
+
};
|
|
9655
|
+
InsightsTestPyramidLayerPresenceMapDto: {
|
|
9656
|
+
unit: components["schemas"]["InsightsTestPyramidLayerPresenceDto"];
|
|
9657
|
+
integration: components["schemas"]["InsightsTestPyramidLayerPresenceDto"];
|
|
9658
|
+
acceptance_bdd: components["schemas"]["InsightsTestPyramidLayerPresenceDto"];
|
|
9659
|
+
contract: components["schemas"]["InsightsTestPyramidLayerPresenceDto"];
|
|
9660
|
+
e2e: components["schemas"]["InsightsTestPyramidLayerPresenceDto"];
|
|
9661
|
+
};
|
|
9662
|
+
InsightsTestPyramidSummaryDto: {
|
|
9663
|
+
/** Format: uuid */
|
|
9664
|
+
workspaceId: string;
|
|
9665
|
+
/** Format: date-time */
|
|
9666
|
+
generatedAt: string;
|
|
9667
|
+
reposWithPyramid: number;
|
|
9668
|
+
/** @description Repos whose newest pyramid came from a non-succeeded readiness run. */
|
|
9669
|
+
reposFromDegradedRuns: string[];
|
|
9670
|
+
/** @description Workspace sum of classified test files (not cases). */
|
|
9671
|
+
totalClassifiedFiles: number;
|
|
9672
|
+
shape: components["schemas"]["InsightsTestPyramidShapeDto"];
|
|
9673
|
+
layerPresence: components["schemas"]["InsightsTestPyramidLayerPresenceMapDto"];
|
|
9674
|
+
maturityCounts: components["schemas"]["InsightsTestPyramidMaturityCountsDto"];
|
|
9675
|
+
gapsByLayer: components["schemas"]["InsightsTestPyramidGapsByLayerDto"];
|
|
9676
|
+
};
|
|
9677
|
+
InsightsTestPyramidRepoItemDto: {
|
|
9678
|
+
/** Format: uuid */
|
|
9679
|
+
repoId: string;
|
|
9680
|
+
repoName: string;
|
|
9681
|
+
/** Format: date-time */
|
|
9682
|
+
scannedAt: string;
|
|
9683
|
+
currentRunStatus: components["schemas"]["TestPyramidRunStatusDto"];
|
|
9684
|
+
maturity: components["schemas"]["InsightsTestPyramidMaturityDto"];
|
|
9685
|
+
layerFileCounts: components["schemas"]["InsightsTestPyramidLayerCountsDto"];
|
|
9686
|
+
layerPresent: components["schemas"]["InsightsTestPyramidLayerPresentDto"];
|
|
9687
|
+
totalClassifiedFiles: number;
|
|
9688
|
+
shape: components["schemas"]["InsightsTestPyramidShapeDto"];
|
|
9689
|
+
};
|
|
9690
|
+
InsightsTestPyramidRepoListDto: {
|
|
9691
|
+
items: components["schemas"]["InsightsTestPyramidRepoItemDto"][];
|
|
9692
|
+
total: number;
|
|
9693
|
+
limit: number;
|
|
9694
|
+
offset: number;
|
|
9695
|
+
};
|
|
9547
9696
|
};
|
|
9548
9697
|
responses: {
|
|
9549
9698
|
/** @description Missing or invalid bearer token */
|
|
@@ -9631,6 +9780,10 @@ export interface components {
|
|
|
9631
9780
|
CodeInsightsRepoSort: "repoName" | "locTotal" | "ccAvg" | "dupPct" | "lastMeasuredAt";
|
|
9632
9781
|
/** @description Case-insensitive substring filter on repo name / provider slug. */
|
|
9633
9782
|
CodeInsightsRepoSearch: string;
|
|
9783
|
+
/** @description Allowlisted Test pyramid assessment repo sort field. */
|
|
9784
|
+
InsightsTestPyramidRepoSort: "repoName" | "totalClassifiedFiles" | "scannedAt" | "maturity";
|
|
9785
|
+
/** @description Case-insensitive substring filter on repository name. */
|
|
9786
|
+
InsightsTestPyramidRepoSearch: string;
|
|
9634
9787
|
/** @description Case-insensitive filter on repository name, language, or provider slug. */
|
|
9635
9788
|
ReadinessRepoSearch: string;
|
|
9636
9789
|
/** @description Exact language filter (e.g. `typescript`). */
|
|
@@ -10154,6 +10307,19 @@ export type CodeInsightsDesignAnalyzeResponseDto = components['schemas']['CodeIn
|
|
|
10154
10307
|
export type CodeInsightsOrgHotspotDto = components['schemas']['CodeInsightsOrgHotspotDto'];
|
|
10155
10308
|
export type CodeInsightsSonarDto = components['schemas']['CodeInsightsSonarDto'];
|
|
10156
10309
|
export type CodeInsightsSummaryDto = components['schemas']['CodeInsightsSummaryDto'];
|
|
10310
|
+
export type InsightsTestPyramidMaturityDto = components['schemas']['InsightsTestPyramidMaturityDto'];
|
|
10311
|
+
export type InsightsTestPyramidShapeLabelDto = components['schemas']['InsightsTestPyramidShapeLabelDto'];
|
|
10312
|
+
export type InsightsTestPyramidShapeDto = components['schemas']['InsightsTestPyramidShapeDto'];
|
|
10313
|
+
export type InsightsTestPyramidLayerCountsDto = components['schemas']['InsightsTestPyramidLayerCountsDto'];
|
|
10314
|
+
export type InsightsTestPyramidLayerPresentDto = components['schemas']['InsightsTestPyramidLayerPresentDto'];
|
|
10315
|
+
export type InsightsTestPyramidLayerPresenceDto = components['schemas']['InsightsTestPyramidLayerPresenceDto'];
|
|
10316
|
+
export type InsightsTestPyramidGapRepoDto = components['schemas']['InsightsTestPyramidGapRepoDto'];
|
|
10317
|
+
export type InsightsTestPyramidGapsByLayerDto = components['schemas']['InsightsTestPyramidGapsByLayerDto'];
|
|
10318
|
+
export type InsightsTestPyramidMaturityCountsDto = components['schemas']['InsightsTestPyramidMaturityCountsDto'];
|
|
10319
|
+
export type InsightsTestPyramidLayerPresenceMapDto = components['schemas']['InsightsTestPyramidLayerPresenceMapDto'];
|
|
10320
|
+
export type InsightsTestPyramidSummaryDto = components['schemas']['InsightsTestPyramidSummaryDto'];
|
|
10321
|
+
export type InsightsTestPyramidRepoItemDto = components['schemas']['InsightsTestPyramidRepoItemDto'];
|
|
10322
|
+
export type InsightsTestPyramidRepoListDto = components['schemas']['InsightsTestPyramidRepoListDto'];
|
|
10157
10323
|
export type ResponseUnauthorized = components['responses']['Unauthorized'];
|
|
10158
10324
|
export type ResponseForbidden = components['responses']['Forbidden'];
|
|
10159
10325
|
export type ResponseZenHrSyncInProgress = components['responses']['ZenHrSyncInProgress'];
|
|
@@ -10185,6 +10351,8 @@ export type ParameterPaginationOrder = components['parameters']['PaginationOrder
|
|
|
10185
10351
|
export type ParameterReadinessRepoSort = components['parameters']['ReadinessRepoSort'];
|
|
10186
10352
|
export type ParameterCodeInsightsRepoSort = components['parameters']['CodeInsightsRepoSort'];
|
|
10187
10353
|
export type ParameterCodeInsightsRepoSearch = components['parameters']['CodeInsightsRepoSearch'];
|
|
10354
|
+
export type ParameterInsightsTestPyramidRepoSort = components['parameters']['InsightsTestPyramidRepoSort'];
|
|
10355
|
+
export type ParameterInsightsTestPyramidRepoSearch = components['parameters']['InsightsTestPyramidRepoSearch'];
|
|
10188
10356
|
export type ParameterReadinessRepoSearch = components['parameters']['ReadinessRepoSearch'];
|
|
10189
10357
|
export type ParameterReadinessRepoLanguage = components['parameters']['ReadinessRepoLanguage'];
|
|
10190
10358
|
export type ParameterReadinessFixSort = components['parameters']['ReadinessFixSort'];
|
|
@@ -14108,6 +14276,106 @@ export interface operations {
|
|
|
14108
14276
|
};
|
|
14109
14277
|
};
|
|
14110
14278
|
};
|
|
14279
|
+
getInsightsTestPyramidSummary: {
|
|
14280
|
+
parameters: {
|
|
14281
|
+
query?: never;
|
|
14282
|
+
header?: never;
|
|
14283
|
+
path: {
|
|
14284
|
+
workspaceId: components["parameters"]["WorkspaceId"];
|
|
14285
|
+
};
|
|
14286
|
+
cookie?: never;
|
|
14287
|
+
};
|
|
14288
|
+
requestBody?: never;
|
|
14289
|
+
responses: {
|
|
14290
|
+
/** @description Test pyramid assessment workspace summary */
|
|
14291
|
+
200: {
|
|
14292
|
+
headers: {
|
|
14293
|
+
[name: string]: unknown;
|
|
14294
|
+
};
|
|
14295
|
+
content: {
|
|
14296
|
+
"application/json": components["schemas"]["InsightsTestPyramidSummaryDto"];
|
|
14297
|
+
};
|
|
14298
|
+
};
|
|
14299
|
+
401: components["responses"]["Unauthorized"];
|
|
14300
|
+
403: components["responses"]["Forbidden"];
|
|
14301
|
+
/** @description Workspace does not exist or malformed workspaceId */
|
|
14302
|
+
404: {
|
|
14303
|
+
headers: {
|
|
14304
|
+
[name: string]: unknown;
|
|
14305
|
+
};
|
|
14306
|
+
content?: never;
|
|
14307
|
+
};
|
|
14308
|
+
/** @description Test pyramid history not supported by store */
|
|
14309
|
+
501: {
|
|
14310
|
+
headers: {
|
|
14311
|
+
[name: string]: unknown;
|
|
14312
|
+
};
|
|
14313
|
+
content: {
|
|
14314
|
+
"application/json": components["schemas"]["ErrorMessageDto"];
|
|
14315
|
+
};
|
|
14316
|
+
};
|
|
14317
|
+
};
|
|
14318
|
+
};
|
|
14319
|
+
listInsightsTestPyramidRepos: {
|
|
14320
|
+
parameters: {
|
|
14321
|
+
query?: {
|
|
14322
|
+
/** @description Page size (default 25, max 100). */
|
|
14323
|
+
limit?: components["parameters"]["PaginationLimit"];
|
|
14324
|
+
/** @description Zero-based row offset into the filtered, sorted result set. */
|
|
14325
|
+
offset?: components["parameters"]["PaginationOffset"];
|
|
14326
|
+
/** @description Allowlisted Test pyramid assessment repo sort field. */
|
|
14327
|
+
sort?: components["parameters"]["InsightsTestPyramidRepoSort"];
|
|
14328
|
+
/** @description Sort direction. */
|
|
14329
|
+
order?: components["parameters"]["PaginationOrder"];
|
|
14330
|
+
/** @description Case-insensitive substring filter on repository name. */
|
|
14331
|
+
search?: components["parameters"]["InsightsTestPyramidRepoSearch"];
|
|
14332
|
+
};
|
|
14333
|
+
header?: never;
|
|
14334
|
+
path: {
|
|
14335
|
+
workspaceId: components["parameters"]["WorkspaceId"];
|
|
14336
|
+
};
|
|
14337
|
+
cookie?: never;
|
|
14338
|
+
};
|
|
14339
|
+
requestBody?: never;
|
|
14340
|
+
responses: {
|
|
14341
|
+
/** @description Paginated test pyramid assessment repo rows */
|
|
14342
|
+
200: {
|
|
14343
|
+
headers: {
|
|
14344
|
+
[name: string]: unknown;
|
|
14345
|
+
};
|
|
14346
|
+
content: {
|
|
14347
|
+
"application/json": components["schemas"]["InsightsTestPyramidRepoListDto"];
|
|
14348
|
+
};
|
|
14349
|
+
};
|
|
14350
|
+
/** @description Invalid pagination or sort query */
|
|
14351
|
+
400: {
|
|
14352
|
+
headers: {
|
|
14353
|
+
[name: string]: unknown;
|
|
14354
|
+
};
|
|
14355
|
+
content: {
|
|
14356
|
+
"application/json": components["schemas"]["ErrorMessageDto"];
|
|
14357
|
+
};
|
|
14358
|
+
};
|
|
14359
|
+
401: components["responses"]["Unauthorized"];
|
|
14360
|
+
403: components["responses"]["Forbidden"];
|
|
14361
|
+
/** @description Workspace does not exist or malformed workspaceId */
|
|
14362
|
+
404: {
|
|
14363
|
+
headers: {
|
|
14364
|
+
[name: string]: unknown;
|
|
14365
|
+
};
|
|
14366
|
+
content?: never;
|
|
14367
|
+
};
|
|
14368
|
+
/** @description Test pyramid history not supported by store */
|
|
14369
|
+
501: {
|
|
14370
|
+
headers: {
|
|
14371
|
+
[name: string]: unknown;
|
|
14372
|
+
};
|
|
14373
|
+
content: {
|
|
14374
|
+
"application/json": components["schemas"]["ErrorMessageDto"];
|
|
14375
|
+
};
|
|
14376
|
+
};
|
|
14377
|
+
};
|
|
14378
|
+
};
|
|
14111
14379
|
getAiToolMembers: {
|
|
14112
14380
|
parameters: {
|
|
14113
14381
|
query?: {
|