@open-agent-toolkit/cli 0.0.34 → 0.0.36

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 (40) hide show
  1. package/assets/docs/cli-utilities/tool-packs.md +8 -1
  2. package/assets/docs/provider-sync/manifest-and-drift.md +2 -0
  3. package/assets/public-package-versions.json +4 -4
  4. package/dist/commands/init/tools/core/index.d.ts.map +1 -1
  5. package/dist/commands/init/tools/core/index.js +7 -1
  6. package/dist/commands/init/tools/docs/index.d.ts.map +1 -1
  7. package/dist/commands/init/tools/docs/index.js +4 -2
  8. package/dist/commands/init/tools/ideas/index.d.ts.map +1 -1
  9. package/dist/commands/init/tools/ideas/index.js +8 -2
  10. package/dist/commands/init/tools/index.d.ts +13 -2
  11. package/dist/commands/init/tools/index.d.ts.map +1 -1
  12. package/dist/commands/init/tools/index.js +321 -83
  13. package/dist/commands/init/tools/install-state.d.ts +10 -0
  14. package/dist/commands/init/tools/install-state.d.ts.map +1 -0
  15. package/dist/commands/init/tools/install-state.js +36 -0
  16. package/dist/commands/init/tools/project-management/index.d.ts.map +1 -1
  17. package/dist/commands/init/tools/project-management/index.js +6 -0
  18. package/dist/commands/init/tools/research/index.d.ts.map +1 -1
  19. package/dist/commands/init/tools/research/index.js +8 -3
  20. package/dist/commands/init/tools/utility/index.d.ts.map +1 -1
  21. package/dist/commands/init/tools/utility/index.js +4 -2
  22. package/dist/commands/init/tools/workflows/index.d.ts.map +1 -1
  23. package/dist/commands/init/tools/workflows/index.js +8 -2
  24. package/dist/commands/sync/index.d.ts.map +1 -1
  25. package/dist/commands/sync/index.js +27 -5
  26. package/dist/commands/sync/sync.types.d.ts +1 -0
  27. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  28. package/dist/commands/tools/install/index.d.ts +2 -1
  29. package/dist/commands/tools/install/index.d.ts.map +1 -1
  30. package/dist/commands/tools/install/index.js +26 -8
  31. package/dist/commands/tools/shared/auto-sync.d.ts +4 -1
  32. package/dist/commands/tools/shared/auto-sync.d.ts.map +1 -1
  33. package/dist/commands/tools/shared/auto-sync.js +7 -2
  34. package/dist/commands/tools/shared/install-sync-context.d.ts +9 -0
  35. package/dist/commands/tools/shared/install-sync-context.d.ts.map +1 -0
  36. package/dist/commands/tools/shared/install-sync-context.js +45 -0
  37. package/dist/engine/compute-plan.d.ts +2 -1
  38. package/dist/engine/compute-plan.d.ts.map +1 -1
  39. package/dist/engine/compute-plan.js +8 -1
  40. package/package.json +2 -2
@@ -1,5 +1,6 @@
1
1
  import { buildCommandContext, } from '../../../../app/command-context.js';
2
2
  import { readGlobalOptions } from '../../../shared/shared.utils.js';
3
+ import { canonicalPathsForPack, setInstalledCanonicalPaths, } from '../../../tools/shared/install-sync-context.js';
3
4
  import { resolveAssetsRoot } from '../../../../fs/assets.js';
4
5
  import { resolveProjectRoot } from '../../../../fs/paths.js';
5
6
  import { Command } from 'commander';
@@ -19,6 +20,7 @@ export function createInitToolsProjectManagementCommand(overrides = {}) {
19
20
  .description('Install OAT project-management skills and templates')
20
21
  .option('--force', 'Overwrite existing files where applicable')
21
22
  .action(async (options, command) => {
23
+ let didInstall = false;
22
24
  try {
23
25
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
24
26
  const targetRoot = await dependencies.resolveProjectRoot(context.cwd);
@@ -44,6 +46,7 @@ export function createInitToolsProjectManagementCommand(overrides = {}) {
44
46
  context.logger.info(`Templates: copied=${result.copiedTemplates.length}, updated=${result.updatedTemplates.length}, skipped=${result.skippedTemplates.length}`);
45
47
  context.logger.info('Run: oat sync --scope project');
46
48
  }
49
+ didInstall = true;
47
50
  process.exitCode = 0;
48
51
  }
49
52
  catch (error) {
@@ -57,5 +60,8 @@ export function createInitToolsProjectManagementCommand(overrides = {}) {
57
60
  }
58
61
  process.exitCode = 1;
59
62
  }
63
+ if (didInstall) {
64
+ setInstalledCanonicalPaths(command, canonicalPathsForPack('project-management'));
65
+ }
60
66
  });
61
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/research/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAEnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAE3B,MAAM,oBAAoB,CAAC;AAM5B,KAAK,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;AAExC,UAAU,6BAA6B;IACrC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,gBAAgB,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,eAAe,EAAE,CACf,OAAO,EAAE,sBAAsB,KAC5B,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACpC,mBAAmB,EAAE,CAAC,CAAC,SAAS,MAAM,EACpC,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,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAqID,wBAAgB,8BAA8B,CAC5C,SAAS,GAAE,OAAO,CAAC,6BAA6B,CAAM,GACrD,OAAO,CAeT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/research/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAEnB,MAAM,iCAAiC,CAAC;AASzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAG3B,MAAM,oBAAoB,CAAC;AAM5B,KAAK,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;AAExC,UAAU,6BAA6B;IACrC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,gBAAgB,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,eAAe,EAAE,CACf,OAAO,EAAE,sBAAsB,KAC5B,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACpC,mBAAmB,EAAE,CAAC,CAAC,SAAS,MAAM,EACpC,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,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AA0ID,wBAAgB,8BAA8B,CAC5C,SAAS,GAAE,OAAO,CAAC,6BAA6B,CAAM,GACrD,OAAO,CAeT"}
@@ -1,10 +1,11 @@
1
1
  import { buildCommandContext, } from '../../../../app/command-context.js';
2
2
  import { confirmAction, selectManyWithAbort, } from '../../../shared/shared.prompts.js';
3
3
  import { readGlobalOptions } from '../../../shared/shared.utils.js';
4
+ import { canonicalAgentPaths, canonicalSkillPaths, setInstalledCanonicalPaths, } from '../../../tools/shared/install-sync-context.js';
4
5
  import { resolveAssetsRoot } from '../../../../fs/assets.js';
5
6
  import { resolveProjectRoot, resolveScopeRoot } from '../../../../fs/paths.js';
6
7
  import { Command } from 'commander';
7
- import { installResearch as defaultInstallResearch, RESEARCH_SKILLS, } from './install-research.js';
8
+ import { installResearch as defaultInstallResearch, RESEARCH_AGENTS, RESEARCH_SKILLS, } from './install-research.js';
8
9
  const DEFAULT_DEPENDENCIES = {
9
10
  buildCommandContext,
10
11
  resolveProjectRoot,
@@ -37,7 +38,7 @@ function reportSuccess(context, scope, targetRoot, assetsRoot, selectedSkills, r
37
38
  context.logger.info(`Agents: copied=${result.copiedAgents.length}, updated=${result.updatedAgents.length}, skipped=${result.skippedAgents.length}`);
38
39
  context.logger.info(`Run: oat sync --scope ${scope}`);
39
40
  }
40
- async function runInitToolsResearch(context, options, dependencies) {
41
+ async function runInitToolsResearch(context, options, dependencies, command) {
41
42
  try {
42
43
  const scope = resolveScope(context);
43
44
  const targetRoot = scope === 'project'
@@ -81,6 +82,10 @@ async function runInitToolsResearch(context, options, dependencies) {
81
82
  skills: selectedSkills,
82
83
  force: options.force,
83
84
  });
85
+ setInstalledCanonicalPaths(command, [
86
+ ...canonicalSkillPaths(selectedSkills),
87
+ ...canonicalAgentPaths(RESEARCH_AGENTS),
88
+ ]);
84
89
  reportSuccess(context, scope, targetRoot, assetsRoot, selectedSkills, result);
85
90
  process.exitCode = 0;
86
91
  }
@@ -105,6 +110,6 @@ export function createInitToolsResearchCommand(overrides = {}) {
105
110
  .option('--force', 'Overwrite existing files where applicable')
106
111
  .action(async (options, command) => {
107
112
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
108
- await runInitToolsResearch(context, options, dependencies);
113
+ await runInitToolsResearch(context, options, dependencies, command);
109
114
  });
110
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/utility/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAEnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAE1B,MAAM,mBAAmB,CAAC;AAM3B,KAAK,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvC,UAAU,4BAA4B;IACpC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,gBAAgB,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,cAAc,EAAE,CACd,OAAO,EAAE,qBAAqB,KAC3B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnC,mBAAmB,EAAE,CAAC,CAAC,SAAS,MAAM,EACpC,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,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAkID,wBAAgB,6BAA6B,CAC3C,SAAS,GAAE,OAAO,CAAC,4BAA4B,CAAM,GACpD,OAAO,CAeT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/utility/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAEnB,MAAM,iCAAiC,CAAC;AAQzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAE1B,MAAM,mBAAmB,CAAC;AAM3B,KAAK,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvC,UAAU,4BAA4B;IACpC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,gBAAgB,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,cAAc,EAAE,CACd,OAAO,EAAE,qBAAqB,KAC3B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnC,mBAAmB,EAAE,CAAC,CAAC,SAAS,MAAM,EACpC,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,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAoID,wBAAgB,6BAA6B,CAC3C,SAAS,GAAE,OAAO,CAAC,4BAA4B,CAAM,GACpD,OAAO,CAeT"}
@@ -1,6 +1,7 @@
1
1
  import { buildCommandContext, } from '../../../../app/command-context.js';
2
2
  import { confirmAction, selectManyWithAbort, } from '../../../shared/shared.prompts.js';
3
3
  import { readGlobalOptions } from '../../../shared/shared.utils.js';
4
+ import { canonicalSkillPaths, setInstalledCanonicalPaths, } from '../../../tools/shared/install-sync-context.js';
4
5
  import { resolveAssetsRoot } from '../../../../fs/assets.js';
5
6
  import { resolveProjectRoot, resolveScopeRoot } from '../../../../fs/paths.js';
6
7
  import { Command } from 'commander';
@@ -36,7 +37,7 @@ function reportSuccess(context, scope, targetRoot, assetsRoot, selectedSkills, r
36
37
  context.logger.info(`Skills: copied=${result.copiedSkills.length}, updated=${result.updatedSkills.length}, skipped=${result.skippedSkills.length}`);
37
38
  context.logger.info(`Run: oat sync --scope ${scope}`);
38
39
  }
39
- async function runInitToolsUtility(context, options, dependencies) {
40
+ async function runInitToolsUtility(context, options, dependencies, command) {
40
41
  try {
41
42
  const scope = resolveScope(context);
42
43
  const targetRoot = scope === 'project'
@@ -80,6 +81,7 @@ async function runInitToolsUtility(context, options, dependencies) {
80
81
  skills: selectedSkills,
81
82
  force: options.force,
82
83
  });
84
+ setInstalledCanonicalPaths(command, canonicalSkillPaths(selectedSkills));
83
85
  reportSuccess(context, scope, targetRoot, assetsRoot, selectedSkills, result);
84
86
  process.exitCode = 0;
85
87
  }
@@ -104,6 +106,6 @@ export function createInitToolsUtilityCommand(overrides = {}) {
104
106
  .option('--force', 'Overwrite existing files where applicable')
105
107
  .action(async (options, command) => {
106
108
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
107
- await runInitToolsUtility(context, options, dependencies);
109
+ await runInitToolsUtility(context, options, dependencies, command);
108
110
  });
109
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/workflows/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAM7B,UAAU,8BAA8B;IACtC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,gBAAgB,EAAE,CAChB,OAAO,EAAE,uBAAuB,KAC7B,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACrC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAgGD,wBAAgB,+BAA+B,CAC7C,SAAS,GAAE,OAAO,CAAC,8BAA8B,CAAM,GACtD,OAAO,CAeT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/workflows/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAQzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAM7B,UAAU,8BAA8B;IACtC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,gBAAgB,EAAE,CAChB,OAAO,EAAE,uBAAuB,KAC7B,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACrC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAkGD,wBAAgB,+BAA+B,CAC7C,SAAS,GAAE,OAAO,CAAC,8BAA8B,CAAM,GACtD,OAAO,CAsBT"}
@@ -1,6 +1,7 @@
1
1
  import { buildCommandContext, } from '../../../../app/command-context.js';
2
2
  import { confirmAction, } from '../../../shared/shared.prompts.js';
3
3
  import { readGlobalOptions } from '../../../shared/shared.utils.js';
4
+ import { canonicalPathsForPack, setInstalledCanonicalPaths, } from '../../../tools/shared/install-sync-context.js';
4
5
  import { resolveAssetsRoot } from '../../../../fs/assets.js';
5
6
  import { resolveProjectRoot } from '../../../../fs/paths.js';
6
7
  import { Command } from 'commander';
@@ -46,7 +47,7 @@ async function runInitToolsWorkflows(context, options, dependencies) {
46
47
  context.logger.info('Cancelled: no files were overwritten.');
47
48
  }
48
49
  process.exitCode = 0;
49
- return;
50
+ return false;
50
51
  }
51
52
  }
52
53
  const assetsRoot = await dependencies.resolveAssetsRoot();
@@ -57,6 +58,7 @@ async function runInitToolsWorkflows(context, options, dependencies) {
57
58
  });
58
59
  reportSuccess(context, targetRoot, assetsRoot, result);
59
60
  process.exitCode = 0;
61
+ return true;
60
62
  }
61
63
  catch (error) {
62
64
  const message = error instanceof Error ? error.message : String(error);
@@ -67,6 +69,7 @@ async function runInitToolsWorkflows(context, options, dependencies) {
67
69
  context.logger.error(message);
68
70
  }
69
71
  process.exitCode = 1;
72
+ return false;
70
73
  }
71
74
  }
72
75
  export function createInitToolsWorkflowsCommand(overrides = {}) {
@@ -79,6 +82,9 @@ export function createInitToolsWorkflowsCommand(overrides = {}) {
79
82
  .option('--force', 'Overwrite existing files where applicable')
80
83
  .action(async (options, command) => {
81
84
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
82
- await runInitToolsWorkflows(context, options, dependencies);
85
+ const didInstall = await runInitToolsWorkflows(context, options, dependencies);
86
+ if (didInstall) {
87
+ setInstalledCanonicalPaths(command, canonicalPathsForPack('workflows'));
88
+ }
83
89
  });
84
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"AAqCA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,cAAc,CAAC;AAyRtB,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,OAAO,CAeT"}
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"}
@@ -5,6 +5,7 @@ import { selectManyWithAbort, } from '../shared/shared.prompts.js';
5
5
  import { readGlobalOptions, resolveConcreteScopes, } from '../shared/shared.utils.js';
6
6
  import { DEFAULT_SYNC_CONFIG, loadSyncConfig, saveSyncConfig, } from '../../config/index.js';
7
7
  import { computeSyncPlan, executeSyncPlan, scanCanonical } from '../../engine/index.js';
8
+ import { CliError } from '../../errors/index.js';
8
9
  import { resolveProjectRoot, resolveScopeRoot } from '../../fs/paths.js';
9
10
  import { loadManifest } from '../../manifest/index.js';
10
11
  import { claudeAdapter } from '../../providers/claude/index.js';
@@ -15,7 +16,7 @@ import { cursorAdapter } from '../../providers/cursor/index.js';
15
16
  import { geminiAdapter } from '../../providers/gemini/index.js';
16
17
  import { getConfigAwareAdapters, } from '../../providers/shared/index.js';
17
18
  import { formatSyncPlan } from '../../ui/output.js';
18
- import { Command } from 'commander';
19
+ import { Command, Option } from 'commander';
19
20
  import { runSyncApply } from './apply.js';
20
21
  import { runSyncDryRun } from './dry-run.js';
21
22
  function defaultDependencies() {
@@ -53,6 +54,18 @@ function defaultDependencies() {
53
54
  formatSyncPlan,
54
55
  };
55
56
  }
57
+ const INSTALL_CANONICAL_PATH_PATTERN = /^\.agents\/(skills|agents|rules)\/[^/\\]+$/;
58
+ function validateInstallCanonicalPaths(paths) {
59
+ if (!paths?.length) {
60
+ return undefined;
61
+ }
62
+ for (const path of paths) {
63
+ if (!INSTALL_CANONICAL_PATH_PATTERN.test(path)) {
64
+ throw new CliError(`Invalid --install-canonical path: ${path}`, 1);
65
+ }
66
+ }
67
+ return paths;
68
+ }
56
69
  function hasProviderMismatches(mismatches) {
57
70
  return (mismatches.detectedUnset.length > 0 ||
58
71
  mismatches.detectedDisabled.length > 0);
@@ -125,7 +138,7 @@ async function maybeResolveProviderMismatches(context, scope, scopeRoot, configP
125
138
  activeAdapters: resolution.activeAdapters,
126
139
  };
127
140
  }
128
- async function computePlans(context, dependencies) {
141
+ async function computePlans(context, dependencies, allowedRemovalCanonicalPaths) {
129
142
  const scopePlans = [];
130
143
  for (const scope of resolveConcreteScopes(context.scope)) {
131
144
  const scopeRoot = await dependencies.resolveScopeRoot(scope, context);
@@ -149,6 +162,7 @@ async function computePlans(context, dependencies) {
149
162
  scope,
150
163
  config: resolved.config,
151
164
  scopeRoot,
165
+ allowedRemovalCanonicalPaths,
152
166
  });
153
167
  let codexExtensionPlan;
154
168
  let codexExtension;
@@ -201,8 +215,8 @@ function logNonInteractiveMismatchGuidance(context, scopePlans) {
201
215
  }
202
216
  }
203
217
  }
204
- async function runSyncCommand(context, dependencies) {
205
- const scopePlans = await computePlans(context, dependencies);
218
+ async function runSyncCommand(context, dependencies, allowedRemovalCanonicalPaths) {
219
+ const scopePlans = await computePlans(context, dependencies, allowedRemovalCanonicalPaths);
206
220
  logNonInteractiveMismatchGuidance(context, scopePlans);
207
221
  if (context.dryRun) {
208
222
  runSyncDryRun(context, scopePlans, dependencies);
@@ -218,8 +232,16 @@ export function createSyncCommand(overrides = {}) {
218
232
  return new Command('sync')
219
233
  .description('Sync canonical content to provider views')
220
234
  .option('--dry-run', 'Preview sync changes without applying')
235
+ .addOption(new Option('--install-canonical <path>', 'Internal install sync filter')
236
+ .hideHelp()
237
+ .default([])
238
+ .argParser((value, previous) => [
239
+ ...(previous ?? []),
240
+ value,
241
+ ]))
221
242
  .action(async (_options, command) => {
222
243
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
223
- await runSyncCommand(context, dependencies);
244
+ const options = command.opts();
245
+ await runSyncCommand(context, dependencies, validateInstallCanonicalPaths(options.installCanonical));
224
246
  });
225
247
  }
@@ -70,6 +70,7 @@ export interface SyncCommandDependencies {
70
70
  scope: ConcreteScope;
71
71
  config: SyncConfig;
72
72
  scopeRoot: string;
73
+ allowedRemovalCanonicalPaths?: string[];
73
74
  }) => Promise<SyncPlan>;
74
75
  executeSyncPlan: (plan: SyncPlan, manifest: Manifest, manifestPath: string) => Promise<SyncResult>;
75
76
  computeCodexProjectExtensionPlan: (scopeRoot: string, canonicalEntries: CanonicalEntry[]) => Promise<CodexExtensionPlan>;
@@ -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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"}
@@ -1,4 +1,5 @@
1
+ import { type InitToolsDependencies } from '../../init/tools/index.js';
1
2
  import { type AutoSyncDependencies } from '../../tools/shared/auto-sync.js';
2
3
  import type { Command } from 'commander';
3
- export declare function createToolsInstallCommand(syncDependencies?: AutoSyncDependencies): Command;
4
+ export declare function createToolsInstallCommand(syncDependencies?: AutoSyncDependencies, initOverrides?: Partial<InitToolsDependencies>, createBaseCommand?: () => Command): Command;
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/install/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,yBAAyB,CACvC,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CAyBT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/install/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBzC,wBAAgB,yBAAyB,CACvC,gBAAgB,GAAE,oBAA8C,EAChE,aAAa,GAAE,OAAO,CAAC,qBAAqB,CAAM,EAClD,iBAAiB,CAAC,EAAE,MAAM,OAAO,GAChC,OAAO,CAoCT"}
@@ -1,12 +1,23 @@
1
1
  import { execFile } from 'node:child_process';
2
2
  import { buildCommandContext } from '../../../app/command-context.js';
3
- import { createInitToolsCommand } from '../../init/tools/index.js';
3
+ import { consumeInitToolsRunMetadata, createInitToolsCommand, } from '../../init/tools/index.js';
4
4
  import { readGlobalOptions, resolveConcreteScopes, } from '../../shared/shared.utils.js';
5
5
  import { autoSync, } from '../../tools/shared/auto-sync.js';
6
+ import { getInstalledCanonicalPaths as getInstallSyncCanonicalPaths } from '../../tools/shared/install-sync-context.js';
6
7
  const defaultSyncDependencies = {
7
- runSync: async ({ scope, cwd }) => {
8
+ runSync: async ({ scope, cwd, installedCanonicalPaths }) => {
9
+ const syncArgs = [
10
+ ...process.execArgv,
11
+ process.argv[1],
12
+ 'sync',
13
+ '--scope',
14
+ scope,
15
+ ];
16
+ for (const canonicalPath of installedCanonicalPaths ?? []) {
17
+ syncArgs.push('--install-canonical', canonicalPath);
18
+ }
8
19
  await new Promise((resolve, reject) => {
9
- execFile(process.execPath, [...process.execArgv, process.argv[1], 'sync', '--scope', scope], { cwd }, (error) => {
20
+ execFile(process.execPath, syncArgs, { cwd }, (error) => {
10
21
  if (error)
11
22
  reject(error);
12
23
  else
@@ -15,8 +26,10 @@ const defaultSyncDependencies = {
15
26
  });
16
27
  },
17
28
  };
18
- export function createToolsInstallCommand(syncDependencies = defaultSyncDependencies) {
19
- const cmd = createInitToolsCommand();
29
+ export function createToolsInstallCommand(syncDependencies = defaultSyncDependencies, initOverrides = {}, createBaseCommand) {
30
+ const cmd = createBaseCommand === undefined
31
+ ? createInitToolsCommand(initOverrides)
32
+ : createBaseCommand();
20
33
  cmd.name('install');
21
34
  cmd.option('--no-sync', 'Skip auto-sync after install');
22
35
  cmd.hook('postAction', async (thisCommand, actionCommand) => {
@@ -26,9 +39,14 @@ export function createToolsInstallCommand(syncDependencies = defaultSyncDependen
26
39
  if (opts.sync === false)
27
40
  return;
28
41
  const globalOptions = readGlobalOptions(actionCommand);
29
- const context = buildCommandContext(globalOptions);
30
- const scopes = resolveConcreteScopes(context.scope);
31
- await autoSync(scopes, context.cwd, context.home, context.logger, syncDependencies);
42
+ const buildContext = initOverrides.buildCommandContext ?? buildCommandContext;
43
+ const context = buildContext(globalOptions);
44
+ const metadata = consumeInitToolsRunMetadata();
45
+ const scopes = metadata === null
46
+ ? resolveConcreteScopes(context.scope)
47
+ : metadata.affectedScopes;
48
+ const installedCanonicalPaths = getInstallSyncCanonicalPaths(actionCommand);
49
+ await autoSync(scopes, context.cwd, context.home, context.logger, syncDependencies, { installedCanonicalPaths });
32
50
  });
33
51
  return cmd;
34
52
  }
@@ -5,6 +5,7 @@ export interface AutoSyncDependencies {
5
5
  scope: ConcreteScope;
6
6
  cwd: string;
7
7
  home: string;
8
+ installedCanonicalPaths?: string[];
8
9
  }) => Promise<void>;
9
10
  }
10
11
  export interface AutoSyncResult {
@@ -12,5 +13,7 @@ export interface AutoSyncResult {
12
13
  scopes: ConcreteScope[];
13
14
  error: string | null;
14
15
  }
15
- export declare function autoSync(scopes: ConcreteScope[], cwd: string, home: string, logger: CliLogger, dependencies: AutoSyncDependencies): Promise<AutoSyncResult>;
16
+ export declare function autoSync(scopes: ConcreteScope[], cwd: string, home: string, logger: CliLogger, dependencies: AutoSyncDependencies, options?: {
17
+ installedCanonicalPaths?: string[];
18
+ }): Promise<AutoSyncResult>;
16
19
  //# sourceMappingURL=auto-sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auto-sync.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/auto-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,CAAC,OAAO,EAAE;QACjB,KAAK,EAAE,aAAa,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,cAAc,CAAC,CAgBzB"}
1
+ {"version":3,"file":"auto-sync.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/auto-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,CAAC,OAAO,EAAE;QACjB,KAAK,EAAE,aAAa,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;KACpC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,oBAAoB,EAClC,OAAO,CAAC,EAAE;IAAE,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/C,OAAO,CAAC,cAAc,CAAC,CAqBzB"}
@@ -1,10 +1,15 @@
1
- export async function autoSync(scopes, cwd, home, logger, dependencies) {
1
+ export async function autoSync(scopes, cwd, home, logger, dependencies, options) {
2
2
  if (scopes.length === 0) {
3
3
  return { synced: false, scopes: [], error: null };
4
4
  }
5
5
  try {
6
6
  for (const scope of scopes) {
7
- await dependencies.runSync({ scope, cwd, home });
7
+ await dependencies.runSync({
8
+ scope,
9
+ cwd,
10
+ home,
11
+ installedCanonicalPaths: options?.installedCanonicalPaths,
12
+ });
8
13
  }
9
14
  logger.info('Auto-sync completed.');
10
15
  return { synced: true, scopes, error: null };
@@ -0,0 +1,9 @@
1
+ import type { PackName } from '../../tools/shared/types.js';
2
+ import type { Command } from 'commander';
3
+ export declare function canonicalSkillPaths(skillNames: readonly string[]): string[];
4
+ export declare function canonicalAgentPaths(agentNames: readonly string[]): string[];
5
+ export declare function canonicalPathsForPack(pack: PackName): string[];
6
+ export declare function canonicalPathsForPacks(packs: readonly PackName[]): string[];
7
+ export declare function setInstalledCanonicalPaths(command: Command, canonicalPaths: readonly string[]): void;
8
+ export declare function getInstalledCanonicalPaths(command: Command): string[];
9
+ //# sourceMappingURL=install-sync-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-sync-context.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/install-sync-context.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAI3E;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAI3E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAuB9D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,EAAE,CAI3E;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,IAAI,CAMN;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAGrE"}
@@ -0,0 +1,45 @@
1
+ import { CORE_SKILLS, DOCS_SKILLS, IDEA_SKILLS, PROJECT_MANAGEMENT_SKILLS, RESEARCH_AGENTS, RESEARCH_SKILLS, UTILITY_SKILLS, WORKFLOW_AGENTS, WORKFLOW_SKILLS, } from '../../init/tools/shared/skill-manifest.js';
2
+ const INSTALL_SYNC_CANONICAL_PATHS = Symbol('oat.installSyncCanonicalPaths');
3
+ function uniqueCanonicalPaths(paths) {
4
+ return [...new Set(paths)];
5
+ }
6
+ export function canonicalSkillPaths(skillNames) {
7
+ return uniqueCanonicalPaths(skillNames.map((skillName) => `.agents/skills/${skillName}`));
8
+ }
9
+ export function canonicalAgentPaths(agentNames) {
10
+ return uniqueCanonicalPaths(agentNames.map((agentName) => `.agents/agents/${agentName}`));
11
+ }
12
+ export function canonicalPathsForPack(pack) {
13
+ switch (pack) {
14
+ case 'core':
15
+ return canonicalSkillPaths(CORE_SKILLS);
16
+ case 'ideas':
17
+ return canonicalSkillPaths(IDEA_SKILLS);
18
+ case 'docs':
19
+ return canonicalSkillPaths(DOCS_SKILLS);
20
+ case 'workflows':
21
+ return uniqueCanonicalPaths([
22
+ ...canonicalSkillPaths(WORKFLOW_SKILLS),
23
+ ...canonicalAgentPaths(WORKFLOW_AGENTS),
24
+ ]);
25
+ case 'utility':
26
+ return canonicalSkillPaths(UTILITY_SKILLS);
27
+ case 'project-management':
28
+ return canonicalSkillPaths(PROJECT_MANAGEMENT_SKILLS);
29
+ case 'research':
30
+ return uniqueCanonicalPaths([
31
+ ...canonicalSkillPaths(RESEARCH_SKILLS),
32
+ ...canonicalAgentPaths(RESEARCH_AGENTS),
33
+ ]);
34
+ }
35
+ }
36
+ export function canonicalPathsForPacks(packs) {
37
+ return uniqueCanonicalPaths(packs.flatMap((pack) => canonicalPathsForPack(pack)));
38
+ }
39
+ export function setInstalledCanonicalPaths(command, canonicalPaths) {
40
+ Reflect.set(command, INSTALL_SYNC_CANONICAL_PATHS, uniqueCanonicalPaths(canonicalPaths));
41
+ }
42
+ export function getInstalledCanonicalPaths(command) {
43
+ const value = Reflect.get(command, INSTALL_SYNC_CANONICAL_PATHS);
44
+ return Array.isArray(value) ? uniqueCanonicalPaths(value) : [];
45
+ }
@@ -10,7 +10,8 @@ interface ComputeSyncPlanArgs {
10
10
  scope: EngineScope;
11
11
  config: SyncConfig;
12
12
  scopeRoot?: string;
13
+ allowedRemovalCanonicalPaths?: string[];
13
14
  }
14
- export declare function computeSyncPlan({ canonical, adapters, manifest, scope, config, scopeRoot: explicitScopeRoot, }: ComputeSyncPlanArgs): Promise<SyncPlan>;
15
+ export declare function computeSyncPlan({ canonical, adapters, manifest, scope, config, scopeRoot: explicitScopeRoot, allowedRemovalCanonicalPaths, }: ComputeSyncPlanArgs): Promise<SyncPlan>;
15
16
  export {};
16
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;CACpB;AAoPD,wBAAsB,eAAe,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,MAAM,EACN,SAAS,EAAE,iBAAiB,GAC7B,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyGzC"}
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"}
@@ -168,12 +168,15 @@ 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, }) {
171
+ export async function computeSyncPlan({ canonical, adapters, manifest, scope, config, scopeRoot: explicitScopeRoot, allowedRemovalCanonicalPaths, }) {
172
172
  const entries = [];
173
173
  const removals = [];
174
174
  const scopeRoot = resolveScopeRoot(canonical, explicitScopeRoot);
175
175
  const seenCanonicalKeys = new Set();
176
176
  const activeProviderNames = new Set();
177
+ const removalFilter = allowedRemovalCanonicalPaths
178
+ ? new Set(allowedRemovalCanonicalPaths.map((canonicalPath) => normalize(canonicalPath)))
179
+ : null;
177
180
  for (const adapter of adapters) {
178
181
  for (const mapping of getSyncMappings(adapter, scope)) {
179
182
  const mappingStrategy = resolveStrategy(adapter, config, Boolean(mapping.transformCanonical));
@@ -228,6 +231,10 @@ export async function computeSyncPlan({ canonical, adapters, manifest, scope, co
228
231
  if (seenCanonicalKeys.has(canonicalKey)) {
229
232
  continue;
230
233
  }
234
+ if (removalFilter &&
235
+ !removalFilter.has(normalize(manifestEntry.canonicalPath))) {
236
+ continue;
237
+ }
231
238
  removals.push(createRemovalEntry(manifestEntry, scopeRoot));
232
239
  }
233
240
  return { scope, entries, removals };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.0.34",
3
+ "version": "0.0.36",
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.34"
36
+ "@open-agent-toolkit/control-plane": "0.0.36"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^22.10.0",