@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.
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-project-complete/SKILL.md +17 -8
- package/dist/commands/sync/index.d.ts.map +1 -1
- package/dist/commands/sync/index.js +5 -5
- package/dist/commands/sync/sync.types.d.ts +2 -2
- package/dist/commands/sync/sync.types.d.ts.map +1 -1
- package/dist/engine/compute-plan.d.ts +2 -2
- package/dist/engine/compute-plan.d.ts.map +1 -1
- package/dist/engine/compute-plan.js +14 -5
- package/dist/providers/codex/codec/sync-extension.d.ts +1 -1
- package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
- package/dist/providers/codex/codec/sync-extension.js +21 -3
- package/package.json +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-complete
|
|
3
|
-
version: 1.4.
|
|
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
|
-
|
|
317
|
+
ARCHIVE_PATH_IS_GITIGNORED="false"
|
|
317
318
|
USE_PRIMARY_REPO_ARCHIVE="false"
|
|
318
319
|
|
|
319
|
-
#
|
|
320
|
-
#
|
|
321
|
-
|
|
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="
|
|
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
|
|
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;
|
|
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,
|
|
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
|
-
|
|
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,
|
|
219
|
-
const scopePlans = await computePlans(context, dependencies,
|
|
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
|
-
|
|
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":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EACd,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EACV,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EACV,yBAAyB,EACzB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,kBAAkB,CAAC,EAAE,sBAAsB,CAAC;IAC5C,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;IACrB,kBAAkB,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC9C,eAAe,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC3C;AAED,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,qBAAqB;IACpC,UAAU,EAAE,uBAAuB,EAAE,CAAC;IACtC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,gBAAgB,EAAE,CAChB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1D,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5D,cAAc,EAAE,CACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,UAAU,KACf,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,aAAa,EAAE,CACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,KACjB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,eAAe,EAAE,CAAC;IACrC,sBAAsB,EAAE,CACtB,QAAQ,EAAE,eAAe,EAAE,EAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,KACf,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACxC,wBAAwB,EAAE,CAAC,CAAC,SAAS,MAAM,EACzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAC/B,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACzB,eAAe,EAAE,CAAC,IAAI,EAAE;QACtB,SAAS,EAAE,cAAc,EAAE,CAAC;QAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;QAC5B,QAAQ,EAAE,QAAQ,CAAC;QACnB,KAAK,EAAE,aAAa,CAAC;QACrB,MAAM,EAAE,UAAU,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;KAClC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxB,eAAe,EAAE,CACf,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,gCAAgC,EAAE,CAChC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,cAAc,EAAE,EAClC,qBAAqB,CAAC,EAAE,MAAM,EAAE,KAC7B,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjC,0BAA0B,EAAE,CAC1B,IAAI,EAAE,kBAAkB,KACrB,uBAAuB,EAAE,CAAC;IAC/B,8BAA8B,EAAE,CAC9B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,kBAAkB,KACrB,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACxC,cAAc,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;CAC9D"}
|
|
@@ -10,8 +10,8 @@ interface ComputeSyncPlanArgs {
|
|
|
10
10
|
scope: EngineScope;
|
|
11
11
|
config: SyncConfig;
|
|
12
12
|
scopeRoot?: string;
|
|
13
|
-
|
|
13
|
+
allowedCanonicalPaths?: string[];
|
|
14
14
|
}
|
|
15
|
-
export declare function computeSyncPlan({ canonical, adapters, manifest, scope, config, scopeRoot: explicitScopeRoot,
|
|
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,
|
|
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
|
-
|
|
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
|
|
178
|
-
? new Set(
|
|
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 (
|
|
235
|
-
!
|
|
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;
|
|
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
|
|
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 =
|
|
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.
|
|
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.
|
|
36
|
+
"@open-agent-toolkit/control-plane": "0.0.40"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/node": "^22.10.0",
|