@open-agent-toolkit/cli 0.0.53 → 0.0.55

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.
@@ -14,6 +14,43 @@ export const S3_ARCHIVE_SYNC_EXCLUDES = ['reviews/*', 'pr/*'];
14
14
  function normalizeS3Uri(s3Uri) {
15
15
  return s3Uri.trim().replace(/\/+$/, '');
16
16
  }
17
+ /**
18
+ * Build the env passed to every `aws` spawn in this module.
19
+ *
20
+ * Non-clobbering merge: a non-empty value in `opts` is applied only when
21
+ * `parentEnv` does not already provide that key (treating empty/whitespace
22
+ * parent values as unset). If parent env has a non-empty value, it is left
23
+ * untouched even when `opts` supplies a non-empty value. Callers that need
24
+ * flag-style overrides must set the env entry themselves before calling this
25
+ * helper. This matches discovery decision #3 — config does not clobber an
26
+ * explicit shell env.
27
+ *
28
+ * An empty/whitespace value in `opts` is also treated as unset, and we never
29
+ * inject a key when neither source supplies one — so the spawned process sees
30
+ * the same "unset" signal it would have seen without this plumbing.
31
+ *
32
+ * Exported as a package-internal helper so the archive sync command (which
33
+ * also spawns `aws`) can layer flag/env/config precedence and produce the same
34
+ * env shape without duplicating this logic. This symbol is **not** part of the
35
+ * public package surface — keep usage limited to files inside
36
+ * `commands/project/archive/`.
37
+ */
38
+ export function buildAwsEnv(parentEnv, opts) {
39
+ const env = { ...parentEnv };
40
+ const parentHas = (key) => {
41
+ const value = parentEnv[key];
42
+ return typeof value === 'string' && value.trim().length > 0;
43
+ };
44
+ const profile = typeof opts.awsProfile === 'string' ? opts.awsProfile.trim() : '';
45
+ if (profile.length > 0 && !parentHas('AWS_PROFILE')) {
46
+ env.AWS_PROFILE = profile;
47
+ }
48
+ const region = typeof opts.awsRegion === 'string' ? opts.awsRegion.trim() : '';
49
+ if (region.length > 0 && !parentHas('AWS_REGION')) {
50
+ env.AWS_REGION = region;
51
+ }
52
+ return env;
53
+ }
17
54
  function resolveRepoSlug(repoRoot) {
18
55
  return basename(repoRoot).trim().replace(/\s+/g, '-');
19
56
  }
@@ -219,6 +256,8 @@ export async function archiveProjectOnCompletion(options, dependencies = {}) {
219
256
  mode: 'completion',
220
257
  s3Uri: options.s3Uri,
221
258
  syncOnComplete: options.s3SyncOnComplete,
259
+ awsProfile: options.awsProfile,
260
+ awsRegion: options.awsRegion,
222
261
  }, {
223
262
  execFile,
224
263
  env: dependencies.env,
@@ -233,7 +272,10 @@ export async function archiveProjectOnCompletion(options, dependencies = {}) {
233
272
  }
234
273
  await execFile('aws', syncArgs, {
235
274
  cwd: options.repoRoot,
236
- env: dependencies.env ?? process.env,
275
+ env: buildAwsEnv(dependencies.env ?? process.env, {
276
+ awsProfile: options.awsProfile,
277
+ awsRegion: options.awsRegion,
278
+ }),
237
279
  });
238
280
  }
239
281
  catch (error) {
@@ -255,7 +297,12 @@ export async function ensureS3ArchiveAccess(options, dependencies = {}) {
255
297
  return { ok: true, warnings: [] };
256
298
  }
257
299
  const execFile = dependencies.execFile ?? execFileAsync;
258
- const execOptions = { env: dependencies.env ?? process.env };
300
+ const execOptions = {
301
+ env: buildAwsEnv(dependencies.env ?? process.env, {
302
+ awsProfile: options.awsProfile,
303
+ awsRegion: options.awsRegion,
304
+ }),
305
+ };
259
306
  try {
260
307
  await execFile('aws', ['--version'], execOptions);
261
308
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAIhD,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGhF,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,oBAAoB,CAAC;AAGnE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAGL,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,YAAY,EAEjB,8BAA8B,EAC/B,MAAM,iBAAiB,CAAC;AASzB,MAAM,WAAW,iCAAiC;IAChD,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,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,qBAAqB,EAAE,OAAO,qBAAqB,CAAC;IACpD,qBAAqB,EAAE,OAAO,qBAAqB,CAAC;IACpD,wBAAwB,EAAE,OAAO,wBAAwB,CAAC;IAC1D,8BAA8B,EAAE,OAAO,8BAA8B,CAAC;IACtE,QAAQ,EAAE,YAAY,CAAC;IACvB,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAwLD,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,OAAO,CAAC,iCAAiC,CAAM,GACzD,OAAO,CAuKT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAIhD,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGhF,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,oBAAoB,CAAC;AAGnE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAIL,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,YAAY,EAEjB,8BAA8B,EAC/B,MAAM,iBAAiB,CAAC;AAsEzB,MAAM,WAAW,iCAAiC;IAChD,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,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,qBAAqB,EAAE,OAAO,qBAAqB,CAAC;IACpD,qBAAqB,EAAE,OAAO,qBAAqB,CAAC;IACpD,wBAAwB,EAAE,OAAO,wBAAwB,CAAC;IAC1D,8BAA8B,EAAE,OAAO,8BAA8B,CAAC;IACtE,QAAQ,EAAE,YAAY,CAAC;IACvB,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AA4LD,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,OAAO,CAAC,iCAAiC,CAAM,GACzD,OAAO,CAsLT"}
@@ -9,8 +9,51 @@ import { readOatConfig } from '../../../config/oat-config.js';
9
9
  import { CliError } from '../../../errors/cli-error.js';
10
10
  import { resolveProjectRoot } from '../../../fs/paths.js';
11
11
  import { Command } from 'commander';
12
- import { ARCHIVE_SNAPSHOT_METADATA_FILENAME, S3_ARCHIVE_SYNC_EXCLUDES, buildProjectArchiveS3Uri, buildRepoArchiveS3Uri, ensureS3ArchiveAccess, parseArchiveSnapshotName, resolveLocalArchiveProjectPath, } from './archive-utils.js';
12
+ import { ARCHIVE_SNAPSHOT_METADATA_FILENAME, S3_ARCHIVE_SYNC_EXCLUDES, buildAwsEnv, buildProjectArchiveS3Uri, buildRepoArchiveS3Uri, ensureS3ArchiveAccess, parseArchiveSnapshotName, resolveLocalArchiveProjectPath, } from './archive-utils.js';
13
13
  const execFileAsync = promisify(execFileCallback);
14
+ /**
15
+ * Resolve effective AWS profile/region for an archive sync invocation, honoring
16
+ * the discovery decision #3 precedence: flag > parent shell env > config.
17
+ *
18
+ * The returned `env` is suitable for passing into every `aws` spawn in this
19
+ * command. The returned `awsProfile`/`awsRegion` are forwarded to
20
+ * `ensureS3ArchiveAccess` so its non-clobbering merge sees the same source of
21
+ * truth (parent env wins inside the helper, so injecting the flag value into
22
+ * the env up-front is what makes "flag > parent env" hold end-to-end).
23
+ */
24
+ function resolveSyncAwsEnv(processEnv, options, config) {
25
+ const flagProfile = typeof options.profile === 'string' && options.profile.trim().length > 0
26
+ ? options.profile.trim()
27
+ : undefined;
28
+ const flagRegion = typeof options.region === 'string' && options.region.trim().length > 0
29
+ ? options.region.trim()
30
+ : undefined;
31
+ // Layer the flag onto the parent env BEFORE delegating to buildAwsEnv. The
32
+ // helper's non-clobbering rule treats parent env as authoritative, so this
33
+ // is how the flag wins over both parent env and config.
34
+ const effectiveParent = { ...processEnv };
35
+ if (flagProfile !== undefined) {
36
+ effectiveParent.AWS_PROFILE = flagProfile;
37
+ }
38
+ if (flagRegion !== undefined) {
39
+ effectiveParent.AWS_REGION = flagRegion;
40
+ }
41
+ const configProfile = config.archive?.awsProfile;
42
+ const configRegion = config.archive?.awsRegion;
43
+ // Forward the same precedence into `awsProfile`/`awsRegion` for downstream
44
+ // helpers: prefer flag, fall back to config. Parent env is *not* substituted
45
+ // here because callers will pass the returned `env` (which already has the
46
+ // flag layered onto a clone of the parent env) as `dependencies.env` to the
47
+ // helper, so `buildAwsEnv`'s non-clobbering rule preserves "flag > parent
48
+ // env > config" against `effectiveParent` rather than the raw `process.env`.
49
+ const awsProfile = flagProfile ?? configProfile ?? undefined;
50
+ const awsRegion = flagRegion ?? configRegion ?? undefined;
51
+ const env = buildAwsEnv(effectiveParent, {
52
+ awsProfile,
53
+ awsRegion,
54
+ });
55
+ return { env, awsProfile, awsRegion };
56
+ }
14
57
  function defaultDependencies() {
15
58
  return {
16
59
  buildCommandContext,
@@ -39,17 +82,17 @@ function buildArchiveSyncArgs(source, target, options) {
39
82
  }
40
83
  return args;
41
84
  }
42
- async function runArchiveSync(repoRoot, source, target, options, dependencies) {
85
+ async function runArchiveSync(repoRoot, source, target, options, awsEnv, dependencies) {
43
86
  await dependencies.execFile('aws', buildArchiveSyncArgs(source, target, options), {
44
87
  cwd: repoRoot,
45
- env: dependencies.processEnv,
88
+ env: awsEnv,
46
89
  });
47
90
  }
48
- async function listArchiveSnapshots(repoRoot, projectsRoot, s3Uri, dependencies) {
91
+ async function listArchiveSnapshots(repoRoot, projectsRoot, s3Uri, awsEnv, dependencies) {
49
92
  const repoPrefix = `${dependencies.buildRepoArchiveS3Uri(s3Uri, repoRoot)}/`;
50
93
  const { stdout } = await dependencies.execFile('aws', ['s3', 'ls', repoPrefix], {
51
94
  cwd: repoRoot,
52
- env: dependencies.processEnv,
95
+ env: awsEnv,
53
96
  });
54
97
  return stdout
55
98
  .split('\n')
@@ -96,7 +139,7 @@ async function readLocalSnapshotName(repoRoot, target) {
96
139
  return null;
97
140
  }
98
141
  }
99
- async function syncArchiveSnapshot(repoRoot, snapshot, options, dependencies) {
142
+ async function syncArchiveSnapshot(repoRoot, snapshot, options, awsEnv, dependencies) {
100
143
  const currentSnapshotName = await readLocalSnapshotName(repoRoot, snapshot.target);
101
144
  if (!options.force && currentSnapshotName === snapshot.snapshotName) {
102
145
  return false;
@@ -107,7 +150,7 @@ async function syncArchiveSnapshot(repoRoot, snapshot, options, dependencies) {
107
150
  force: true,
108
151
  });
109
152
  }
110
- await runArchiveSync(repoRoot, snapshot.source, snapshot.target, options, dependencies);
153
+ await runArchiveSync(repoRoot, snapshot.source, snapshot.target, options, awsEnv, dependencies);
111
154
  return true;
112
155
  }
113
156
  export function createProjectArchiveCommand(overrides = {}) {
@@ -122,6 +165,8 @@ export function createProjectArchiveCommand(overrides = {}) {
122
165
  .argument('[project-name]', 'Archived project name to sync')
123
166
  .option('--dry-run', 'Preview archive sync without downloading')
124
167
  .option('--force', 'Replace the named local archive before syncing it from S3')
168
+ .option('--profile <profile>', 'AWS profile override for this sync')
169
+ .option('--region <region>', 'AWS region override for this sync')
125
170
  .action(async (projectName, options, command) => {
126
171
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
127
172
  try {
@@ -134,13 +179,16 @@ export function createProjectArchiveCommand(overrides = {}) {
134
179
  if (!s3Uri) {
135
180
  throw new CliError('Archive sync requires `archive.s3Uri` to be configured. Set it with `oat config set archive.s3Uri <s3://...>` and retry.');
136
181
  }
182
+ const { env: awsEnv, awsProfile, awsRegion, } = resolveSyncAwsEnv(dependencies.processEnv, options, config);
137
183
  await dependencies.ensureS3ArchiveAccess({
138
184
  mode: 'sync',
139
185
  s3Uri,
140
186
  syncOnComplete: config.archive?.s3SyncOnComplete ?? false,
141
- });
187
+ awsProfile,
188
+ awsRegion,
189
+ }, { env: awsEnv });
142
190
  const projectsRoot = await dependencies.resolveProjectsRoot(repoRoot, dependencies.processEnv);
143
- const snapshots = await listArchiveSnapshots(repoRoot, projectsRoot, s3Uri, dependencies);
191
+ const snapshots = await listArchiveSnapshots(repoRoot, projectsRoot, s3Uri, awsEnv, dependencies);
144
192
  const targets = projectName
145
193
  ? snapshots.filter((snapshot) => snapshot.projectName === projectName ||
146
194
  snapshot.snapshotName === projectName)
@@ -169,7 +217,7 @@ export function createProjectArchiveCommand(overrides = {}) {
169
217
  if (!snapshot) {
170
218
  continue;
171
219
  }
172
- const synced = await syncArchiveSnapshot(repoRoot, snapshot, options, dependencies);
220
+ const synced = await syncArchiveSnapshot(repoRoot, snapshot, options, awsEnv, dependencies);
173
221
  if (synced) {
174
222
  appliedTargets.push(snapshot.target);
175
223
  appliedSources.push(snapshot.source);
@@ -13,10 +13,13 @@ export interface OatArchiveConfig {
13
13
  s3SyncOnComplete?: boolean;
14
14
  summaryExportPath?: string;
15
15
  wrapUpExportPath?: string;
16
+ awsProfile?: string;
17
+ awsRegion?: string;
16
18
  }
17
19
  export type WorkflowHillCheckpointDefault = 'every' | 'final';
18
20
  export type WorkflowPostImplementSequence = 'wait' | 'summary' | 'pr' | 'docs-pr';
19
21
  export type WorkflowReviewExecutionModel = 'subagent' | 'inline' | 'fresh-session';
22
+ export type WorkflowDesignMode = 'collaborative' | 'selective' | 'draft';
20
23
  export interface OatWorkflowConfig {
21
24
  hillCheckpointDefault?: WorkflowHillCheckpointDefault;
22
25
  archiveOnComplete?: boolean;
@@ -25,6 +28,7 @@ export interface OatWorkflowConfig {
25
28
  reviewExecutionModel?: WorkflowReviewExecutionModel;
26
29
  autoReviewAtHillCheckpoints?: boolean;
27
30
  autoNarrowReReviewScope?: boolean;
31
+ designMode?: WorkflowDesignMode;
28
32
  }
29
33
  export type OatToolsConfig = Partial<Record<'core' | 'ideas' | 'docs' | 'workflows' | 'utility' | 'project-management' | 'research', boolean>>;
30
34
  export interface OatConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"oat-config.d.ts","sourceRoot":"","sources":["../../src/config/oat-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oat-config.d.ts","sourceRoot":"","sources":["../../src/config/oat-config.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,11 @@ const VALID_REVIEW_EXECUTION_MODELS = [
10
10
  'inline',
11
11
  'fresh-session',
12
12
  ];
13
+ const VALID_DESIGN_MODES = [
14
+ 'collaborative',
15
+ 'selective',
16
+ 'draft',
17
+ ];
13
18
  function normalizeWorkflowConfig(parsed) {
14
19
  if (!isRecord(parsed)) {
15
20
  return undefined;
@@ -42,6 +47,10 @@ function normalizeWorkflowConfig(parsed) {
42
47
  if (typeof parsed.autoNarrowReReviewScope === 'boolean') {
43
48
  next.autoNarrowReReviewScope = parsed.autoNarrowReReviewScope;
44
49
  }
50
+ if (typeof parsed.designMode === 'string' &&
51
+ VALID_DESIGN_MODES.includes(parsed.designMode)) {
52
+ next.designMode = parsed.designMode;
53
+ }
45
54
  return Object.keys(next).length > 0 ? next : undefined;
46
55
  }
47
56
  const DEFAULT_OAT_CONFIG = { version: 1 };
@@ -65,6 +74,13 @@ function isMissingFileError(error) {
65
74
  function trimPathValue(value) {
66
75
  return value.replace(/\/+$/, '').replace(/^\.\//, '').trim();
67
76
  }
77
+ function trimNonEmptyString(value) {
78
+ if (typeof value !== 'string') {
79
+ return undefined;
80
+ }
81
+ const trimmed = value.trim();
82
+ return trimmed.length > 0 ? trimmed : undefined;
83
+ }
68
84
  function normalizeProjectPath(repoRoot, pathValue) {
69
85
  if (pathValue == null) {
70
86
  return null;
@@ -134,6 +150,14 @@ function normalizeOatConfig(parsed) {
134
150
  parsed.archive.wrapUpExportPath.trim()) {
135
151
  archive.wrapUpExportPath = normalizeToPosixPath(parsed.archive.wrapUpExportPath.trim().replace(/\/+$/, ''));
136
152
  }
153
+ const awsProfile = trimNonEmptyString(parsed.archive.awsProfile);
154
+ if (awsProfile !== undefined) {
155
+ archive.awsProfile = awsProfile;
156
+ }
157
+ const awsRegion = trimNonEmptyString(parsed.archive.awsRegion);
158
+ if (awsRegion !== undefined) {
159
+ archive.awsRegion = awsRegion;
160
+ }
137
161
  if (Object.keys(archive).length > 0) {
138
162
  next.archive = archive;
139
163
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,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;AAgED,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"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,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;AAmED,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"}
@@ -13,6 +13,8 @@ const DEFAULT_SHARED_CONFIG = {
13
13
  s3SyncOnComplete: false,
14
14
  summaryExportPath: null,
15
15
  wrapUpExportPath: null,
16
+ awsProfile: null,
17
+ awsRegion: null,
16
18
  },
17
19
  documentation: {
18
20
  root: null,
@@ -49,6 +51,7 @@ const DEFAULT_WORKFLOW_CONFIG = {
49
51
  reviewExecutionModel: null,
50
52
  autoReviewAtHillCheckpoints: null,
51
53
  autoNarrowReReviewScope: null,
54
+ designMode: null,
52
55
  },
53
56
  };
54
57
  const ENV_OVERRIDE_MAP = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.0.53",
3
+ "version": "0.0.55",
4
4
  "private": false,
5
5
  "description": "Open Agent Toolkit CLI",
6
6
  "homepage": "https://github.com/voxmedia/open-agent-toolkit/tree/main/packages/cli",
@@ -33,7 +33,7 @@
33
33
  "ora": "^9.0.0",
34
34
  "yaml": "2.8.2",
35
35
  "zod": "^3.25.76",
36
- "@open-agent-toolkit/control-plane": "0.0.53"
36
+ "@open-agent-toolkit/control-plane": "0.0.55"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^22.10.0",