@open-agent-toolkit/cli 0.2.4 → 0.2.6

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 (106) 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/projects/implementation-execution.md +30 -5
  5. package/assets/docs/workflows/skills/explainer-kit.md +125 -0
  6. package/assets/docs/workflows/skills/index.md +4 -0
  7. package/assets/migration/pjm-restructure.md +12 -0
  8. package/assets/public-package-versions.json +4 -4
  9. package/assets/skills/explainer-kit/SKILL.md +95 -0
  10. package/assets/skills/explainer-kit/examples/project-explainer/content.md +31 -0
  11. package/assets/skills/explainer-kit/examples/project-explainer/fact-base.md +22 -0
  12. package/assets/skills/explainer-kit/examples/project-recap/content.md +34 -0
  13. package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +22 -0
  14. package/assets/skills/explainer-kit/examples/theme-bundle.json +87 -0
  15. package/assets/skills/explainer-kit/palettes/ember.json +37 -0
  16. package/assets/skills/explainer-kit/palettes/forest.json +37 -0
  17. package/assets/skills/explainer-kit/palettes/neutral.json +37 -0
  18. package/assets/skills/explainer-kit/palettes/ocean.json +37 -0
  19. package/assets/skills/explainer-kit/palettes/violet.json +37 -0
  20. package/assets/skills/explainer-kit/profiles/clean.json +42 -0
  21. package/assets/skills/explainer-kit/profiles/editorial.json +42 -0
  22. package/assets/skills/explainer-kit/profiles/technical.json +39 -0
  23. package/assets/skills/explainer-kit/recipes/engineer-tour.json +33 -0
  24. package/assets/skills/explainer-kit/recipes/program-recap.json +34 -0
  25. package/assets/skills/explainer-kit/recipes/project-explainer.json +33 -0
  26. package/assets/skills/explainer-kit/recipes/project-recap.json +34 -0
  27. package/assets/skills/explainer-kit/references/contracts.md +101 -0
  28. package/assets/skills/explainer-kit/references/destination-contract.md +94 -0
  29. package/assets/skills/explainer-kit/references/extension-contract.md +71 -0
  30. package/assets/skills/explainer-kit/references/fact-base-contract.md +119 -0
  31. package/assets/skills/explainer-kit/schemas/build-record.schema.json +92 -0
  32. package/assets/skills/explainer-kit/schemas/durability-evidence.schema.json +53 -0
  33. package/assets/skills/explainer-kit/schemas/fact-base.schema.json +129 -0
  34. package/assets/skills/explainer-kit/schemas/manifest.schema.json +193 -0
  35. package/assets/skills/explainer-kit/schemas/publish-receipt.schema.json +97 -0
  36. package/assets/skills/explainer-kit/schemas/publish-request.schema.json +32 -0
  37. package/assets/skills/explainer-kit/schemas/run-request.schema.json +132 -0
  38. package/assets/skills/explainer-kit/schemas/theme.schema.json +217 -0
  39. package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +180 -0
  40. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +680 -0
  41. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +538 -0
  42. package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +494 -0
  43. package/assets/skills/explainer-kit/scripts/lib/fs-safe.mjs +218 -0
  44. package/assets/skills/explainer-kit/scripts/lib/qa.mjs +512 -0
  45. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +289 -0
  46. package/assets/skills/explainer-kit/scripts/lib/records.mjs +231 -0
  47. package/assets/skills/explainer-kit/scripts/lib/render.mjs +485 -0
  48. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +587 -0
  49. package/assets/skills/explainer-kit/scripts/lib/safe-paths.mjs +96 -0
  50. package/assets/skills/explainer-kit/scripts/lib/theme.mjs +332 -0
  51. package/assets/skills/explainer-kit/scripts/publish.mjs +76 -0
  52. package/assets/skills/explainer-kit/scripts/record-durability.mjs +64 -0
  53. package/assets/skills/explainer-kit/scripts/render-qa.mjs +273 -0
  54. package/assets/skills/explainer-kit/scripts/run.mjs +778 -0
  55. package/assets/skills/explainer-kit/scripts/validate.mjs +59 -0
  56. package/assets/skills/explainer-kit/templates/deck-shell.html +233 -0
  57. package/assets/skills/explainer-kit/templates/diagram-shell.html +219 -0
  58. package/assets/skills/explainer-kit/templates/engineer-tour.html +273 -0
  59. package/assets/skills/explainer-kit/templates/house-style.html +218 -0
  60. package/assets/skills/oat-explainer-kit/SKILL.md +92 -0
  61. package/assets/skills/oat-explainer-kit/references/config-contract.md +67 -0
  62. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +143 -0
  63. package/assets/skills/oat-explainer-kit/references/migration.md +143 -0
  64. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +103 -0
  65. package/assets/skills/oat-explainer-kit/scripts/check-core.mjs +127 -0
  66. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +392 -0
  67. package/assets/skills/oat-explainer-kit/scripts/persist-intent.mjs +130 -0
  68. package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +293 -0
  69. package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +209 -0
  70. package/assets/skills/oat-explainer-kit/scripts/resolve-paths.mjs +166 -0
  71. package/assets/skills/oat-explainer-kit/scripts/run.mjs +284 -0
  72. package/assets/skills/oat-project-autonomous/SKILL.md +22 -1
  73. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +5 -1
  74. package/assets/skills/oat-project-complete/SKILL.md +166 -28
  75. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +5 -1
  76. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  77. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +84 -9
  78. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +5 -1
  79. package/assets/skills/oat-project-next/SKILL.md +31 -11
  80. package/assets/skills/oat-project-plan/SKILL.md +30 -1
  81. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +5 -1
  82. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +5 -1
  83. package/assets/skills/oat-project-summary/SKILL.md +20 -1
  84. package/assets/templates/state.md +4 -1
  85. package/dist/commands/config/index.d.ts.map +1 -1
  86. package/dist/commands/config/index.js +232 -1
  87. package/dist/commands/init/tools/shared/skill-manifest.d.ts +2 -2
  88. package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
  89. package/dist/commands/init/tools/shared/skill-manifest.js +2 -0
  90. package/dist/commands/project/archive/archive-utils.d.ts +12 -0
  91. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  92. package/dist/commands/project/archive/archive-utils.js +320 -8
  93. package/dist/commands/project/archive/index.d.ts.map +1 -1
  94. package/dist/commands/project/archive/index.js +1 -0
  95. package/dist/commands/project/archive/push-runner.d.ts +1 -0
  96. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  97. package/dist/commands/project/archive/push-runner.js +9 -2
  98. package/dist/config/oat-config.d.ts +26 -0
  99. package/dist/config/oat-config.d.ts.map +1 -1
  100. package/dist/config/oat-config.js +88 -0
  101. package/dist/config/resolve.d.ts.map +1 -1
  102. package/dist/config/resolve.js +18 -0
  103. package/dist/validation/project-state.d.ts +3 -0
  104. package/dist/validation/project-state.d.ts.map +1 -1
  105. package/dist/validation/project-state.js +91 -0
  106. package/package.json +2 -2
@@ -0,0 +1,273 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { readFile } from 'node:fs/promises';
4
+ import { basename } from 'node:path';
5
+ import { pathToFileURL } from 'node:url';
6
+
7
+ import { auditArtifactSet } from './lib/qa.mjs';
8
+ import { renderArtifact } from './lib/render.mjs';
9
+ import { resolveTheme } from './lib/theme.mjs';
10
+
11
+ export const RELEASE_PALETTES = Object.freeze([
12
+ 'neutral',
13
+ 'ocean',
14
+ 'ember',
15
+ 'forest',
16
+ 'violet',
17
+ ]);
18
+ export const RELEASE_MODES = Object.freeze(['light', 'dark']);
19
+ export const RELEASE_PROFILES = Object.freeze([
20
+ 'clean',
21
+ 'editorial',
22
+ 'technical',
23
+ ]);
24
+ export const RELEASE_VIEWPORTS = Object.freeze([320, 768, 1440]);
25
+ export const RELEASE_ARTIFACTS = Object.freeze([
26
+ Object.freeze({
27
+ id: 'release-hub',
28
+ type: 'hub',
29
+ template: 'house-style',
30
+ required: true,
31
+ }),
32
+ Object.freeze({
33
+ id: 'release-diagram',
34
+ type: 'diagram',
35
+ template: 'diagram-shell',
36
+ required: true,
37
+ }),
38
+ Object.freeze({
39
+ id: 'release-explainer',
40
+ type: 'explainer',
41
+ template: 'engineer-tour',
42
+ required: true,
43
+ }),
44
+ Object.freeze({
45
+ id: 'release-deck',
46
+ type: 'deck',
47
+ template: 'deck-shell',
48
+ required: true,
49
+ }),
50
+ ]);
51
+
52
+ export function selectReleaseVisualMatrix() {
53
+ const paletteModeCases = RELEASE_PALETTES.flatMap((palette, paletteIndex) =>
54
+ RELEASE_MODES.map((mode, modeIndex) => ({
55
+ id: `palette-${palette}-${mode}`,
56
+ axis: 'palette-mode',
57
+ palette,
58
+ mode,
59
+ visualProfile: 'clean',
60
+ renderStrategy:
61
+ (paletteIndex + modeIndex) % 2 === 0
62
+ ? 'default-only'
63
+ : 'user-switchable',
64
+ artifact: {
65
+ ...RELEASE_ARTIFACTS[0],
66
+ id: `palette-${palette}-${mode}`,
67
+ },
68
+ viewports: [RELEASE_VIEWPORTS[0], RELEASE_VIEWPORTS[2]],
69
+ scenarios: ['default'],
70
+ })),
71
+ );
72
+ const profileArtifactCases = RELEASE_PROFILES.flatMap(
73
+ (visualProfile, profileIndex) =>
74
+ RELEASE_ARTIFACTS.map((artifact, artifactIndex) => {
75
+ const mode =
76
+ RELEASE_MODES[(profileIndex + artifactIndex) % RELEASE_MODES.length];
77
+ return {
78
+ id: `profile-${visualProfile}-${artifact.type}`,
79
+ axis: 'profile-artifact',
80
+ palette:
81
+ RELEASE_PALETTES[
82
+ (profileIndex + artifactIndex) % RELEASE_PALETTES.length
83
+ ],
84
+ mode,
85
+ visualProfile,
86
+ renderStrategy:
87
+ (profileIndex + artifactIndex) % 2 === 0
88
+ ? 'default-only'
89
+ : 'user-switchable',
90
+ artifact: {
91
+ ...artifact,
92
+ id: `profile-${visualProfile}-${artifact.type}`,
93
+ },
94
+ viewports:
95
+ artifact.type === 'deck'
96
+ ? [...RELEASE_VIEWPORTS]
97
+ : [RELEASE_VIEWPORTS[0], RELEASE_VIEWPORTS[2]],
98
+ scenarios:
99
+ artifact.type === 'deck'
100
+ ? ['horizontal', 'no-js', 'print']
101
+ : ['default'],
102
+ };
103
+ }),
104
+ );
105
+
106
+ return [...paletteModeCases, ...profileArtifactCases];
107
+ }
108
+
109
+ export async function runReleaseVisualMatrix({
110
+ matrix = selectReleaseVisualMatrix(),
111
+ browserProbe,
112
+ } = {}) {
113
+ if (!Array.isArray(matrix) || matrix.length === 0) {
114
+ throw new TypeError('Release visual QA requires a non-empty matrix.');
115
+ }
116
+ if (typeof browserProbe !== 'function') {
117
+ throw new TypeError('Release visual QA requires a browser probe callback.');
118
+ }
119
+
120
+ const issues = [];
121
+ const cases = [];
122
+ for (const entry of matrix) {
123
+ const { theme } = await resolveTheme({
124
+ palette: entry.palette,
125
+ visualProfile: entry.visualProfile,
126
+ defaultMode: entry.mode,
127
+ renderStrategy: entry.renderStrategy,
128
+ });
129
+ const rendered = await renderArtifact({
130
+ recipeArtifact: entry.artifact,
131
+ content: releaseContent(entry.artifact.id),
132
+ theme,
133
+ renderStrategy: entry.renderStrategy,
134
+ });
135
+ const report = await auditArtifactSet({
136
+ artifacts: [
137
+ {
138
+ id: entry.id,
139
+ type: entry.artifact.type,
140
+ html: rendered.html,
141
+ },
142
+ ],
143
+ widths: entry.viewports,
144
+ browserProbe: async (request) => {
145
+ const result = await browserProbe(request);
146
+ if (
147
+ entry.artifact.type === 'deck' &&
148
+ request.scenario === 'default' &&
149
+ result?.deckLayout?.flow !== 'horizontal'
150
+ ) {
151
+ issues.push({
152
+ artifactId: entry.id,
153
+ width: request.viewport.width,
154
+ scenario: 'default',
155
+ code: 'deck-horizontal-layout',
156
+ message: 'Interactive deck must page horizontally by default.',
157
+ });
158
+ }
159
+ return result;
160
+ },
161
+ });
162
+ issues.push(...report.issues);
163
+ cases.push({
164
+ id: entry.id,
165
+ artifactType: entry.artifact.type,
166
+ palette: entry.palette,
167
+ mode: entry.mode,
168
+ visualProfile: entry.visualProfile,
169
+ renderStrategy: entry.renderStrategy,
170
+ probes: report.browser?.probes ?? 0,
171
+ });
172
+ }
173
+
174
+ return { valid: issues.length === 0, issues, cases };
175
+ }
176
+
177
+ export async function runRenderQaCli(
178
+ argv = process.argv.slice(2),
179
+ io = console,
180
+ options = {},
181
+ ) {
182
+ try {
183
+ const parsed = parseArguments(argv);
184
+ const denylist = [...parsed.denylist, ...(options.denylist ?? [])];
185
+ if (parsed.paths.length === 0) {
186
+ throw new Error(
187
+ 'Usage: render-qa.mjs [--deny <string>] [--type <type>] <html-path> [...]',
188
+ );
189
+ }
190
+
191
+ const artifacts = await Promise.all(
192
+ parsed.paths.map(async ({ path, type }, index) => ({
193
+ id: `${basename(path)}-${index + 1}`,
194
+ type,
195
+ html: await readFile(path, 'utf8'),
196
+ })),
197
+ );
198
+ const report = await auditArtifactSet({
199
+ artifacts,
200
+ denylist,
201
+ ...(options.browserProbe && { browserProbe: options.browserProbe }),
202
+ ...(options.widths && { widths: options.widths }),
203
+ });
204
+ io.log(JSON.stringify(report, null, 2));
205
+ return report.valid ? 0 : 1;
206
+ } catch (error) {
207
+ io.log(
208
+ JSON.stringify(
209
+ {
210
+ valid: false,
211
+ issues: [
212
+ {
213
+ code: 'input',
214
+ message: error instanceof Error ? error.message : String(error),
215
+ },
216
+ ],
217
+ },
218
+ null,
219
+ 2,
220
+ ),
221
+ );
222
+ return 1;
223
+ }
224
+ }
225
+
226
+ function parseArguments(argv) {
227
+ const paths = [];
228
+ const denylist = [];
229
+ let nextType;
230
+
231
+ for (let index = 0; index < argv.length; index += 1) {
232
+ const value = argv[index];
233
+ if (value === '--deny') {
234
+ const denied = argv[index + 1];
235
+ if (!denied) throw new Error('--deny requires a string.');
236
+ denylist.push(denied);
237
+ index += 1;
238
+ } else if (value === '--type') {
239
+ nextType = argv[index + 1];
240
+ if (!['hub', 'diagram', 'explainer', 'deck'].includes(nextType)) {
241
+ throw new Error('--type requires hub, diagram, explainer, or deck.');
242
+ }
243
+ index += 1;
244
+ } else if (value.startsWith('--')) {
245
+ throw new Error(`Unknown option: ${value}.`);
246
+ } else {
247
+ paths.push({ path: value, ...(nextType && { type: nextType }) });
248
+ nextType = undefined;
249
+ }
250
+ }
251
+ if (nextType) throw new Error('--type must precede an HTML path.');
252
+ return { paths, denylist };
253
+ }
254
+
255
+ function releaseContent(artifactId) {
256
+ return {
257
+ artifactId,
258
+ slug: 'release-qa',
259
+ title: 'Release QA',
260
+ description: 'Representative release artifact.',
261
+ sections: [
262
+ { id: 'overview', title: 'Overview', content: 'Release candidate.' },
263
+ { id: 'evidence', title: 'Evidence', content: 'Checks are complete.' },
264
+ ],
265
+ };
266
+ }
267
+
268
+ if (
269
+ process.argv[1] &&
270
+ pathToFileURL(process.argv[1]).href === import.meta.url
271
+ ) {
272
+ process.exitCode = await runRenderQaCli();
273
+ }