@open-agent-toolkit/cli 0.2.30 → 0.2.32

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 (107) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/configuration.md +41 -0
  3. package/assets/docs/contributing/code.md +19 -7
  4. package/assets/docs/contributing/explainer-kit-verification.md +9 -1
  5. package/assets/docs/contributing/skills.md +9 -0
  6. package/assets/docs/provider-sync/commands.md +15 -10
  7. package/assets/docs/provider-sync/manifest-and-drift.md +23 -0
  8. package/assets/docs/provider-sync/providers.md +8 -2
  9. package/assets/docs/provider-sync/scope-and-surface.md +3 -1
  10. package/assets/docs/reference/file-locations.md +5 -0
  11. package/assets/docs/reference/troubleshooting.md +18 -0
  12. package/assets/docs/workflows/skills/explainer-kit-providers.md +16 -5
  13. package/assets/docs/workflows/skills/explainer-kit.md +98 -38
  14. package/assets/public-package-versions.json +4 -4
  15. package/assets/skills/create-agnostic-skill/references/docs/skills-guide.md +34 -22
  16. package/assets/skills/explainer-kit/SKILL.md +33 -8
  17. package/assets/skills/explainer-kit/briefs/project-recap.md +25 -7
  18. package/assets/skills/explainer-kit/recipes/project-recap.v2.json +72 -0
  19. package/assets/skills/explainer-kit/references/contracts.md +49 -17
  20. package/assets/skills/explainer-kit/references/destination-contract.md +141 -25
  21. package/assets/skills/explainer-kit/references/extension-contract.md +19 -10
  22. package/assets/skills/explainer-kit/references/visual-authoring.md +24 -0
  23. package/assets/skills/explainer-kit/references/visual-review.md +19 -5
  24. package/assets/skills/explainer-kit/schemas/author-request.v3.schema.json +241 -0
  25. package/assets/skills/explainer-kit/schemas/publish-receipt.v2.schema.json +215 -0
  26. package/assets/skills/explainer-kit/schemas/publish-request.v2.schema.json +34 -0
  27. package/assets/skills/explainer-kit/schemas/run-request.schema.json +4 -1
  28. package/assets/skills/explainer-kit/schemas/terminal-evidence.v1.schema.json +81 -0
  29. package/assets/skills/explainer-kit/schemas/visual-review-evidence.v1.schema.json +66 -0
  30. package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +109 -3
  31. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +550 -17
  32. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +90 -8
  33. package/assets/skills/explainer-kit/scripts/lib/fs-safe.mjs +5 -0
  34. package/assets/skills/explainer-kit/scripts/lib/internal-references.mjs +538 -0
  35. package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +129 -11
  36. package/assets/skills/explainer-kit/scripts/lib/publication-policy.mjs +54 -0
  37. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +2 -1
  38. package/assets/skills/explainer-kit/scripts/lib/records.mjs +139 -22
  39. package/assets/skills/explainer-kit/scripts/lib/s3-roots.mjs +353 -0
  40. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +237 -107
  41. package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +1 -0
  42. package/assets/skills/explainer-kit/scripts/lib/terminal-evidence.mjs +157 -0
  43. package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +26 -6
  44. package/assets/skills/explainer-kit/scripts/run.mjs +1006 -144
  45. package/assets/skills/oat-agent-instructions-analyze/references/docs/provider-reference.md +14 -2
  46. package/assets/skills/oat-agent-instructions-apply/references/docs/provider-reference.md +14 -2
  47. package/assets/skills/oat-explainer-kit/SKILL.md +16 -3
  48. package/assets/skills/oat-explainer-kit/references/config-contract.md +13 -8
  49. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +50 -6
  50. package/assets/skills/oat-explainer-kit/references/migration.md +2 -1
  51. package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +11 -0
  52. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +37 -15
  53. package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +83 -0
  54. package/assets/skills/oat-explainer-kit/scripts/derive-destination.mjs +91 -0
  55. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +66 -10
  56. package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +60 -21
  57. package/assets/skills/oat-explainer-kit/scripts/resolve-paths.mjs +52 -8
  58. package/assets/skills/oat-explainer-kit/scripts/run.mjs +271 -36
  59. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +2 -2
  60. package/assets/skills/oat-project-complete/SKILL.md +19 -3
  61. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +2 -2
  62. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +8 -0
  63. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +2 -2
  64. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +2 -2
  65. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +2 -2
  66. package/dist/commands/config/index.d.ts.map +1 -1
  67. package/dist/commands/config/index.js +18 -0
  68. package/dist/commands/init/index.d.ts +2 -2
  69. package/dist/commands/init/index.d.ts.map +1 -1
  70. package/dist/commands/init/index.js +22 -13
  71. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  72. package/dist/commands/project/archive/archive-utils.js +57 -7
  73. package/dist/commands/project/archive/explainer-terminal-evidence.d.ts +29 -0
  74. package/dist/commands/project/archive/explainer-terminal-evidence.d.ts.map +1 -0
  75. package/dist/commands/project/archive/explainer-terminal-evidence.js +37 -0
  76. package/dist/commands/remove/skill/remove-skill.d.ts +4 -1
  77. package/dist/commands/remove/skill/remove-skill.d.ts.map +1 -1
  78. package/dist/commands/remove/skill/remove-skill.js +44 -5
  79. package/dist/commands/shared/adopt-stray.d.ts +5 -0
  80. package/dist/commands/shared/adopt-stray.d.ts.map +1 -1
  81. package/dist/commands/shared/adopt-stray.js +25 -4
  82. package/dist/commands/shared/native-skill-disposition.d.ts +22 -0
  83. package/dist/commands/shared/native-skill-disposition.d.ts.map +1 -0
  84. package/dist/commands/shared/native-skill-disposition.js +60 -0
  85. package/dist/commands/status/index.d.ts +2 -2
  86. package/dist/commands/status/index.d.ts.map +1 -1
  87. package/dist/commands/status/index.js +22 -13
  88. package/dist/config/oat-config.d.ts +2 -0
  89. package/dist/config/oat-config.d.ts.map +1 -1
  90. package/dist/config/oat-config.js +4 -0
  91. package/dist/config/resolve.d.ts.map +1 -1
  92. package/dist/config/resolve.js +1 -0
  93. package/dist/engine/compute-plan.d.ts +3 -2
  94. package/dist/engine/compute-plan.d.ts.map +1 -1
  95. package/dist/engine/compute-plan.js +1 -1
  96. package/dist/engine/index.d.ts +1 -1
  97. package/dist/engine/index.d.ts.map +1 -1
  98. package/dist/engine/index.js +1 -1
  99. package/dist/providers/copilot/paths.d.ts.map +1 -1
  100. package/dist/providers/copilot/paths.js +6 -4
  101. package/package.json +2 -2
  102. package/dist/commands/shared/cursor-skill-disposition.d.ts +0 -17
  103. package/dist/commands/shared/cursor-skill-disposition.d.ts.map +0 -1
  104. package/dist/commands/shared/cursor-skill-disposition.js +0 -41
  105. /package/assets/skills/explainer-kit/recipes/{project-recap.json → project-recap.v1.json} +0 -0
  106. /package/assets/skills/explainer-kit/schemas/{publish-receipt.schema.json → publish-receipt.v1.schema.json} +0 -0
  107. /package/assets/skills/explainer-kit/schemas/{publish-request.schema.json → publish-request.v1.schema.json} +0 -0
@@ -20,13 +20,18 @@ Private wrappers may retain presets, vault conventions, Google Docs behavior,
20
20
  and personal destinations around this seam. Those values are wrapper-owned;
21
21
  they are not OAT config keys and must not be discovered by the core.
22
22
 
23
- ## Frozen v1 boundary
23
+ ## Frozen versioned boundary
24
24
 
25
25
  The versioned request, artifact package, manifest, build record, durability
26
- request, publish request, and publish receipt are the public boundary. V1 has
27
- no plugin registry and no mid-pipeline callback API for private destinations.
28
- Provider-neutral callbacks already documented by the core remain explicit run
29
- options; they do not transfer stage ownership to a wrapper.
26
+ request, publish request, and publish receipt are the public boundary. New
27
+ publication work uses the immutable `explainer-kit.publish-request/v2` and
28
+ `explainer-kit.publish-receipt/v2` contracts. The corresponding
29
+ `publish-request/v1` and `publish-receipt/v1` contracts remain readable for
30
+ replay; v2 is a new contract version, not an in-place mutation of v1. The
31
+ extension seam has no plugin registry and no mid-pipeline callback API for
32
+ private destinations. Provider-neutral callbacks already documented by the
33
+ core remain explicit run options; they do not transfer stage ownership to a
34
+ wrapper.
30
35
 
31
36
  V1 readers reject unsupported contract majors and identity mismatches rather
32
37
  than guessing. Wrappers should preserve unknown future versions for diagnosis,
@@ -59,13 +64,17 @@ or private content.
59
64
 
60
65
  After the core command returns, the wrapper performs its post-run publication
61
66
  and linking work. It retains the immutable core manifest as
62
- `private-wrapper-manifest.json`, the complete `PublishReceiptV1` as
67
+ `private-wrapper-manifest.json`, the complete `publish-receipt/v2` as
63
68
  `private-wrapper-publish-receipt.json`, and its sanitized wrapper result as
64
69
  `private-wrapper-result.json`. The wrapper result repeats canonical hashes for
65
70
  the request, manifest, and post-run receipt.
66
71
 
67
72
  The wrapper acceptance stage reads those post-run files separately. It
68
- validates the closed receipt contract, every manifest artifact/hash and
69
- destination, the run-unique sentinel, the manifest hash, and the core run ID
70
- against `private-wrapper-execution.json`. Repeating a matching hash cannot make
71
- a foreign or stale receipt attributable to the packaged run.
73
+ validates the closed receipt contract, complete manifest and catalog evidence,
74
+ every source identity, path, artifact hash, destination, and verification fact,
75
+ the run-unique sentinel, the manifest hash, and the core run ID against
76
+ `private-wrapper-execution.json`. Public and protected v2 receipts must each
77
+ provide exactly one entry for every finalized manifest artifact and exactly one
78
+ generated catalog entry. A `publish-receipt/v1` remains consumable only for
79
+ replay. Repeating a matching hash cannot make a foreign, duplicate, incomplete,
80
+ or stale receipt attributable to the packaged run.
@@ -28,10 +28,30 @@ stands. Use one dominant title, a short framing statement, and the most useful
28
28
  visual or status summary before secondary detail. Keep headings descriptive,
29
29
  group related items, and use size, spacing, and contrast consistently.
30
30
 
31
+ Assign intentional typography roles to the title, framing statement, section
32
+ headings, labels, body copy, evidence, and annotations. Use weight, scale,
33
+ measure, and contrast to clarify those roles rather than making every text block
34
+ equally loud. Keep the role system consistent across artifacts without forcing
35
+ every medium into the same composition.
36
+
31
37
  Use the shared terminology, status labels, and numbers exactly. Never create a
32
38
  shorter synonym that changes meaning. Keep source-backed uncertainty visible as
33
39
  `needs confirmation`.
34
40
 
41
+ ## Compose to the evidence
42
+
43
+ Treat composition and density as editorial choices. Group facts that belong
44
+ together, give the main claim enough emphasis, and let supporting evidence
45
+ recede without becoming hard to find. Restructure crowded content instead of
46
+ shrinking it, and remove decorative filler instead of stretching sparse
47
+ material.
48
+
49
+ Seek medium leverage: a visual artifact should make a relationship, comparison,
50
+ sequence, or decision easier to understand than prose alone. Vary the treatment
51
+ to fit the evidence and avoid template repetition across sections, cards, or
52
+ slides. Shared visual language should create cross-artifact cohesion, not a set
53
+ of cloned layouts.
54
+
35
55
  ## Hubs and responsive navigation
36
56
 
37
57
  - Lead with the project outcome and current state, then expose architecture,
@@ -45,6 +65,8 @@ shorter synonym that changes meaning. Keep source-backed uncertainty visible as
45
65
 
46
66
  ## Diagrams and system visuals
47
67
 
68
+ - Preserve diagram semantics: topology, direction, ownership, state, and edge
69
+ meaning must survive the visual treatment.
48
70
  - Encode relationships with position and connectors, not color alone.
49
71
  - Label nodes with concrete nouns and edges with actions or data movement.
50
72
  - Make direction explicit and include a legend only when the encoding needs it.
@@ -58,6 +80,8 @@ shorter synonym that changes meaning. Keep source-backed uncertainty visible as
58
80
  attribute escaping, including `data-edge-label=""` for an unlabeled edge.
59
81
  - Give the canvas an accessible name and description. Keep labels readable at
60
82
  the required viewport widths and provide bounded pan or zoom for large maps.
83
+ - Fit the frame to the content so the meaningful topology is prominent rather
84
+ than stranded in unused canvas.
61
85
  - Use the same component names and status vocabulary as the hub and deck.
62
86
 
63
87
  ## Decks
@@ -12,17 +12,30 @@ Inspect the complete set before assigning artifact findings. Verify:
12
12
 
13
13
  - **First viewport:** each artifact establishes purpose, project state, and the
14
14
  primary reader question without scrolling.
15
+ - **Typography:** titles, framing text, headings, labels, body copy, and
16
+ annotations have distinct, readable roles that remain consistent across the
17
+ set.
15
18
  - **Hierarchy:** the most important outcome or relationship is dominant, with
16
19
  secondary detail grouped and ordered consistently.
17
- - **Representation choice:** the selected medium makes the evidence easier to
18
- understand than plain prose would.
20
+ - **Composition:** grouping, alignment, spacing, and emphasis create a clear
21
+ reading path suited to the artifact's evidence.
22
+ - **Density:** crowded material is restructured instead of miniaturized, while
23
+ sparse material is not padded with decorative filler.
24
+ - **Medium leverage:** the selected medium makes a relationship, comparison,
25
+ sequence, or decision easier to understand than plain prose would.
19
26
  - **Legibility:** text, labels, status cues, tables, and connectors remain
20
27
  readable at every required viewport.
21
28
  - **Medium fit:** the hub orients and links, the system visual preserves
22
29
  relationships, the deck paces a narrative, and optional artifacts add a
23
30
  distinct source-backed perspective.
24
- - **Cohesion:** terminology, status labels, numbers, color meaning, and visual
25
- language match the shared ledger and one another.
31
+ - **Template repetition:** sections, cards, and slides vary when the evidence
32
+ calls for a different treatment instead of repeating one shell mechanically.
33
+ - **Diagram semantics:** topology, direction, labels, edge meaning, and
34
+ fit-to-content framing communicate the planned relationships without false
35
+ linearization or decorative ambiguity.
36
+ - **Cross-artifact cohesion:** terminology, status labels, numbers, color
37
+ meaning, typographic roles, and visual language match the shared ledger and
38
+ one another.
26
39
  - **Coverage and redundancy:** planned sources and reader questions are covered
27
40
  once at the right depth; optional artifacts do not repeat the hub or deck
28
41
  without a justified purpose.
@@ -49,7 +62,8 @@ Use severity proportionally:
49
62
  Return exactly one provider-neutral disposition:
50
63
 
51
64
  - `pass` when the full set clears the rubric with no required correction.
52
- - `correct` when bounded artifact-scoped changes can clear the rubric.
65
+ - `correct` when bounded artifact-scoped changes can clear the rubric; every
66
+ finding must name a concrete, actionable correction.
53
67
  - `fail` when evidence is missing, the plan or ledger is internally invalid, or
54
68
  correction would require unsupported facts or a different artifact set.
55
69
 
@@ -0,0 +1,241 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "explainer-kit.author-request/v3",
4
+ "title": "AuthorRequestV3",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "artifactId",
10
+ "artifactType",
11
+ "authoring",
12
+ "brief",
13
+ "visualAuthoringGuidance",
14
+ "factBase",
15
+ "theme",
16
+ "setContext",
17
+ "plannedArtifact",
18
+ "artifactLinks"
19
+ ],
20
+ "properties": {
21
+ "schemaVersion": { "const": "explainer-kit.author-request/v3" },
22
+ "artifactId": { "type": "string", "minLength": 1 },
23
+ "artifactType": {
24
+ "enum": ["hub", "diagram", "explainer", "deck", "catalog"]
25
+ },
26
+ "authoring": { "enum": ["markdown", "html"] },
27
+ "brief": { "type": "string", "minLength": 1 },
28
+ "visualAuthoringGuidance": { "type": "string", "minLength": 1 },
29
+ "factBase": { "$ref": "explainer-kit.fact-base/v1" },
30
+ "shell": { "type": "string", "minLength": 1 },
31
+ "theme": { "$ref": "explainer-kit.theme/v1" },
32
+ "setContext": { "$ref": "explainer-kit.set-plan/v1" },
33
+ "plannedArtifact": { "$ref": "#/$defs/plannedArtifact" },
34
+ "artifactLinks": {
35
+ "type": "array",
36
+ "items": { "$ref": "#/$defs/artifactLink" },
37
+ "minItems": 1,
38
+ "uniqueItems": true
39
+ },
40
+ "graphSemantics": {
41
+ "type": "array",
42
+ "items": { "$ref": "#/$defs/graphSemantics" },
43
+ "minItems": 1
44
+ },
45
+ "floor": {
46
+ "type": "object",
47
+ "additionalProperties": false,
48
+ "required": ["requiredNarrative"],
49
+ "properties": {
50
+ "requiredNarrative": {
51
+ "type": "array",
52
+ "items": { "type": "string", "minLength": 1 },
53
+ "minItems": 1,
54
+ "uniqueItems": true
55
+ }
56
+ }
57
+ }
58
+ },
59
+ "$defs": {
60
+ "artifactLink": {
61
+ "type": "object",
62
+ "additionalProperties": false,
63
+ "required": ["artifactId", "artifactType", "sitePath", "href"],
64
+ "properties": {
65
+ "artifactId": {
66
+ "type": "string",
67
+ "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
68
+ },
69
+ "artifactType": {
70
+ "enum": ["hub", "diagram", "explainer", "deck", "catalog"]
71
+ },
72
+ "sitePath": {
73
+ "type": "string",
74
+ "pattern": "^site/[a-z0-9._-]+(?:/[a-z0-9._-]+)*/index\\.html$"
75
+ },
76
+ "href": {
77
+ "type": "string",
78
+ "pattern": "^(?:index\\.html|(?:\\.\\./)*[a-z0-9._-]+(?:/[a-z0-9._-]+)*/index\\.html)$"
79
+ }
80
+ }
81
+ },
82
+ "graphSemantics": {
83
+ "type": "object",
84
+ "additionalProperties": false,
85
+ "required": ["direction", "nodes", "edges", "topology"],
86
+ "properties": {
87
+ "direction": { "enum": ["TD", "LR"] },
88
+ "nodes": {
89
+ "type": "array",
90
+ "items": {
91
+ "type": "object",
92
+ "additionalProperties": false,
93
+ "required": ["id", "label", "shape", "explicit"],
94
+ "properties": {
95
+ "id": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_-]*$" },
96
+ "label": { "type": "string", "minLength": 1 },
97
+ "shape": { "enum": ["rectangle", "rounded", "diamond"] },
98
+ "explicit": { "type": "boolean" }
99
+ }
100
+ },
101
+ "minItems": 1,
102
+ "uniqueItems": true
103
+ },
104
+ "edges": {
105
+ "type": "array",
106
+ "items": {
107
+ "type": "object",
108
+ "additionalProperties": false,
109
+ "required": ["from", "to", "kind", "label"],
110
+ "properties": {
111
+ "from": {
112
+ "type": "string",
113
+ "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
114
+ },
115
+ "to": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_-]*$" },
116
+ "kind": { "enum": ["arrow", "line"] },
117
+ "label": { "type": "string" }
118
+ }
119
+ },
120
+ "minItems": 1
121
+ },
122
+ "topology": {
123
+ "type": "object",
124
+ "additionalProperties": false,
125
+ "required": [
126
+ "kind",
127
+ "features",
128
+ "branchNodes",
129
+ "fanInNodes",
130
+ "cycle",
131
+ "order"
132
+ ],
133
+ "properties": {
134
+ "kind": { "const": "non-linear" },
135
+ "features": {
136
+ "type": "array",
137
+ "items": {
138
+ "enum": [
139
+ "branch",
140
+ "fan-in",
141
+ "cycle",
142
+ "disconnected",
143
+ "non-linear"
144
+ ]
145
+ },
146
+ "minItems": 1,
147
+ "uniqueItems": true
148
+ },
149
+ "branchNodes": {
150
+ "type": "array",
151
+ "items": {
152
+ "type": "string",
153
+ "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
154
+ },
155
+ "uniqueItems": true
156
+ },
157
+ "fanInNodes": {
158
+ "type": "array",
159
+ "items": {
160
+ "type": "string",
161
+ "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
162
+ },
163
+ "uniqueItems": true
164
+ },
165
+ "cycle": { "type": "boolean" },
166
+ "order": {
167
+ "type": "array",
168
+ "items": {
169
+ "type": "string",
170
+ "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
171
+ },
172
+ "maxItems": 0
173
+ }
174
+ }
175
+ }
176
+ }
177
+ },
178
+ "plannedArtifact": {
179
+ "type": "object",
180
+ "additionalProperties": false,
181
+ "required": [
182
+ "artifactId",
183
+ "artifactType",
184
+ "profileId",
185
+ "required",
186
+ "sourceIds",
187
+ "draft",
188
+ "visualIntent"
189
+ ],
190
+ "properties": {
191
+ "artifactId": {
192
+ "type": "string",
193
+ "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
194
+ },
195
+ "artifactType": {
196
+ "enum": ["hub", "diagram", "explainer", "deck", "catalog"]
197
+ },
198
+ "profileId": {
199
+ "type": "string",
200
+ "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
201
+ },
202
+ "required": { "type": "boolean" },
203
+ "sourceIds": {
204
+ "type": "array",
205
+ "items": {
206
+ "type": "string",
207
+ "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
208
+ },
209
+ "minItems": 1,
210
+ "uniqueItems": true
211
+ },
212
+ "draft": { "type": "string", "minLength": 1 },
213
+ "visualIntent": { "type": "string", "minLength": 1 },
214
+ "justification": {
215
+ "type": "object",
216
+ "additionalProperties": false,
217
+ "required": ["kind", "sourceIds", "rationale"],
218
+ "properties": {
219
+ "kind": {
220
+ "enum": [
221
+ "status-change",
222
+ "rollout-complexity",
223
+ "source-backed-detail"
224
+ ]
225
+ },
226
+ "sourceIds": {
227
+ "type": "array",
228
+ "items": {
229
+ "type": "string",
230
+ "pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
231
+ },
232
+ "minItems": 1,
233
+ "uniqueItems": true
234
+ },
235
+ "rationale": { "type": "string", "minLength": 1 }
236
+ }
237
+ }
238
+ }
239
+ }
240
+ }
241
+ }
@@ -0,0 +1,215 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "explainer-kit.publish-receipt/v2",
4
+ "title": "PublishReceiptV2",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "provider",
10
+ "publishedAt",
11
+ "publicAccess",
12
+ "roots",
13
+ "sentinel",
14
+ "artifacts"
15
+ ],
16
+ "properties": {
17
+ "schemaVersion": {
18
+ "const": "explainer-kit.publish-receipt/v2"
19
+ },
20
+ "provider": {
21
+ "const": "s3-static"
22
+ },
23
+ "publishedAt": {
24
+ "type": "string",
25
+ "format": "date-time"
26
+ },
27
+ "publicAccess": {
28
+ "enum": ["public", "protected"]
29
+ },
30
+ "roots": {
31
+ "type": "object",
32
+ "additionalProperties": false,
33
+ "required": ["s3Uri", "publicBaseUrl"],
34
+ "properties": {
35
+ "s3Uri": {
36
+ "type": "string",
37
+ "pattern": "^s3://[a-z0-9][a-z0-9.-]{1,61}[a-z0-9](?:/[^\\s/?#\\\\]+(?:/[^\\s/?#\\\\]+)*)?$"
38
+ },
39
+ "publicBaseUrl": {
40
+ "type": "string",
41
+ "pattern": "^https://[^\\s/?#@]+(?::[0-9]+)?(?:/[^\\s/?#\\\\]+(?:/[^\\s/?#\\\\]+)*)?$"
42
+ }
43
+ }
44
+ },
45
+ "sentinel": {
46
+ "type": "object",
47
+ "additionalProperties": false,
48
+ "required": [
49
+ "relativePath",
50
+ "objectVerification",
51
+ "publicVerification",
52
+ "deleted"
53
+ ],
54
+ "properties": {
55
+ "relativePath": {
56
+ "$ref": "#/$defs/safeRelativePath"
57
+ },
58
+ "objectVerification": {
59
+ "$ref": "#/$defs/objectVerification"
60
+ },
61
+ "publicVerification": {
62
+ "$ref": "#/$defs/publicVerification"
63
+ },
64
+ "deleted": {
65
+ "type": "boolean"
66
+ }
67
+ }
68
+ },
69
+ "artifacts": {
70
+ "type": "array",
71
+ "items": {
72
+ "$ref": "#/$defs/artifact"
73
+ },
74
+ "uniqueItems": true
75
+ },
76
+ "publicRootPolicy": {
77
+ "description": "Present only when EXPLAINER_KIT_ALLOW_PRIVATE_PUBLIC_ROOT was set and the public root was in fact a non-public address, so a publication made with the anti-SSRF control disabled is distinguishable in durable evidence.",
78
+ "enum": ["private-allowed"]
79
+ }
80
+ },
81
+ "$defs": {
82
+ "hash": {
83
+ "type": "string",
84
+ "pattern": "^sha256:[a-f0-9]{64}$"
85
+ },
86
+ "safeRelativePath": {
87
+ "type": "string",
88
+ "minLength": 1,
89
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+$"
90
+ },
91
+ "source": {
92
+ "oneOf": [
93
+ {
94
+ "type": "object",
95
+ "additionalProperties": false,
96
+ "required": ["kind", "artifactId"],
97
+ "properties": {
98
+ "kind": {
99
+ "const": "manifest"
100
+ },
101
+ "artifactId": {
102
+ "type": "string",
103
+ "minLength": 1
104
+ }
105
+ }
106
+ },
107
+ {
108
+ "type": "object",
109
+ "additionalProperties": false,
110
+ "required": ["kind", "name"],
111
+ "properties": {
112
+ "kind": {
113
+ "const": "auxiliary"
114
+ },
115
+ "name": {
116
+ "type": "string",
117
+ "minLength": 1
118
+ }
119
+ }
120
+ }
121
+ ]
122
+ },
123
+ "objectVerification": {
124
+ "type": "object",
125
+ "additionalProperties": false,
126
+ "required": ["status", "method", "hash"],
127
+ "properties": {
128
+ "status": {
129
+ "const": "verified"
130
+ },
131
+ "method": {
132
+ "enum": ["service-checksum", "authenticated-download"]
133
+ },
134
+ "hash": {
135
+ "$ref": "#/$defs/hash"
136
+ }
137
+ }
138
+ },
139
+ "publicVerification": {
140
+ "oneOf": [
141
+ {
142
+ "type": "object",
143
+ "additionalProperties": false,
144
+ "required": ["status", "httpStatus", "hash"],
145
+ "properties": {
146
+ "status": {
147
+ "const": "verified"
148
+ },
149
+ "httpStatus": {
150
+ "type": "integer",
151
+ "minimum": 200,
152
+ "maximum": 299
153
+ },
154
+ "hash": {
155
+ "$ref": "#/$defs/hash"
156
+ }
157
+ }
158
+ },
159
+ {
160
+ "type": "object",
161
+ "additionalProperties": false,
162
+ "required": ["status"],
163
+ "properties": {
164
+ "status": {
165
+ "const": "skipped-protected"
166
+ }
167
+ }
168
+ }
169
+ ]
170
+ },
171
+ "artifact": {
172
+ "type": "object",
173
+ "additionalProperties": false,
174
+ "required": [
175
+ "source",
176
+ "relativePath",
177
+ "hash",
178
+ "s3Uri",
179
+ "publicUrl",
180
+ "contentType",
181
+ "objectVerification",
182
+ "publicVerification"
183
+ ],
184
+ "properties": {
185
+ "source": {
186
+ "$ref": "#/$defs/source"
187
+ },
188
+ "relativePath": {
189
+ "$ref": "#/$defs/safeRelativePath"
190
+ },
191
+ "hash": {
192
+ "$ref": "#/$defs/hash"
193
+ },
194
+ "s3Uri": {
195
+ "type": "string",
196
+ "pattern": "^s3://[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]/[^\\s?#\\\\]+$"
197
+ },
198
+ "publicUrl": {
199
+ "type": "string",
200
+ "pattern": "^https://[^\\s/?#@]+(?::[0-9]+)?/[^\\s?#\\\\]+$"
201
+ },
202
+ "contentType": {
203
+ "type": "string",
204
+ "minLength": 1
205
+ },
206
+ "objectVerification": {
207
+ "$ref": "#/$defs/objectVerification"
208
+ },
209
+ "publicVerification": {
210
+ "$ref": "#/$defs/publicVerification"
211
+ }
212
+ }
213
+ }
214
+ }
215
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "explainer-kit.publish-request/v2",
4
+ "title": "S3StaticPublishRequestV2",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "provider",
10
+ "s3Uri",
11
+ "publicBaseUrl",
12
+ "awsRegion",
13
+ "publicAccess",
14
+ "siteRoot",
15
+ "manifestPath"
16
+ ],
17
+ "properties": {
18
+ "schemaVersion": { "const": "explainer-kit.publish-request/v2" },
19
+ "provider": { "const": "s3-static" },
20
+ "s3Uri": {
21
+ "type": "string",
22
+ "pattern": "^s3://[a-z0-9][a-z0-9.-]{1,61}[a-z0-9](?:/[^\\s/?#\\\\]+(?:/[^\\s/?#\\\\]+)*)?/?$"
23
+ },
24
+ "publicBaseUrl": {
25
+ "type": "string",
26
+ "pattern": "^https://[^\\s/?#@]+(?::[0-9]+)?(?:/[^\\s/?#\\\\]+(?:/[^\\s/?#\\\\]+)*)?/?$"
27
+ },
28
+ "awsRegion": { "type": "string", "minLength": 1 },
29
+ "awsProfile": { "type": "string", "minLength": 1 },
30
+ "publicAccess": { "enum": ["public", "protected"] },
31
+ "siteRoot": { "type": "string", "minLength": 1 },
32
+ "manifestPath": { "type": "string", "minLength": 1 }
33
+ }
34
+ }
@@ -46,7 +46,10 @@
46
46
  "enum": ["none", "commit", "publish"]
47
47
  },
48
48
  "publish": {
49
- "$ref": "explainer-kit.publish-request/v1"
49
+ "oneOf": [
50
+ { "$ref": "explainer-kit.publish-request/v1" },
51
+ { "$ref": "explainer-kit.publish-request/v2" }
52
+ ]
50
53
  }
51
54
  }
52
55
  },