@open-agent-toolkit/cli 0.2.29 → 0.2.31
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/assets/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/configuration.md +52 -1
- package/assets/docs/contributing/code.md +19 -7
- package/assets/docs/contributing/explainer-kit-verification.md +9 -1
- package/assets/docs/contributing/skills.md +9 -0
- package/assets/docs/workflows/projects/artifacts.md +5 -0
- package/assets/docs/workflows/projects/index.md +1 -0
- package/assets/docs/workflows/projects/lifecycle.md +23 -0
- package/assets/docs/workflows/projects/retro.md +261 -0
- package/assets/docs/workflows/skills/explainer-kit-providers.md +16 -5
- package/assets/docs/workflows/skills/explainer-kit.md +98 -38
- package/assets/docs/workflows/skills/index.md +6 -0
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/explainer-kit/SKILL.md +33 -8
- package/assets/skills/explainer-kit/briefs/project-recap.md +25 -7
- package/assets/skills/explainer-kit/recipes/project-recap.v2.json +72 -0
- package/assets/skills/explainer-kit/references/contracts.md +49 -17
- package/assets/skills/explainer-kit/references/destination-contract.md +141 -25
- package/assets/skills/explainer-kit/references/extension-contract.md +19 -10
- package/assets/skills/explainer-kit/references/visual-authoring.md +24 -0
- package/assets/skills/explainer-kit/references/visual-review.md +19 -5
- package/assets/skills/explainer-kit/schemas/author-request.v3.schema.json +241 -0
- package/assets/skills/explainer-kit/schemas/publish-receipt.v2.schema.json +215 -0
- package/assets/skills/explainer-kit/schemas/publish-request.v2.schema.json +34 -0
- package/assets/skills/explainer-kit/schemas/run-request.schema.json +4 -1
- package/assets/skills/explainer-kit/schemas/terminal-evidence.v1.schema.json +81 -0
- package/assets/skills/explainer-kit/schemas/visual-review-evidence.v1.schema.json +66 -0
- package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +109 -3
- package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +550 -17
- package/assets/skills/explainer-kit/scripts/lib/durability.mjs +90 -8
- package/assets/skills/explainer-kit/scripts/lib/fs-safe.mjs +5 -0
- package/assets/skills/explainer-kit/scripts/lib/internal-references.mjs +538 -0
- package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +129 -11
- package/assets/skills/explainer-kit/scripts/lib/publication-policy.mjs +54 -0
- package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +2 -1
- package/assets/skills/explainer-kit/scripts/lib/records.mjs +139 -22
- package/assets/skills/explainer-kit/scripts/lib/s3-roots.mjs +353 -0
- package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +237 -107
- package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +1 -0
- package/assets/skills/explainer-kit/scripts/lib/terminal-evidence.mjs +157 -0
- package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +26 -6
- package/assets/skills/explainer-kit/scripts/run.mjs +1006 -144
- package/assets/skills/oat-explainer-kit/SKILL.md +16 -3
- package/assets/skills/oat-explainer-kit/references/config-contract.md +13 -8
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +50 -6
- package/assets/skills/oat-explainer-kit/references/migration.md +2 -1
- package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +11 -0
- package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +37 -15
- package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +83 -0
- package/assets/skills/oat-explainer-kit/scripts/derive-destination.mjs +91 -0
- package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +66 -10
- package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +60 -21
- package/assets/skills/oat-explainer-kit/scripts/resolve-paths.mjs +52 -8
- package/assets/skills/oat-explainer-kit/scripts/run.mjs +271 -36
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +38 -38
- package/assets/skills/oat-project-complete/SKILL.md +60 -8
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +38 -38
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +28 -6
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +38 -38
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +38 -38
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +38 -38
- package/assets/skills/oat-project-retro/SKILL.md +310 -0
- package/assets/skills/oat-project-retro/references/apply-procedure.md +212 -0
- package/assets/skills/oat-project-retro/references/evidence-and-lanes.md +91 -0
- package/assets/skills/oat-project-retro/references/retro-quality-bar.md +100 -0
- package/assets/skills/oat-project-retro-file/SKILL.md +387 -0
- package/assets/templates/project-retro.md +236 -0
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +99 -0
- package/dist/commands/init/tools/shared/skill-manifest.d.ts +2 -2
- package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
- package/dist/commands/init/tools/shared/skill-manifest.js +3 -0
- package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
- package/dist/commands/project/archive/archive-utils.js +57 -7
- package/dist/commands/project/archive/explainer-terminal-evidence.d.ts +29 -0
- package/dist/commands/project/archive/explainer-terminal-evidence.d.ts.map +1 -0
- package/dist/commands/project/archive/explainer-terminal-evidence.js +37 -0
- package/dist/config/oat-config.d.ts +14 -1
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +42 -2
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +9 -0
- package/package.json +2 -2
- /package/assets/skills/explainer-kit/recipes/{project-recap.json → project-recap.v1.json} +0 -0
- /package/assets/skills/explainer-kit/schemas/{publish-receipt.schema.json → publish-receipt.v1.schema.json} +0 -0
- /package/assets/skills/explainer-kit/schemas/{publish-request.schema.json → publish-request.v1.schema.json} +0 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
---
|
|
2
|
+
oat_retro_project: null
|
|
3
|
+
oat_retro_generated: null
|
|
4
|
+
oat_retro_evidence_sources:
|
|
5
|
+
- source: project-log
|
|
6
|
+
status: unavailable
|
|
7
|
+
- source: oat-execution-learnings
|
|
8
|
+
status: unavailable
|
|
9
|
+
- source: lifecycle-artifacts
|
|
10
|
+
status: unavailable
|
|
11
|
+
- source: session-transcript
|
|
12
|
+
status: unavailable
|
|
13
|
+
oat_retro_promotions: none
|
|
14
|
+
oat_retro_filing: none
|
|
15
|
+
oat_generated: false
|
|
16
|
+
oat_template: true
|
|
17
|
+
oat_template_name: project-retro
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Project Retrospective: {Project Name}
|
|
21
|
+
|
|
22
|
+
<!-- Rendered artifacts must replace oat_retro_project with a non-null project
|
|
23
|
+
slug and oat_retro_generated with a UTC YYYY-MM-DDTHH:MM:SSZ timestamp,
|
|
24
|
+
set oat_template: false, and remove oat_template_name. Record every
|
|
25
|
+
inspected evidence source above with status: used | unavailable. When an
|
|
26
|
+
evidence family is partial, split it into truthful source entries, such as
|
|
27
|
+
archived-review-markdown: unavailable and gate-receipts: used. Do not add
|
|
28
|
+
a `partial` evidence status. Derivative current-run reconnaissance
|
|
29
|
+
transcripts are not original project-run evidence. Remove all
|
|
30
|
+
brace-delimited placeholders and scaffold RP/UP item examples. -->
|
|
31
|
+
|
|
32
|
+
<!-- Keep output concise by default. Every section must add distinct
|
|
33
|
+
information. Prefer references to evidence over repeated chronology. For
|
|
34
|
+
a small project, keep core sections brief. Use subsections and tables only
|
|
35
|
+
for evidence-rich projects where they improve decisions. Make each
|
|
36
|
+
material incident understandable without opening another artifact. Use
|
|
37
|
+
stable evidence anchors such as project-log event IDs, artifact headings,
|
|
38
|
+
review paths, decision IDs, and commit IDs. Anchors supplement but never
|
|
39
|
+
replace explanation. -->
|
|
40
|
+
|
|
41
|
+
## Executive Summary
|
|
42
|
+
|
|
43
|
+
{Summarize how the run went, the most important outcome, and what should change next.}
|
|
44
|
+
|
|
45
|
+
## Evidence and Review Method
|
|
46
|
+
|
|
47
|
+
{List the durable project artifacts and session/run evidence reviewed. State
|
|
48
|
+
unavailable sources explicitly. Distinguish confirmed causes, hypotheses, and
|
|
49
|
+
inconclusive mechanisms.}
|
|
50
|
+
|
|
51
|
+
## Outcome Snapshot
|
|
52
|
+
|
|
53
|
+
{Summarize delivered scope, verification, lifecycle outcome, and material
|
|
54
|
+
boundaries in a concise table or list.}
|
|
55
|
+
|
|
56
|
+
## Current State
|
|
57
|
+
|
|
58
|
+
<!-- This is the only mutable freeform status surface. Derive it from register
|
|
59
|
+
fields and frontmatter rollups after generation and after every apply/file
|
|
60
|
+
writeback. Consumers may replace only the contents of this section, not
|
|
61
|
+
this heading or any other narrative. Keep it concise and include
|
|
62
|
+
promotions, filing, and unsettled-item state. -->
|
|
63
|
+
|
|
64
|
+
- **Promotions:** {Current promotion rollup and item state.}
|
|
65
|
+
- **Filing:** {Current filing rollup and item state.}
|
|
66
|
+
- **Unsettled items:** {Current IDs and next actions, or `None`.}
|
|
67
|
+
|
|
68
|
+
## What Went Well
|
|
69
|
+
|
|
70
|
+
{Describe successful technical and workflow practices, grounded in evidence.}
|
|
71
|
+
|
|
72
|
+
## Challenges and Struggles
|
|
73
|
+
|
|
74
|
+
{Own the complete incident narrative here: what happened, impact, response, and
|
|
75
|
+
result. Describe blockers, failed approaches, and orchestration friction.
|
|
76
|
+
Classify rather than blame.}
|
|
77
|
+
|
|
78
|
+
<!-- CONDITIONAL: Include both sections below when load-bearing decisions or
|
|
79
|
+
rejected/superseded alternatives shaped the outcome. Otherwise delete
|
|
80
|
+
both headings and their placeholders. -->
|
|
81
|
+
|
|
82
|
+
## Decision Register
|
|
83
|
+
|
|
84
|
+
{Record decisions, rationale, consequences, and existing durable records.
|
|
85
|
+
Identify any justified missing decision records.}
|
|
86
|
+
|
|
87
|
+
## Rejected or Superseded Alternatives
|
|
88
|
+
|
|
89
|
+
{Record alternatives that materially shaped the outcome and why they were
|
|
90
|
+
rejected or superseded.}
|
|
91
|
+
|
|
92
|
+
## Where We Changed Course
|
|
93
|
+
|
|
94
|
+
{Record only the trigger, changed direction, and outcome. Do not repeat the
|
|
95
|
+
complete incident chronology from Challenges and Struggles.}
|
|
96
|
+
|
|
97
|
+
<!-- CONDITIONAL: Include when the project introduced reusable architecture
|
|
98
|
+
patterns or materially new approaches. Otherwise delete this section. -->
|
|
99
|
+
|
|
100
|
+
## New Architecture Patterns and Approaches
|
|
101
|
+
|
|
102
|
+
{Describe reusable patterns, their boundaries, and why they worked.}
|
|
103
|
+
|
|
104
|
+
<!-- CONDITIONAL: Include when the run produced project-domain knowledge worth
|
|
105
|
+
preserving. Rename subsections for the domain as needed. Otherwise delete
|
|
106
|
+
this section. -->
|
|
107
|
+
|
|
108
|
+
## Domain Learnings
|
|
109
|
+
|
|
110
|
+
{Abstract reusable lessons without replaying chronology. Capture domain failure
|
|
111
|
+
classes and correct responses.}
|
|
112
|
+
|
|
113
|
+
<!-- CONDITIONAL: Include when the evidence supports actionable guidance for
|
|
114
|
+
humans. Otherwise delete this section. -->
|
|
115
|
+
|
|
116
|
+
## Gotchas for Humans
|
|
117
|
+
|
|
118
|
+
{Write future-facing instructions rather than incident summaries. List concrete
|
|
119
|
+
operator or contributor gotchas.}
|
|
120
|
+
|
|
121
|
+
<!-- CONDITIONAL: Include when the evidence supports actionable guidance for
|
|
122
|
+
autonomous agents. Otherwise delete this section. -->
|
|
123
|
+
|
|
124
|
+
## Gotchas for Autonomous Agents
|
|
125
|
+
|
|
126
|
+
{Write future-facing instructions rather than incident summaries. List concrete
|
|
127
|
+
execution, evidence, monitoring, and escalation gotchas.}
|
|
128
|
+
|
|
129
|
+
## Repo Improvements (Promotion Register)
|
|
130
|
+
|
|
131
|
+
<!-- Stable IDs: RP-NN. Type defaults: docs, agents-instruction, rule, and
|
|
132
|
+
decision default to Disposition: apply; code-follow-up defaults to
|
|
133
|
+
Disposition: file. The recorded Disposition is authoritative.
|
|
134
|
+
|
|
135
|
+
Apply item fields:
|
|
136
|
+
Status: proposed | approved | applied | rejected
|
|
137
|
+
Target: repository path
|
|
138
|
+
Applied-ref: commit/path after application
|
|
139
|
+
Disposition-note: rejection, recovery, or outcome detail
|
|
140
|
+
|
|
141
|
+
File item fields:
|
|
142
|
+
Status: proposed | filed | rejected | no-destination
|
|
143
|
+
Destination: issue URL or backlog item ID/path
|
|
144
|
+
Destination-receipt: full commit SHA for a local backlog destination
|
|
145
|
+
Remote-visibility: pushed | unpushed for a local backlog destination
|
|
146
|
+
Disposition-note: rejection, recovery, or outcome detail
|
|
147
|
+
|
|
148
|
+
Schema by destination type:
|
|
149
|
+
Local backlog + filed: Destination-receipt is a verified full commit SHA
|
|
150
|
+
and Remote-visibility is pushed | unpushed.
|
|
151
|
+
GitHub + filed: Destination is a validated issue URL,
|
|
152
|
+
Destination-receipt: —, and Remote-visibility: —.
|
|
153
|
+
Unsettled local or GitHub item: receipt fields remain —.
|
|
154
|
+
|
|
155
|
+
Consumers may mutate only Status, Applied-ref or Destination, and
|
|
156
|
+
Destination-receipt, Remote-visibility, Sanitized, Disposition-note, plus
|
|
157
|
+
the corresponding frontmatter rollup and Current State contents. IDs,
|
|
158
|
+
Type, Disposition, titles, proposal bodies, and all other narrative are
|
|
159
|
+
stable. -->
|
|
160
|
+
|
|
161
|
+
### RP-01: {Actionable repo improvement}
|
|
162
|
+
|
|
163
|
+
- **Type:** docs
|
|
164
|
+
- **Disposition:** apply
|
|
165
|
+
- **Status:** proposed
|
|
166
|
+
- **Target:** {repository path}
|
|
167
|
+
- **Applied-ref:** —
|
|
168
|
+
- **Disposition-note:** —
|
|
169
|
+
|
|
170
|
+
{Rationale, evidence summary, and concrete proposed change.}
|
|
171
|
+
|
|
172
|
+
### RP-02: {Tracker-ready repo follow-up}
|
|
173
|
+
|
|
174
|
+
- **Type:** code-follow-up
|
|
175
|
+
- **Disposition:** file
|
|
176
|
+
- **Status:** proposed
|
|
177
|
+
- **Destination:** —
|
|
178
|
+
- **Destination-receipt:** —
|
|
179
|
+
- **Remote-visibility:** —
|
|
180
|
+
- **Sanitized:** no
|
|
181
|
+
- **Disposition-note:** —
|
|
182
|
+
|
|
183
|
+
{Problem, evidence summary, and suggested direction.}
|
|
184
|
+
|
|
185
|
+
## OAT Upstream Feedback (Upstream Register)
|
|
186
|
+
|
|
187
|
+
<!-- Stable IDs: UP-NN. Status: proposed | filed | rejected | no-destination.
|
|
188
|
+
Destination records the issue URL or backlog item ID/path. Sanitized
|
|
189
|
+
records whether the public-destination verification passed. Consumers may
|
|
190
|
+
mutate only Status, Destination, Destination-receipt, Remote-visibility,
|
|
191
|
+
Sanitized, Disposition-note, the filing rollup, and Current State
|
|
192
|
+
contents. IDs, titles, proposal bodies, and all other narrative are
|
|
193
|
+
stable. Local filed items require a verified full commit receipt and
|
|
194
|
+
pushed | unpushed visibility. GitHub filed items require a validated URL
|
|
195
|
+
with Destination-receipt: — and Remote-visibility: —. -->
|
|
196
|
+
|
|
197
|
+
No upstream feedback identified.
|
|
198
|
+
|
|
199
|
+
<!-- Replace the empty-state line above with items in this form:
|
|
200
|
+
|
|
201
|
+
### UP-01: {Tracker-ready upstream feedback}
|
|
202
|
+
|
|
203
|
+
- **Status:** proposed
|
|
204
|
+
- **Destination:** —
|
|
205
|
+
- **Destination-receipt:** —
|
|
206
|
+
- **Remote-visibility:** —
|
|
207
|
+
- **Sanitized:** no
|
|
208
|
+
- **Disposition-note:** —
|
|
209
|
+
|
|
210
|
+
{Problem, evidence summary, and suggested direction.}
|
|
211
|
+
-->
|
|
212
|
+
|
|
213
|
+
<!-- Rollup derivation:
|
|
214
|
+
oat_retro_promotions derives only from RP items with Disposition: apply.
|
|
215
|
+
`none`: no apply items exist.
|
|
216
|
+
`proposed`: apply items exist and none are settled.
|
|
217
|
+
`partial`: a mix of settled and unsettled apply items exists.
|
|
218
|
+
`complete`: all apply items are settled.
|
|
219
|
+
`proposed` and `approved` are unsettled; `applied` and `rejected` are settled.
|
|
220
|
+
oat_retro_filing derives from all UP items plus RP items with
|
|
221
|
+
Disposition: file.
|
|
222
|
+
Each rollup is none | proposed | partial | complete and must be
|
|
223
|
+
computable from register fields alone. -->
|
|
224
|
+
|
|
225
|
+
<!-- CONDITIONAL: Include when unresolved work or explicit ownership boundaries
|
|
226
|
+
remain. Otherwise delete this section. -->
|
|
227
|
+
|
|
228
|
+
## Remaining Boundaries and Follow-Ups
|
|
229
|
+
|
|
230
|
+
{Record unresolved boundaries, owners, and next steps without disguising them
|
|
231
|
+
as completed work.}
|
|
232
|
+
|
|
233
|
+
## Reflections
|
|
234
|
+
|
|
235
|
+
{End with run-specific reflections about what the project taught, what made the
|
|
236
|
+
result trustworthy, and what future work should do differently.}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAmBzC,OAAO,EAML,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAehB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,mCAAmC,EACnC,0BAA0B,EAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAmBzC,OAAO,EAML,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAehB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,mCAAmC,EACnC,0BAA0B,EAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyGpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC7C,mCAAmC,EAAE,OAAO,mCAAmC,CAAC;IAChF,0BAA0B,EAAE,OAAO,0BAA0B,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAgiFD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAsKT"}
|
|
@@ -46,6 +46,7 @@ const KEY_ORDER = [
|
|
|
46
46
|
'explainers.publish.s3Uri',
|
|
47
47
|
'explainers.publish.publicBaseUrl',
|
|
48
48
|
'explainers.publish.awsRegion',
|
|
49
|
+
'explainers.publish.publicAccess',
|
|
49
50
|
'explainers.publish.awsProfile',
|
|
50
51
|
'git.defaultBranch',
|
|
51
52
|
'projects.root',
|
|
@@ -62,6 +63,10 @@ const KEY_ORDER = [
|
|
|
62
63
|
'workflow.archiveOnComplete',
|
|
63
64
|
'workflow.createPrOnComplete',
|
|
64
65
|
'workflow.postImplementSequence',
|
|
66
|
+
'workflow.retro.filing.repo',
|
|
67
|
+
'workflow.retro.filing.upstream',
|
|
68
|
+
'workflow.retro.apply',
|
|
69
|
+
'workflow.retro.upstreamRepo',
|
|
65
70
|
'workflow.reviewExecutionModel',
|
|
66
71
|
'workflow.autoReviewAtHillCheckpoints',
|
|
67
72
|
'workflow.autoNarrowReReviewScope',
|
|
@@ -412,6 +417,17 @@ const CONFIG_CATALOG = [
|
|
|
412
417
|
owningCommand: 'oat config set explainers.publish.awsRegion <region> --shared',
|
|
413
418
|
description: 'AWS region used for explainer publishing.',
|
|
414
419
|
},
|
|
420
|
+
{
|
|
421
|
+
key: 'explainers.publish.publicAccess',
|
|
422
|
+
group: 'Explainer Publish (shared)',
|
|
423
|
+
file: '.oat/config.json',
|
|
424
|
+
scope: 'shared repo',
|
|
425
|
+
type: 'public | protected',
|
|
426
|
+
defaultValue: 'public',
|
|
427
|
+
mutability: 'read/write',
|
|
428
|
+
owningCommand: 'oat config set explainers.publish.publicAccess <public|protected> --shared',
|
|
429
|
+
description: 'Declares whether published explainer URLs support anonymous access; it does not authorize publication.',
|
|
430
|
+
},
|
|
415
431
|
{
|
|
416
432
|
key: 'explainers.publish.awsProfile',
|
|
417
433
|
group: 'Explainer Publish Credentials (local > user)',
|
|
@@ -544,6 +560,50 @@ const CONFIG_CATALOG = [
|
|
|
544
560
|
owningCommand: "oat config set workflow.postImplementSequence '<legacy-or-json>'",
|
|
545
561
|
description: 'Default post-implementation chaining. Legacy strings remain supported unchanged. Structured JSON uses {"preApproval":[...],"postApproval":[...]} with the canonical sequence steps. Plain get/list/dump output serializes structured values as compact JSON; get --json preserves the object value. When unset, the skill prompts. Resolution: local > shared > user > default.',
|
|
546
562
|
},
|
|
563
|
+
{
|
|
564
|
+
key: 'workflow.retro.filing.repo',
|
|
565
|
+
group: 'Workflow Preferences (3-layer: local > shared > user)',
|
|
566
|
+
file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
|
|
567
|
+
scope: 'workflow',
|
|
568
|
+
type: 'issues | backlog | none',
|
|
569
|
+
defaultValue: 'unset',
|
|
570
|
+
mutability: 'read/write',
|
|
571
|
+
owningCommand: 'oat config set workflow.retro.filing.repo <issues|backlog|none>',
|
|
572
|
+
description: 'Default filing destination for host-repository retro items. Resolution: local > shared > user > default.',
|
|
573
|
+
},
|
|
574
|
+
{
|
|
575
|
+
key: 'workflow.retro.filing.upstream',
|
|
576
|
+
group: 'Workflow Preferences (3-layer: local > shared > user)',
|
|
577
|
+
file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
|
|
578
|
+
scope: 'workflow',
|
|
579
|
+
type: 'issues | none',
|
|
580
|
+
defaultValue: 'unset',
|
|
581
|
+
mutability: 'read/write',
|
|
582
|
+
owningCommand: 'oat config set workflow.retro.filing.upstream <issues|none>',
|
|
583
|
+
description: 'Default filing destination for upstream retro items. Resolution: local > shared > user > default.',
|
|
584
|
+
},
|
|
585
|
+
{
|
|
586
|
+
key: 'workflow.retro.apply',
|
|
587
|
+
group: 'Workflow Preferences (3-layer: local > shared > user)',
|
|
588
|
+
file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
|
|
589
|
+
scope: 'workflow',
|
|
590
|
+
type: 'auto | ask',
|
|
591
|
+
defaultValue: 'ask',
|
|
592
|
+
mutability: 'read/write',
|
|
593
|
+
owningCommand: 'oat config set workflow.retro.apply <auto|ask>',
|
|
594
|
+
description: 'Controls whether non-interactive retro runs apply approved repo promotions automatically or remain propose-only. Resolution: local > shared > user > default.',
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
key: 'workflow.retro.upstreamRepo',
|
|
598
|
+
group: 'Workflow Preferences (3-layer: local > shared > user)',
|
|
599
|
+
file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
|
|
600
|
+
scope: 'workflow',
|
|
601
|
+
type: 'owner/name repository slug',
|
|
602
|
+
defaultValue: 'unset',
|
|
603
|
+
mutability: 'read/write',
|
|
604
|
+
owningCommand: 'oat config set workflow.retro.upstreamRepo <owner/name>',
|
|
605
|
+
description: 'Repository that receives upstream retro feedback; the workflow skill supplies its ecosystem default. Resolution: local > shared > user > default.',
|
|
606
|
+
},
|
|
547
607
|
{
|
|
548
608
|
key: 'workflow.reviewExecutionModel',
|
|
549
609
|
group: 'Workflow Preferences (3-layer: local > shared > user)',
|
|
@@ -884,6 +944,12 @@ function parseExplainerValue(key, rawValue, surface) {
|
|
|
884
944
|
}
|
|
885
945
|
return value.replace(/\/+$/, '');
|
|
886
946
|
}
|
|
947
|
+
if (key === 'explainers.publish.publicAccess') {
|
|
948
|
+
if (value !== 'public' && value !== 'protected') {
|
|
949
|
+
throw new Error(`Invalid value for ${key}: expected 'public' or 'protected', got '${rawValue}'.`);
|
|
950
|
+
}
|
|
951
|
+
return value;
|
|
952
|
+
}
|
|
887
953
|
return value;
|
|
888
954
|
}
|
|
889
955
|
const WORKFLOW_ENUM_VALUES = {
|
|
@@ -909,6 +975,9 @@ const WORKFLOW_ENUM_VALUES = {
|
|
|
909
975
|
],
|
|
910
976
|
'workflow.explainers.projectExplainer': ['always', 'ask', 'never'],
|
|
911
977
|
'workflow.explainers.projectRecap': ['always', 'ask', 'never'],
|
|
978
|
+
'workflow.retro.filing.repo': ['issues', 'backlog', 'none'],
|
|
979
|
+
'workflow.retro.filing.upstream': ['issues', 'none'],
|
|
980
|
+
'workflow.retro.apply': ['auto', 'ask'],
|
|
912
981
|
};
|
|
913
982
|
function closedDispatchProviderValues(provider) {
|
|
914
983
|
if (provider === 'codex') {
|
|
@@ -1059,6 +1128,13 @@ function parseWorkflowValue(key, rawValue) {
|
|
|
1059
1128
|
return sequence;
|
|
1060
1129
|
}
|
|
1061
1130
|
}
|
|
1131
|
+
if (key === 'workflow.retro.upstreamRepo') {
|
|
1132
|
+
const normalized = rawValue.trim();
|
|
1133
|
+
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(normalized)) {
|
|
1134
|
+
throw new Error(`Invalid value for ${key}: expected an owner/name repository slug, got '${rawValue}'`);
|
|
1135
|
+
}
|
|
1136
|
+
return normalized;
|
|
1137
|
+
}
|
|
1062
1138
|
if (key === 'workflow.gateTimeouts.code' ||
|
|
1063
1139
|
key === 'workflow.gateTimeouts.artifact') {
|
|
1064
1140
|
const value = Number(rawValue);
|
|
@@ -1293,6 +1369,29 @@ function applyWorkflowValue(workflow, key, value) {
|
|
|
1293
1369
|
},
|
|
1294
1370
|
};
|
|
1295
1371
|
}
|
|
1372
|
+
if (subKey.startsWith('retro.filing.')) {
|
|
1373
|
+
const filingKey = subKey.slice('retro.filing.'.length);
|
|
1374
|
+
return {
|
|
1375
|
+
...workflow,
|
|
1376
|
+
retro: {
|
|
1377
|
+
...workflow.retro,
|
|
1378
|
+
filing: {
|
|
1379
|
+
...workflow.retro?.filing,
|
|
1380
|
+
[filingKey]: value,
|
|
1381
|
+
},
|
|
1382
|
+
},
|
|
1383
|
+
};
|
|
1384
|
+
}
|
|
1385
|
+
if (subKey.startsWith('retro.')) {
|
|
1386
|
+
const retroKey = subKey.slice('retro.'.length);
|
|
1387
|
+
return {
|
|
1388
|
+
...workflow,
|
|
1389
|
+
retro: {
|
|
1390
|
+
...workflow.retro,
|
|
1391
|
+
[retroKey]: value,
|
|
1392
|
+
},
|
|
1393
|
+
};
|
|
1394
|
+
}
|
|
1296
1395
|
return {
|
|
1297
1396
|
...workflow,
|
|
1298
1397
|
[subKey]: value,
|
|
@@ -11,9 +11,9 @@ export interface PackMetadata {
|
|
|
11
11
|
}
|
|
12
12
|
export declare const PACK_METADATA: Record<string, PackMetadata>;
|
|
13
13
|
export declare function resolvePackDefaultScope(packName: string): 'user' | 'project';
|
|
14
|
-
export declare const WORKFLOW_SKILLS: readonly ['oat-cursor-cloud-projects', 'oat-explainer-kit', 'oat-project-autonomous', 'oat-project-capture', 'oat-project-clear-active', 'oat-project-complete', 'oat-project-design', 'oat-project-dispatch-subagents', 'oat-project-discover', 'oat-project-document', 'oat-project-implement', 'oat-project-import-plan', 'oat-project-new', 'oat-project-next', 'oat-project-open', 'oat-project-plan', 'oat-project-plan-writing', 'oat-project-pr-final', 'oat-project-pr-progress', 'oat-project-progress', 'oat-project-promote-spec-driven', 'oat-project-quick-start', 'oat-project-reconcile', 'oat-project-revise', 'oat-project-review-provide', 'oat-project-review-provide-remote', 'oat-project-review-receive', 'oat-project-review-receive-remote', 'oat-project-spec', 'oat-project-split', 'oat-project-summary', 'oat-repo-knowledge-index', 'oat-worktree-bootstrap', 'oat-worktree-bootstrap-auto', 'oat-wave-execute', 'oat-wave-program', 'oat-wrap-up'];
|
|
14
|
+
export declare const WORKFLOW_SKILLS: readonly ['oat-cursor-cloud-projects', 'oat-explainer-kit', 'oat-project-autonomous', 'oat-project-capture', 'oat-project-clear-active', 'oat-project-complete', 'oat-project-design', 'oat-project-dispatch-subagents', 'oat-project-discover', 'oat-project-document', 'oat-project-implement', 'oat-project-import-plan', 'oat-project-new', 'oat-project-next', 'oat-project-open', 'oat-project-plan', 'oat-project-plan-writing', 'oat-project-pr-final', 'oat-project-pr-progress', 'oat-project-progress', 'oat-project-promote-spec-driven', 'oat-project-quick-start', 'oat-project-reconcile', 'oat-project-retro', 'oat-project-retro-file', 'oat-project-revise', 'oat-project-review-provide', 'oat-project-review-provide-remote', 'oat-project-review-receive', 'oat-project-review-receive-remote', 'oat-project-spec', 'oat-project-split', 'oat-project-summary', 'oat-repo-knowledge-index', 'oat-worktree-bootstrap', 'oat-worktree-bootstrap-auto', 'oat-wave-execute', 'oat-wave-program', 'oat-wrap-up'];
|
|
15
15
|
export declare const WORKFLOW_AGENTS: readonly ['oat-codebase-mapper.md', 'oat-phase-implementer.md', 'oat-reviewer.md'];
|
|
16
|
-
export declare const WORKFLOW_TEMPLATES: readonly ['state.md', 'discovery.md', 'spec.md', 'design.md', 'plan.md', 'implementation.md', 'summary.md', 'project-log.md'];
|
|
16
|
+
export declare const WORKFLOW_TEMPLATES: readonly ['state.md', 'discovery.md', 'spec.md', 'design.md', 'plan.md', 'implementation.md', 'summary.md', 'project-log.md', 'project-retro.md'];
|
|
17
17
|
export declare const WORKFLOW_SCRIPTS: readonly ['generate-oat-state.sh', 'generate-thin-index.sh', 'resolve-tracking.sh'];
|
|
18
18
|
export declare const IDEA_SKILLS: readonly ['oat-idea-new', 'oat-idea-ideate', 'oat-idea-summarize', 'oat-idea-scratchpad'];
|
|
19
19
|
export declare const CORE_SKILLS: readonly ['oat-docs', 'oat-doctor'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-manifest.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/shared/skill-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAKtD,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE5E;AAID,eAAO,MAAM,eAAe,YAC1B,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,gCAAgC,EAChC,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,iCAAiC,EACjC,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,4BAA4B,EAC5B,mCAAmC,EACnC,4BAA4B,EAC5B,mCAAmC,EACnC,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,6BAA6B,EAC7B,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,CACL,CAAC;AAEX,eAAO,MAAM,eAAe,YAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,CACT,CAAC;AAEX,eAAO,MAAM,kBAAkB,YAC7B,UAAU,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,
|
|
1
|
+
{"version":3,"file":"skill-manifest.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/shared/skill-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAKtD,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE5E;AAID,eAAO,MAAM,eAAe,YAC1B,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,gCAAgC,EAChC,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,iCAAiC,EACjC,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,4BAA4B,EAC5B,mCAAmC,EACnC,4BAA4B,EAC5B,mCAAmC,EACnC,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,6BAA6B,EAC7B,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,CACL,CAAC;AAEX,eAAO,MAAM,eAAe,YAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,CACT,CAAC;AAEX,eAAO,MAAM,kBAAkB,YAC7B,UAAU,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,CACV,CAAC;AAEX,eAAO,MAAM,gBAAgB,YAC3B,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,CACb,CAAC;AAIX,eAAO,MAAM,WAAW,YACtB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,CACb,CAAC;AAIX,eAAO,MAAM,WAAW,YAAI,UAAU,EAAE,YAAY,CAAU,CAAC;AAI/D,eAAO,MAAM,WAAW,YACtB,gBAAgB,EAChB,gCAAgC,EAChC,8BAA8B,EAC9B,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,CACZ,CAAC;AAEX,eAAO,MAAM,YAAY,YAAI,qBAAqB,CAAU,CAAC;AAI7D,eAAO,MAAM,cAAc,YACzB,uBAAuB,EACvB,eAAe,EACf,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,iCAAiC,EACjC,oBAAoB,EACpB,2BAA2B,EAC3B,oBAAoB,EACpB,2BAA2B,CACnB,CAAC;AAIX,eAAO,MAAM,yBAAyB,YACpC,0BAA0B,EAC1B,kBAAkB,EAClB,+BAA+B,EAC/B,wBAAwB,CAChB,CAAC;AAEX,eAAO,MAAM,4BAA4B,YACvC,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,qBAAqB,CACb,CAAC;AAEX,eAAO,MAAM,0BAA0B,aAAc,CAAC;AAItD,eAAO,MAAM,iBAAiB,YAAI,gBAAgB,CAAU,CAAC;AAI7D,eAAO,MAAM,eAAe,YAC1B,SAAS,EACT,SAAS,EACT,eAAe,EACf,SAAS,EACT,YAAY,CACJ,CAAC;AAEX,eAAO,MAAM,eAAe,YAAI,wBAAwB,CAAU,CAAC"}
|
|
@@ -39,6 +39,8 @@ export const WORKFLOW_SKILLS = [
|
|
|
39
39
|
'oat-project-promote-spec-driven',
|
|
40
40
|
'oat-project-quick-start',
|
|
41
41
|
'oat-project-reconcile',
|
|
42
|
+
'oat-project-retro',
|
|
43
|
+
'oat-project-retro-file',
|
|
42
44
|
'oat-project-revise',
|
|
43
45
|
'oat-project-review-provide',
|
|
44
46
|
'oat-project-review-provide-remote',
|
|
@@ -68,6 +70,7 @@ export const WORKFLOW_TEMPLATES = [
|
|
|
68
70
|
'implementation.md',
|
|
69
71
|
'summary.md',
|
|
70
72
|
'project-log.md',
|
|
73
|
+
'project-retro.md',
|
|
71
74
|
];
|
|
72
75
|
export const WORKFLOW_SCRIPTS = [
|
|
73
76
|
'generate-oat-state.sh',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive-utils.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/archive-utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,MAAM,EAGP,MAAM,kBAAkB,CAAC;AAc1B,OAAO,EACL,aAAa,EACb,cAAc,EACd,SAAS,EACT,SAAS,EACT,UAAU,EACX,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"archive-utils.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/archive-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { CliError } from '../../../errors/cli-error.js';
|
|
|
7
7
|
import { copyDirectory, copySingleFile, dirExists, ensureDir, fileExists, } from '../../../fs/io.js';
|
|
8
8
|
import { loadExplainerPackageCoverage } from './explainer-package-coverage.js';
|
|
9
9
|
import { loadExplainerSourceBacklinks, } from './explainer-source-backlinks.js';
|
|
10
|
+
import { loadExplainerTerminalEvidence } from './explainer-terminal-evidence.js';
|
|
10
11
|
const execFileAsync = promisify(execFileCallback);
|
|
11
12
|
export const ARCHIVE_SNAPSHOT_METADATA_FILENAME = '.oat-archive-source.json';
|
|
12
13
|
/**
|
|
@@ -564,6 +565,25 @@ async function readVerifiedRunMode(runRoot) {
|
|
|
564
565
|
}
|
|
565
566
|
return request.mode;
|
|
566
567
|
}
|
|
568
|
+
async function verifyProjectRecapTerminalEvidence(runRoot, manifest, expected) {
|
|
569
|
+
if (!['built-needs-review', 'failed'].includes(manifest.outcome)) {
|
|
570
|
+
return null;
|
|
571
|
+
}
|
|
572
|
+
try {
|
|
573
|
+
const terminalEvidence = await loadExplainerTerminalEvidence();
|
|
574
|
+
const verified = await terminalEvidence.readTerminalEvidenceFile(runRoot, {
|
|
575
|
+
manifest,
|
|
576
|
+
...(expected && {
|
|
577
|
+
expectedBytes: expected.bytes,
|
|
578
|
+
expectedHash: expected.hash,
|
|
579
|
+
}),
|
|
580
|
+
});
|
|
581
|
+
return { bytes: verified.bytes, hash: verified.hash };
|
|
582
|
+
}
|
|
583
|
+
catch {
|
|
584
|
+
throw new CliError('Selected project recap requires valid confined terminal evidence before archival.');
|
|
585
|
+
}
|
|
586
|
+
}
|
|
567
587
|
async function loadVerifiedProjectRecap(projectPath, projectRecapRun) {
|
|
568
588
|
const sourceRunRoot = await resolveSelectedProjectRecapRun(projectPath, projectRecapRun);
|
|
569
589
|
const manifestContents = await readFile(join(sourceRunRoot, 'manifest.json'), 'utf8');
|
|
@@ -571,9 +591,6 @@ async function loadVerifiedProjectRecap(projectPath, projectRecapRun) {
|
|
|
571
591
|
if (manifest.recipe.id !== 'project-recap') {
|
|
572
592
|
throw new CliError('Selected project recap manifest recipe must be exactly `project-recap`.');
|
|
573
593
|
}
|
|
574
|
-
if (manifest.outcome === 'built-needs-review') {
|
|
575
|
-
throw new CliError('Selected project recap is built-needs-review and requires a passing visual review before archival.');
|
|
576
|
-
}
|
|
577
594
|
const verifiedArtifactCount = await verifyProjectRecapImmutableHashes(sourceRunRoot, manifest);
|
|
578
595
|
const runMode = await readVerifiedRunMode(sourceRunRoot);
|
|
579
596
|
const packageCoverage = await loadExplainerPackageCoverage();
|
|
@@ -605,11 +622,29 @@ async function loadVerifiedProjectRecap(projectPath, projectRecapRun) {
|
|
|
605
622
|
artifact.hash !== manifest.immutableHashes[artifact.renderedPath])) {
|
|
606
623
|
throw new CliError('Selected project recap artifact hashes do not match the immutable package.');
|
|
607
624
|
}
|
|
625
|
+
const terminalEvidence = await verifyProjectRecapTerminalEvidence(sourceRunRoot, manifest);
|
|
626
|
+
const exactCoverage = packageCoverage;
|
|
627
|
+
if (typeof exactCoverage.permissibleRunPackagePaths !== 'function' ||
|
|
628
|
+
typeof exactCoverage.enforceRunPackageInventory !== 'function') {
|
|
629
|
+
throw new CliError('Bundled explainer package coverage does not provide the exact run inventory.');
|
|
630
|
+
}
|
|
631
|
+
try {
|
|
632
|
+
await exactCoverage.enforceRunPackageInventory(sourceRunRoot, manifest, {
|
|
633
|
+
includeTerminalEvidence: terminalEvidence !== null,
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
catch {
|
|
637
|
+
throw new CliError('Selected project recap package inventory is invalid.');
|
|
638
|
+
}
|
|
608
639
|
return {
|
|
609
640
|
sourceRunRoot,
|
|
610
641
|
manifestContents,
|
|
611
642
|
manifest,
|
|
612
643
|
verifiedArtifactCount,
|
|
644
|
+
terminalEvidence,
|
|
645
|
+
packagePaths: exactCoverage.permissibleRunPackagePaths(manifest, {
|
|
646
|
+
includeTerminalEvidence: terminalEvidence !== null,
|
|
647
|
+
}),
|
|
613
648
|
};
|
|
614
649
|
}
|
|
615
650
|
export async function verifySelectedProjectRecapForArchive(projectPath, projectRecapRun) {
|
|
@@ -621,25 +656,40 @@ async function exportSelectedProjectRecap(options, snapshotName, dependencies) {
|
|
|
621
656
|
return null;
|
|
622
657
|
}
|
|
623
658
|
const verified = await loadVerifiedProjectRecap(options.projectPath, selectedRun);
|
|
624
|
-
const { sourceRunRoot, manifestContents: sourceManifestContents,
|
|
659
|
+
const { sourceRunRoot, manifestContents: sourceManifestContents, terminalEvidence: sourceTerminalEvidence, packagePaths, } = verified;
|
|
625
660
|
const exportRoot = join(options.repoRoot, '.oat', 'repo', 'reference', 'project-recaps', snapshotName);
|
|
626
661
|
if (await pathExists(exportRoot)) {
|
|
627
662
|
throw new CliError(`Project recap export destination \`${exportRoot}\` already exists; refusing to overwrite it.`);
|
|
628
663
|
}
|
|
629
664
|
const temporaryRoot = `${exportRoot}.tmp-${randomUUID()}`;
|
|
630
665
|
const makeDir = dependencies.ensureDir ?? ensureDir;
|
|
631
|
-
const
|
|
666
|
+
const copyFile = dependencies.copySingleFile ?? copySingleFile;
|
|
632
667
|
const removePath = dependencies.removePath ??
|
|
633
668
|
(async (target, removeOptions) => rm(target, removeOptions));
|
|
634
669
|
const renamePath = dependencies.renamePath ?? rename;
|
|
635
670
|
await makeDir(dirname(exportRoot));
|
|
636
671
|
try {
|
|
637
|
-
|
|
672
|
+
for (const relativePath of packagePaths) {
|
|
673
|
+
const destination = join(temporaryRoot, relativePath);
|
|
674
|
+
await makeDir(dirname(destination));
|
|
675
|
+
await copyFile(join(sourceRunRoot, relativePath), destination);
|
|
676
|
+
}
|
|
638
677
|
const stagedManifestContents = await readFile(join(temporaryRoot, 'manifest.json'), 'utf8');
|
|
639
678
|
if (stagedManifestContents !== sourceManifestContents) {
|
|
640
679
|
throw new CliError('Selected project recap manifest changed while staging the export.');
|
|
641
680
|
}
|
|
642
|
-
const
|
|
681
|
+
const stagedManifest = await parseProjectRecapManifest(stagedManifestContents);
|
|
682
|
+
const verifiedArtifactCount = await verifyProjectRecapImmutableHashes(temporaryRoot, stagedManifest);
|
|
683
|
+
const stagedTerminalEvidence = await verifyProjectRecapTerminalEvidence(temporaryRoot, stagedManifest, sourceTerminalEvidence ?? undefined);
|
|
684
|
+
const exactCoverage = (await loadExplainerPackageCoverage());
|
|
685
|
+
try {
|
|
686
|
+
await exactCoverage.enforceRunPackageInventory(temporaryRoot, stagedManifest, {
|
|
687
|
+
includeTerminalEvidence: stagedTerminalEvidence !== null,
|
|
688
|
+
});
|
|
689
|
+
}
|
|
690
|
+
catch {
|
|
691
|
+
throw new CliError('Staged project recap package inventory is invalid.');
|
|
692
|
+
}
|
|
643
693
|
await renamePath(temporaryRoot, exportRoot);
|
|
644
694
|
return {
|
|
645
695
|
sourceRunRoot,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
declare const TERMINAL_EVIDENCE_VERSION = "explainer-kit.terminal-evidence/v1";
|
|
2
|
+
export interface ExplainerTerminalEvidence {
|
|
3
|
+
TERMINAL_EVIDENCE_VERSION: typeof TERMINAL_EVIDENCE_VERSION;
|
|
4
|
+
assertTerminalEvidence: (evidence: unknown, context: {
|
|
5
|
+
manifest: unknown;
|
|
6
|
+
}) => unknown;
|
|
7
|
+
readTerminalEvidenceFile: (runRoot: string, context: {
|
|
8
|
+
manifest: unknown;
|
|
9
|
+
expectedBytes?: Uint8Array;
|
|
10
|
+
expectedHash?: string;
|
|
11
|
+
}) => Promise<{
|
|
12
|
+
evidence: unknown;
|
|
13
|
+
bytes: Buffer;
|
|
14
|
+
hash: string;
|
|
15
|
+
}>;
|
|
16
|
+
writeTerminalEvidence: (run: {
|
|
17
|
+
runId: string;
|
|
18
|
+
slug: string;
|
|
19
|
+
runRoot: string;
|
|
20
|
+
}, input: {
|
|
21
|
+
outcome: string;
|
|
22
|
+
manifest: unknown;
|
|
23
|
+
reasons: unknown[];
|
|
24
|
+
evidenceDisposition: string;
|
|
25
|
+
}) => Promise<string>;
|
|
26
|
+
}
|
|
27
|
+
export declare function loadExplainerTerminalEvidence(): Promise<ExplainerTerminalEvidence>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=explainer-terminal-evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainer-terminal-evidence.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/explainer-terminal-evidence.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,yBAAyB,uCAAuC,CAAC;AAEvE,MAAM,WAAW,yBAAyB;IACxC,yBAAyB,EAAE,OAAO,yBAAyB,CAAC;IAC5D,sBAAsB,EAAE,CACtB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,KAC3B,OAAO,CAAC;IACb,wBAAwB,EAAE,CACxB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,QAAQ,EAAE,OAAO,CAAC;QAClB,aAAa,CAAC,EAAE,UAAU,CAAC;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,KACE,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,qBAAqB,EAAE,CACrB,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EACrD,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,CAAC;QACnB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,KACE,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB;AAID,wBAAgB,6BAA6B,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAGlF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
import { CliError } from '../../../errors/cli-error.js';
|
|
4
|
+
import { resolveAssetsRoot } from '../../../fs/assets.js';
|
|
5
|
+
const TERMINAL_EVIDENCE_VERSION = 'explainer-kit.terminal-evidence/v1';
|
|
6
|
+
let cachedTerminalEvidence;
|
|
7
|
+
export function loadExplainerTerminalEvidence() {
|
|
8
|
+
cachedTerminalEvidence ??= loadGeneratedTerminalEvidence();
|
|
9
|
+
return cachedTerminalEvidence;
|
|
10
|
+
}
|
|
11
|
+
async function loadGeneratedTerminalEvidence() {
|
|
12
|
+
const assetsRoot = await resolveAssetsRoot();
|
|
13
|
+
const skillRoot = join(assetsRoot, 'skills', 'explainer-kit');
|
|
14
|
+
let contract;
|
|
15
|
+
let records;
|
|
16
|
+
try {
|
|
17
|
+
[contract, records] = await Promise.all([
|
|
18
|
+
import(pathToFileURL(join(skillRoot, 'scripts', 'lib', 'terminal-evidence.mjs')).href),
|
|
19
|
+
import(pathToFileURL(join(skillRoot, 'scripts', 'lib', 'records.mjs')).href),
|
|
20
|
+
]);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new CliError('Bundled explainer terminal evidence could not be loaded.', 2);
|
|
24
|
+
}
|
|
25
|
+
if (contract.TERMINAL_EVIDENCE_VERSION !== TERMINAL_EVIDENCE_VERSION ||
|
|
26
|
+
typeof contract.assertTerminalEvidence !== 'function' ||
|
|
27
|
+
typeof contract.readTerminalEvidenceFile !== 'function' ||
|
|
28
|
+
typeof records.writeTerminalEvidence !== 'function') {
|
|
29
|
+
throw new CliError(`Bundled assets must provide ${TERMINAL_EVIDENCE_VERSION} validation and writing.`, 2);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
TERMINAL_EVIDENCE_VERSION,
|
|
33
|
+
assertTerminalEvidence: contract.assertTerminalEvidence,
|
|
34
|
+
readTerminalEvidenceFile: contract.readTerminalEvidenceFile,
|
|
35
|
+
writeTerminalEvidence: records.writeTerminalEvidence,
|
|
36
|
+
};
|
|
37
|
+
}
|