@open-agent-toolkit/cli 0.2.51 → 0.2.53

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 (218) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/bootstrap.md +6 -2
  3. package/assets/docs/cli-utilities/tool-packs.md +87 -33
  4. package/assets/docs/provider-sync/commands.md +30 -2
  5. package/assets/docs/provider-sync/config.md +19 -0
  6. package/assets/docs/provider-sync/manifest-and-drift.md +37 -0
  7. package/assets/docs/provider-sync/providers.md +69 -2
  8. package/assets/docs/provider-sync/scope-and-surface.md +44 -0
  9. package/assets/docs/reference/cli-reference.md +1 -0
  10. package/assets/docs/reference/oat-directory-structure.md +11 -4
  11. package/assets/docs/workflows/projects/evidence-layers.md +110 -1
  12. package/assets/docs/workflows/projects/implementation-execution.md +13 -0
  13. package/assets/docs/workflows/projects/orchestration-model.md +18 -0
  14. package/assets/public-package-versions.json +4 -4
  15. package/assets/skills/oat-dispatch-subagents/SKILL.md +57 -1
  16. package/assets/skills/oat-dispatch-subagents/references/record-schema.md +77 -1
  17. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -1
  18. package/assets/skills/oat-project-dispatch-subagents/SKILL.md +24 -1
  19. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -1
  20. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +11 -0
  21. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -1
  22. package/assets/skills/oat-project-plan-writing/SKILL.md +12 -1
  23. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -1
  24. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -1
  25. package/assets/skills/oat-project-review-provide/SKILL.md +12 -1
  26. package/assets/skills/oat-project-review-provide-remote/SKILL.md +12 -1
  27. package/dist/agents/canonical/index.d.ts +2 -0
  28. package/dist/agents/canonical/index.d.ts.map +1 -1
  29. package/dist/agents/canonical/index.js +1 -0
  30. package/dist/agents/canonical/resolve.d.ts +45 -0
  31. package/dist/agents/canonical/resolve.d.ts.map +1 -0
  32. package/dist/agents/canonical/resolve.js +175 -0
  33. package/dist/commands/decision/agents-guidance.d.ts +2 -2
  34. package/dist/commands/decision/agents-guidance.d.ts.map +1 -1
  35. package/dist/commands/decision/agents-guidance.js +1 -4
  36. package/dist/commands/decision/index.d.ts.map +1 -1
  37. package/dist/commands/decision/index.js +25 -6
  38. package/dist/commands/docs/init/index.d.ts +7 -1
  39. package/dist/commands/docs/init/index.d.ts.map +1 -1
  40. package/dist/commands/docs/init/index.js +53 -20
  41. package/dist/commands/doctor/index.d.ts +8 -2
  42. package/dist/commands/doctor/index.d.ts.map +1 -1
  43. package/dist/commands/doctor/index.js +157 -46
  44. package/dist/commands/init/index.d.ts +8 -3
  45. package/dist/commands/init/index.d.ts.map +1 -1
  46. package/dist/commands/init/index.js +66 -28
  47. package/dist/commands/init/tools/index.d.ts +12 -12
  48. package/dist/commands/init/tools/index.d.ts.map +1 -1
  49. package/dist/commands/init/tools/index.js +430 -99
  50. package/dist/commands/init/tools/install-state.d.ts +2 -0
  51. package/dist/commands/init/tools/install-state.d.ts.map +1 -1
  52. package/dist/commands/init/tools/install-state.js +11 -0
  53. package/dist/commands/init/tools/project-guidance.d.ts +49 -0
  54. package/dist/commands/init/tools/project-guidance.d.ts.map +1 -0
  55. package/dist/commands/init/tools/project-guidance.js +144 -0
  56. package/dist/commands/init/tools/workflows/index.d.ts +7 -0
  57. package/dist/commands/init/tools/workflows/index.d.ts.map +1 -1
  58. package/dist/commands/init/tools/workflows/index.js +160 -7
  59. package/dist/commands/pjm/index.d.ts.map +1 -1
  60. package/dist/commands/pjm/index.js +28 -3
  61. package/dist/commands/pjm/init.d.ts +5 -0
  62. package/dist/commands/pjm/init.d.ts.map +1 -1
  63. package/dist/commands/pjm/init.js +19 -3
  64. package/dist/commands/project/dispatch/index.d.ts +10 -0
  65. package/dist/commands/project/dispatch/index.d.ts.map +1 -0
  66. package/dist/commands/project/dispatch/index.js +137 -0
  67. package/dist/commands/project/dispatch/record.d.ts +91 -0
  68. package/dist/commands/project/dispatch/record.d.ts.map +1 -0
  69. package/dist/commands/project/dispatch/record.js +402 -0
  70. package/dist/commands/project/index.d.ts.map +1 -1
  71. package/dist/commands/project/index.js +2 -0
  72. package/dist/commands/providers/inspect/inspect.d.ts +8 -1
  73. package/dist/commands/providers/inspect/inspect.d.ts.map +1 -1
  74. package/dist/commands/providers/inspect/inspect.js +146 -26
  75. package/dist/commands/providers/list/list.d.ts +8 -1
  76. package/dist/commands/providers/list/list.d.ts.map +1 -1
  77. package/dist/commands/providers/list/list.js +139 -23
  78. package/dist/commands/providers/providers.types.d.ts +25 -1
  79. package/dist/commands/providers/providers.types.d.ts.map +1 -1
  80. package/dist/commands/providers/set/index.d.ts +9 -1
  81. package/dist/commands/providers/set/index.d.ts.map +1 -1
  82. package/dist/commands/providers/set/index.js +43 -33
  83. package/dist/commands/remove/skill/remove-skill.d.ts.map +1 -1
  84. package/dist/commands/remove/skill/remove-skill.js +11 -0
  85. package/dist/commands/shared/agents-md.d.ts +42 -14
  86. package/dist/commands/shared/agents-md.d.ts.map +1 -1
  87. package/dist/commands/shared/agents-md.js +364 -70
  88. package/dist/commands/status/index.d.ts +8 -3
  89. package/dist/commands/status/index.d.ts.map +1 -1
  90. package/dist/commands/status/index.js +149 -37
  91. package/dist/commands/sync/apply.d.ts.map +1 -1
  92. package/dist/commands/sync/apply.js +220 -29
  93. package/dist/commands/sync/dry-run.d.ts.map +1 -1
  94. package/dist/commands/sync/dry-run.js +30 -6
  95. package/dist/commands/sync/index.d.ts +17 -2
  96. package/dist/commands/sync/index.d.ts.map +1 -1
  97. package/dist/commands/sync/index.js +108 -43
  98. package/dist/commands/sync/sync.types.d.ts +39 -2
  99. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  100. package/dist/commands/sync/sync.utils.d.ts +5 -1
  101. package/dist/commands/sync/sync.utils.d.ts.map +1 -1
  102. package/dist/commands/sync/sync.utils.js +73 -0
  103. package/dist/commands/tools/info/info-tool.d.ts +2 -0
  104. package/dist/commands/tools/info/info-tool.d.ts.map +1 -1
  105. package/dist/commands/tools/info/info-tool.js +34 -12
  106. package/dist/commands/tools/install/index.d.ts.map +1 -1
  107. package/dist/commands/tools/install/index.js +19 -3
  108. package/dist/commands/tools/list/list-tools.d.ts +2 -0
  109. package/dist/commands/tools/list/list-tools.d.ts.map +1 -1
  110. package/dist/commands/tools/list/list-tools.js +36 -7
  111. package/dist/commands/tools/remove/index.d.ts.map +1 -1
  112. package/dist/commands/tools/remove/index.js +150 -21
  113. package/dist/commands/tools/remove/remove-tools.d.ts +20 -0
  114. package/dist/commands/tools/remove/remove-tools.d.ts.map +1 -1
  115. package/dist/commands/tools/remove/remove-tools.js +122 -1
  116. package/dist/commands/tools/shared/format-pack-inventory.d.ts +19 -0
  117. package/dist/commands/tools/shared/format-pack-inventory.d.ts.map +1 -1
  118. package/dist/commands/tools/shared/format-pack-inventory.js +109 -0
  119. package/dist/commands/tools/shared/pack-evidence.d.ts +66 -0
  120. package/dist/commands/tools/shared/pack-evidence.d.ts.map +1 -0
  121. package/dist/commands/tools/shared/pack-evidence.js +132 -0
  122. package/dist/commands/tools/shared/pack-inventory.d.ts +1 -0
  123. package/dist/commands/tools/shared/pack-inventory.d.ts.map +1 -1
  124. package/dist/commands/tools/shared/pack-lifecycle-outcome.d.ts +44 -0
  125. package/dist/commands/tools/shared/pack-lifecycle-outcome.d.ts.map +1 -0
  126. package/dist/commands/tools/shared/pack-lifecycle-outcome.js +91 -0
  127. package/dist/commands/tools/update/index.d.ts.map +1 -1
  128. package/dist/commands/tools/update/index.js +74 -4
  129. package/dist/commands/tools/update/update-tools.d.ts +5 -0
  130. package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
  131. package/dist/commands/tools/update/update-tools.js +64 -2
  132. package/dist/config/oat-config.d.ts +5 -0
  133. package/dist/config/oat-config.d.ts.map +1 -1
  134. package/dist/config/oat-config.js +17 -5
  135. package/dist/config/user-sync-config.d.ts +1 -0
  136. package/dist/config/user-sync-config.d.ts.map +1 -1
  137. package/dist/config/user-sync-config.js +8 -0
  138. package/dist/drift/detector.d.ts +2 -2
  139. package/dist/drift/detector.d.ts.map +1 -1
  140. package/dist/drift/detector.js +18 -0
  141. package/dist/drift/strays.d.ts.map +1 -1
  142. package/dist/drift/strays.js +5 -0
  143. package/dist/engine/collection-sync.d.ts +14 -0
  144. package/dist/engine/collection-sync.d.ts.map +1 -0
  145. package/dist/engine/collection-sync.js +282 -0
  146. package/dist/engine/compute-plan.d.ts +8 -1
  147. package/dist/engine/compute-plan.d.ts.map +1 -1
  148. package/dist/engine/compute-plan.js +303 -12
  149. package/dist/engine/engine.types.d.ts +61 -0
  150. package/dist/engine/engine.types.d.ts.map +1 -1
  151. package/dist/engine/execute-plan.d.ts +22 -2
  152. package/dist/engine/execute-plan.d.ts.map +1 -1
  153. package/dist/engine/execute-plan.js +459 -27
  154. package/dist/engine/index.d.ts +1 -1
  155. package/dist/engine/index.d.ts.map +1 -1
  156. package/dist/engine/index.js +1 -1
  157. package/dist/engine/provider-path-safety.d.ts +1 -0
  158. package/dist/engine/provider-path-safety.d.ts.map +1 -1
  159. package/dist/engine/provider-path-safety.js +15 -0
  160. package/dist/engine/scanner.d.ts +9 -2
  161. package/dist/engine/scanner.d.ts.map +1 -1
  162. package/dist/engine/scanner.js +58 -4
  163. package/dist/fs/io.d.ts +67 -0
  164. package/dist/fs/io.d.ts.map +1 -1
  165. package/dist/fs/io.js +536 -3
  166. package/dist/manifest/index.d.ts +2 -2
  167. package/dist/manifest/index.d.ts.map +1 -1
  168. package/dist/manifest/index.js +1 -1
  169. package/dist/manifest/manager.d.ts +2 -2
  170. package/dist/manifest/manager.d.ts.map +1 -1
  171. package/dist/manifest/manager.js +20 -3
  172. package/dist/manifest/manifest.types.d.ts +704 -13
  173. package/dist/manifest/manifest.types.d.ts.map +1 -1
  174. package/dist/manifest/manifest.types.js +131 -15
  175. package/dist/providers/codex/codec/sync-extension.d.ts +1 -1
  176. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  177. package/dist/providers/codex/codec/sync-extension.js +48 -17
  178. package/dist/providers/cursor/codec/sync-extension.d.ts +1 -1
  179. package/dist/providers/cursor/codec/sync-extension.d.ts.map +1 -1
  180. package/dist/providers/cursor/codec/sync-extension.js +52 -23
  181. package/dist/providers/identity/absolute-paths.d.ts +68 -0
  182. package/dist/providers/identity/absolute-paths.d.ts.map +1 -0
  183. package/dist/providers/identity/absolute-paths.js +144 -0
  184. package/dist/providers/identity/claude-runtime-observation.d.ts +105 -0
  185. package/dist/providers/identity/claude-runtime-observation.d.ts.map +1 -0
  186. package/dist/providers/identity/claude-runtime-observation.fixtures.d.ts +40 -0
  187. package/dist/providers/identity/claude-runtime-observation.fixtures.d.ts.map +1 -0
  188. package/dist/providers/identity/claude-runtime-observation.fixtures.js +146 -0
  189. package/dist/providers/identity/claude-runtime-observation.js +229 -0
  190. package/dist/providers/identity/codex-runtime-observation.d.ts +75 -0
  191. package/dist/providers/identity/codex-runtime-observation.d.ts.map +1 -0
  192. package/dist/providers/identity/codex-runtime-observation.fixtures.d.ts +37 -0
  193. package/dist/providers/identity/codex-runtime-observation.fixtures.d.ts.map +1 -0
  194. package/dist/providers/identity/codex-runtime-observation.fixtures.js +539 -0
  195. package/dist/providers/identity/codex-runtime-observation.js +255 -0
  196. package/dist/providers/identity/generic-dispatch-record.d.ts +313 -0
  197. package/dist/providers/identity/generic-dispatch-record.d.ts.map +1 -0
  198. package/dist/providers/identity/generic-dispatch-record.js +539 -0
  199. package/dist/providers/identity/oat-dispatch-record.d.ts +1964 -0
  200. package/dist/providers/identity/oat-dispatch-record.d.ts.map +1 -0
  201. package/dist/providers/identity/oat-dispatch-record.js +691 -0
  202. package/dist/providers/identity/runtime-observation.d.ts +100 -0
  203. package/dist/providers/identity/runtime-observation.d.ts.map +1 -0
  204. package/dist/providers/identity/runtime-observation.js +169 -0
  205. package/dist/providers/shared/index.d.ts +2 -0
  206. package/dist/providers/shared/index.d.ts.map +1 -1
  207. package/dist/providers/shared/index.js +1 -0
  208. package/dist/providers/shared/materialization-extension.d.ts +12 -0
  209. package/dist/providers/shared/materialization-extension.d.ts.map +1 -1
  210. package/dist/providers/shared/registry.d.ts +69 -0
  211. package/dist/providers/shared/registry.d.ts.map +1 -0
  212. package/dist/providers/shared/registry.js +252 -0
  213. package/dist/providers/shared/restart-adviser.d.ts +26 -0
  214. package/dist/providers/shared/restart-adviser.d.ts.map +1 -0
  215. package/dist/providers/shared/restart-adviser.js +96 -0
  216. package/dist/shared/types.d.ts +4 -0
  217. package/dist/shared/types.d.ts.map +1 -1
  218. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"dry-run.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/dry-run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EAExB,MAAM,cAAc,CAAC;AAiEtB,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,aAAa,EAAE,EAC3B,YAAY,EAAE,uBAAuB,GACpC,IAAI,CA+CN"}
1
+ {"version":3,"file":"dry-run.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/dry-run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EAExB,MAAM,cAAc,CAAC;AAsGtB,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,aAAa,EAAE,EAC3B,YAAY,EAAE,uBAAuB,GACpC,IAAI,CAqDN"}
@@ -1,4 +1,4 @@
1
- import { countPlannedOperations } from './sync.utils.js';
1
+ import { buildCollectionLifecycle, countPlannedOperations, formatCollectionLifecycle, toSyncOutputPlan, } from './sync.utils.js';
2
2
  function summarize(scopePlans) {
3
3
  return {
4
4
  plannedOperations: countPlannedOperations(scopePlans),
@@ -10,10 +10,21 @@ function summarize(scopePlans) {
10
10
  return (total +
11
11
  scopePlan.plan.entries.filter((entry) => entry.operation === 'skip')
12
12
  .length +
13
+ (scopePlan.plan.collections ?? []).filter(({ action }) => action === 'fallback-per-entry').length +
13
14
  extensionSkipped);
14
15
  }, 0),
15
16
  };
16
17
  }
18
+ function buildOperationResults(scopePlans) {
19
+ return scopePlans.flatMap((scopePlan) => [...scopePlan.plan.entries, ...scopePlan.plan.removals].map((operation) => ({
20
+ scope: scopePlan.scope,
21
+ provider: operation.provider,
22
+ contentKind: operation.canonical.type,
23
+ asset: operation.canonical.name,
24
+ action: operation.operation,
25
+ status: operation.operation === 'skip' ? 'current' : 'planned',
26
+ })));
27
+ }
17
28
  function formatMaterializationExtensions(scopePlan) {
18
29
  return scopePlan.materializationExtensions
19
30
  .map((extension) => {
@@ -35,11 +46,20 @@ function formatDryRunOutput(scopePlans, dependencies) {
35
46
  }
36
47
  return scopePlans
37
48
  .map((scopePlan) => {
38
- const syncOutput = dependencies.formatSyncPlan(scopePlan.plan, false);
49
+ const collectionOutput = formatCollectionLifecycle(buildCollectionLifecycle(scopePlan));
50
+ const syncOutput = collectionOutput &&
51
+ scopePlan.plan.entries.length === 0 &&
52
+ scopePlan.plan.removals.length === 0
53
+ ? 'Per-entry sync plan\nNo per-entry operations.'
54
+ : dependencies.formatSyncPlan(scopePlan.plan, false);
39
55
  const extensionOutput = formatMaterializationExtensions(scopePlan);
40
- return extensionOutput
41
- ? `Scope: ${scopePlan.scope}\n${syncOutput}\n\n${extensionOutput}`
42
- : `Scope: ${scopePlan.scope}\n${syncOutput}`;
56
+ return [
57
+ `Scope: ${scopePlan.scope}\n${syncOutput}`,
58
+ collectionOutput,
59
+ extensionOutput,
60
+ ]
61
+ .filter(Boolean)
62
+ .join('\n\n');
43
63
  })
44
64
  .join('\n\n');
45
65
  }
@@ -52,6 +72,8 @@ export function runSyncDryRun(context, scopePlans, dependencies) {
52
72
  .map((scopePlan) => scopePlan.versionSkew)
53
73
  .filter((skew) => skew !== undefined);
54
74
  const materializationExtensions = scopePlans.flatMap((scopePlan) => scopePlan.materializationExtensions);
75
+ const operationResults = buildOperationResults(scopePlans);
76
+ const collectionOperations = scopePlans.flatMap((scopePlan) => buildCollectionLifecycle(scopePlan));
55
77
  const codexExtensions = materializationExtensions
56
78
  .filter((extension) => extension.provider === 'codex')
57
79
  .map((extension) => ({
@@ -69,11 +91,13 @@ export function runSyncDryRun(context, scopePlans, dependencies) {
69
91
  context.logger.json({
70
92
  scope: context.scope,
71
93
  dryRun: true,
72
- plans: scopePlans.map((scopePlan) => scopePlan.plan),
94
+ plans: scopePlans.map(toSyncOutputPlan),
95
+ collectionOperations,
73
96
  summary,
74
97
  providerMismatches,
75
98
  versionSkew,
76
99
  materializationExtensions,
100
+ operationResults,
77
101
  codexExtensions,
78
102
  });
79
103
  }
@@ -1,4 +1,19 @@
1
+ import { type SyncConfig } from '../../config/index.js';
2
+ import { type ProviderScopeContext } from '../../providers/shared/index.js';
3
+ import { type CanonicalScanTarget, type ConcreteScope } from '../../shared/types.js';
1
4
  import { Command } from 'commander';
2
- import type { SyncCommandDependencies } from './sync.types.js';
3
- export declare function createSyncCommand(overrides?: Partial<SyncCommandDependencies>): Command;
5
+ import type { ScopeSyncPlan, SyncCommandDependencies } from './sync.types.js';
6
+ type ContextualSyncDependencies = Omit<SyncCommandDependencies, 'computeSyncPlan' | 'scanCanonical'> & {
7
+ scanCanonical: (scopeRoot: string, scope: ConcreteScope, targets?: readonly CanonicalScanTarget[]) => ReturnType<SyncCommandDependencies['scanCanonical']>;
8
+ computeSyncPlan: (args: Parameters<SyncCommandDependencies['computeSyncPlan']>[0] & {
9
+ extensionOwnedCanonicalPathsByProvider?: Readonly<Record<string, readonly string[]>>;
10
+ }) => ReturnType<SyncCommandDependencies['computeSyncPlan']>;
11
+ resolveProviderScopeContext?: (input: {
12
+ scope: ScopeSyncPlan['scope'];
13
+ scopeRoot: string;
14
+ config: SyncConfig;
15
+ }) => Promise<ProviderScopeContext>;
16
+ };
17
+ export declare function createSyncCommand(overrides?: Partial<ContextualSyncDependencies>): Command;
18
+ export {};
4
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"AA2CA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,OAAO,KAAK,EAGV,uBAAuB,EAGxB,MAAM,cAAc,CAAC;AAoZtB,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,OAAO,CAuDT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,eAAe,CAAC;AAWvB,OAAO,EAOL,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,OAAO,KAAK,EACV,aAAa,EAEb,uBAAuB,EAGxB,MAAM,cAAc,CAAC;AAEtB,KAAK,0BAA0B,GAAG,IAAI,CACpC,uBAAuB,EACvB,iBAAiB,GAAG,eAAe,CACpC,GAAG;IACF,aAAa,EAAE,CACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE,SAAS,mBAAmB,EAAE,KACrC,UAAU,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1D,eAAe,EAAE,CACf,IAAI,EAAE,UAAU,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;QAChE,sCAAsC,CAAC,EAAE,QAAQ,CAC/C,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAClC,CAAC;KACH,KACE,UAAU,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC5D,2BAA2B,CAAC,EAAE,CAAC,KAAK,EAAE;QACpC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,UAAU,CAAC;KACpB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACrC,CAAC;AA8eF,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,OAAO,CA+DT"}
@@ -5,19 +5,13 @@ import { withScopeOption } from '../shared/scope-option.js';
5
5
  import { selectManyWithAbort, } from '../shared/shared.prompts.js';
6
6
  import { readGlobalOptions, resolveConcreteScopes, } from '../shared/shared.utils.js';
7
7
  import { DEFAULT_SYNC_CONFIG, loadSyncConfig, saveSyncConfig, } from '../../config/index.js';
8
- import { computeSyncPlan, executeSyncPlan, scanBundledManagedAgents, scanCanonical, } from '../../engine/index.js';
8
+ import { computeSyncPlan, executeSyncPlan, mergeUserScopeMaterializationEntries, scanBundledManagedAgents, scanCanonical, } from '../../engine/index.js';
9
9
  import { CliError } from '../../errors/index.js';
10
10
  import { resolveProjectRoot, resolveScopeRoot } from '../../fs/paths.js';
11
11
  import { loadManifest } from '../../manifest/index.js';
12
- import { claudeAdapter } from '../../providers/claude/index.js';
13
- import { codexAdapter } from '../../providers/codex/index.js';
14
- import { codexMaterializationExtension } from '../../providers/codex/codec/sync-extension.js';
15
- import { copilotAdapter } from '../../providers/copilot/index.js';
16
- import { cursorAdapter } from '../../providers/cursor/index.js';
17
- import { cursorMaterializationExtension } from '../../providers/cursor/codec/sync-extension.js';
18
- import { geminiAdapter } from '../../providers/gemini/index.js';
19
- import { getConfigAwareAdapters, toMaterializationOperations, } from '../../providers/shared/index.js';
12
+ import { getConfigAwareAdapters, getProviderRegistrations, recomputeProviderScopeContext, resolveProviderScopeContext, toMaterializationOperations, } from '../../providers/shared/index.js';
20
13
  import { OAT_VERSION } from '../../shared/oat-version.js';
14
+ import { USER_SCOPE_MANAGED_AGENT_FILES, } from '../../shared/types.js';
21
15
  import { formatSyncPlan } from '../../ui/output.js';
22
16
  import { Command, Option } from 'commander';
23
17
  import { runSyncApply } from './apply.js';
@@ -40,23 +34,15 @@ function defaultDependencies() {
40
34
  scanCanonical,
41
35
  scanBundledManagedAgents,
42
36
  getAdapters() {
43
- return [
44
- claudeAdapter,
45
- cursorAdapter,
46
- codexAdapter,
47
- copilotAdapter,
48
- geminiAdapter,
49
- ];
37
+ return getProviderRegistrations().map(({ adapter }) => adapter);
50
38
  },
51
39
  getConfigAwareAdapters,
40
+ resolveProviderScopeContext,
52
41
  selectProvidersWithAbort: selectManyWithAbort,
53
42
  computeSyncPlan,
54
43
  executeSyncPlan,
55
44
  getMaterializationExtensions() {
56
- return [
57
- codexMaterializationExtension,
58
- cursorMaterializationExtension,
59
- ];
45
+ return getProviderRegistrations().flatMap(({ extensions }) => extensions);
60
46
  },
61
47
  applyMaterializationExtensionPlan(extension, scopeRoot, plan) {
62
48
  return extension.applyPlan(scopeRoot, plan);
@@ -109,26 +95,29 @@ function buildMismatchChoices(adapters, mismatches) {
109
95
  };
110
96
  });
111
97
  }
112
- async function maybeResolveProviderMismatches(context, scope, scopeRoot, configPath, config, adapters, mismatches, dependencies) {
98
+ async function maybeResolveProviderMismatches(context, scope, scopeRoot, configPath, config, adapters, mismatches, dependencies, activeAdapters, providerContext) {
113
99
  if (scope !== 'project' ||
114
100
  !context.interactive ||
115
101
  !hasProviderMismatches(mismatches)) {
116
102
  return {
117
103
  config,
118
104
  mismatches,
119
- activeAdapters: await dependencies
120
- .getConfigAwareAdapters(adapters, scopeRoot, config)
121
- .then((resolution) => resolution.activeAdapters),
105
+ activeAdapters: activeAdapters ??
106
+ (await dependencies
107
+ .getConfigAwareAdapters(adapters, scopeRoot, config)
108
+ .then((resolution) => resolution.activeAdapters)),
122
109
  };
123
110
  }
124
111
  const choices = buildMismatchChoices(adapters, mismatches);
125
112
  const selected = await dependencies.selectProvidersWithAbort('Detected provider directories are not enabled in config. Select providers to enable for sync.', choices, { interactive: context.interactive });
126
113
  if (selected === null) {
127
- const resolution = await dependencies.getConfigAwareAdapters(adapters, scopeRoot, config);
128
114
  return {
129
115
  config,
130
116
  mismatches,
131
- activeAdapters: resolution.activeAdapters,
117
+ activeAdapters: activeAdapters ??
118
+ (await dependencies
119
+ .getConfigAwareAdapters(adapters, scopeRoot, config)
120
+ .then((resolution) => resolution.activeAdapters)),
132
121
  };
133
122
  }
134
123
  const selectedSet = new Set(selected);
@@ -148,14 +137,29 @@ async function maybeResolveProviderMismatches(context, scope, scopeRoot, configP
148
137
  ...config,
149
138
  providers,
150
139
  });
151
- const resolution = await dependencies.getConfigAwareAdapters(adapters, scopeRoot, savedConfig);
140
+ const refreshedProviderContext = providerContext
141
+ ? recomputeProviderScopeContext(providerContext, savedConfig)
142
+ : undefined;
143
+ const resolution = refreshedProviderContext
144
+ ? undefined
145
+ : await dependencies.getConfigAwareAdapters(adapters, scopeRoot, savedConfig);
152
146
  return {
153
147
  config: savedConfig,
154
148
  mismatches: {
155
- detectedUnset: resolution.detectedUnset,
156
- detectedDisabled: resolution.detectedDisabled,
149
+ detectedUnset: [
150
+ ...(refreshedProviderContext?.mismatches.detectedUnset ??
151
+ resolution.detectedUnset),
152
+ ],
153
+ detectedDisabled: [
154
+ ...(refreshedProviderContext?.mismatches.detectedDisabled ??
155
+ resolution.detectedDisabled),
156
+ ],
157
157
  },
158
- activeAdapters: resolution.activeAdapters,
158
+ activeAdapters: refreshedProviderContext
159
+ ? refreshedProviderContext.registrations
160
+ .map(({ adapter }) => adapter)
161
+ .filter(({ name }) => refreshedProviderContext.activeProviders.includes(name))
162
+ : resolution.activeAdapters,
159
163
  };
160
164
  }
161
165
  /**
@@ -188,11 +192,53 @@ async function computePlans(context, dependencies, canonicalFilter) {
188
192
  const scopeRoot = await dependencies.resolveScopeRoot(scope, context);
189
193
  const manifestPath = join(scopeRoot, '.oat', 'sync', 'manifest.json');
190
194
  const configPath = join(scopeRoot, '.oat', 'sync', 'config.json');
191
- const [manifest, config, canonical] = await Promise.all([
195
+ const [manifest, config] = await Promise.all([
192
196
  dependencies.loadManifest(manifestPath),
193
197
  dependencies.loadSyncConfig(configPath),
194
- dependencies.scanCanonical(scopeRoot, scope),
195
198
  ]);
199
+ const providerContext = dependencies.resolveProviderScopeContext
200
+ ? await dependencies.resolveProviderScopeContext({
201
+ scope,
202
+ scopeRoot,
203
+ config,
204
+ })
205
+ : undefined;
206
+ const adapters = providerContext
207
+ ? providerContext.registrations.map(({ adapter }) => adapter)
208
+ : dependencies.getAdapters();
209
+ const initialResolution = providerContext
210
+ ? undefined
211
+ : await dependencies.getConfigAwareAdapters(adapters, scopeRoot, config);
212
+ const initialActiveAdapters = providerContext
213
+ ? adapters.filter(({ name }) => providerContext.activeProviders.includes(name))
214
+ : initialResolution.activeAdapters;
215
+ const resolved = await maybeResolveProviderMismatches(context, scope, scopeRoot, configPath, config, adapters, {
216
+ detectedUnset: [
217
+ ...(providerContext?.mismatches.detectedUnset ??
218
+ initialResolution.detectedUnset),
219
+ ],
220
+ detectedDisabled: [
221
+ ...(providerContext?.mismatches.detectedDisabled ??
222
+ initialResolution.detectedDisabled),
223
+ ],
224
+ }, dependencies, initialActiveAdapters, providerContext);
225
+ const scanTargets = [];
226
+ const seenScanTargets = new Set();
227
+ for (const adapter of resolved.activeAdapters) {
228
+ const mappings = scope === 'project' ? adapter.projectMappings : adapter.userMappings;
229
+ for (const mapping of mappings) {
230
+ const key = `${mapping.contentType}::${mapping.canonicalDir}`;
231
+ if (seenScanTargets.has(key)) {
232
+ continue;
233
+ }
234
+ seenScanTargets.add(key);
235
+ scanTargets.push({
236
+ contentType: mapping.contentType,
237
+ canonicalDir: mapping.canonicalDir,
238
+ });
239
+ }
240
+ }
241
+ const canonical = await dependencies.scanCanonical(scopeRoot, scope, scanTargets);
196
242
  if (canonicalFilter?.mode === 'remove') {
197
243
  const existing = new Set(canonical.map(({ canonicalPath }) => relative(scopeRoot, canonicalPath).replaceAll('\\', '/')));
198
244
  const stillPresent = canonicalFilter.paths.filter((path) => existing.has(path));
@@ -200,12 +246,27 @@ async function computePlans(context, dependencies, canonicalFilter) {
200
246
  throw new CliError(`Cannot remove canonical provider views while source exists: ${stillPresent.join(', ')}`, 1);
201
247
  }
202
248
  }
203
- const adapters = dependencies.getAdapters();
204
- const initialResolution = await dependencies.getConfigAwareAdapters(adapters, scopeRoot, config);
205
- const resolved = await maybeResolveProviderMismatches(context, scope, scopeRoot, configPath, config, adapters, {
206
- detectedUnset: initialResolution.detectedUnset,
207
- detectedDisabled: initialResolution.detectedDisabled,
208
- }, dependencies);
249
+ const activeAdapterNames = resolved.activeAdapters.map((adapter) => adapter.name);
250
+ const enabledExtensions = (providerContext
251
+ ? providerContext.registrations.flatMap(({ extensions }) => extensions)
252
+ : dependencies.getMaterializationExtensions()).filter((extension) => activeAdapterNames.includes(extension.provider));
253
+ const extensionOwnedCanonicalPathsByProvider = Object.fromEntries(enabledExtensions.map(({ provider }) => [
254
+ provider,
255
+ USER_SCOPE_MANAGED_AGENT_FILES.map((name) => `.agents/agents/${name}`),
256
+ ]));
257
+ const activeAdapterNameSet = new Set(activeAdapterNames);
258
+ const collectionAliasEligibleMappings = providerContext?.registrations.flatMap((registration) => activeAdapterNameSet.has(registration.adapter.name)
259
+ ? registration.capabilities
260
+ .filter((capability) => capability.scope === scope &&
261
+ (capability.contentKind === 'skill' ||
262
+ capability.contentKind === 'agent' ||
263
+ capability.contentKind === 'rule') &&
264
+ capability.collectionAlias === 'supported')
265
+ .map((capability) => ({
266
+ provider: registration.adapter.name,
267
+ contentType: capability.contentKind,
268
+ }))
269
+ : []) ?? [];
209
270
  const plan = await dependencies.computeSyncPlan({
210
271
  canonical,
211
272
  adapters: resolved.activeAdapters,
@@ -214,13 +275,11 @@ async function computePlans(context, dependencies, canonicalFilter) {
214
275
  config: resolved.config,
215
276
  scopeRoot,
216
277
  allowedCanonicalPaths: canonicalFilter?.paths,
278
+ collectionAliasEligibleMappings,
279
+ ...(scope === 'user' ? { extensionOwnedCanonicalPathsByProvider } : {}),
217
280
  });
218
- const activeAdapterNames = resolved.activeAdapters.map((adapter) => adapter.name);
219
- const enabledExtensions = dependencies
220
- .getMaterializationExtensions()
221
- .filter((extension) => activeAdapterNames.includes(extension.provider));
222
281
  const extensionCanonical = scope === 'user' && enabledExtensions.length > 0
223
- ? [...canonical, ...(await dependencies.scanBundledManagedAgents())]
282
+ ? mergeUserScopeMaterializationEntries(canonical, await dependencies.scanBundledManagedAgents())
224
283
  : canonical;
225
284
  const materializationExtensionPlans = await Promise.all(enabledExtensions.map((extension) => extension.computePlan({
226
285
  scopeRoot,
@@ -302,6 +361,12 @@ export function createSyncCommand(overrides = {}) {
302
361
  ...defaultDependencies(),
303
362
  ...overrides,
304
363
  };
364
+ if (overrides.resolveProviderScopeContext === undefined &&
365
+ (overrides.getAdapters !== undefined ||
366
+ overrides.getConfigAwareAdapters !== undefined ||
367
+ overrides.getMaterializationExtensions !== undefined)) {
368
+ dependencies.resolveProviderScopeContext = undefined;
369
+ }
305
370
  return withScopeOption(new Command('sync'))
306
371
  .description('Sync canonical content to provider views')
307
372
  .option('--dry-run', 'Preview sync changes without applying')
@@ -1,9 +1,12 @@
1
1
  import type { CommandContext, GlobalOptions } from '../../app/command-context.js';
2
2
  import type { MultiSelectChoice, PromptContext } from '../shared/shared.prompts.js';
3
3
  import type { SyncConfig } from '../../config/index.js';
4
+ import type { CollectionProjectionPlan, SyncOperationResult } from '../../engine/engine.types.js';
5
+ import type { CollectionOperationResult } from '../../engine/execute-plan.js';
4
6
  import type { CanonicalEntry, SyncPlan, SyncResult } from '../../engine/index.js';
5
7
  import type { Manifest } from '../../manifest/index.js';
6
8
  import type { ConfigAwareAdaptersResult, MaterializationApplyResult, MaterializationExtension, MaterializationOperation, MaterializationPlan, ProviderAdapter } from '../../providers/shared/index.js';
9
+ import type { MaterializationOperationResult } from '../../providers/shared/materialization-extension.js';
7
10
  import type { ConcreteScope, Scope } from '../../shared/types.js';
8
11
  export interface SyncProviderMismatches {
9
12
  detectedUnset: string[];
@@ -42,14 +45,41 @@ export interface SyncSummary {
42
45
  failed: number;
43
46
  skipped: number;
44
47
  }
48
+ export type CollectionProofSummary = Pick<CollectionProjectionPlan['proof'], 'status'> & {
49
+ reason?: Extract<CollectionProjectionPlan['proof'], {
50
+ status: 'ineligible';
51
+ }>['reason'];
52
+ };
53
+ export type CollectionOutputPlan = Omit<CollectionProjectionPlan, 'proof'> & {
54
+ proof: CollectionProofSummary;
55
+ };
56
+ export type SyncOutputPlan = Omit<SyncPlan, 'collections'> & {
57
+ collections?: CollectionOutputPlan[];
58
+ };
59
+ export interface CollectionLifecycleOutput {
60
+ scope: ConcreteScope;
61
+ provider: string;
62
+ contentType: CollectionProjectionPlan['contentType'];
63
+ action: CollectionProjectionPlan['action'];
64
+ ownership: CollectionProjectionPlan['ownership'];
65
+ canonicalDir: string;
66
+ providerDir: string;
67
+ reason: string;
68
+ result: {
69
+ status: 'planned' | CollectionOperationResult['status'];
70
+ reason: string;
71
+ };
72
+ }
45
73
  export interface SyncJsonPayload {
46
74
  scope: Scope;
47
75
  dryRun: boolean;
48
- plans: SyncPlan[];
76
+ plans: SyncOutputPlan[];
77
+ collectionOperations: CollectionLifecycleOutput[];
49
78
  summary: SyncSummary;
50
79
  providerMismatches?: SyncProviderMismatches[];
51
80
  versionSkew?: SyncVersionSkew[];
52
81
  materializationExtensions?: MaterializationExtensionSummary[];
82
+ operationResults: SyncOperationResult[];
53
83
  /** Retained for compatibility with existing Codex JSON consumers. */
54
84
  codexExtensions?: CodexExtensionSummary[];
55
85
  }
@@ -73,6 +103,7 @@ export interface CodexExtensionSummary {
73
103
  export interface MaterializationExtensionSummary {
74
104
  provider: string;
75
105
  operations: MaterializationOperation[];
106
+ operationResults?: MaterializationOperationResult[];
76
107
  managedEntries: string[];
77
108
  aggregateHash: string;
78
109
  applied?: number;
@@ -107,8 +138,14 @@ export interface SyncCommandDependencies {
107
138
  config: SyncConfig;
108
139
  scopeRoot: string;
109
140
  allowedCanonicalPaths?: string[];
141
+ collectionAliasEligibleMappings?: readonly {
142
+ provider: string;
143
+ contentType: CanonicalEntry['type'];
144
+ }[];
110
145
  }) => Promise<SyncPlan>;
111
- executeSyncPlan: (plan: SyncPlan, manifest: Manifest, manifestPath: string) => Promise<SyncResult>;
146
+ executeSyncPlan: (plan: SyncPlan, manifest: Manifest, manifestPath: string) => Promise<SyncResult & {
147
+ collectionResults?: CollectionOperationResult[];
148
+ }>;
112
149
  getMaterializationExtensions: () => SyncMaterializationExtension[];
113
150
  applyMaterializationExtensionPlan: (extension: SyncMaterializationExtension, scopeRoot: string, plan: MaterializationPlan) => Promise<MaterializationApplyResult>;
114
151
  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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"}
@@ -1,3 +1,7 @@
1
- import type { ScopeSyncPlan } from './sync.types.js';
1
+ import type { CollectionOperationResult } from '../../engine/execute-plan.js';
2
+ import type { CollectionLifecycleOutput, ScopeSyncPlan, SyncOutputPlan } from './sync.types.js';
3
+ export declare function toSyncOutputPlan(scopePlan: ScopeSyncPlan): SyncOutputPlan;
4
+ export declare function buildCollectionLifecycle(scopePlan: ScopeSyncPlan, results?: readonly CollectionOperationResult[]): CollectionLifecycleOutput[];
5
+ export declare function formatCollectionLifecycle(lifecycle: readonly CollectionLifecycleOutput[]): string;
2
6
  export declare function countPlannedOperations(scopePlans: ScopeSyncPlan[]): number;
3
7
  //# sourceMappingURL=sync.utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.utils.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/sync.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,CAgB1E"}
1
+ {"version":3,"file":"sync.utils.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/sync.utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,KAAK,EACV,yBAAyB,EAEzB,aAAa,EACb,cAAc,EACf,MAAM,cAAc,CAAC;AA6BtB,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,aAAa,GAAG,cAAc,CAgBzE;AAgBD,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,aAAa,EACxB,OAAO,GAAE,SAAS,yBAAyB,EAAO,GACjD,yBAAyB,EAAE,CA8B7B;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,SAAS,yBAAyB,EAAE,GAC9C,MAAM,CAUR;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,CAmB1E"}
@@ -1,9 +1,82 @@
1
+ import { isAbsolute, relative, resolve, sep } from 'node:path';
2
+ const MUTATING_COLLECTION_ACTIONS = new Set([
3
+ 'create-collection-link',
4
+ 'adopt-collection-link',
5
+ 'inherit-collection',
6
+ 'detach-collection',
7
+ ]);
8
+ function scopeRelativePath(scopeRoot, path) {
9
+ const relativePath = relative(resolve(scopeRoot), resolve(path));
10
+ if (relativePath === '..' ||
11
+ relativePath.startsWith(`..${sep}`) ||
12
+ isAbsolute(relativePath)) {
13
+ return '<outside-scope>';
14
+ }
15
+ return relativePath.replaceAll('\\', '/') || '.';
16
+ }
17
+ function proofSummary(proof) {
18
+ return proof.status === 'ineligible'
19
+ ? { status: proof.status, reason: proof.reason }
20
+ : { status: proof.status };
21
+ }
22
+ export function toSyncOutputPlan(scopePlan) {
23
+ return {
24
+ ...scopePlan.plan,
25
+ collections: scopePlan.plan.collections?.map((collection) => ({
26
+ ...collection,
27
+ canonicalDir: scopeRelativePath(scopePlan.scopeRoot, collection.canonicalDir),
28
+ providerDir: scopeRelativePath(scopePlan.scopeRoot, collection.providerDir),
29
+ proof: proofSummary(collection.proof),
30
+ })),
31
+ };
32
+ }
33
+ function resultKey(result) {
34
+ return JSON.stringify([
35
+ result.provider,
36
+ result.contentType,
37
+ result.action,
38
+ result.ownership,
39
+ ]);
40
+ }
41
+ export function buildCollectionLifecycle(scopePlan, results = []) {
42
+ const resultsByKey = new Map();
43
+ for (const result of results) {
44
+ const key = resultKey(result);
45
+ resultsByKey.set(key, [...(resultsByKey.get(key) ?? []), result]);
46
+ }
47
+ return (scopePlan.plan.collections ?? []).map((collection) => {
48
+ const matching = resultsByKey.get(resultKey(collection))?.shift();
49
+ return {
50
+ scope: scopePlan.scope,
51
+ provider: collection.provider,
52
+ contentType: collection.contentType,
53
+ action: collection.action,
54
+ ownership: collection.ownership,
55
+ canonicalDir: scopeRelativePath(scopePlan.scopeRoot, collection.canonicalDir),
56
+ providerDir: scopeRelativePath(scopePlan.scopeRoot, collection.providerDir),
57
+ reason: collection.reason,
58
+ result: {
59
+ status: matching?.status ?? 'planned',
60
+ reason: matching?.reason ?? collection.reason,
61
+ },
62
+ };
63
+ });
64
+ }
65
+ export function formatCollectionLifecycle(lifecycle) {
66
+ if (lifecycle.length === 0) {
67
+ return '';
68
+ }
69
+ return `Collection aliases\n${lifecycle
70
+ .map((entry) => `- [${entry.scope}] ${entry.provider}/${entry.contentType}:${entry.action} ownership=${entry.ownership} ${entry.canonicalDir} -> ${entry.providerDir}\n reason: ${entry.reason}\n result: ${entry.result.status} — ${entry.result.reason}`)
71
+ .join('\n')}`;
72
+ }
1
73
  export function countPlannedOperations(scopePlans) {
2
74
  return scopePlans.reduce((total, scopePlan) => {
3
75
  const extensionOperations = scopePlan.materializationExtensions.reduce((count, extension) => count +
4
76
  extension.operations.filter((entry) => entry.action !== 'skip').length, 0);
5
77
  return (total +
6
78
  [...scopePlan.plan.entries, ...scopePlan.plan.removals].filter((entry) => entry.operation !== 'skip').length +
79
+ (scopePlan.plan.collections ?? []).filter((collection) => MUTATING_COLLECTION_ACTIONS.has(collection.action)).length +
7
80
  extensionOperations);
8
81
  }, 0);
9
82
  }
@@ -1,4 +1,5 @@
1
1
  import type { CommandContext } from '../../../app/command-context.js';
2
+ import { type PackEvidenceBlockV1 } from '../../tools/shared/format-pack-inventory.js';
2
3
  import { type InventoryPackInput, type PackInventory } from '../../tools/shared/pack-inventory.js';
3
4
  import type { ScanToolsOptions } from '../../tools/shared/scan-tools.js';
4
5
  import type { ToolInfo } from '../../tools/shared/types.js';
@@ -19,6 +20,7 @@ export interface InfoToolResult {
19
20
  found: boolean;
20
21
  tool: ToolDetail | null;
21
22
  pack: PackInventory | null;
23
+ packEvidence?: PackEvidenceBlockV1;
22
24
  }
23
25
  export declare function runInfoTool(context: CommandContext, name: string, dependencies: InfoToolDependencies): Promise<InfoToolResult>;
24
26
  //# sourceMappingURL=info-tool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"info-tool.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/info/info-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7D,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAC1C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,gBAAgB,EAAE,CAChB,KAAK,EAAE,SAAS,GAAG,MAAM,EACzB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,aAAa,EAAE,CACb,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,cAAc,CAAC,CAmFzB"}
1
+ {"version":3,"file":"info-tool.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/info/info-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAML,KAAK,mBAAmB,EACzB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7D,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAC1C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,gBAAgB,EAAE,CAChB,KAAK,EAAE,SAAS,GAAG,MAAM,EACzB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,aAAa,EAAE,CACb,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,cAAc,CAAC,CAuGzB"}
@@ -1,5 +1,5 @@
1
1
  import { resolveConcreteScopes } from '../../shared/shared.utils.js';
2
- import { formatPackInventoryDetails } from '../../tools/shared/format-pack-inventory.js';
2
+ import { formatPackEvidenceDetails, formatPackInventoryDetails, packEvidenceBlock, projectRenderablePackEvidence, unavailablePackEvidence, } from '../../tools/shared/format-pack-inventory.js';
3
3
  import { inventoryPack, } from '../../tools/shared/pack-inventory.js';
4
4
  import { PACK_MANIFEST } from '../../tools/shared/pack-manifest.js';
5
5
  export async function runInfoTool(context, name, dependencies) {
@@ -10,23 +10,45 @@ export async function runInfoTool(context, name, dependencies) {
10
10
  for (const scope of scopes) {
11
11
  roots[scope] = await dependencies.resolveScopeRoot(scope, context.cwd, context.home);
12
12
  }
13
+ const packRoots = {
14
+ projectRoot: roots.project,
15
+ userRoot: roots.user,
16
+ };
13
17
  const packName = PACK_MANIFEST.find(({ name: candidate }) => candidate === name)?.name;
14
18
  if (packName) {
15
- const pack = await (dependencies.inventoryPack ?? inventoryPack)({
16
- pack: packName,
17
- assetsRoot,
18
- projectRoot: roots.project,
19
- userRoot: roots.user,
20
- });
19
+ let pack = null;
20
+ let evidence;
21
+ try {
22
+ pack = await (dependencies.inventoryPack ?? inventoryPack)({
23
+ pack: packName,
24
+ assetsRoot,
25
+ projectRoot: roots.project,
26
+ userRoot: roots.user,
27
+ });
28
+ evidence = projectRenderablePackEvidence(pack, packRoots);
29
+ }
30
+ catch (error) {
31
+ evidence = unavailablePackEvidence({
32
+ pack: packName,
33
+ scopes,
34
+ reason: error instanceof Error ? error.message : String(error),
35
+ roots: packRoots,
36
+ });
37
+ }
38
+ const packEvidence = packEvidenceBlock([evidence]);
21
39
  if (context.json)
22
- logger.json({ tool: null, pack });
40
+ logger.json({ tool: null, pack, packEvidence });
23
41
  else {
24
- logger.info(`${pack.pack}`);
25
- logger.info(` Placement: ${pack.placement}`);
26
- for (const line of formatPackInventoryDetails(pack))
42
+ logger.info(packName);
43
+ if (pack) {
44
+ logger.info(` Placement: ${pack.placement}`);
45
+ for (const line of formatPackInventoryDetails(pack))
46
+ logger.info(line);
47
+ }
48
+ for (const line of formatPackEvidenceDetails(evidence))
27
49
  logger.info(line);
28
50
  }
29
- return { found: true, tool: null, pack };
51
+ return { found: true, tool: null, pack, packEvidence };
30
52
  }
31
53
  for (const scope of scopes) {
32
54
  const scopeRoot = roots[scope];