@open-agent-toolkit/cli 0.0.38 → 0.0.40

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.
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.0.38",
3
- "docs-config": "0.0.38",
4
- "docs-theme": "0.0.38",
5
- "docs-transforms": "0.0.38"
2
+ "cli": "0.0.40",
3
+ "docs-config": "0.0.40",
4
+ "docs-theme": "0.0.40",
5
+ "docs-transforms": "0.0.40"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-complete
3
- version: 1.4.1
3
+ version: 1.4.2
4
4
  description: Use when all implementation work is finished and the project is ready to close. Marks the OAT project lifecycle as complete.
5
5
  disable-model-invocation: true
6
6
  user-invocable: true
@@ -312,13 +312,21 @@ The archive-side effects in this step are CLI-owned. Follow the canonical behavi
312
312
 
313
313
  ```bash
314
314
  ARCHIVED_ROOT=".oat/projects/archived"
315
+ ARCHIVE_RELATIVE_PATH=".oat/projects/archived/${PROJECT_NAME}"
315
316
  PRIMARY_REPO_ARCHIVE=""
316
- LOCAL_ARCHIVED_ROOT=".oat/projects/archived"
317
+ ARCHIVE_PATH_IS_GITIGNORED="false"
317
318
  USE_PRIMARY_REPO_ARCHIVE="false"
318
319
 
319
- # Heuristic: if this checkout is a worktree and the primary repo archive parent
320
- # exists, use that durable archive path as the canonical archive destination.
321
- if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
320
+ # First decide whether the archive destination is local-only in this checkout.
321
+ # If the archive path is tracked here, keep the archive on the current worktree
322
+ # and branch so the completion commit and PR carry the archived project.
323
+ if git check-ignore --quiet --no-index "$ARCHIVE_RELATIVE_PATH" 2>/dev/null; then
324
+ ARCHIVE_PATH_IS_GITIGNORED="true"
325
+ fi
326
+
327
+ # Only fall back to the primary checkout when the archive destination is
328
+ # gitignored/local-only in the current worktree.
329
+ if [[ "$ARCHIVE_PATH_IS_GITIGNORED" == "true" ]] && git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
322
330
  GIT_COMMON_DIR=$(git rev-parse --git-common-dir 2>/dev/null || true)
323
331
  GIT_DIR=$(git rev-parse --git-dir 2>/dev/null || true)
324
332
  if [[ -n "$GIT_COMMON_DIR" && -n "$GIT_DIR" && "$GIT_COMMON_DIR" != "$GIT_DIR" ]]; then
@@ -328,7 +336,7 @@ if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
328
336
  USE_PRIMARY_REPO_ARCHIVE="true"
329
337
  ARCHIVED_ROOT="$PRIMARY_REPO_ARCHIVE"
330
338
  else
331
- echo "Warning: Running in a worktree, but the primary repo archive path is unavailable: $PRIMARY_REPO_ARCHIVE"
339
+ echo "Warning: Running in a worktree with a local-only archive path, but the primary repo archive path is unavailable: $PRIMARY_REPO_ARCHIVE"
332
340
  echo "A worktree-local archive may be deleted when the worktree is removed and is not a durable archive."
333
341
  echo "Require explicit confirmation before proceeding with local-only archive."
334
342
  fi
@@ -336,7 +344,7 @@ if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
336
344
  fi
337
345
 
338
346
  if [[ "$USE_PRIMARY_REPO_ARCHIVE" != "true" ]]; then
339
- ARCHIVED_ROOT="$LOCAL_ARCHIVED_ROOT"
347
+ ARCHIVED_ROOT=".oat/projects/archived"
340
348
  fi
341
349
 
342
350
  mkdir -p "$ARCHIVED_ROOT"
@@ -365,6 +373,7 @@ echo "Project archived to $ARCHIVE_PATH"
365
373
  - Ask the user explicitly: "Primary repo archive path is unavailable, so this archive may be lost when the worktree is deleted. Continue with local-only archive anyway?"
366
374
  - If the user declines, skip archiving and continue the completion flow without archive.
367
375
  - Resolve the durable repo root from `git rev-parse --git-common-dir` and `git rev-parse --git-dir`, matching the CLI helper in `packages/cli/src/commands/project/archive/archive-utils.ts`. Do not rely on a `main` checkout or default-branch naming.
376
+ - Apply this guard only when `git check-ignore --quiet --no-index "$ARCHIVE_RELATIVE_PATH"` reports that the archive destination is local-only in the current checkout.
368
377
 
369
378
  **Git handling after archive:**
370
379
 
@@ -378,7 +387,7 @@ This stages the deletions from the shared directory. The archived copy is preser
378
387
 
379
388
  **Worktree archive target (required when available):**
380
389
 
381
- If running from a git worktree, the primary repo archive directory is the canonical/durable archive destination.
390
+ If running from a git worktree, prefer the primary repo archive directory only when the archive destination is local-only/gitignored in the current checkout.
382
391
 
383
392
  Reference path:
384
393
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"AAsCA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,cAAc,CAAC;AAmTtB,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,OAAO,CA6BT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"AAsCA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,cAAc,CAAC;AAoTtB,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,OAAO,CA6BT"}
@@ -138,7 +138,7 @@ async function maybeResolveProviderMismatches(context, scope, scopeRoot, configP
138
138
  activeAdapters: resolution.activeAdapters,
139
139
  };
140
140
  }
141
- async function computePlans(context, dependencies, allowedRemovalCanonicalPaths) {
141
+ async function computePlans(context, dependencies, allowedCanonicalPaths) {
142
142
  const scopePlans = [];
143
143
  for (const scope of resolveConcreteScopes(context.scope)) {
144
144
  const scopeRoot = await dependencies.resolveScopeRoot(scope, context);
@@ -162,13 +162,13 @@ async function computePlans(context, dependencies, allowedRemovalCanonicalPaths)
162
162
  scope,
163
163
  config: resolved.config,
164
164
  scopeRoot,
165
- allowedRemovalCanonicalPaths,
165
+ allowedCanonicalPaths,
166
166
  });
167
167
  let codexExtensionPlan;
168
168
  let codexExtension;
169
169
  const activeAdapterNames = resolved.activeAdapters.map((adapter) => adapter.name);
170
170
  if (scope === 'project' && activeAdapterNames.includes('codex')) {
171
- codexExtensionPlan = await dependencies.computeCodexProjectExtensionPlan(scopeRoot, canonical);
171
+ codexExtensionPlan = await dependencies.computeCodexProjectExtensionPlan(scopeRoot, canonical, allowedCanonicalPaths);
172
172
  codexExtension = {
173
173
  operations: dependencies.toCodexExtensionOperations(codexExtensionPlan),
174
174
  managedRoles: codexExtensionPlan.managedRoles,
@@ -215,8 +215,8 @@ function logNonInteractiveMismatchGuidance(context, scopePlans) {
215
215
  }
216
216
  }
217
217
  }
218
- async function runSyncCommand(context, dependencies, allowedRemovalCanonicalPaths) {
219
- const scopePlans = await computePlans(context, dependencies, allowedRemovalCanonicalPaths);
218
+ async function runSyncCommand(context, dependencies, allowedCanonicalPaths) {
219
+ const scopePlans = await computePlans(context, dependencies, allowedCanonicalPaths);
220
220
  logNonInteractiveMismatchGuidance(context, scopePlans);
221
221
  if (context.dryRun) {
222
222
  runSyncDryRun(context, scopePlans, dependencies);
@@ -70,10 +70,10 @@ export interface SyncCommandDependencies {
70
70
  scope: ConcreteScope;
71
71
  config: SyncConfig;
72
72
  scopeRoot: string;
73
- allowedRemovalCanonicalPaths?: string[];
73
+ allowedCanonicalPaths?: string[];
74
74
  }) => Promise<SyncPlan>;
75
75
  executeSyncPlan: (plan: SyncPlan, manifest: Manifest, manifestPath: string) => Promise<SyncResult>;
76
- computeCodexProjectExtensionPlan: (scopeRoot: string, canonicalEntries: CanonicalEntry[]) => Promise<CodexExtensionPlan>;
76
+ computeCodexProjectExtensionPlan: (scopeRoot: string, canonicalEntries: CanonicalEntry[], allowedCanonicalPaths?: string[]) => Promise<CodexExtensionPlan>;
77
77
  toCodexExtensionOperations: (plan: CodexExtensionPlan) => CodexExtensionOperation[];
78
78
  applyCodexProjectExtensionPlan: (scopeRoot: string, plan: CodexExtensionPlan) => Promise<CodexExtensionApplyResult>;
79
79
  formatSyncPlan: (plan: SyncPlan, applied: boolean) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"sync.types.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/sync.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.types.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/sync.types.ts"],"names":[],"mappings":"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"}
@@ -10,8 +10,8 @@ interface ComputeSyncPlanArgs {
10
10
  scope: EngineScope;
11
11
  config: SyncConfig;
12
12
  scopeRoot?: string;
13
- allowedRemovalCanonicalPaths?: string[];
13
+ allowedCanonicalPaths?: string[];
14
14
  }
15
- export declare function computeSyncPlan({ canonical, adapters, manifest, scope, config, scopeRoot: explicitScopeRoot, allowedRemovalCanonicalPaths, }: ComputeSyncPlanArgs): Promise<SyncPlan>;
15
+ export declare function computeSyncPlan({ canonical, adapters, manifest, scope, config, scopeRoot: explicitScopeRoot, allowedCanonicalPaths, }: ComputeSyncPlanArgs): Promise<SyncPlan>;
16
16
  export {};
17
17
  //# sourceMappingURL=compute-plan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compute-plan.d.ts","sourceRoot":"","sources":["../../src/engine/compute-plan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,0BAA0B,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvE,OAAO,KAAK,EACV,WAAW,EAEX,QAAQ,EAET,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,UAAU,mBAAmB;IAC3B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B,CAAC,EAAE,MAAM,EAAE,CAAC;CACzC;AAoPD,wBAAsB,eAAe,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,MAAM,EACN,SAAS,EAAE,iBAAiB,EAC5B,4BAA4B,GAC7B,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsHzC"}
1
+ {"version":3,"file":"compute-plan.d.ts","sourceRoot":"","sources":["../../src/engine/compute-plan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,0BAA0B,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIvE,OAAO,KAAK,EACV,WAAW,EAEX,QAAQ,EAET,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,UAAU,mBAAmB;IAC3B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CAClC;AA+PD,wBAAsB,eAAe,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,MAAM,EACN,SAAS,EAAE,iBAAiB,EAC5B,qBAAqB,GACtB,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuHzC"}
@@ -168,14 +168,20 @@ function resolveScopeRoot(canonical, explicitScopeRoot) {
168
168
  function entryContentTypeMatches(entry, contentType) {
169
169
  return entry.type === contentType;
170
170
  }
171
- export async function computeSyncPlan({ canonical, adapters, manifest, scope, config, scopeRoot: explicitScopeRoot, allowedRemovalCanonicalPaths, }) {
171
+ function canonicalPathAllowed(relativeCanonicalPath, canonicalFilter) {
172
+ if (!canonicalFilter) {
173
+ return true;
174
+ }
175
+ return canonicalFilter.has(normalize(relativeCanonicalPath));
176
+ }
177
+ export async function computeSyncPlan({ canonical, adapters, manifest, scope, config, scopeRoot: explicitScopeRoot, allowedCanonicalPaths, }) {
172
178
  const entries = [];
173
179
  const removals = [];
174
180
  const scopeRoot = resolveScopeRoot(canonical, explicitScopeRoot);
175
181
  const seenCanonicalKeys = new Set();
176
182
  const activeProviderNames = new Set();
177
- const removalFilter = allowedRemovalCanonicalPaths
178
- ? new Set(allowedRemovalCanonicalPaths.map((canonicalPath) => normalize(canonicalPath)))
183
+ const canonicalFilter = allowedCanonicalPaths
184
+ ? new Set(allowedCanonicalPaths.map((canonicalPath) => normalize(canonicalPath)))
179
185
  : null;
180
186
  for (const adapter of adapters) {
181
187
  for (const mapping of getSyncMappings(adapter, scope)) {
@@ -189,6 +195,9 @@ export async function computeSyncPlan({ canonical, adapters, manifest, scope, co
189
195
  continue;
190
196
  }
191
197
  const relativeCanonicalPath = canonicalRelativePath(canonicalEntry);
198
+ if (!canonicalPathAllowed(relativeCanonicalPath, canonicalFilter)) {
199
+ continue;
200
+ }
192
201
  if (!entryInsideMapping(canonicalEntry, mapping.canonicalDir)) {
193
202
  continue;
194
203
  }
@@ -231,8 +240,8 @@ export async function computeSyncPlan({ canonical, adapters, manifest, scope, co
231
240
  if (seenCanonicalKeys.has(canonicalKey)) {
232
241
  continue;
233
242
  }
234
- if (removalFilter &&
235
- !removalFilter.has(normalize(manifestEntry.canonicalPath))) {
243
+ if (canonicalFilter &&
244
+ !canonicalFilter.has(normalize(manifestEntry.canonicalPath))) {
236
245
  continue;
237
246
  }
238
247
  removals.push(createRemovalEntry(manifestEntry, scopeRoot));
@@ -21,7 +21,7 @@ export interface CodexExtensionApplyResult {
21
21
  failed: number;
22
22
  skipped: number;
23
23
  }
24
- export declare function computeCodexProjectExtensionPlan(scopeRoot: string, canonicalEntries: CanonicalEntry[]): Promise<CodexExtensionPlan>;
24
+ export declare function computeCodexProjectExtensionPlan(scopeRoot: string, canonicalEntries: CanonicalEntry[], allowedCanonicalPaths?: string[]): Promise<CodexExtensionPlan>;
25
25
  export declare function applyCodexProjectExtensionPlan(scopeRoot: string, plan: CodexExtensionPlan): Promise<CodexExtensionApplyResult>;
26
26
  export declare function hasCodexExtensionChanges(plan: CodexExtensionPlan): boolean;
27
27
  export declare function summarizeCodexExtension(plan: CodexExtensionPlan): {
@@ -1 +1 @@
1
- {"version":3,"file":"sync-extension.d.ts","sourceRoot":"","sources":["../../../../src/providers/codex/codec/sync-extension.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAQpD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC3E,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA6B,SAAQ,uBAAuB;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,4BAA4B,EAAE,CAAC;IAC3C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAuID,wBAAsB,gCAAgC,CACpD,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,cAAc,EAAE,GACjC,OAAO,CAAC,kBAAkB,CAAC,CAuG7B;AAED,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,yBAAyB,CAAC,CA6BpC;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAE1E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG;IACjE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,CAaA;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,kBAAkB,GACvB,uBAAuB,EAAE,CAQ3B"}
1
+ {"version":3,"file":"sync-extension.d.ts","sourceRoot":"","sources":["../../../../src/providers/codex/codec/sync-extension.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAQpD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC3E,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA6B,SAAQ,uBAAuB;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,4BAA4B,EAAE,CAAC;IAC3C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAwJD,wBAAsB,gCAAgC,CACpD,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,cAAc,EAAE,EAClC,qBAAqB,CAAC,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAqH7B;AAED,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,yBAAyB,CAAC,CA6BpC;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAE1E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG;IACjE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,CAaA;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,kBAAkB,GACvB,uBAAuB,EAAE,CAQ3B"}
@@ -16,6 +16,14 @@ function configPath(scopeRoot) {
16
16
  function toRelativePath(scopeRoot, absolutePath) {
17
17
  return relative(scopeRoot, absolutePath).replaceAll('\\', '/');
18
18
  }
19
+ function canonicalPathAllowed(scopeRoot, canonicalEntry, allowedCanonicalPaths) {
20
+ if (!allowedCanonicalPaths?.length) {
21
+ return true;
22
+ }
23
+ const allowedSet = new Set(allowedCanonicalPaths);
24
+ const relativeCanonicalPath = toRelativePath(scopeRoot, canonicalEntry.canonicalPath);
25
+ return allowedSet.has(relativeCanonicalPath);
26
+ }
19
27
  async function readOptionalFile(path) {
20
28
  if (!(await fileExists(path))) {
21
29
  return null;
@@ -94,12 +102,22 @@ async function collectStaleManagedRoles(scopeRoot, existingConfigContent, desire
94
102
  }
95
103
  return stale.sort((left, right) => left.localeCompare(right));
96
104
  }
97
- export async function computeCodexProjectExtensionPlan(scopeRoot, canonicalEntries) {
98
- const desiredRoles = await desiredRolesFromCanonical(canonicalEntries, scopeRoot);
105
+ export async function computeCodexProjectExtensionPlan(scopeRoot, canonicalEntries, allowedCanonicalPaths) {
106
+ const isPartialSync = allowedCanonicalPaths !== undefined && allowedCanonicalPaths.length > 0;
107
+ const desiredRoles = await desiredRolesFromCanonical(canonicalEntries.filter((entry) => canonicalPathAllowed(scopeRoot, entry, allowedCanonicalPaths)), scopeRoot);
99
108
  const desiredRoleNames = new Set(desiredRoles.map((role) => role.roleName));
100
109
  const existingConfigPath = configPath(scopeRoot);
101
110
  const existingConfigContent = await readOptionalFile(existingConfigPath);
102
- const staleRoles = await collectStaleManagedRoles(scopeRoot, existingConfigContent, desiredRoleNames);
111
+ const staleRoles = isPartialSync
112
+ ? []
113
+ : await collectStaleManagedRoles(scopeRoot, existingConfigContent, desiredRoleNames);
114
+ if (isPartialSync && desiredRoles.length === 0) {
115
+ return {
116
+ operations: [],
117
+ managedRoles: [],
118
+ aggregateConfigHash: hashContent(existingConfigContent ?? ''),
119
+ };
120
+ }
103
121
  const operations = [];
104
122
  for (const role of desiredRoles) {
105
123
  const existingRoleContent = await readOptionalFile(role.rolePath);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.0.38",
3
+ "version": "0.0.40",
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.38"
36
+ "@open-agent-toolkit/control-plane": "0.0.40"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^22.10.0",