@open-agent-toolkit/cli 0.2.5 → 0.2.7

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 (104) hide show
  1. package/assets/docs/cli-utilities/configuration.md +40 -0
  2. package/assets/docs/cli-utilities/tool-packs.md +31 -0
  3. package/assets/docs/workflows/projects/artifacts.md +27 -0
  4. package/assets/docs/workflows/skills/explainer-kit.md +125 -0
  5. package/assets/docs/workflows/skills/index.md +4 -0
  6. package/assets/migration/pjm-restructure.md +12 -0
  7. package/assets/public-package-versions.json +4 -4
  8. package/assets/skills/explainer-kit/SKILL.md +95 -0
  9. package/assets/skills/explainer-kit/examples/project-explainer/content.md +31 -0
  10. package/assets/skills/explainer-kit/examples/project-explainer/fact-base.md +22 -0
  11. package/assets/skills/explainer-kit/examples/project-recap/content.md +34 -0
  12. package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +22 -0
  13. package/assets/skills/explainer-kit/examples/theme-bundle.json +87 -0
  14. package/assets/skills/explainer-kit/palettes/ember.json +37 -0
  15. package/assets/skills/explainer-kit/palettes/forest.json +37 -0
  16. package/assets/skills/explainer-kit/palettes/neutral.json +37 -0
  17. package/assets/skills/explainer-kit/palettes/ocean.json +37 -0
  18. package/assets/skills/explainer-kit/palettes/violet.json +37 -0
  19. package/assets/skills/explainer-kit/profiles/clean.json +42 -0
  20. package/assets/skills/explainer-kit/profiles/editorial.json +42 -0
  21. package/assets/skills/explainer-kit/profiles/technical.json +39 -0
  22. package/assets/skills/explainer-kit/recipes/engineer-tour.json +33 -0
  23. package/assets/skills/explainer-kit/recipes/project-explainer.json +33 -0
  24. package/assets/skills/explainer-kit/recipes/project-recap.json +34 -0
  25. package/assets/skills/explainer-kit/references/contracts.md +101 -0
  26. package/assets/skills/explainer-kit/references/destination-contract.md +94 -0
  27. package/assets/skills/explainer-kit/references/extension-contract.md +71 -0
  28. package/assets/skills/explainer-kit/references/fact-base-contract.md +119 -0
  29. package/assets/skills/explainer-kit/schemas/build-record.schema.json +92 -0
  30. package/assets/skills/explainer-kit/schemas/durability-evidence.schema.json +53 -0
  31. package/assets/skills/explainer-kit/schemas/fact-base.schema.json +129 -0
  32. package/assets/skills/explainer-kit/schemas/manifest.schema.json +193 -0
  33. package/assets/skills/explainer-kit/schemas/publish-receipt.schema.json +97 -0
  34. package/assets/skills/explainer-kit/schemas/publish-request.schema.json +32 -0
  35. package/assets/skills/explainer-kit/schemas/run-request.schema.json +132 -0
  36. package/assets/skills/explainer-kit/schemas/theme.schema.json +217 -0
  37. package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +180 -0
  38. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +680 -0
  39. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +538 -0
  40. package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +494 -0
  41. package/assets/skills/explainer-kit/scripts/lib/fs-safe.mjs +218 -0
  42. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +512 -0
  43. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +289 -0
  44. package/assets/skills/explainer-kit/scripts/lib/records.mjs +231 -0
  45. package/assets/skills/explainer-kit/scripts/lib/render.mjs +485 -0
  46. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +587 -0
  47. package/assets/skills/explainer-kit/scripts/lib/safe-paths.mjs +96 -0
  48. package/assets/skills/explainer-kit/scripts/lib/theme.mjs +332 -0
  49. package/assets/skills/explainer-kit/scripts/publish.mjs +76 -0
  50. package/assets/skills/explainer-kit/scripts/record-durability.mjs +64 -0
  51. package/assets/skills/explainer-kit/scripts/render-qa.mjs +273 -0
  52. package/assets/skills/explainer-kit/scripts/run.mjs +778 -0
  53. package/assets/skills/explainer-kit/scripts/validate.mjs +59 -0
  54. package/assets/skills/explainer-kit/templates/deck-shell.html +233 -0
  55. package/assets/skills/explainer-kit/templates/diagram-shell.html +219 -0
  56. package/assets/skills/explainer-kit/templates/engineer-tour.html +273 -0
  57. package/assets/skills/explainer-kit/templates/house-style.html +218 -0
  58. package/assets/skills/oat-explainer-kit/SKILL.md +92 -0
  59. package/assets/skills/oat-explainer-kit/references/config-contract.md +67 -0
  60. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +143 -0
  61. package/assets/skills/oat-explainer-kit/references/migration.md +143 -0
  62. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +103 -0
  63. package/assets/skills/oat-explainer-kit/scripts/check-core.mjs +127 -0
  64. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +392 -0
  65. package/assets/skills/oat-explainer-kit/scripts/persist-intent.mjs +130 -0
  66. package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +293 -0
  67. package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +209 -0
  68. package/assets/skills/oat-explainer-kit/scripts/resolve-paths.mjs +166 -0
  69. package/assets/skills/oat-explainer-kit/scripts/run.mjs +284 -0
  70. package/assets/skills/oat-project-autonomous/SKILL.md +22 -1
  71. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +5 -1
  72. package/assets/skills/oat-project-complete/SKILL.md +166 -28
  73. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +5 -1
  74. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  75. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +17 -0
  76. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +5 -1
  77. package/assets/skills/oat-project-plan/SKILL.md +30 -1
  78. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +5 -1
  79. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +5 -1
  80. package/assets/skills/oat-project-summary/SKILL.md +20 -1
  81. package/assets/skills/oat-wave-execute/SKILL.md +1 -1
  82. package/dist/commands/config/index.d.ts.map +1 -1
  83. package/dist/commands/config/index.js +232 -1
  84. package/dist/commands/init/tools/shared/skill-manifest.d.ts +2 -2
  85. package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
  86. package/dist/commands/init/tools/shared/skill-manifest.js +2 -0
  87. package/dist/commands/project/archive/archive-utils.d.ts +12 -0
  88. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  89. package/dist/commands/project/archive/archive-utils.js +320 -8
  90. package/dist/commands/project/archive/index.d.ts.map +1 -1
  91. package/dist/commands/project/archive/index.js +1 -0
  92. package/dist/commands/project/archive/push-runner.d.ts +1 -0
  93. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  94. package/dist/commands/project/archive/push-runner.js +9 -2
  95. package/dist/config/oat-config.d.ts +26 -0
  96. package/dist/config/oat-config.d.ts.map +1 -1
  97. package/dist/config/oat-config.js +88 -0
  98. package/dist/config/resolve.d.ts.map +1 -1
  99. package/dist/config/resolve.js +18 -0
  100. package/dist/validation/project-state.d.ts +3 -0
  101. package/dist/validation/project-state.d.ts.map +1 -1
  102. package/dist/validation/project-state.js +91 -0
  103. package/package.json +2 -2
  104. /package/assets/skills/{oat-wave-execute/assets/program-recap.recipe.json → explainer-kit/recipes/program-recap.json} +0 -0
@@ -0,0 +1,273 @@
1
+ <!doctype html>
2
+ <!--
3
+ Neutral production shell. Worked content: ../examples/
4
+ TEMPLATE CONTRACT: THEME_CSS, TITLE, DESCRIPTION, EYEBROW, NAVIGATION, CONTENT, DIAGRAM, FOOTER
5
+ CONTENT sections use data-active-nodes/data-active-edges and may include expandable snippets.
6
+ DIAGRAM contains validated inline SVG nodes and edges.
7
+ -->
8
+ <html lang="en">
9
+ <head>
10
+ <meta charset="utf-8" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <title>{{TITLE}}</title>
13
+ <meta name="description" content="{{DESCRIPTION}}" />
14
+ <style>
15
+ :root {
16
+ --canvas: hsl(215 24% 13%);
17
+ --panel: hsl(215 20% 18%);
18
+ --panel-muted: hsl(215 18% 22%);
19
+ --border: hsl(215 14% 32%);
20
+ --ink: hsl(210 18% 92%);
21
+ --muted: hsl(210 10% 70%);
22
+ --accent: hsl(190 38% 70%);
23
+ --warning: hsl(38 55% 68%);
24
+ --sans: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
25
+ --serif: ui-serif, Georgia, serif;
26
+ --mono: ui-monospace, SFMono-Regular, Consolas, monospace;
27
+ {{THEME_CSS}}
28
+ }
29
+ * {
30
+ box-sizing: border-box;
31
+ }
32
+ html {
33
+ scroll-behavior: smooth;
34
+ }
35
+ body {
36
+ margin: 0;
37
+ background: var(--canvas);
38
+ color: var(--ink);
39
+ font-family: var(--sans);
40
+ line-height: 1.65;
41
+ }
42
+ .layout {
43
+ display: grid;
44
+ grid-template-columns: 13rem minmax(0, 1fr) 23rem;
45
+ gap: 2rem;
46
+ max-width: 86rem;
47
+ margin: auto;
48
+ padding-inline: 2rem;
49
+ }
50
+ .toc {
51
+ position: sticky;
52
+ top: 0;
53
+ align-self: start;
54
+ max-height: 100dvh;
55
+ overflow-y: auto;
56
+ padding-block: 2.5rem;
57
+ }
58
+ .toc-brand,
59
+ .eyebrow,
60
+ .section-number {
61
+ color: var(--muted);
62
+ font: 0.7rem/1.4 var(--mono);
63
+ letter-spacing: 0.12em;
64
+ text-transform: uppercase;
65
+ }
66
+ .toc a {
67
+ display: block;
68
+ border-inline-start: 2px solid transparent;
69
+ padding: 0.35rem 0.75rem;
70
+ color: var(--muted);
71
+ text-decoration: none;
72
+ }
73
+ .toc a.active {
74
+ border-inline-start-color: var(--accent);
75
+ color: var(--accent);
76
+ }
77
+ .tour-body {
78
+ min-width: 0;
79
+ padding-block: 3.5rem 6rem;
80
+ }
81
+ h1,
82
+ h2 {
83
+ font-family: var(--serif);
84
+ line-height: 1.15;
85
+ text-wrap: balance;
86
+ }
87
+ h1 {
88
+ font-size: clamp(2.3rem, 5vw, 3.8rem);
89
+ margin-block: 0.6rem 1rem;
90
+ }
91
+ section {
92
+ margin-block: 4rem;
93
+ scroll-margin-top: 2rem;
94
+ }
95
+ .snippet {
96
+ overflow: hidden;
97
+ border: 1px solid var(--border);
98
+ border-radius: 0.6rem;
99
+ background: var(--panel);
100
+ }
101
+ .snippet-toggle {
102
+ width: 100%;
103
+ border: 0;
104
+ border-block-end: 1px solid transparent;
105
+ background: var(--panel-muted);
106
+ color: var(--ink);
107
+ cursor: pointer;
108
+ padding: 0.75rem 1rem;
109
+ text-align: start;
110
+ font: 0.85rem var(--sans);
111
+ }
112
+ .snippet-toggle[aria-expanded='true'] {
113
+ border-block-end-color: var(--border);
114
+ }
115
+ .snippet pre {
116
+ max-width: 100%;
117
+ margin: 0;
118
+ overflow-x: auto;
119
+ padding: 1rem;
120
+ font-family: var(--mono);
121
+ }
122
+ .snippet:not(.open) pre {
123
+ display: none;
124
+ }
125
+ .diagram-rail {
126
+ position: sticky;
127
+ top: 0;
128
+ align-self: start;
129
+ height: 100dvh;
130
+ padding-block: 3.5rem 2rem;
131
+ }
132
+ .diagram-card {
133
+ border: 1px solid var(--border);
134
+ border-radius: 0.75rem;
135
+ background: var(--panel);
136
+ padding: 1rem;
137
+ }
138
+ .diagram-card svg {
139
+ display: block;
140
+ width: 100%;
141
+ height: auto;
142
+ }
143
+ .diagram-card .node,
144
+ .diagram-card .edge {
145
+ transition: opacity 180ms ease, stroke 180ms ease, fill 180ms ease;
146
+ }
147
+ .diagram-card .node:not(.active),
148
+ .diagram-card .edge:not(.active) {
149
+ opacity: 0.35;
150
+ }
151
+ footer {
152
+ border-block-start: 1px solid var(--border);
153
+ color: var(--muted);
154
+ padding-block-start: 1rem;
155
+ }
156
+ @media (max-width: 74rem) {
157
+ .layout {
158
+ grid-template-columns: 12rem minmax(0, 1fr);
159
+ }
160
+ .diagram-rail {
161
+ display: none;
162
+ }
163
+ }
164
+ @media (max-width: 52rem) {
165
+ .layout {
166
+ grid-template-columns: 1fr;
167
+ padding-inline: 1rem;
168
+ }
169
+ .toc {
170
+ position: sticky;
171
+ top: 0;
172
+ z-index: 2;
173
+ display: flex;
174
+ max-height: none;
175
+ overflow-x: auto;
176
+ background: var(--canvas);
177
+ border-block-end: 1px solid var(--border);
178
+ padding-block: 0.5rem;
179
+ }
180
+ .toc-brand {
181
+ display: none;
182
+ }
183
+ .toc a {
184
+ flex: none;
185
+ }
186
+ .tour-body {
187
+ padding-block-start: 1.5rem;
188
+ }
189
+ }
190
+ @media (prefers-reduced-motion: reduce) {
191
+ html {
192
+ scroll-behavior: auto;
193
+ }
194
+ *,
195
+ *::before,
196
+ *::after {
197
+ transition-duration: 0.01ms !important;
198
+ }
199
+ }
200
+ </style>
201
+ </head>
202
+ <body>
203
+ <div class="layout">
204
+ <nav class="toc" aria-label="Tour sections">
205
+ <div class="toc-brand">{{EYEBROW}}</div>
206
+ {{NAVIGATION}}
207
+ </nav>
208
+ <main class="tour-body">
209
+ <header>
210
+ <div class="eyebrow">{{EYEBROW}}</div>
211
+ <h1>{{TITLE}}</h1>
212
+ <p>{{DESCRIPTION}}</p>
213
+ </header>
214
+ {{CONTENT}}
215
+ <footer>{{FOOTER}}</footer>
216
+ </main>
217
+ <aside class="diagram-rail" aria-label="System diagram">
218
+ <div class="diagram-card">
219
+ <svg viewBox="0 0 360 540" role="img" aria-label="{{TITLE}}">
220
+ {{DIAGRAM}}
221
+ </svg>
222
+ </div>
223
+ </aside>
224
+ </div>
225
+ <script>
226
+ (() => {
227
+ document.querySelectorAll('.snippet-toggle').forEach((button) => {
228
+ button.setAttribute('aria-expanded', 'false');
229
+ button.addEventListener('click', () => {
230
+ const snippet = button.closest('.snippet');
231
+ const expanded = snippet.classList.toggle('open');
232
+ button.setAttribute('aria-expanded', String(expanded));
233
+ });
234
+ });
235
+
236
+ const sections = [...document.querySelectorAll('section[id]')];
237
+ const links = [...document.querySelectorAll('.toc a[data-target]')];
238
+ const nodes = [
239
+ ...document.querySelectorAll('.diagram-card [data-node]'),
240
+ ];
241
+ const edges = [
242
+ ...document.querySelectorAll('.diagram-card [data-edge]'),
243
+ ];
244
+ const activate = (section) => {
245
+ const activeNodes = new Set(
246
+ (section.dataset.activeNodes || '').split(',').filter(Boolean),
247
+ );
248
+ const activeEdges = new Set(
249
+ (section.dataset.activeEdges || '').split(',').filter(Boolean),
250
+ );
251
+ nodes.forEach((node) =>
252
+ node.classList.toggle('active', activeNodes.has(node.dataset.node)),
253
+ );
254
+ edges.forEach((edge) =>
255
+ edge.classList.toggle('active', activeEdges.has(edge.dataset.edge)),
256
+ );
257
+ links.forEach((link) =>
258
+ link.classList.toggle('active', link.dataset.target === section.id),
259
+ );
260
+ };
261
+ const observer = new IntersectionObserver(
262
+ (entries) => {
263
+ const visible = entries.find((entry) => entry.isIntersecting);
264
+ if (visible) activate(visible.target);
265
+ },
266
+ { rootMargin: '-15% 0px -60% 0px', threshold: [0.1, 0.4, 0.7] },
267
+ );
268
+ sections.forEach((section) => observer.observe(section));
269
+ if (sections[0]) activate(sections[0]);
270
+ })();
271
+ </script>
272
+ </body>
273
+ </html>
@@ -0,0 +1,218 @@
1
+ <!doctype html>
2
+ <!--
3
+ Neutral production shell. Worked content: ../examples/
4
+ TEMPLATE CONTRACT: THEME_CSS, TITLE, DESCRIPTION, EYEBROW, NAVIGATION, CONTENT, FOOTER
5
+ All replacement values are validated and escaped by the renderer.
6
+ -->
7
+ <html lang="en">
8
+ <head>
9
+ <meta charset="utf-8" />
10
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
11
+ <title>{{TITLE}}</title>
12
+ <meta name="description" content="{{DESCRIPTION}}" />
13
+ <style>
14
+ :root {
15
+ --canvas: hsl(210 20% 98%);
16
+ --panel: hsl(0 0% 100%);
17
+ --panel-muted: hsl(210 16% 94%);
18
+ --border: hsl(210 14% 82%);
19
+ --ink: hsl(215 24% 16%);
20
+ --muted: hsl(215 12% 38%);
21
+ --accent: hsl(215 28% 32%);
22
+ --success: hsl(145 45% 28%);
23
+ --warning: hsl(38 70% 30%);
24
+ --danger: hsl(0 55% 36%);
25
+ --sans: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
26
+ --serif: ui-serif, Georgia, serif;
27
+ --mono: ui-monospace, SFMono-Regular, Consolas, monospace;
28
+ --radius: 0.65rem;
29
+ {{THEME_CSS}}
30
+ }
31
+ * {
32
+ box-sizing: border-box;
33
+ }
34
+ html {
35
+ color-scheme: light dark;
36
+ scroll-behavior: smooth;
37
+ }
38
+ body {
39
+ margin: 0;
40
+ background: var(--canvas);
41
+ color: var(--ink);
42
+ font-family: var(--sans);
43
+ line-height: 1.6;
44
+ }
45
+ a {
46
+ color: var(--accent);
47
+ }
48
+ .wrap {
49
+ display: grid;
50
+ grid-template-columns: minmax(10rem, 14rem) minmax(0, 1fr);
51
+ gap: 2rem;
52
+ max-width: 74rem;
53
+ margin: auto;
54
+ padding: 2rem;
55
+ }
56
+ .toc {
57
+ position: sticky;
58
+ top: 2rem;
59
+ align-self: start;
60
+ max-height: calc(100dvh - 4rem);
61
+ overflow-y: auto;
62
+ }
63
+ .toc-label,
64
+ .eyebrow {
65
+ color: var(--muted);
66
+ font: 0.72rem/1.4 var(--mono);
67
+ letter-spacing: 0.12em;
68
+ text-transform: uppercase;
69
+ }
70
+ .toc a {
71
+ display: block;
72
+ border-inline-start: 2px solid transparent;
73
+ padding: 0.3rem 0.7rem;
74
+ text-decoration: none;
75
+ }
76
+ .toc a.active {
77
+ border-inline-start-color: var(--accent);
78
+ font-weight: 650;
79
+ }
80
+ main {
81
+ min-width: 0;
82
+ }
83
+ h1,
84
+ h2,
85
+ h3 {
86
+ font-family: var(--serif);
87
+ line-height: 1.2;
88
+ text-wrap: balance;
89
+ }
90
+ h1 {
91
+ font-size: clamp(2rem, 5vw, 3.4rem);
92
+ margin-block: 0.5rem 1rem;
93
+ }
94
+ h2 {
95
+ border-block-end: 1px solid var(--border);
96
+ padding-block-end: 0.45rem;
97
+ scroll-margin-top: 1rem;
98
+ }
99
+ section {
100
+ margin-block: 2.5rem;
101
+ }
102
+ .cards,
103
+ .lanes {
104
+ display: grid;
105
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr));
106
+ gap: 1rem;
107
+ }
108
+ .card,
109
+ .lane,
110
+ .callout {
111
+ min-width: 0;
112
+ border: 1px solid var(--border);
113
+ border-radius: var(--radius);
114
+ background: var(--panel);
115
+ padding: 1rem;
116
+ overflow-wrap: anywhere;
117
+ }
118
+ .callout {
119
+ border-inline-start: 0.25rem solid var(--accent);
120
+ }
121
+ .table-scroll,
122
+ pre {
123
+ max-width: 100%;
124
+ overflow-x: auto;
125
+ }
126
+ table {
127
+ width: 100%;
128
+ border-collapse: collapse;
129
+ }
130
+ th,
131
+ td {
132
+ border-block-end: 1px solid var(--border);
133
+ padding: 0.6rem;
134
+ text-align: start;
135
+ }
136
+ code,
137
+ pre {
138
+ font-family: var(--mono);
139
+ }
140
+ footer {
141
+ border-block-start: 1px solid var(--border);
142
+ color: var(--muted);
143
+ margin-block-start: 3rem;
144
+ padding-block-start: 1rem;
145
+ }
146
+ @media (max-width: 46rem) {
147
+ .wrap {
148
+ grid-template-columns: 1fr;
149
+ padding: 1rem;
150
+ }
151
+ .toc {
152
+ position: sticky;
153
+ top: 0;
154
+ z-index: 2;
155
+ display: flex;
156
+ gap: 0.25rem;
157
+ max-height: none;
158
+ overflow-x: auto;
159
+ background: var(--canvas);
160
+ border-block-end: 1px solid var(--border);
161
+ padding-block: 0.5rem;
162
+ }
163
+ .toc-label {
164
+ display: none;
165
+ }
166
+ .toc a {
167
+ flex: none;
168
+ white-space: nowrap;
169
+ }
170
+ }
171
+ @media (prefers-reduced-motion: reduce) {
172
+ html {
173
+ scroll-behavior: auto;
174
+ }
175
+ }
176
+ </style>
177
+ </head>
178
+ <body>
179
+ <div class="wrap">
180
+ <nav class="toc" aria-label="Page sections">
181
+ <div class="toc-label">{{EYEBROW}}</div>
182
+ {{NAVIGATION}}
183
+ </nav>
184
+ <main>
185
+ <header>
186
+ <div class="eyebrow">{{EYEBROW}}</div>
187
+ <h1>{{TITLE}}</h1>
188
+ <p>{{DESCRIPTION}}</p>
189
+ </header>
190
+ {{CONTENT}}
191
+ <footer>{{FOOTER}}</footer>
192
+ </main>
193
+ </div>
194
+ <script>
195
+ (() => {
196
+ const links = [...document.querySelectorAll('.toc a[href^="#"]')];
197
+ const targets = links
198
+ .map((link) => document.querySelector(link.getAttribute('href')))
199
+ .filter(Boolean);
200
+ const observer = new IntersectionObserver(
201
+ (entries) => {
202
+ for (const entry of entries) {
203
+ if (!entry.isIntersecting) continue;
204
+ links.forEach((link) =>
205
+ link.classList.toggle(
206
+ 'active',
207
+ link.getAttribute('href') === `#${entry.target.id}`,
208
+ ),
209
+ );
210
+ }
211
+ },
212
+ { rootMargin: '-15% 0px -70% 0px' },
213
+ );
214
+ targets.forEach((target) => observer.observe(target));
215
+ })();
216
+ </script>
217
+ </body>
218
+ </html>
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: oat-explainer-kit
3
+ version: 1.0.0
4
+ description: Use when building project explainers or recaps from OAT configuration, state, and lifecycle artifacts.
5
+ disable-model-invocation: false
6
+ user-invocable: true
7
+ allowed-tools: Read, Write, Edit, Bash, Grep, Glob, AskUserQuestion
8
+ ---
9
+
10
+ # OAT Explainer Kit
11
+
12
+ Adapt OAT project context into the versioned request consumed by the canonical
13
+ `explainer-kit` core.
14
+
15
+ ## Responsibilities
16
+
17
+ - Require a compatible installed `explainer-kit` core.
18
+ - Resolve typed OAT configuration with source attribution.
19
+ - Derive canonical project or repository output roots.
20
+ - Bind OAT lifecycle artifacts to generic recipe source roles.
21
+ - Resolve project explainer and recap intent before invoking the core.
22
+
23
+ ## Dependency Direction
24
+
25
+ This adapter depends on `explainer-kit`; the core never depends on this adapter.
26
+ Fail closed when the compatible installed core is unavailable. Do not copy core
27
+ runtime logic into the adapter.
28
+
29
+ Private wrappers use the core's frozen pre-resolution/request/core-run/manifest/
30
+ post-run seam directly; they do not route presets, vaults, Google Docs, Stoa, or
31
+ personal destinations through this adapter. For the release-candidate sequence,
32
+ rollback, and operator-owned real-wrapper gate, use `references/migration.md`.
33
+
34
+ Before reading OAT config or invoking the core, call
35
+ `scripts/check-core.mjs#checkCoreCompatibility` with this installed skill
36
+ directory and minimum core version `1.0.0`. Continue only when it returns
37
+ `ok: true`.
38
+
39
+ - Missing core: stop and show
40
+ `oat tools install utility --scope user`.
41
+ - Incompatible core: stop and show
42
+ `oat tools update --pack utility --scope user`.
43
+ - Never search a repository checkout or another noncanonical path as fallback.
44
+
45
+ ## Asset Resolution
46
+
47
+ Resolve adapter scripts and references relative to this installed skill
48
+ directory. Resolve the core only from its installed canonical skill path. Never
49
+ fall back to a repository source checkout.
50
+
51
+ ## Core Invocation
52
+
53
+ Call `scripts/run.mjs#runOatExplainer` with the repository root, project
54
+ invocation, active project path, recipe, slug, lifecycle mode, and any explicit
55
+ runtime overrides. The adapter:
56
+
57
+ 1. checks the user-scoped installed core at minimum version `1.0.0`;
58
+ 2. resolves only the public `explainers.*` and `workflow.explainers.*` keys;
59
+ 3. derives the canonical project output root;
60
+ 4. binds approved OAT artifacts to the recipe's single `project` source set;
61
+ 5. creates one `ExplainerRunRequestV1`;
62
+ 6. calls the installed core's `runExplainer(request, options)` export; and
63
+ 7. consumes and returns the resulting `explainer-kit.manifest/v1`.
64
+
65
+ `project-explainer` binds `plan.md`, `design.md`, and `spec.md`.
66
+ `project-recap` additionally binds `implementation.md` and `summary.md`.
67
+ Missing optional artifacts are omitted, but at least one approved lifecycle
68
+ artifact is required. An explicit supplied fact-base path bypasses artifact
69
+ federation and is passed through as `factBase.mode: supplied`.
70
+
71
+ Unattended project runs pass `approved-oat-artifacts` provenance to the core's
72
+ content-approval seam and never prompt. Federated runs still require an
73
+ explicit provider-neutral critic callback. In-process callers may supply
74
+ `critic` (or `coreOptions.critic` for compatibility); JSON/CLI callers supply
75
+ `criticModulePath` naming a module whose `critic` export implements the same
76
+ provider-neutral request/result contract. Supply exactly one critic seam.
77
+ Approval provenance does not bypass fact reconciliation. Do not read private
78
+ presets, vault files, provider configuration, or ambient destination
79
+ configuration.
80
+
81
+ ## Progress Indicators (User-Facing)
82
+
83
+ For interactive runs, show a concise banner and adapter stage updates:
84
+
85
+ ```text
86
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
87
+ OAT ▸ EXPLAINER KIT
88
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
89
+ ```
90
+
91
+ Report compatibility, config, intent, source-binding, core-run, and finalization
92
+ stages. Lifecycle-triggered unattended runs must not prompt.
@@ -0,0 +1,67 @@
1
+ # OAT Explainer Configuration Contract
2
+
3
+ `oat-explainer-kit` is the OAT-aware boundary around the config-blind
4
+ `explainer-kit` core. The adapter reads each supported stored value with
5
+ `oat config get <key> --json` and preserves its `source` metadata while
6
+ constructing an `explainer-kit.run-request/v1`.
7
+
8
+ ## Supported keys
9
+
10
+ | Key | Stored scopes | Built-in default |
11
+ | -------------------------------------- | ------------------- | ---------------- |
12
+ | `explainers.defaults.palette` | local, shared, user | `neutral` |
13
+ | `explainers.defaults.visualProfile` | local, shared, user | `clean` |
14
+ | `explainers.defaults.themeBundlePath` | local, shared | unset |
15
+ | `explainers.publish.provider` | shared | unset |
16
+ | `explainers.publish.s3Uri` | shared | unset |
17
+ | `explainers.publish.publicBaseUrl` | shared | unset |
18
+ | `explainers.publish.awsRegion` | shared | unset |
19
+ | `explainers.publish.awsProfile` | local, user | unset |
20
+ | `workflow.explainers.projectExplainer` | local, shared, user | `ask` |
21
+ | `workflow.explainers.projectRecap` | local, shared, user | `ask` |
22
+
23
+ Explicit runtime inputs may override these ten keys for one invocation. They
24
+ do not write config. Recipe, slug, fact-base path, output root, per-run art
25
+ direction, and private wrapper lanes are invocation inputs rather than config
26
+ keys and are rejected from the runtime config-override map.
27
+
28
+ ## Source-sensitive paths
29
+
30
+ A shared theme bundle path is repository-relative and must remain inside the
31
+ canonical repository root after resolving symlink ancestors. A local relative
32
+ path follows the same repository confinement; a local absolute path may point
33
+ outside the repository. Runtime paths follow the local rule. User config cannot
34
+ set a theme bundle path.
35
+
36
+ When a theme bundle path is present it replaces named palette and visual-profile
37
+ selection and produces a warning. The adapter passes the resolved canonical
38
+ path as `theme.suppliedBundlePath`.
39
+
40
+ ## Publish block
41
+
42
+ No provider means build-only operation, even if unused destination fields are
43
+ present. When `provider` is `s3-static`, `s3Uri`, `publicBaseUrl`, and
44
+ `awsRegion` are all required. `awsProfile` is optional and uses the normal AWS
45
+ credential chain when absent. Destination roots are normalized without trailing
46
+ slashes. Lifecycle callers must explicitly select publish durability; config
47
+ alone never starts publishing.
48
+
49
+ ## Canonical output roots
50
+
51
+ - Active project: `<resolved-project-path>/explainers/`, for both shared and
52
+ local projects.
53
+ - Non-project OAT run: `.oat/repo/reference/explainers/`.
54
+ - Direct core caller: an explicit `outputRoot`; the OAT adapter does not infer
55
+ one.
56
+
57
+ Derived OAT roots reject traversal and must remain inside their canonical root
58
+ after symlink resolution. The adapter validates all config and paths before the
59
+ core creates output.
60
+
61
+ ## Run-request translation
62
+
63
+ The adapter emits `explainer-kit.run-request/v1` with the requested recipe,
64
+ slug, fact-base binding, mode, derived output root, resolved theme selection,
65
+ privacy choice, and explicit durability strategy. Publish durability adds a
66
+ complete `explainer-kit.publish-request/v1` whose `siteRoot` and
67
+ `manifestPath` point inside `<outputRoot>/<slug>/`.