@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
@@ -1,5 +1,6 @@
1
1
  import { execFile as execFileCallback } from 'node:child_process';
2
- import { rm, writeFile } from 'node:fs/promises';
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { lstat, readFile, realpath, rename, rm, writeFile, } from 'node:fs/promises';
3
4
  import { basename, dirname, isAbsolute, join, posix as path, relative, resolve, sep, } from 'node:path';
4
5
  import { promisify } from 'node:util';
5
6
  import { CliError } from '../../../errors/cli-error.js';
@@ -280,6 +281,304 @@ async function exportProjectSummary(archivePath, snapshotName, summaryExportPath
280
281
  await copySummary(summarySource, summaryTarget);
281
282
  return summaryTarget;
282
283
  }
284
+ function parseProjectRecapManifest(contents) {
285
+ let value;
286
+ try {
287
+ value = JSON.parse(contents);
288
+ }
289
+ catch {
290
+ throw new CliError('Selected project recap has an invalid manifest.json.');
291
+ }
292
+ if (!isProjectRecapManifestV1(value)) {
293
+ throw new CliError('Selected project recap manifest does not match the explainer-kit manifest contract.');
294
+ }
295
+ const expectedImmutablePaths = new Set([
296
+ value.source.factBasePath,
297
+ 'source/fact-base.md',
298
+ value.theme.path,
299
+ ...value.artifacts.flatMap((artifact) => [
300
+ artifact.contentPath,
301
+ ...(artifact.status === 'built' &&
302
+ typeof artifact.renderedPath === 'string'
303
+ ? [artifact.renderedPath]
304
+ : []),
305
+ ]),
306
+ ]);
307
+ const recordedImmutablePaths = Object.keys(value.immutableHashes);
308
+ if (expectedImmutablePaths.size === 0 ||
309
+ expectedImmutablePaths.size !== recordedImmutablePaths.length ||
310
+ [...expectedImmutablePaths].some((relativePath) => !(relativePath in value.immutableHashes)) ||
311
+ value.source.factBaseHash !==
312
+ value.immutableHashes[value.source.factBasePath] ||
313
+ value.theme.hash !== value.immutableHashes[value.theme.path] ||
314
+ value.artifacts.some((artifact) => artifact.status === 'built' &&
315
+ typeof artifact.renderedPath === 'string' &&
316
+ artifact.hash !== value.immutableHashes[artifact.renderedPath])) {
317
+ throw new CliError('Selected project recap manifest immutable hashes do not cover the complete v1 package.');
318
+ }
319
+ return value;
320
+ }
321
+ function isProjectRecapManifestV1(value) {
322
+ if (!isRecord(value) ||
323
+ !hasExactKeys(value, [
324
+ 'schemaVersion',
325
+ 'runId',
326
+ 'slug',
327
+ 'recipe',
328
+ 'createdAt',
329
+ 'source',
330
+ 'theme',
331
+ 'artifacts',
332
+ 'immutableHashes',
333
+ 'outcome',
334
+ 'buildRecord',
335
+ 'warnings',
336
+ ], ['publishReceipt']) ||
337
+ value.schemaVersion !== 'explainer-kit.manifest/v1' ||
338
+ !isNonEmptyString(value.runId) ||
339
+ typeof value.slug !== 'string' ||
340
+ !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value.slug) ||
341
+ !isDateTime(value.createdAt) ||
342
+ !isRecord(value.recipe) ||
343
+ !hasExactKeys(value.recipe, ['id', 'version']) ||
344
+ !isNonEmptyString(value.recipe.id) ||
345
+ !isNonEmptyString(value.recipe.version) ||
346
+ !isRecord(value.source) ||
347
+ !hasExactKeys(value.source, ['factBasePath', 'factBaseHash', 'inputHashes'], ['sourceRevision']) ||
348
+ !isSafeRelativePath(value.source.factBasePath) ||
349
+ !isSha256(value.source.factBaseHash) ||
350
+ !isHashMap(value.source.inputHashes) ||
351
+ (value.source.sourceRevision !== undefined &&
352
+ !isNonEmptyString(value.source.sourceRevision)) ||
353
+ !isRecord(value.theme) ||
354
+ !hasExactKeys(value.theme, ['path', 'hash', 'derived']) ||
355
+ value.theme.path !== 'theme.resolved.json' ||
356
+ !isSha256(value.theme.hash) ||
357
+ typeof value.theme.derived !== 'boolean' ||
358
+ !Array.isArray(value.artifacts) ||
359
+ !value.artifacts.every(isManifestArtifact) ||
360
+ new Set(value.artifacts.map((artifact) => JSON.stringify(artifact)))
361
+ .size !== value.artifacts.length ||
362
+ !isHashMap(value.immutableHashes) ||
363
+ !['built-durable', 'built-not-durable', 'failed', 'incomplete'].includes(String(value.outcome)) ||
364
+ !isPathHashRecord(value.buildRecord, 'build-record.json') ||
365
+ (value.publishReceipt !== undefined &&
366
+ !isPathHashRecord(value.publishReceipt, 'publish-receipt.json')) ||
367
+ !Array.isArray(value.warnings) ||
368
+ !value.warnings.every(isNonEmptyString)) {
369
+ return false;
370
+ }
371
+ return true;
372
+ }
373
+ function isManifestArtifact(value) {
374
+ if (!isRecord(value) ||
375
+ !hasExactKeys(value, ['id', 'type', 'contentPath', 'status', 'rebuildable'], [
376
+ 'renderedPath',
377
+ 'mediaType',
378
+ 'hash',
379
+ 'rebuild',
380
+ 'durableEvidence',
381
+ 'failure',
382
+ ]) ||
383
+ !isNonEmptyString(value.id) ||
384
+ !['hub', 'diagram', 'explainer', 'deck', 'catalog'].includes(String(value.type)) ||
385
+ !isSafeRelativePath(value.contentPath) ||
386
+ !['built', 'failed', 'skipped'].includes(String(value.status)) ||
387
+ typeof value.rebuildable !== 'boolean' ||
388
+ (value.renderedPath !== undefined &&
389
+ (!isSafeRelativePath(value.renderedPath) ||
390
+ !value.renderedPath.startsWith('site/'))) ||
391
+ (value.mediaType !== undefined && !isNonEmptyString(value.mediaType)) ||
392
+ (value.hash !== undefined && !isSha256(value.hash)) ||
393
+ (value.status === 'built' && !isSha256(value.hash)) ||
394
+ (value.rebuildable === true && !isRebuildRecord(value.rebuild)) ||
395
+ (value.rebuild !== undefined && !isRebuildRecord(value.rebuild)) ||
396
+ (value.durableEvidence !== undefined &&
397
+ (!Array.isArray(value.durableEvidence) ||
398
+ !value.durableEvidence.every(isDurableEvidence))) ||
399
+ (value.failure !== undefined && !isFailureRecord(value.failure))) {
400
+ return false;
401
+ }
402
+ return true;
403
+ }
404
+ function isRebuildRecord(value) {
405
+ return (isRecord(value) &&
406
+ hasExactKeys(value, ['argv', 'cwd', 'inputHashes']) &&
407
+ Array.isArray(value.argv) &&
408
+ value.argv.length > 0 &&
409
+ value.argv.every((argument) => typeof argument === 'string') &&
410
+ isNonEmptyString(value.cwd) &&
411
+ isHashMap(value.inputHashes));
412
+ }
413
+ function isDurableEvidence(value) {
414
+ return (isRecord(value) &&
415
+ hasExactKeys(value, ['kind', 'ref', 'paths', 'attestedAt'], ['supersedes']) &&
416
+ ['commit', 'publish'].includes(String(value.kind)) &&
417
+ isNonEmptyString(value.ref) &&
418
+ isUniqueSafePathArray(value.paths) &&
419
+ isDateTime(value.attestedAt) &&
420
+ (value.supersedes === undefined ||
421
+ (isRecord(value.supersedes) &&
422
+ hasExactKeys(value.supersedes, ['ref', 'paths']) &&
423
+ isNonEmptyString(value.supersedes.ref) &&
424
+ isUniqueSafePathArray(value.supersedes.paths))));
425
+ }
426
+ function isFailureRecord(value) {
427
+ return (isRecord(value) &&
428
+ hasExactKeys(value, ['code', 'message', 'recovery']) &&
429
+ isNonEmptyString(value.code) &&
430
+ isNonEmptyString(value.message) &&
431
+ Array.isArray(value.recovery) &&
432
+ value.recovery.length > 0 &&
433
+ value.recovery.every(isNonEmptyString));
434
+ }
435
+ function isPathHashRecord(value, expectedPath) {
436
+ return (isRecord(value) &&
437
+ hasExactKeys(value, ['path', 'hash']) &&
438
+ value.path === expectedPath &&
439
+ isSha256(value.hash));
440
+ }
441
+ function isHashMap(value) {
442
+ return (isRecord(value) &&
443
+ Object.entries(value).every(([relativePath, hash]) => isSafeRelativePath(relativePath) && isSha256(hash)));
444
+ }
445
+ function isUniqueSafePathArray(value) {
446
+ return (Array.isArray(value) &&
447
+ value.length > 0 &&
448
+ value.every(isSafeRelativePath) &&
449
+ new Set(value).size === value.length);
450
+ }
451
+ function isRecord(value) {
452
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
453
+ }
454
+ function hasExactKeys(value, required, optional = []) {
455
+ const allowed = new Set([...required, ...optional]);
456
+ return (required.every((key) => key in value) &&
457
+ Object.keys(value).every((key) => allowed.has(key)));
458
+ }
459
+ function isNonEmptyString(value) {
460
+ return typeof value === 'string' && value.length > 0;
461
+ }
462
+ function isDateTime(value) {
463
+ return (typeof value === 'string' &&
464
+ /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/.test(value) &&
465
+ !Number.isNaN(Date.parse(value)));
466
+ }
467
+ function isSafeRelativePath(value) {
468
+ return (typeof value === 'string' &&
469
+ value.length > 0 &&
470
+ !isAbsolute(value) &&
471
+ !value.includes('\\') &&
472
+ value.split('/').every((segment) => segment !== '' && segment !== '..'));
473
+ }
474
+ function isSha256(value) {
475
+ return typeof value === 'string' && /^sha256:[a-f0-9]{64}$/.test(value);
476
+ }
477
+ async function pathExists(target) {
478
+ try {
479
+ await lstat(target);
480
+ return true;
481
+ }
482
+ catch (error) {
483
+ if (typeof error === 'object' &&
484
+ error !== null &&
485
+ 'code' in error &&
486
+ error.code === 'ENOENT') {
487
+ return false;
488
+ }
489
+ throw error;
490
+ }
491
+ }
492
+ function assertInsideExplainers(explainersRoot, selectedRunRoot) {
493
+ if (selectedRunRoot === explainersRoot ||
494
+ !isInsidePath(explainersRoot, selectedRunRoot)) {
495
+ throw new CliError('Selected project recap run must be inside the project `explainers/` directory.');
496
+ }
497
+ }
498
+ async function resolveSelectedProjectRecapRun(projectPath, projectRecapRun) {
499
+ const explainersRoot = resolve(projectPath, 'explainers');
500
+ const selectedRunRoot = resolve(projectPath, projectRecapRun);
501
+ assertInsideExplainers(explainersRoot, selectedRunRoot);
502
+ const [realExplainersRoot, realSelectedRunRoot] = await Promise.all([
503
+ realpath(explainersRoot),
504
+ realpath(selectedRunRoot),
505
+ ]);
506
+ assertInsideExplainers(realExplainersRoot, realSelectedRunRoot);
507
+ return selectedRunRoot;
508
+ }
509
+ function parseExpectedSha256(value, relativePath) {
510
+ const match = value.match(/^sha256:([a-f0-9]{64})$/);
511
+ if (!match?.[1]) {
512
+ throw new CliError(`Selected project recap manifest has an invalid hash for \`${relativePath}\`.`);
513
+ }
514
+ return match[1];
515
+ }
516
+ async function verifyProjectRecapImmutableHashes(stagedRoot, manifest) {
517
+ const entries = Object.entries(manifest.immutableHashes);
518
+ const realStagedRoot = await realpath(stagedRoot);
519
+ for (const [relativePath, expectedHash] of entries) {
520
+ const artifactPath = resolve(stagedRoot, relativePath);
521
+ if (artifactPath === stagedRoot ||
522
+ !isInsidePath(stagedRoot, artifactPath)) {
523
+ throw new CliError(`Selected project recap manifest path \`${relativePath}\` escapes the recap package.`);
524
+ }
525
+ const realArtifactPath = await realpath(artifactPath);
526
+ if (!isInsidePath(realStagedRoot, realArtifactPath)) {
527
+ throw new CliError(`Selected project recap manifest path \`${relativePath}\` escapes the recap package.`);
528
+ }
529
+ const actualHash = createHash('sha256')
530
+ .update(await readFile(realArtifactPath))
531
+ .digest('hex');
532
+ if (actualHash !== parseExpectedSha256(expectedHash, relativePath)) {
533
+ throw new CliError(`Selected project recap hash verification failed for \`${relativePath}\`.`);
534
+ }
535
+ }
536
+ return entries.length;
537
+ }
538
+ async function exportSelectedProjectRecap(options, snapshotName, dependencies) {
539
+ const selectedRun = options.projectRecapRun?.trim();
540
+ if (!selectedRun) {
541
+ return null;
542
+ }
543
+ const sourceRunRoot = await resolveSelectedProjectRecapRun(options.projectPath, selectedRun);
544
+ const sourceManifestContents = await readFile(join(sourceRunRoot, 'manifest.json'), 'utf8');
545
+ const sourceManifest = parseProjectRecapManifest(sourceManifestContents);
546
+ if (sourceManifest.recipe.id !== 'project-recap') {
547
+ throw new CliError('Selected project recap manifest recipe must be exactly `project-recap`.');
548
+ }
549
+ const exportRoot = join(options.repoRoot, '.oat', 'repo', 'reference', 'project-recaps', snapshotName);
550
+ if (await pathExists(exportRoot)) {
551
+ throw new CliError(`Project recap export destination \`${exportRoot}\` already exists; refusing to overwrite it.`);
552
+ }
553
+ const temporaryRoot = `${exportRoot}.tmp-${randomUUID()}`;
554
+ const makeDir = dependencies.ensureDir ?? ensureDir;
555
+ const copyProjectDirectory = dependencies.copyDirectory ?? copyDirectory;
556
+ const removePath = dependencies.removePath ??
557
+ (async (target, removeOptions) => rm(target, removeOptions));
558
+ const renamePath = dependencies.renamePath ?? rename;
559
+ await makeDir(dirname(exportRoot));
560
+ try {
561
+ await copyProjectDirectory(sourceRunRoot, temporaryRoot);
562
+ const stagedManifestContents = await readFile(join(temporaryRoot, 'manifest.json'), 'utf8');
563
+ if (stagedManifestContents !== sourceManifestContents) {
564
+ throw new CliError('Selected project recap manifest changed while staging the export.');
565
+ }
566
+ const verifiedArtifactCount = await verifyProjectRecapImmutableHashes(temporaryRoot, sourceManifest);
567
+ await renamePath(temporaryRoot, exportRoot);
568
+ return {
569
+ sourceRunRoot,
570
+ exportRoot,
571
+ manifest: {
572
+ relativePath: 'manifest.json',
573
+ verifiedArtifactCount,
574
+ },
575
+ };
576
+ }
577
+ catch (error) {
578
+ await removePath(temporaryRoot, { recursive: true, force: true });
579
+ throw error;
580
+ }
581
+ }
283
582
  export async function archiveProjectOnCompletion(options, dependencies = {}) {
284
583
  const makeDir = dependencies.ensureDir ?? ensureDir;
285
584
  const copyProjectDirectory = dependencies.copyDirectory ?? copyDirectory;
@@ -296,13 +595,25 @@ export async function archiveProjectOnCompletion(options, dependencies = {}) {
296
595
  }, dependencies);
297
596
  assertDurableArchiveProjectTarget(archiveTarget);
298
597
  const archivePath = archiveTarget.archivePath;
299
- await makeDir(dirname(archivePath));
300
- await copyProjectDirectory(options.projectPath, archivePath);
301
- await writeArchiveSnapshotMetadata(archivePath, {
302
- projectName: options.projectName,
303
- snapshotName,
304
- });
305
- await removePath(options.projectPath, { recursive: true, force: true });
598
+ const projectRecapExport = await exportSelectedProjectRecap(options, snapshotName, dependencies);
599
+ try {
600
+ await makeDir(dirname(archivePath));
601
+ await copyProjectDirectory(options.projectPath, archivePath);
602
+ await writeArchiveSnapshotMetadata(archivePath, {
603
+ projectName: options.projectName,
604
+ snapshotName,
605
+ });
606
+ await removePath(options.projectPath, { recursive: true, force: true });
607
+ }
608
+ catch (error) {
609
+ if (projectRecapExport) {
610
+ await removePath(projectRecapExport.exportRoot, {
611
+ recursive: true,
612
+ force: true,
613
+ });
614
+ }
615
+ throw error;
616
+ }
306
617
  const warnings = [];
307
618
  let summaryExportFile = null;
308
619
  if (options.summaryExportPath) {
@@ -354,6 +665,7 @@ export async function archiveProjectOnCompletion(options, dependencies = {}) {
354
665
  archivePath,
355
666
  s3Path,
356
667
  summaryExportFile,
668
+ projectRecapExport,
357
669
  warnings,
358
670
  };
359
671
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAIL,KAAK,qCAAqC,EAC3C,MAAM,eAAe,CAAC;AACvB,OAAO,EAIL,KAAK,iCAAiC,EACvC,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,kBAAkB,EAClB,iCAAiC,GAClC,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,kBAAkB,EAClB,qCAAqC,GACtC,MAAM,eAAe,CAAC;AAEvB,KAAK,0BAA0B,GAAG,iCAAiC,GACjE,qCAAqC,CAAC;AAKxC,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,OAAO,CAyET"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAIL,KAAK,qCAAqC,EAC3C,MAAM,eAAe,CAAC;AACvB,OAAO,EAIL,KAAK,iCAAiC,EACvC,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,kBAAkB,EAClB,iCAAiC,GAClC,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,kBAAkB,EAClB,qCAAqC,GACtC,MAAM,eAAe,CAAC;AAEvB,KAAK,0BAA0B,GAAG,iCAAiC,GACjE,qCAAqC,CAAC;AAKxC,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,OAAO,CA6ET"}
@@ -13,6 +13,7 @@ export function createProjectArchiveCommand(overrides = {}) {
13
13
  .description('Manage archived project data')
14
14
  .argument('[project-path]', 'Project path to archive')
15
15
  .option('--dry-run', 'Preview archive without moving files or syncing S3')
16
+ .option('--project-recap-run <path>', 'Export the selected project-relative recap run before archiving')
16
17
  .addHelpText('afterAll', '\nPull archived project data with `oat repo archive sync [project-name]`; `oat project archive sync` is deprecated.')
17
18
  .action(async (projectPath, options, command) => {
18
19
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
@@ -3,6 +3,7 @@ import { type OatConfig, type OatLocalConfig } from '../../../config/oat-config.
3
3
  import { resolveArchiveProjectTarget, resolvePrimaryRepoRoot, type ArchiveProjectOnCompletionOptions, type ArchiveProjectOnCompletionResult } from './archive-utils.js';
4
4
  export interface ArchivePushOptions {
5
5
  dryRun?: boolean;
6
+ projectRecapRun?: string;
6
7
  }
7
8
  export interface ProjectArchivePushCommandDependencies {
8
9
  buildCommandContext: (options: Parameters<typeof buildCommandContext>[0]) => CommandContext;
@@ -1 +1 @@
1
- {"version":3,"file":"push-runner.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/push-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAKL,2BAA2B,EAC3B,sBAAsB,EAEtB,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EACtC,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qCAAqC;IACpD,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,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,OAAO,sBAAsB,CAAC;IACtD,2BAA2B,EAAE,OAAO,2BAA2B,CAAC;IAChE,0BAA0B,EAAE,CAC1B,OAAO,EAAE,iCAAiC,KACvC,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;IAC9B,SAAS,EAAE,MAAM,MAAM,CAAC;CACzB;AAkBD,wBAAgB,4CAA4C,IAAI,qCAAqC,CAapG;AA2ID,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,qCAAqC,EACnD,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CAiEf"}
1
+ {"version":3,"file":"push-runner.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/push-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAKL,2BAA2B,EAC3B,sBAAsB,EAEtB,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EAEtC,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,qCAAqC;IACpD,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,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,OAAO,sBAAsB,CAAC;IACtD,2BAA2B,EAAE,OAAO,2BAA2B,CAAC;IAChE,0BAA0B,EAAE,CAC1B,OAAO,EAAE,iCAAiC,KACvC,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;IAC9B,SAAS,EAAE,MAAM,MAAM,CAAC;CACzB;AAmBD,wBAAgB,4CAA4C,IAAI,qCAAqC,CAapG;AAkJD,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,qCAAqC,EACnD,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CAoEf"}
@@ -40,7 +40,7 @@ async function resolveArchiveTarget(dependencies, repoRoot, projectPathArg) {
40
40
  projectPath: absoluteProjectPath,
41
41
  };
42
42
  }
43
- function buildArchiveOptions(repoRoot, config, projectsRoot, target) {
43
+ function buildArchiveOptions(repoRoot, config, projectsRoot, target, options) {
44
44
  return {
45
45
  repoRoot,
46
46
  projectPath: target.projectPath,
@@ -49,6 +49,7 @@ function buildArchiveOptions(repoRoot, config, projectsRoot, target) {
49
49
  s3Uri: config.archive?.s3Uri,
50
50
  s3SyncOnComplete: config.archive?.s3SyncOnComplete ?? false,
51
51
  summaryExportPath: config.archive?.summaryExportPath,
52
+ projectRecapRun: options.projectRecapRun,
52
53
  awsProfile: config.archive?.awsProfile,
53
54
  awsRegion: config.archive?.awsRegion,
54
55
  };
@@ -94,6 +95,9 @@ function emitArchivePushText(report, summaryExportPath, logger) {
94
95
  if (report.summaryExportFile) {
95
96
  logger.info(`Summary export: ${report.summaryExportFile}`);
96
97
  }
98
+ if (report.projectRecapExport) {
99
+ logger.info(`Project recap export: ${report.projectRecapExport.exportRoot}`);
100
+ }
97
101
  }
98
102
  function emitArchivePushReport(report, summaryExportPath, context) {
99
103
  if (context.json) {
@@ -124,7 +128,7 @@ export async function runArchivePushCommand(dependencies, projectPathArg, option
124
128
  process.exitCode = 0;
125
129
  return;
126
130
  }
127
- const result = await dependencies.archiveProjectOnCompletion(buildArchiveOptions(repoRoot, config, projectsRoot, target));
131
+ const result = await dependencies.archiveProjectOnCompletion(buildArchiveOptions(repoRoot, config, projectsRoot, target, options));
128
132
  const report = {
129
133
  status: 'ok',
130
134
  mode: 'apply',
@@ -133,6 +137,9 @@ export async function runArchivePushCommand(dependencies, projectPathArg, option
133
137
  archivePath: result.archivePath,
134
138
  s3Path: result.s3Path,
135
139
  summaryExportFile: result.summaryExportFile,
140
+ ...(result.projectRecapExport
141
+ ? { projectRecapExport: result.projectRecapExport }
142
+ : {}),
136
143
  warnings: result.warnings,
137
144
  };
138
145
  emitArchivePushReport(report, config.archive?.summaryExportPath, context);
@@ -18,6 +18,23 @@ export interface OatArchiveConfig {
18
18
  awsProfile?: string;
19
19
  awsRegion?: string;
20
20
  }
21
+ export interface OatExplainerDefaultsConfig {
22
+ palette?: string;
23
+ visualProfile?: string;
24
+ themeBundlePath?: string;
25
+ }
26
+ export type OatExplainerPublishProvider = 's3-static';
27
+ export interface OatExplainerPublishConfig {
28
+ provider?: OatExplainerPublishProvider;
29
+ s3Uri?: string;
30
+ publicBaseUrl?: string;
31
+ awsRegion?: string;
32
+ awsProfile?: string;
33
+ }
34
+ export interface OatExplainersConfig {
35
+ defaults?: OatExplainerDefaultsConfig;
36
+ publish?: OatExplainerPublishConfig;
37
+ }
21
38
  export type WorkflowHillCheckpointDefault = 'every' | 'final';
22
39
  export type WorkflowProjectLog = true | false | 'auto';
23
40
  export type WorkflowPostImplementStep = 'summary' | 'document' | 'pr';
@@ -52,6 +69,11 @@ export interface WorkflowAutoArtifactReview {
52
69
  plan?: boolean;
53
70
  analysis?: boolean;
54
71
  }
72
+ export type WorkflowExplainerPreference = 'always' | 'ask' | 'never';
73
+ export interface WorkflowExplainersConfig {
74
+ projectExplainer?: WorkflowExplainerPreference;
75
+ projectRecap?: WorkflowExplainerPreference;
76
+ }
55
77
  export interface GateConfig {
56
78
  command: string;
57
79
  onFailure: GateOnFailure;
@@ -97,6 +119,7 @@ export interface OatWorkflowConfig {
97
119
  dispatchCeiling?: WorkflowDispatchCeiling;
98
120
  gateTimeouts?: WorkflowGateTimeouts;
99
121
  gates?: WorkflowGatesConfig;
122
+ explainers?: WorkflowExplainersConfig;
100
123
  }
101
124
  export declare const VALID_CODEX_DISPATCH_CEILINGS: readonly WorkflowCodexDispatchCeiling[];
102
125
  export declare const VALID_CLAUDE_DISPATCH_CEILINGS: readonly WorkflowClaudeDispatchCeiling[];
@@ -117,6 +140,7 @@ export interface OatConfig {
117
140
  };
118
141
  git?: OatGitConfig;
119
142
  archive?: OatArchiveConfig;
143
+ explainers?: OatExplainersConfig;
120
144
  tools?: OatToolsConfig;
121
145
  documentation?: OatDocumentationConfig;
122
146
  localPaths?: string[];
@@ -128,12 +152,14 @@ export interface OatLocalConfig {
128
152
  activeProject?: string | null;
129
153
  lastPausedProject?: string | null;
130
154
  activeIdea?: string | null;
155
+ explainers?: OatExplainersConfig;
131
156
  workflow?: OatWorkflowConfig;
132
157
  }
133
158
  export interface UserConfig {
134
159
  version: number;
135
160
  activeIdea?: string | null;
136
161
  updateNotifications?: boolean;
162
+ explainers?: OatExplainersConfig;
137
163
  workflow?: OatWorkflowConfig;
138
164
  }
139
165
  export interface ActiveProjectResolution {
@@ -1 +1 @@
1
- {"version":3,"file":"oat-config.d.ts","sourceRoot":"","sources":["../../src/config/oat-config.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,EAC9B,iCAAiC,EACjC,+BAA+B,EAC/B,iCAAiC,EACjC,2BAA2B,EAC3B,KAAK,6BAA6B,EAClC,KAAK,yBAAyB,EAC9B,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,KAAK,gCAAgC,EACrC,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,GACjC,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,6BAA6B,GAAG,OAAO,GAAG,OAAO,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AACvD,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC;AACtE,MAAM,MAAM,mCAAmC,GAC3C,MAAM,GACN,SAAS,GACT,IAAI,GACJ,SAAS,CAAC;AACd,MAAM,WAAW,uCAAuC;IACtD,WAAW,EAAE,yBAAyB,EAAE,CAAC;IACzC,YAAY,EAAE,yBAAyB,EAAE,CAAC;CAC3C;AACD,MAAM,MAAM,6BAA6B,GACrC,mCAAmC,GACnC,uCAAuC,CAAC;AAC5C,MAAM,MAAM,4BAA4B,GACpC,UAAU,GACV,QAAQ,GACR,eAAe,CAAC;AACpB,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,WAAW,GAAG,OAAO,CAAC;AACzE,MAAM,MAAM,4BAA4B,GACpC,KAAK,GACL,QAAQ,GACR,MAAM,GACN,OAAO,GACP,KAAK,CAAC;AACV,MAAM,MAAM,6BAA6B,GACrC,OAAO,GACP,QAAQ,GACR,MAAM,GACN,OAAO,CAAC;AACZ,MAAM,MAAM,6BAA6B,GACrC,UAAU,GACV,SAAS,GACT,gBAAgB,CAAC;AACrB,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,SAAS,CAAC;AAC/D,MAAM,MAAM,6BAA6B,GACrC,SAAS,GACT,UAAU,GACV,MAAM,GACN,UAAU,GACV,UAAU,CAAC;AACf,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AACxD,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,cAAc,GAAG,MAAM,CAAC;AAChE,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AACzC,eAAO,MAAM,mBAAmB,WAAa,CAAC;AAE9C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAOpE;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,6BAA6B,CAAC;IACvC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,0BAA0B,CAAC;IACjC,MAAM,CAAC,EAAE,6BAA6B,CAAC;CACxC;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAC;CAC/C;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,qBAAqB,CAAC,EAAE,6BAA6B,CAAC;IACtD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB,CAAC,EAAE,6BAA6B,CAAC;IACtD,oBAAoB,CAAC,EAAE,4BAA4B,CAAC;IACpD,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC;IAChD,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAmCD,eAAO,MAAM,6BAA6B,EAAE,SAAS,4BAA4B,EACtC,CAAC;AAC5C,eAAO,MAAM,8BAA8B,EAAE,SAAS,6BAA6B,EAC7C,CAAC;AACvC,eAAO,MAAM,8BAA8B,EAAE,SAAS,6BAA6B,EACxC,CAAC;AAC5C,eAAO,MAAM,2BAA2B,EAAE,SAAS,0BAA0B,EACrD,CAAC;AACzB,eAAO,MAAM,+BAA+B,EAAE,SAAS,6BAA6B,EAC3B,CAAC;AAO1D,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CA0CrE,CAAC;AAEF,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,OAAO,GACb,uCAAuC,GAAG,SAAS,CA8CrD;AAED,wBAAgB,yCAAyC,CACvD,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,uCAAuC,CAKlD;AAoVD,MAAM,MAAM,cAAc,GAAG,OAAO,CAClC,MAAM,CACF,MAAM,GACN,OAAO,GACP,MAAM,GACN,WAAW,GACX,SAAS,GACT,oBAAoB,GACpB,UAAU,GACV,YAAY,EACd,OAAO,CACR,CACF,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;CACxC;AAuCD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACnC,MAAM,GAAG,IAAI,CA0Bf;AAgOD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,CAE7D;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAaxE;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAuBzB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,uBAAuB,CAAC,CAwClC;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC,OAAO,CAAC,IAAI,CAAC,CAYf;AAiED,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,CAAC,CAarB;AAED,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQxB;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6B5D"}
1
+ {"version":3,"file":"oat-config.d.ts","sourceRoot":"","sources":["../../src/config/oat-config.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,7 @@ const VALID_DESIGN_MODES = [
41
41
  'selective',
42
42
  'draft',
43
43
  ];
44
+ const VALID_WORKFLOW_EXPLAINER_PREFERENCES = ['always', 'ask', 'never'];
44
45
  export const VALID_CODEX_DISPATCH_CEILINGS = ['low', 'medium', 'high', 'xhigh', 'max'];
45
46
  export const VALID_CLAUDE_DISPATCH_CEILINGS = ['haiku', 'sonnet', 'opus', 'fable'];
46
47
  export const VALID_DISPATCH_CEILING_PRESETS = ['balanced', 'maximum', 'cost-conscious'];
@@ -244,6 +245,68 @@ function normalizeRecordMap(value, normalizeValue) {
244
245
  }
245
246
  return Object.keys(next).length > 0 ? next : undefined;
246
247
  }
248
+ function normalizeExplainersConfig(parsed, scope) {
249
+ if (!isRecord(parsed)) {
250
+ return undefined;
251
+ }
252
+ const next = {};
253
+ if (isRecord(parsed.defaults)) {
254
+ const defaults = {};
255
+ const palette = trimNonEmptyString(parsed.defaults.palette);
256
+ if (palette !== undefined) {
257
+ defaults.palette = palette;
258
+ }
259
+ const visualProfile = trimNonEmptyString(parsed.defaults.visualProfile);
260
+ if (visualProfile !== undefined) {
261
+ defaults.visualProfile = visualProfile;
262
+ }
263
+ if (scope !== 'user') {
264
+ const rawPath = trimNonEmptyString(parsed.defaults.themeBundlePath);
265
+ if (rawPath !== undefined) {
266
+ const normalizedPath = normalizeToPosixPath(rawPath);
267
+ const escapesSharedScope = normalizedPath === '..' || normalizedPath.startsWith('../');
268
+ if (scope === 'local' ||
269
+ (!isAbsolute(normalizedPath) && !escapesSharedScope)) {
270
+ defaults.themeBundlePath = normalizedPath;
271
+ }
272
+ }
273
+ }
274
+ if (Object.keys(defaults).length > 0) {
275
+ next.defaults = defaults;
276
+ }
277
+ }
278
+ if (isRecord(parsed.publish)) {
279
+ const publish = {};
280
+ if (scope === 'shared') {
281
+ if (parsed.publish.provider === 's3-static') {
282
+ publish.provider = 's3-static';
283
+ }
284
+ const s3Uri = trimNonEmptyString(parsed.publish.s3Uri);
285
+ if (s3Uri !== undefined && /^s3:\/\/[^/\s]+(?:\/.*)?$/.test(s3Uri)) {
286
+ publish.s3Uri = s3Uri.replace(/\/+$/, '');
287
+ }
288
+ const publicBaseUrl = trimNonEmptyString(parsed.publish.publicBaseUrl);
289
+ if (publicBaseUrl !== undefined &&
290
+ /^https:\/\/[^/\s]+(?:\/.*)?$/.test(publicBaseUrl)) {
291
+ publish.publicBaseUrl = publicBaseUrl.replace(/\/+$/, '');
292
+ }
293
+ const awsRegion = trimNonEmptyString(parsed.publish.awsRegion);
294
+ if (awsRegion !== undefined) {
295
+ publish.awsRegion = awsRegion;
296
+ }
297
+ }
298
+ else {
299
+ const awsProfile = trimNonEmptyString(parsed.publish.awsProfile);
300
+ if (awsProfile !== undefined) {
301
+ publish.awsProfile = awsProfile;
302
+ }
303
+ }
304
+ if (Object.keys(publish).length > 0) {
305
+ next.publish = publish;
306
+ }
307
+ }
308
+ return Object.keys(next).length > 0 ? next : undefined;
309
+ }
247
310
  function normalizeWorkflowConfig(parsed) {
248
311
  if (!isRecord(parsed)) {
249
312
  return undefined;
@@ -368,6 +431,19 @@ function normalizeWorkflowConfig(parsed) {
368
431
  next.gates = gates;
369
432
  }
370
433
  }
434
+ if (isRecord(parsed.explainers)) {
435
+ const explainers = {};
436
+ for (const key of ['projectExplainer', 'projectRecap']) {
437
+ const value = parsed.explainers[key];
438
+ if (typeof value === 'string' &&
439
+ VALID_WORKFLOW_EXPLAINER_PREFERENCES.includes(value)) {
440
+ explainers[key] = value;
441
+ }
442
+ }
443
+ if (Object.keys(explainers).length > 0) {
444
+ next.explainers = explainers;
445
+ }
446
+ }
371
447
  return Object.keys(next).length > 0 ? next : undefined;
372
448
  }
373
449
  const DEFAULT_OAT_CONFIG = { version: 1 };
@@ -496,6 +572,10 @@ function normalizeOatConfig(parsed) {
496
572
  next.archive = archive;
497
573
  }
498
574
  }
575
+ const explainers = normalizeExplainersConfig(parsed.explainers, 'shared');
576
+ if (explainers) {
577
+ next.explainers = explainers;
578
+ }
499
579
  if (isRecord(parsed.tools)) {
500
580
  const validPacks = [
501
581
  'core',
@@ -582,6 +662,10 @@ function normalizeOatLocalConfig(repoRoot, parsed) {
582
662
  ? parsed.activeIdea.trim()
583
663
  : null;
584
664
  }
665
+ const explainers = normalizeExplainersConfig(parsed.explainers, 'local');
666
+ if (explainers) {
667
+ next.explainers = explainers;
668
+ }
585
669
  const workflow = normalizeWorkflowConfig(parsed.workflow);
586
670
  if (workflow) {
587
671
  next.workflow = workflow;
@@ -721,6 +805,10 @@ function normalizeUserConfig(parsed) {
721
805
  if (typeof parsed.updateNotifications === 'boolean') {
722
806
  next.updateNotifications = parsed.updateNotifications;
723
807
  }
808
+ const explainers = normalizeExplainersConfig(parsed.explainers, 'user');
809
+ if (explainers) {
810
+ next.explainers = explainers;
811
+ }
724
812
  const workflow = normalizeWorkflowConfig(parsed.workflow);
725
813
  if (workflow) {
726
814
  next.workflow = workflow;
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,OAAO,GACP,MAAM,GACN,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kCAAkC;IACjD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAChE;AAsFD,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,CAAC,kCAAkC,CAAM,GAC1D,OAAO,CAAC,cAAc,CAAC,CAgFzB;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,MAAM,GAChB,UAAU,GAAG,IAAI,CAcnB;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,cAAc,GACxB,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAY5B;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,cAAc,GACxB,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAoDxC"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,OAAO,GACP,MAAM,GACN,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kCAAkC;IACjD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAChE;AAwGD,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,CAAC,kCAAkC,CAAM,GAC1D,OAAO,CAAC,cAAc,CAAC,CAgFzB;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,MAAM,GAChB,UAAU,GAAG,IAAI,CAcnB;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,cAAc,GACxB,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAY5B;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,cAAc,GACxB,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAoDxC"}