@graphrefly/stack 0.1.1 → 0.1.4
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 +24 -11
- package/dist/assets/contracts/ci/v1/artifacts.schema.json +253 -0
- package/dist/assets/contracts/ci/v1/golden-suite.schema.json +17 -0
- package/dist/assets/contracts/repository/v1/review-bundle.schema.json +49 -0
- package/dist/assets/contracts/repository/v1/review-decision-request.schema.json +15 -0
- package/dist/assets/contracts/repository/v1/review-decision.schema.json +52 -0
- package/dist/assets/contracts/repository/v1/review.schema.json +46 -2
- package/dist/assets/contracts/semantic/v1/artifacts.schema.json +697 -0
- package/dist/assets/contracts/semantic/v1/golden-suite.schema.json +119 -0
- package/dist/assets/contracts/v1/schemas/cli-result.schema.json +11 -1
- package/dist/assets/fixtures/contracts/ci/v1/golden-digests.json +5 -0
- package/dist/assets/fixtures/contracts/ci/v1/golden-suite.json +104 -0
- package/dist/assets/fixtures/contracts/semantic/v1/golden-digests.json +17 -0
- package/dist/assets/fixtures/contracts/semantic/v1/golden-suite.json +715 -0
- package/dist/grfs.js +3745 -1395
- package/dist/review/assets/{abnfDiagram-VRR7QNED-5JVeQ-ZW.js → abnfDiagram-VRR7QNED-BjBHcddA.js} +1 -1
- package/dist/review/assets/{architectureDiagram-ZJ3FMSHR-BnEvDO7X.js → architectureDiagram-ZJ3FMSHR-D2YEagFX.js} +1 -1
- package/dist/review/assets/{chunk-EX3LRPZG-BrpCa9zr.js → chunk-EX3LRPZG-Cqlq9N1k.js} +1 -1
- package/dist/review/assets/{chunk-MOJQB5TN-BshP08Ez.js → chunk-MOJQB5TN-CrJU23I4.js} +1 -1
- package/dist/review/assets/{chunk-PUDLZKDR-HkwEqIVB.js → chunk-PUDLZKDR-D2gPOWiF.js} +1 -1
- package/dist/review/assets/{chunk-V7JOEXUC-CswDacm3.js → chunk-V7JOEXUC-zqKE0D3Z.js} +1 -1
- package/dist/review/assets/{classDiagram-OUVF2IWQ-U8e_ZvC4.js → classDiagram-OUVF2IWQ-CRJJUaPV.js} +1 -1
- package/dist/review/assets/{classDiagram-v2-EOCWNBFH-U8e_ZvC4.js → classDiagram-v2-EOCWNBFH-CRJJUaPV.js} +1 -1
- package/dist/review/assets/{cynefinDiagram-TSTJHNR4-CfYu2mB5.js → cynefinDiagram-TSTJHNR4-BkymIc14.js} +1 -1
- package/dist/review/assets/{dagre-VKFMJZFB-BvyihZfA.js → dagre-VKFMJZFB-e2nCgJcZ.js} +1 -1
- package/dist/review/assets/{diagram-G47NLZAW-qFNMv5An.js → diagram-G47NLZAW-QL9zGpjT.js} +1 -1
- package/dist/review/assets/{diagram-NH7WQ7WH-CsvacND9.js → diagram-NH7WQ7WH-DvCskT8T.js} +1 -1
- package/dist/review/assets/{diagram-OA4YK3LP-qFtWcyNi.js → diagram-OA4YK3LP-Cx9kjg5t.js} +1 -1
- package/dist/review/assets/{diagram-WEI45ONY-C5nYGL8t.js → diagram-WEI45ONY-CfwqC_md.js} +1 -1
- package/dist/review/assets/{ebnfDiagram-CCIWWBDH-D_0nhpry.js → ebnfDiagram-CCIWWBDH-G63kkvbq.js} +1 -1
- package/dist/review/assets/{erDiagram-Q63AITRT-CIS7hpdK.js → erDiagram-Q63AITRT-D3GzhK6w.js} +1 -1
- package/dist/review/assets/{flowDiagram-23GEKE2U-Df5sjnlg.js → flowDiagram-23GEKE2U-DqVi9C2r.js} +1 -1
- package/dist/review/assets/index-BGz0YQEi.css +1 -0
- package/dist/review/assets/index-D_ZKYhz7.js +64 -0
- package/dist/review/assets/{infoDiagram-FWYZ7A6U-CT7TZgi6.js → infoDiagram-FWYZ7A6U-WJv0WBae.js} +1 -1
- package/dist/review/assets/{ishikawaDiagram-FXEZZL3T-BUpotH7r.js → ishikawaDiagram-FXEZZL3T-BnZ5zRCL.js} +1 -1
- package/dist/review/assets/{kanban-definition-HUTT4EX6-e-emfNuh.js → kanban-definition-HUTT4EX6-BDdmEROe.js} +1 -1
- package/dist/review/assets/{mindmap-definition-LN4V7U3C-ClSEPrvR.js → mindmap-definition-LN4V7U3C-BH2EZxB3.js} +1 -1
- package/dist/review/assets/{pegDiagram-2B236MQR-Ck_v89jl.js → pegDiagram-2B236MQR-apJfnuaF.js} +1 -1
- package/dist/review/assets/{pieDiagram-ENE6RG2P-C63dxyZj.js → pieDiagram-ENE6RG2P-DBZNNsNI.js} +1 -1
- package/dist/review/assets/{railroadDiagram-RFXS5EU6-DYI7CPMt.js → railroadDiagram-RFXS5EU6-Csr5eB8z.js} +1 -1
- package/dist/review/assets/{requirementDiagram-TGXJPOKE-BMW46SXM.js → requirementDiagram-TGXJPOKE-DOGov392.js} +1 -1
- package/dist/review/assets/{sequenceDiagram-DBY2YBRQ-DVtyVuxr.js → sequenceDiagram-DBY2YBRQ-CGLEdxIQ.js} +1 -1
- package/dist/review/assets/{stateDiagram-2N3HPSRC-BM1s-zUo.js → stateDiagram-2N3HPSRC-DGc_GIR7.js} +1 -1
- package/dist/review/assets/{stateDiagram-v2-6OUMAXLB-BEfolAkc.js → stateDiagram-v2-6OUMAXLB-CB--qhqy.js} +1 -1
- package/dist/review/assets/{swimlanes-5IMT3BWC-Bnu9mzxz.js → swimlanes-5IMT3BWC-DWuBlI_u.js} +1 -1
- package/dist/review/assets/{swimlanesDiagram-G3AALYLV-DlNNBK53.js → swimlanesDiagram-G3AALYLV-dXt3qLQg.js} +1 -1
- package/dist/review/assets/{timeline-definition-FHXFAJF6-CwlO71Lp.js → timeline-definition-FHXFAJF6-Da2ReugN.js} +1 -1
- package/dist/review/assets/{vennDiagram-L72KCM5P-DZxbcc_O.js → vennDiagram-L72KCM5P-CnhNeNSC.js} +1 -1
- package/dist/review/assets/{wardleyDiagram-EHGQE667-DGQto3hn.js → wardleyDiagram-EHGQE667-CixYg3yw.js} +1 -1
- package/dist/review/assets/{xychartDiagram-FW5EYKEG-BfD1lSXX.js → xychartDiagram-FW5EYKEG-BwY7805o.js} +1 -1
- package/dist/review/index.html +2 -2
- package/package.json +2 -2
- package/dist/review/assets/index-Bt3i8n39.css +0 -1
- package/dist/review/assets/index-CqjR4YYp.js +0 -64
package/README.md
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
**Semantic stacked diffs that know when their architectural assumptions expire.**
|
|
4
4
|
|
|
5
5
|
GraphReFly Stack is an OpenAI Build Week developer tool built with Codex, GPT-5.6, Git, and
|
|
6
|
-
GraphReFly.
|
|
7
|
-
|
|
8
|
-
deterministic `GateResult`.
|
|
6
|
+
GraphReFly. Its generic local review binds every stacked commit to the GraphBlueprint generated at
|
|
7
|
+
that Git object and its exact parent diff. Repositories that adopt semantic change records can also
|
|
8
|
+
bind allowed source scopes, dependency claims, required checks, and a deterministic `GateResult`.
|
|
9
9
|
|
|
10
10
|
Git can report a clean rebase while an agent-generated change is no longer valid under the
|
|
11
11
|
architecture it was planned against. GraphReFly Stack makes that mismatch visible, keeps unaffected
|
|
@@ -15,8 +15,8 @@ decides validity.
|
|
|
15
15
|
## Install and review a GraphReFly repository
|
|
16
16
|
|
|
17
17
|
Requirements: macOS or Linux, Node.js 24, pnpm 11.7, and Git. The CLI and local web review shell use
|
|
18
|
-
no hosted service, database, or credentials.
|
|
19
|
-
|
|
18
|
+
no hosted service, database, or credentials. Install it in the GraphReFly repository you want to
|
|
19
|
+
review:
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
22
|
pnpm add -D @graphrefly/stack
|
|
@@ -34,8 +34,17 @@ automatically. Open the printed URL (normally <http://127.0.0.1:4173>), then:
|
|
|
34
34
|
runtime.
|
|
35
35
|
3. Verify that commit OID, Blueprint hash, upstream Mermaid diagram, delta events, and split code diff
|
|
36
36
|
move together.
|
|
37
|
-
4.
|
|
38
|
-
|
|
37
|
+
4. Use **Review changes** to record Approve or Request changes for the exact commit and Blueprint.
|
|
38
|
+
5. Open **Help** for the Git → Blueprint delta → code diff relationship, and expand **Technical
|
|
39
|
+
details** only when troubleshooting runtime or immutable identities.
|
|
40
|
+
|
|
41
|
+
Local review decisions and their summaries are strict immutable records under the repository's Git
|
|
42
|
+
common directory at `.git/grfs/reviews`; they never appear in `git status`, change source files, or
|
|
43
|
+
update Git refs. The Technical details disclosure offers an explicit portable review export after a
|
|
44
|
+
decision exists. That content-hashed bundle is the explicit sharing boundary for another reviewer or
|
|
45
|
+
CI. A future hosted GraphReFly Stack can wrap selected exported artifacts in its policy-redacted
|
|
46
|
+
upload envelope; this release neither treats the local export as upload-ready nor uploads review
|
|
47
|
+
state automatically.
|
|
39
48
|
|
|
40
49
|
`--graph-module` means the repository's root Graph construction module, not the only Graph module
|
|
41
50
|
allowed in the repository. That root module may import, compose, and mount any number of Graphs and
|
|
@@ -83,8 +92,10 @@ pnpm exec grfs review --repo . --base "$BASE" --head HEAD --json
|
|
|
83
92
|
```
|
|
84
93
|
|
|
85
94
|
The generic payload is commit-centric. When a repository has not adopted semantic change records,
|
|
86
|
-
the
|
|
87
|
-
`GateResult`.
|
|
95
|
+
the payload records that internal absence but the primary UI does not advertise an unavailable
|
|
96
|
+
gate, and it never turns missing semantic evidence into a passing `GateResult`. A local human
|
|
97
|
+
decision remains separate from any future semantic gate and does not approve or merge a GitHub pull
|
|
98
|
+
request.
|
|
88
99
|
|
|
89
100
|
Before registry publication, the same install path is exercised from the packed tarball rather than
|
|
90
101
|
from workspace imports:
|
|
@@ -197,8 +208,10 @@ and canonical milestones in `docs/evidence/milestones.jsonl` distinguish that wo
|
|
|
197
208
|
- The portable bundle is not self-listed in its manifest because that would create a circular hash.
|
|
198
209
|
- Raw provider responses, generated repositories, and sensitive submission drafts stay under
|
|
199
210
|
ignored `.private/` paths.
|
|
200
|
-
- The review server only binds to `127.0.0.1
|
|
201
|
-
|
|
211
|
+
- The review server only binds to `127.0.0.1` and sends a restrictive CSP. Its sole write surface is
|
|
212
|
+
a size-bounded, same-origin `application/json` endpoint that appends validated review decisions
|
|
213
|
+
below `.git/grfs`; source files, Git objects and refs, repository config, and `GateResult` remain
|
|
214
|
+
read-only.
|
|
202
215
|
- Generic Blueprint entrypoints run with an empty environment, a five-second timeout, a one-MiB
|
|
203
216
|
stdout bound, read-only filesystem allowlists, and no network or child-process permission.
|
|
204
217
|
- Generic payloads omit Blueprint provenance and reject absolute paths in topology metadata before
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "urn:graphrefly-stack:schema:ci-artifacts:v1",
|
|
4
|
+
"title": "GraphReFly Stack CI artifacts v1",
|
|
5
|
+
"definitions": {
|
|
6
|
+
"Hash": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"required": ["algorithm", "value"],
|
|
10
|
+
"properties": {
|
|
11
|
+
"algorithm": { "const": "sha256" },
|
|
12
|
+
"value": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"GitOid": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"additionalProperties": false,
|
|
18
|
+
"required": ["algorithm", "value"],
|
|
19
|
+
"properties": {
|
|
20
|
+
"algorithm": { "enum": ["sha1", "sha256"] },
|
|
21
|
+
"value": { "type": "string", "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$" }
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"DecimalId": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"pattern": "^[1-9][0-9]*$",
|
|
27
|
+
"maxLength": 32
|
|
28
|
+
},
|
|
29
|
+
"Identifier": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"minLength": 1,
|
|
32
|
+
"maxLength": 64,
|
|
33
|
+
"pattern": "^[A-Za-z][A-Za-z0-9._-]*$"
|
|
34
|
+
},
|
|
35
|
+
"RuntimeVersion": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"minLength": 1,
|
|
38
|
+
"maxLength": 64,
|
|
39
|
+
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?$"
|
|
40
|
+
},
|
|
41
|
+
"GitHubEvent": {
|
|
42
|
+
"type": "object",
|
|
43
|
+
"additionalProperties": false,
|
|
44
|
+
"required": ["name", "pullRequestNumber", "base", "head"],
|
|
45
|
+
"properties": {
|
|
46
|
+
"name": { "const": "pull_request" },
|
|
47
|
+
"pullRequestNumber": { "type": "integer", "minimum": 1 },
|
|
48
|
+
"base": { "$ref": "#/definitions/GitOid" },
|
|
49
|
+
"head": { "$ref": "#/definitions/GitOid" }
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"CacheInputs": {
|
|
53
|
+
"type": "object",
|
|
54
|
+
"additionalProperties": false,
|
|
55
|
+
"required": [
|
|
56
|
+
"operatingSystem",
|
|
57
|
+
"architecture",
|
|
58
|
+
"nodeVersion",
|
|
59
|
+
"pnpmVersion",
|
|
60
|
+
"lockfilePath",
|
|
61
|
+
"lockfileDigest",
|
|
62
|
+
"packageManifestDigest",
|
|
63
|
+
"stackVersion",
|
|
64
|
+
"graphreflyVersion",
|
|
65
|
+
"cacheKey"
|
|
66
|
+
],
|
|
67
|
+
"properties": {
|
|
68
|
+
"operatingSystem": { "type": "string", "minLength": 1, "maxLength": 64 },
|
|
69
|
+
"architecture": { "type": "string", "minLength": 1, "maxLength": 32 },
|
|
70
|
+
"nodeVersion": { "$ref": "#/definitions/RuntimeVersion" },
|
|
71
|
+
"pnpmVersion": { "$ref": "#/definitions/RuntimeVersion" },
|
|
72
|
+
"lockfilePath": { "const": "pnpm-lock.yaml" },
|
|
73
|
+
"lockfileDigest": { "$ref": "#/definitions/Hash" },
|
|
74
|
+
"packageManifestDigest": { "$ref": "#/definitions/Hash" },
|
|
75
|
+
"stackVersion": { "$ref": "#/definitions/RuntimeVersion" },
|
|
76
|
+
"graphreflyVersion": { "$ref": "#/definitions/RuntimeVersion" },
|
|
77
|
+
"cacheKey": { "type": "string", "minLength": 1, "maxLength": 512 }
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"CIInvocation": {
|
|
81
|
+
"type": "object",
|
|
82
|
+
"additionalProperties": false,
|
|
83
|
+
"required": [
|
|
84
|
+
"schema",
|
|
85
|
+
"adapter",
|
|
86
|
+
"repository",
|
|
87
|
+
"event",
|
|
88
|
+
"workflow",
|
|
89
|
+
"run",
|
|
90
|
+
"plan",
|
|
91
|
+
"cacheInputs",
|
|
92
|
+
"identity"
|
|
93
|
+
],
|
|
94
|
+
"properties": {
|
|
95
|
+
"schema": { "const": "graphrefly.stack.ci-invocation.v1" },
|
|
96
|
+
"adapter": {
|
|
97
|
+
"type": "object",
|
|
98
|
+
"additionalProperties": false,
|
|
99
|
+
"required": ["provider", "version"],
|
|
100
|
+
"properties": {
|
|
101
|
+
"provider": { "const": "github-actions" },
|
|
102
|
+
"version": { "const": "v1" }
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"repository": {
|
|
106
|
+
"type": "object",
|
|
107
|
+
"additionalProperties": false,
|
|
108
|
+
"required": ["id", "ownerId", "headRepositoryId"],
|
|
109
|
+
"properties": {
|
|
110
|
+
"id": { "$ref": "#/definitions/DecimalId" },
|
|
111
|
+
"ownerId": { "$ref": "#/definitions/DecimalId" },
|
|
112
|
+
"headRepositoryId": { "$ref": "#/definitions/DecimalId" }
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"event": { "$ref": "#/definitions/GitHubEvent" },
|
|
116
|
+
"workflow": {
|
|
117
|
+
"type": "object",
|
|
118
|
+
"additionalProperties": false,
|
|
119
|
+
"required": ["ref", "sha"],
|
|
120
|
+
"properties": {
|
|
121
|
+
"ref": { "type": "string", "minLength": 1, "maxLength": 1024 },
|
|
122
|
+
"sha": { "$ref": "#/definitions/GitOid" }
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
"run": {
|
|
126
|
+
"type": "object",
|
|
127
|
+
"additionalProperties": false,
|
|
128
|
+
"required": ["id", "attempt", "actorId", "jobName"],
|
|
129
|
+
"properties": {
|
|
130
|
+
"id": { "$ref": "#/definitions/DecimalId" },
|
|
131
|
+
"attempt": { "type": "integer", "minimum": 1 },
|
|
132
|
+
"actorId": { "$ref": "#/definitions/DecimalId" },
|
|
133
|
+
"jobName": { "const": "GraphReFly Stack / Semantic Gate" }
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
"plan": {
|
|
137
|
+
"type": "object",
|
|
138
|
+
"additionalProperties": false,
|
|
139
|
+
"required": ["id", "policyDigest"],
|
|
140
|
+
"properties": {
|
|
141
|
+
"id": { "$ref": "#/definitions/Identifier" },
|
|
142
|
+
"policyDigest": { "$ref": "#/definitions/Hash" }
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"cacheInputs": { "$ref": "#/definitions/CacheInputs" },
|
|
146
|
+
"identity": {
|
|
147
|
+
"type": "object",
|
|
148
|
+
"additionalProperties": false,
|
|
149
|
+
"required": ["assurance"],
|
|
150
|
+
"properties": { "assurance": { "const": "platform-asserted" } }
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
"CIResult": {
|
|
155
|
+
"type": "object",
|
|
156
|
+
"additionalProperties": false,
|
|
157
|
+
"required": [
|
|
158
|
+
"schema",
|
|
159
|
+
"invocationDigest",
|
|
160
|
+
"outcome",
|
|
161
|
+
"gateInputDigest",
|
|
162
|
+
"gateResult",
|
|
163
|
+
"portableBundleDigest",
|
|
164
|
+
"provenance",
|
|
165
|
+
"redaction",
|
|
166
|
+
"summary",
|
|
167
|
+
"artifactName"
|
|
168
|
+
],
|
|
169
|
+
"properties": {
|
|
170
|
+
"schema": { "const": "graphrefly.stack.ci-result.v1" },
|
|
171
|
+
"invocationDigest": { "$ref": "#/definitions/Hash" },
|
|
172
|
+
"outcome": { "enum": ["pass", "blocked", "error"] },
|
|
173
|
+
"gateInputDigest": { "$ref": "#/definitions/Hash" },
|
|
174
|
+
"gateResult": {
|
|
175
|
+
"$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/GateResult"
|
|
176
|
+
},
|
|
177
|
+
"portableBundleDigest": { "$ref": "#/definitions/Hash" },
|
|
178
|
+
"provenance": {
|
|
179
|
+
"type": "object",
|
|
180
|
+
"additionalProperties": false,
|
|
181
|
+
"required": ["provider", "repositoryId", "workflowSha", "runId", "attempt"],
|
|
182
|
+
"properties": {
|
|
183
|
+
"provider": { "const": "github-actions" },
|
|
184
|
+
"repositoryId": { "$ref": "#/definitions/DecimalId" },
|
|
185
|
+
"workflowSha": { "$ref": "#/definitions/GitOid" },
|
|
186
|
+
"runId": { "$ref": "#/definitions/DecimalId" },
|
|
187
|
+
"attempt": { "type": "integer", "minimum": 1 }
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
"redaction": {
|
|
191
|
+
"type": "object",
|
|
192
|
+
"additionalProperties": false,
|
|
193
|
+
"required": ["excludes"],
|
|
194
|
+
"properties": {
|
|
195
|
+
"excludes": {
|
|
196
|
+
"type": "array",
|
|
197
|
+
"items": {
|
|
198
|
+
"enum": [
|
|
199
|
+
"source-content",
|
|
200
|
+
"raw-blueprint",
|
|
201
|
+
"check-output",
|
|
202
|
+
"credentials",
|
|
203
|
+
"environment",
|
|
204
|
+
"model-response"
|
|
205
|
+
]
|
|
206
|
+
},
|
|
207
|
+
"minItems": 6,
|
|
208
|
+
"maxItems": 6,
|
|
209
|
+
"uniqueItems": true
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
"summary": {
|
|
214
|
+
"type": "object",
|
|
215
|
+
"additionalProperties": false,
|
|
216
|
+
"required": ["verdict", "affectedWorkUnitIds", "reasonCodes"],
|
|
217
|
+
"properties": {
|
|
218
|
+
"verdict": { "enum": ["pass", "blocked", "error"] },
|
|
219
|
+
"affectedWorkUnitIds": {
|
|
220
|
+
"type": "array",
|
|
221
|
+
"items": { "type": "string", "minLength": 1, "maxLength": 64 },
|
|
222
|
+
"uniqueItems": true
|
|
223
|
+
},
|
|
224
|
+
"reasonCodes": {
|
|
225
|
+
"type": "array",
|
|
226
|
+
"items": {
|
|
227
|
+
"$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/ReasonCode"
|
|
228
|
+
},
|
|
229
|
+
"uniqueItems": true
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
"artifactName": {
|
|
234
|
+
"type": "string",
|
|
235
|
+
"pattern": "^graphrefly-stack-ci-[0-9a-f]{64}$"
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
"CIBundle": {
|
|
240
|
+
"type": "object",
|
|
241
|
+
"additionalProperties": false,
|
|
242
|
+
"required": ["schema", "invocation", "result", "portableBundle"],
|
|
243
|
+
"properties": {
|
|
244
|
+
"schema": { "const": "graphrefly.stack.ci-bundle.v1" },
|
|
245
|
+
"invocation": { "$ref": "#/definitions/CIInvocation" },
|
|
246
|
+
"result": { "$ref": "#/definitions/CIResult" },
|
|
247
|
+
"portableBundle": {
|
|
248
|
+
"$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/SemanticPortableBundle"
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "urn:graphrefly-stack:schema:ci-golden-suite:v1",
|
|
4
|
+
"title": "GraphReFly Stack CI golden suite v1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schema", "invocation", "result"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema": { "const": "graphrefly.stack.ci-golden-suite.v1" },
|
|
10
|
+
"invocation": {
|
|
11
|
+
"$ref": "urn:graphrefly-stack:schema:ci-artifacts:v1#/definitions/CIInvocation"
|
|
12
|
+
},
|
|
13
|
+
"result": {
|
|
14
|
+
"$ref": "urn:graphrefly-stack:schema:ci-artifacts:v1#/definitions/CIResult"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "urn:graphrefly-stack:schema:repository-review-bundle:v1",
|
|
4
|
+
"title": "GraphReFly Stack portable repository review bundle v1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schema", "repository", "artifacts"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema": { "const": "graphrefly.stack.repository-review-bundle.v1" },
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"additionalProperties": false,
|
|
13
|
+
"required": ["label", "baseOid", "headOid"],
|
|
14
|
+
"properties": {
|
|
15
|
+
"label": { "type": "string", "minLength": 1 },
|
|
16
|
+
"baseOid": {
|
|
17
|
+
"$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid"
|
|
18
|
+
},
|
|
19
|
+
"headOid": {
|
|
20
|
+
"$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"artifacts": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"items": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"additionalProperties": false,
|
|
29
|
+
"required": ["path", "hash", "record"],
|
|
30
|
+
"properties": {
|
|
31
|
+
"path": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"pattern": "^reviews/[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\.json$"
|
|
34
|
+
},
|
|
35
|
+
"hash": {
|
|
36
|
+
"type": "object",
|
|
37
|
+
"additionalProperties": false,
|
|
38
|
+
"required": ["algorithm", "value"],
|
|
39
|
+
"properties": {
|
|
40
|
+
"algorithm": { "const": "sha256" },
|
|
41
|
+
"value": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"record": { "$ref": "urn:graphrefly-stack:schema:repository-review-decision:v1" }
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "urn:graphrefly-stack:schema:repository-review-decision-request:v1",
|
|
4
|
+
"title": "GraphReFly Stack local repository review decision request v1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schema", "commitOid", "decision", "reviewerLabel", "summary"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema": { "const": "graphrefly.stack.repository-review-decision-request.v1" },
|
|
10
|
+
"commitOid": { "$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid" },
|
|
11
|
+
"decision": { "enum": ["approve", "request-changes"] },
|
|
12
|
+
"reviewerLabel": { "type": "string", "minLength": 1, "maxLength": 120 },
|
|
13
|
+
"summary": { "type": "string", "maxLength": 10000 }
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "urn:graphrefly-stack:schema:repository-review-decision:v1",
|
|
4
|
+
"title": "GraphReFly Stack local repository review decision v1",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"schema",
|
|
9
|
+
"id",
|
|
10
|
+
"target",
|
|
11
|
+
"decision",
|
|
12
|
+
"reviewerLabel",
|
|
13
|
+
"summary",
|
|
14
|
+
"recordedAt",
|
|
15
|
+
"identityVerified"
|
|
16
|
+
],
|
|
17
|
+
"properties": {
|
|
18
|
+
"schema": { "const": "graphrefly.stack.repository-review-decision.v1" },
|
|
19
|
+
"id": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
|
|
22
|
+
},
|
|
23
|
+
"target": {
|
|
24
|
+
"type": "object",
|
|
25
|
+
"additionalProperties": false,
|
|
26
|
+
"required": ["baseOid", "headOid", "parentOid", "commitOid", "blueprintHash"],
|
|
27
|
+
"properties": {
|
|
28
|
+
"baseOid": {
|
|
29
|
+
"$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid"
|
|
30
|
+
},
|
|
31
|
+
"headOid": {
|
|
32
|
+
"$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid"
|
|
33
|
+
},
|
|
34
|
+
"parentOid": {
|
|
35
|
+
"$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid"
|
|
36
|
+
},
|
|
37
|
+
"commitOid": {
|
|
38
|
+
"$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid"
|
|
39
|
+
},
|
|
40
|
+
"blueprintHash": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"decision": { "enum": ["approve", "request-changes"] },
|
|
44
|
+
"reviewerLabel": { "type": "string", "minLength": 1, "maxLength": 120 },
|
|
45
|
+
"summary": { "type": "string", "maxLength": 10000 },
|
|
46
|
+
"recordedAt": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$"
|
|
49
|
+
},
|
|
50
|
+
"identityVerified": { "const": false }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -11,9 +11,10 @@
|
|
|
11
11
|
"repository": {
|
|
12
12
|
"type": "object",
|
|
13
13
|
"additionalProperties": false,
|
|
14
|
-
"required": ["label", "graphreflyVersion", "entrypoint", "baseOid", "headOid"],
|
|
14
|
+
"required": ["label", "headLabel", "graphreflyVersion", "entrypoint", "baseOid", "headOid"],
|
|
15
15
|
"properties": {
|
|
16
16
|
"label": { "type": "string", "minLength": 1 },
|
|
17
|
+
"headLabel": { "type": "string", "minLength": 1 },
|
|
17
18
|
"graphreflyVersion": { "type": "string", "pattern": "^0\\.3\\.[0-9]+$" },
|
|
18
19
|
"entrypoint": {
|
|
19
20
|
"$ref": "urn:graphrefly-stack:schema:repository-config:v1#/properties/blueprint/properties/entrypoint"
|
|
@@ -28,8 +29,51 @@
|
|
|
28
29
|
"minItems": 1,
|
|
29
30
|
"items": { "$ref": "#/definitions/ReviewCommit" }
|
|
30
31
|
},
|
|
31
|
-
"semanticStatus": { "
|
|
32
|
+
"semanticStatus": { "enum": ["not-configured", "evaluated"] },
|
|
33
|
+
"semantic": {
|
|
34
|
+
"type": "object",
|
|
35
|
+
"additionalProperties": false,
|
|
36
|
+
"required": ["plan", "bindings", "records", "checks", "gateResult", "invalidWorkUnitIds"],
|
|
37
|
+
"properties": {
|
|
38
|
+
"plan": {
|
|
39
|
+
"$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/AcceptedChangePlan"
|
|
40
|
+
},
|
|
41
|
+
"bindings": {
|
|
42
|
+
"type": "array",
|
|
43
|
+
"items": {
|
|
44
|
+
"$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/CommitWorkUnitBinding"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"records": {
|
|
48
|
+
"type": "array",
|
|
49
|
+
"items": {
|
|
50
|
+
"$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/SemanticChangeRecord"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"checks": {
|
|
54
|
+
"type": "array",
|
|
55
|
+
"items": {
|
|
56
|
+
"$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/CheckResult"
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"gateResult": {
|
|
60
|
+
"$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/GateResult"
|
|
61
|
+
},
|
|
62
|
+
"invalidWorkUnitIds": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"items": { "type": "string" },
|
|
65
|
+
"uniqueItems": true
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
32
69
|
},
|
|
70
|
+
"allOf": [
|
|
71
|
+
{
|
|
72
|
+
"if": { "properties": { "semanticStatus": { "const": "evaluated" } } },
|
|
73
|
+
"then": { "properties": { "semantic": {} }, "required": ["semantic"] },
|
|
74
|
+
"else": { "not": { "required": ["semantic"] } }
|
|
75
|
+
}
|
|
76
|
+
],
|
|
33
77
|
"definitions": {
|
|
34
78
|
"GitOid": { "type": "string", "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$" },
|
|
35
79
|
"Hash": {
|