@open-agent-toolkit/cli 0.2.63 → 0.2.64

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 (92) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/tool-packs.md +83 -0
  3. package/assets/docs/contributing/skills.md +42 -7
  4. package/assets/docs/provider-sync/manifest-and-drift.md +105 -0
  5. package/assets/public-package-versions.json +4 -4
  6. package/assets/skills/create-agnostic-skill/SKILL.md +9 -7
  7. package/assets/skills/create-agnostic-skill/references/skill-template.md +9 -7
  8. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -0
  9. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -0
  10. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -0
  11. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +1 -0
  12. package/assets/skills/oat-project-pr-final/SKILL.md +281 -6
  13. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -0
  14. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -0
  15. package/dist/agents/canonical/resolve.d.ts.map +1 -1
  16. package/dist/agents/canonical/resolve.js +25 -4
  17. package/dist/commands/doctor/index.d.ts +7 -0
  18. package/dist/commands/doctor/index.d.ts.map +1 -1
  19. package/dist/commands/doctor/index.js +10 -2
  20. package/dist/commands/init/tools/index.d.ts.map +1 -1
  21. package/dist/commands/init/tools/index.js +68 -36
  22. package/dist/commands/shared/frontmatter.d.ts +51 -0
  23. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  24. package/dist/commands/shared/frontmatter.js +118 -6
  25. package/dist/commands/status/index.d.ts.map +1 -1
  26. package/dist/commands/status/index.js +5 -3
  27. package/dist/commands/sync/index.d.ts +14 -0
  28. package/dist/commands/sync/index.d.ts.map +1 -1
  29. package/dist/commands/sync/index.js +21 -0
  30. package/dist/commands/tools/info/index.d.ts.map +1 -1
  31. package/dist/commands/tools/info/index.js +14 -1
  32. package/dist/commands/tools/info/info-tool.d.ts +12 -0
  33. package/dist/commands/tools/info/info-tool.d.ts.map +1 -1
  34. package/dist/commands/tools/info/info-tool.js +54 -6
  35. package/dist/commands/tools/info/skill-views.d.ts +86 -0
  36. package/dist/commands/tools/info/skill-views.d.ts.map +1 -0
  37. package/dist/commands/tools/info/skill-views.js +383 -0
  38. package/dist/commands/tools/install/index.d.ts.map +1 -1
  39. package/dist/commands/tools/install/index.js +3 -25
  40. package/dist/commands/tools/list/list-tools.d.ts +2 -0
  41. package/dist/commands/tools/list/list-tools.d.ts.map +1 -1
  42. package/dist/commands/tools/list/list-tools.js +23 -4
  43. package/dist/commands/tools/remove/index.d.ts.map +1 -1
  44. package/dist/commands/tools/remove/index.js +35 -42
  45. package/dist/commands/tools/remove/remove-tools.d.ts +3 -2
  46. package/dist/commands/tools/remove/remove-tools.d.ts.map +1 -1
  47. package/dist/commands/tools/remove/remove-tools.js +14 -4
  48. package/dist/commands/tools/shared/auto-sync.d.ts +12 -1
  49. package/dist/commands/tools/shared/auto-sync.d.ts.map +1 -1
  50. package/dist/commands/tools/shared/auto-sync.js +20 -4
  51. package/dist/commands/tools/shared/format-pack-inventory.d.ts +12 -1
  52. package/dist/commands/tools/shared/format-pack-inventory.d.ts.map +1 -1
  53. package/dist/commands/tools/shared/format-pack-inventory.js +48 -6
  54. package/dist/commands/tools/shared/in-process-sync.d.ts +11 -0
  55. package/dist/commands/tools/shared/in-process-sync.d.ts.map +1 -0
  56. package/dist/commands/tools/shared/in-process-sync.js +79 -0
  57. package/dist/commands/tools/shared/pack-evidence.d.ts +78 -2
  58. package/dist/commands/tools/shared/pack-evidence.d.ts.map +1 -1
  59. package/dist/commands/tools/shared/pack-evidence.js +96 -2
  60. package/dist/commands/tools/shared/pack-lifecycle-outcome.d.ts +11 -0
  61. package/dist/commands/tools/shared/pack-lifecycle-outcome.d.ts.map +1 -1
  62. package/dist/commands/tools/shared/pack-lifecycle-outcome.js +24 -3
  63. package/dist/commands/tools/shared/pack-provider-evidence.d.ts +73 -0
  64. package/dist/commands/tools/shared/pack-provider-evidence.d.ts.map +1 -0
  65. package/dist/commands/tools/shared/pack-provider-evidence.js +161 -0
  66. package/dist/commands/tools/shared/provider-context.d.ts +88 -0
  67. package/dist/commands/tools/shared/provider-context.d.ts.map +1 -0
  68. package/dist/commands/tools/shared/provider-context.js +77 -0
  69. package/dist/commands/tools/shared/provider-reachability.d.ts +93 -0
  70. package/dist/commands/tools/shared/provider-reachability.d.ts.map +1 -0
  71. package/dist/commands/tools/shared/provider-reachability.js +358 -0
  72. package/dist/commands/tools/shared/sync-evidence.d.ts +57 -0
  73. package/dist/commands/tools/shared/sync-evidence.d.ts.map +1 -0
  74. package/dist/commands/tools/shared/sync-evidence.js +147 -0
  75. package/dist/commands/tools/update/index.d.ts +0 -4
  76. package/dist/commands/tools/update/index.d.ts.map +1 -1
  77. package/dist/commands/tools/update/index.js +22 -40
  78. package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
  79. package/dist/commands/tools/update/update-tools.js +23 -8
  80. package/dist/config/json.d.ts +36 -0
  81. package/dist/config/json.d.ts.map +1 -1
  82. package/dist/config/json.js +135 -3
  83. package/dist/drift/index.d.ts +2 -0
  84. package/dist/drift/index.d.ts.map +1 -1
  85. package/dist/drift/index.js +1 -0
  86. package/dist/drift/skill-view-diagnostic.d.ts +197 -0
  87. package/dist/drift/skill-view-diagnostic.d.ts.map +1 -0
  88. package/dist/drift/skill-view-diagnostic.js +343 -0
  89. package/dist/validation/skills.d.ts +1 -0
  90. package/dist/validation/skills.d.ts.map +1 -1
  91. package/dist/validation/skills.js +181 -19
  92. package/package.json +2 -2
@@ -11,9 +11,11 @@ import { canonicalPathsForPacks, getInstalledCanonicalPaths, setInstalledCanonic
11
11
  import { packScopeFactsFromInventory, projectPackEvidence, } from '../../tools/shared/pack-evidence.js';
12
12
  import { inventoryPack, } from '../../tools/shared/pack-inventory.js';
13
13
  import { reconcilePackLifecycles, } from '../../tools/shared/pack-lifecycle.js';
14
- import { evaluatePackLifecycleOutcome, resolveAdditivePackScopeSelection, } from '../../tools/shared/pack-lifecycle-outcome.js';
14
+ import { evaluatePackLifecycleOutcome, notRunProviderSyncOutcome, providerSyncOutcomeFromAutoSync, resolveAdditivePackScopeSelection, } from '../../tools/shared/pack-lifecycle-outcome.js';
15
15
  import { getPackDefinition } from '../../tools/shared/pack-manifest.js';
16
+ import { lifecycleProviderEvidence, withLifecycleProviderEvidence, } from '../../tools/shared/pack-provider-evidence.js';
16
17
  import { reconcileProjectToolsConfig } from '../../tools/shared/project-tools-config.js';
18
+ import { resolveProviderScopeContexts } from '../../tools/shared/provider-context.js';
17
19
  import { scanTools } from '../../tools/shared/scan-tools.js';
18
20
  import { readOatConfig, resolveLocalPaths, writeOatConfig, } from '../../../config/oat-config.js';
19
21
  import { resolveAssetsRoot } from '../../../fs/assets.js';
@@ -620,6 +622,10 @@ export async function runInitTools(context, dependencies, explicitProjectGuidanc
620
622
  let attemptedPacks = [];
621
623
  let attemptedSelections = [];
622
624
  let lifecycleOutcomes = [];
625
+ // Resolved once and reused by every outcome in this run, including the
626
+ // failure path: activation and capability are knowable even when the
627
+ // canonical apply failed.
628
+ let providerContexts = [];
623
629
  try {
624
630
  const userRoot = dependencies.resolveScopeRoot('user', context.cwd, context.home);
625
631
  const assetsRoot = await dependencies.resolveAssetsRoot();
@@ -631,6 +637,12 @@ export async function runInitTools(context, dependencies, explicitProjectGuidanc
631
637
  if (context.scope === 'project')
632
638
  throw error;
633
639
  }
640
+ providerContexts = await resolveProviderScopeContexts({
641
+ scopeRoots: {
642
+ ...(projectRoot ? { project: projectRoot } : {}),
643
+ user: userRoot,
644
+ },
645
+ });
634
646
  const initialPackStates = await loadInstalledPackStates(projectRoot, userRoot, assetsRoot, dependencies);
635
647
  const selectedPacks = context.interactive
636
648
  ? ((await dependencies.selectManyWithAbort('Select tool packs to install', buildPackChoices(initialPackStates), { interactive: context.interactive })) ?? [])
@@ -706,11 +718,17 @@ export async function runInitTools(context, dependencies, explicitProjectGuidanc
706
718
  lifecycleOutcomes = finalEvidence.map((evidence) => {
707
719
  const packResults = lifecycle.filter(({ request }) => request.pack === evidence.pack);
708
720
  const selection = attemptedSelections.find(({ pack }) => pack === evidence.pack);
721
+ const providers = lifecycleProviderEvidence({
722
+ pack: evidence.pack,
723
+ scopedInventories: evidence.canonical?.scopes ?? [],
724
+ providerContexts,
725
+ scopes: selection.targetScopes,
726
+ });
709
727
  return evaluatePackLifecycleOutcome({
710
728
  selection,
711
729
  lifecycle: packResults,
712
- sync: { scopes: [], status: 'not-run', providers: [] },
713
- finalEvidence: evidence,
730
+ sync: notRunProviderSyncOutcome(providers, 'Auto-sync has not run for this operation'),
731
+ finalEvidence: withLifecycleProviderEvidence(evidence, providers),
714
732
  });
715
733
  });
716
734
  for (const evidence of finalEvidence) {
@@ -1011,21 +1029,24 @@ export async function runInitTools(context, dependencies, explicitProjectGuidanc
1011
1029
  const guidancePlan = await applyProjectGuidance(plannedGuidance, dependencies);
1012
1030
  if (dependencies.syncAfterInstall) {
1013
1031
  const sync = await dependencies.syncAfterInstall(affectedScopesList, context, canonicalPathsForPacks(selectedPacks));
1014
- lifecycleOutcomes = lifecycleOutcomes.map((outcome) => evaluatePackLifecycleOutcome({
1015
- selection: outcome.selection,
1016
- lifecycle: outcome.canonical.results,
1017
- sync: {
1018
- scopes: sync.scopes.filter((scope) => outcome.selection.targetScopes.includes(scope)),
1019
- status: sync.scopes.length === 0
1020
- ? 'not-run'
1021
- : sync.synced
1022
- ? 'complete'
1023
- : 'failed',
1024
- providers: [],
1025
- ...(sync.error ? { error: sync.error } : {}),
1026
- },
1027
- finalEvidence: outcome.finalEvidence,
1028
- }));
1032
+ lifecycleOutcomes = lifecycleOutcomes.map((outcome) => {
1033
+ const providers = lifecycleProviderEvidence({
1034
+ pack: outcome.selection.pack,
1035
+ scopedInventories: outcome.finalEvidence?.canonical?.scopes ?? [],
1036
+ providerContexts,
1037
+ scopes: outcome.selection.targetScopes,
1038
+ sync,
1039
+ });
1040
+ return evaluatePackLifecycleOutcome({
1041
+ selection: outcome.selection,
1042
+ lifecycle: outcome.canonical.results,
1043
+ sync: providerSyncOutcomeFromAutoSync({
1044
+ ...sync,
1045
+ scopes: sync.scopes.filter((scope) => outcome.selection.targetScopes.includes(scope)),
1046
+ }, providers),
1047
+ finalEvidence: withLifecycleProviderEvidence(outcome.finalEvidence, providers),
1048
+ });
1049
+ });
1029
1050
  }
1030
1051
  lastRunInitToolsMetadata = {
1031
1052
  affectedScopes: affectedScopesList,
@@ -1062,11 +1083,11 @@ export async function runInitTools(context, dependencies, explicitProjectGuidanc
1062
1083
  targetScopes: [],
1063
1084
  },
1064
1085
  canonical: { status: 'failed', results: [] },
1065
- sync: {
1066
- scopes: [],
1067
- status: 'not-run',
1068
- providers: [],
1069
- },
1086
+ sync: notRunProviderSyncOutcome(lifecycleProviderEvidence({
1087
+ pack,
1088
+ scopedInventories: [],
1089
+ providerContexts,
1090
+ }), 'Canonical apply failed before auto-sync'),
1070
1091
  finalEvidence: null,
1071
1092
  status: 'failed',
1072
1093
  recovery: [{ code: 'canonical-apply-failed', message }],
@@ -1159,6 +1180,7 @@ function createReconciledPackCommand(pack, dependencies) {
1159
1180
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
1160
1181
  let lifecycleOutcome = null;
1161
1182
  let selection = null;
1183
+ let providerContexts = [];
1162
1184
  try {
1163
1185
  const explicitProjectGuidance = pack === 'workflows'
1164
1186
  ? commandProjectGuidanceChoice(command)
@@ -1189,6 +1211,9 @@ function createReconciledPackCommand(pack, dependencies) {
1189
1211
  action: 'install',
1190
1212
  })));
1191
1213
  const results = await dependencies.reconcilePacks(requests);
1214
+ providerContexts = await resolveProviderScopeContexts({
1215
+ scopeRoots: Object.fromEntries(requests.map(({ scope, scopeRoot }) => [scope, scopeRoot])),
1216
+ });
1192
1217
  let finalEvidence = null;
1193
1218
  if (dependencies.inventoryPack) {
1194
1219
  finalEvidence = await loadPackEvidence(pack, requests.some(({ scope }) => scope === 'project')
@@ -1198,7 +1223,12 @@ function createReconciledPackCommand(pack, dependencies) {
1198
1223
  lifecycleOutcome = evaluatePackLifecycleOutcome({
1199
1224
  selection,
1200
1225
  lifecycle: results,
1201
- sync: { scopes: [], status: 'not-run', providers: [] },
1226
+ sync: notRunProviderSyncOutcome(lifecycleProviderEvidence({
1227
+ pack,
1228
+ scopedInventories: finalEvidence?.canonical?.scopes ?? [],
1229
+ providerContexts,
1230
+ scopes,
1231
+ }), 'Auto-sync has not run for this operation'),
1202
1232
  finalEvidence,
1203
1233
  });
1204
1234
  if (finalEvidence)
@@ -1213,20 +1243,18 @@ function createReconciledPackCommand(pack, dependencies) {
1213
1243
  .filter(({ plan }) => plan.operations.length > 0)
1214
1244
  .map(({ request }) => request.scope);
1215
1245
  const sync = await dependencies.syncAfterInstall(changedScopes, context, canonicalPathsForPacks([pack]));
1246
+ const providers = lifecycleProviderEvidence({
1247
+ pack,
1248
+ scopedInventories: finalEvidence?.canonical?.scopes ?? [],
1249
+ providerContexts,
1250
+ scopes,
1251
+ sync,
1252
+ });
1216
1253
  lifecycleOutcome = evaluatePackLifecycleOutcome({
1217
1254
  selection,
1218
1255
  lifecycle: results,
1219
- sync: {
1220
- scopes: sync.scopes,
1221
- status: sync.scopes.length === 0
1222
- ? 'not-run'
1223
- : sync.synced
1224
- ? 'complete'
1225
- : 'failed',
1226
- providers: [],
1227
- ...(sync.error ? { error: sync.error } : {}),
1228
- },
1229
- finalEvidence,
1256
+ sync: providerSyncOutcomeFromAutoSync(sync, providers),
1257
+ finalEvidence: withLifecycleProviderEvidence(finalEvidence, providers),
1230
1258
  });
1231
1259
  }
1232
1260
  // Project-scope placement installs capability only. The
@@ -1316,7 +1344,11 @@ function createReconciledPackCommand(pack, dependencies) {
1316
1344
  targetScopes: [],
1317
1345
  },
1318
1346
  canonical: { status: 'failed', results: [] },
1319
- sync: { scopes: [], status: 'not-run', providers: [] },
1347
+ sync: notRunProviderSyncOutcome(lifecycleProviderEvidence({
1348
+ pack,
1349
+ scopedInventories: [],
1350
+ providerContexts,
1351
+ }), 'Canonical apply failed before auto-sync'),
1320
1352
  finalEvidence: null,
1321
1353
  status: 'failed',
1322
1354
  recovery: [{ code: 'canonical-apply-failed', message }],
@@ -56,6 +56,57 @@ export declare function parseFrontmatterScalarFields(frontmatter: string, fields
56
56
  */
57
57
  export declare function parseGeneratedTime(value: string): number;
58
58
  export declare function parseFrontmatterField(filePath: string, field: string): Promise<string>;
59
+ /**
60
+ * A skill or agent frontmatter block reduced to the fields that carry a
61
+ * version, in the one shape every version read consumes.
62
+ *
63
+ * `malformed` marks input that cannot be trusted to carry a version at all:
64
+ * the YAML document has errors (including duplicate keys), or `metadata` is
65
+ * present but is not a map. A malformed block resolves to `null` rather than
66
+ * to a guessed value.
67
+ *
68
+ * `unusableVersionDeclaration` records that a `version` key was present at
69
+ * either position but produced no usable value (empty, or a non-string scalar
70
+ * such as `1.10`, which YAML reads as the number 1.1). Validation needs that
71
+ * distinction: a skill that declares nothing is unversioned, while a skill
72
+ * that declares an unusable version is broken — including when the *other*
73
+ * position still resolves. It is carried here so no caller has to re-read the
74
+ * block with a regex.
75
+ */
76
+ export interface ParsedSkillFrontmatter {
77
+ version?: string;
78
+ metadata?: {
79
+ version?: string;
80
+ };
81
+ malformed: boolean;
82
+ unusableVersionDeclaration: boolean;
83
+ }
84
+ export interface SkillVersionConflict {
85
+ metadata: string;
86
+ topLevel: string;
87
+ }
88
+ export interface ResolvedSkillVersion {
89
+ version: string;
90
+ source: 'metadata' | 'top-level';
91
+ conflict?: SkillVersionConflict;
92
+ }
93
+ /**
94
+ * Parse a raw frontmatter block into the shared version-carrying shape.
95
+ *
96
+ * Uses the `yaml` package already imported by this module so that
97
+ * `metadata.version` is read by a real YAML parser; a regex or
98
+ * indentation-based reader cannot tell a nested key from a top-level one.
99
+ */
100
+ export declare function parseSkillFrontmatter(block: string): ParsedSkillFrontmatter;
101
+ /**
102
+ * Resolve the canonical version with `metadata.version` taking precedence over
103
+ * the deprecated top-level `version` alias.
104
+ *
105
+ * When both are present and differ the resolver still reports the
106
+ * metadata value, but flags the conflict so callers that must not guess (the
107
+ * validators, canonical role identity) can reject it.
108
+ */
109
+ export declare function resolveSkillVersion(parsed: ParsedSkillFrontmatter): ResolvedSkillVersion | null;
59
110
  export declare function getSkillVersion(skillDir: string): Promise<string | null>;
60
111
  export declare function getAgentVersion(agentPath: string): Promise<string | null>;
61
112
  //# sourceMappingURL=frontmatter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/frontmatter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/frontmatter.ts"],"names":[],"mappings":"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"}
@@ -201,13 +201,125 @@ export async function parseFrontmatterField(filePath, field) {
201
201
  return '';
202
202
  }
203
203
  }
204
+ /**
205
+ * Read a frontmatter value that is a plain, undecorated string.
206
+ *
207
+ * A tagged (`!!str 1.2.3`) or anchored (`&pin 1.2.3`) scalar is rejected by the
208
+ * explicit checks below, and an aliased value (`*pin`) is rejected because an
209
+ * alias node is not a scalar at all. Folded (`>-`) and literal (`|`) block
210
+ * scalars are none of those: they are ordinary string scalars and resolve
211
+ * normally.
212
+ *
213
+ * Non-string scalars are deliberately rejected rather than stringified: YAML
214
+ * reads `version: 1.10` as the number `1.1`, so accepting numbers would report
215
+ * a version the author never wrote.
216
+ */
217
+ function scalarStringValue(node) {
218
+ if (!isScalar(node) ||
219
+ node.anchor !== undefined ||
220
+ node.tag !== undefined ||
221
+ typeof node.value !== 'string') {
222
+ return undefined;
223
+ }
224
+ const trimmed = node.value.trim();
225
+ return trimmed.length > 0 ? trimmed : undefined;
226
+ }
227
+ function hasKey(map, key) {
228
+ return map.items.some((pair) => isScalar(pair.key) && pair.key.value === key);
229
+ }
230
+ function uniqueMapValue(map, key) {
231
+ const matches = map.items.filter((pair) => isScalar(pair.key) && pair.key.value === key);
232
+ return matches.length === 1 ? matches[0]?.value : undefined;
233
+ }
234
+ /**
235
+ * Parse a raw frontmatter block into the shared version-carrying shape.
236
+ *
237
+ * Uses the `yaml` package already imported by this module so that
238
+ * `metadata.version` is read by a real YAML parser; a regex or
239
+ * indentation-based reader cannot tell a nested key from a top-level one.
240
+ */
241
+ export function parseSkillFrontmatter(block) {
242
+ const document = YAML.parseDocument(block, { uniqueKeys: true });
243
+ if (document.errors.length > 0) {
244
+ return { malformed: true, unusableVersionDeclaration: false };
245
+ }
246
+ if (!isMap(document.contents)) {
247
+ return { malformed: false, unusableVersionDeclaration: false };
248
+ }
249
+ const version = scalarStringValue(uniqueMapValue(document.contents, 'version'));
250
+ const parsed = {
251
+ malformed: false,
252
+ unusableVersionDeclaration: version === undefined && hasKey(document.contents, 'version'),
253
+ };
254
+ if (version !== undefined) {
255
+ parsed.version = version;
256
+ }
257
+ const metadata = uniqueMapValue(document.contents, 'metadata');
258
+ if (metadata !== undefined) {
259
+ if (!isMap(metadata)) {
260
+ return {
261
+ malformed: true,
262
+ unusableVersionDeclaration: parsed.unusableVersionDeclaration,
263
+ };
264
+ }
265
+ const metadataVersion = scalarStringValue(uniqueMapValue(metadata, 'version'));
266
+ parsed.unusableVersionDeclaration =
267
+ parsed.unusableVersionDeclaration ||
268
+ (metadataVersion === undefined && hasKey(metadata, 'version'));
269
+ parsed.metadata =
270
+ metadataVersion === undefined ? {} : { version: metadataVersion };
271
+ }
272
+ return parsed;
273
+ }
274
+ /**
275
+ * Resolve the canonical version with `metadata.version` taking precedence over
276
+ * the deprecated top-level `version` alias.
277
+ *
278
+ * When both are present and differ the resolver still reports the
279
+ * metadata value, but flags the conflict so callers that must not guess (the
280
+ * validators, canonical role identity) can reject it.
281
+ */
282
+ export function resolveSkillVersion(parsed) {
283
+ if (parsed.malformed) {
284
+ return null;
285
+ }
286
+ const metadataVersion = parsed.metadata?.version;
287
+ const topLevel = parsed.version;
288
+ if (metadataVersion !== undefined) {
289
+ if (topLevel !== undefined && topLevel !== metadataVersion) {
290
+ return {
291
+ version: metadataVersion,
292
+ source: 'metadata',
293
+ conflict: { metadata: metadataVersion, topLevel },
294
+ };
295
+ }
296
+ return { version: metadataVersion, source: 'metadata' };
297
+ }
298
+ if (topLevel !== undefined) {
299
+ return { version: topLevel, source: 'top-level' };
300
+ }
301
+ return null;
302
+ }
303
+ async function readResolvedVersion(filePath) {
304
+ let content;
305
+ try {
306
+ content = await readFile(filePath, 'utf8');
307
+ }
308
+ catch {
309
+ return null;
310
+ }
311
+ const block = getFrontmatterBlock(content);
312
+ if (!block)
313
+ return null;
314
+ return resolveSkillVersion(parseSkillFrontmatter(block));
315
+ }
204
316
  export async function getSkillVersion(skillDir) {
205
- // parseFrontmatterField() returns '' when SKILL.md is missing or unreadable,
206
- // so read failures are normalized to null here.
207
- const version = await parseFrontmatterField(join(skillDir, 'SKILL.md'), 'version');
208
- return version.length > 0 ? version : null;
317
+ // Missing, unreadable, malformed, and empty frontmatter all normalize to
318
+ // null here so callers keep one "no comparable version" contract.
319
+ const resolved = await readResolvedVersion(join(skillDir, 'SKILL.md'));
320
+ return resolved?.version ?? null;
209
321
  }
210
322
  export async function getAgentVersion(agentPath) {
211
- const version = await parseFrontmatterField(agentPath, 'version');
212
- return version.length > 0 ? version : null;
323
+ const resolved = await readResolvedVersion(agentPath);
324
+ return resolved?.version ?? null;
213
325
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/status/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/status/index.ts"],"names":[],"mappings":"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"}
@@ -274,7 +274,7 @@ function shouldReportPjmAdoption(adoption, states) {
274
274
  const pjm = states.find(({ pack }) => pack === 'project-management');
275
275
  return (pjm?.scopes ?? []).some(({ scope }) => scope === 'project');
276
276
  }
277
- async function collectPackReport(scopeRoots, unavailableScopes, userAgentCoverage, dependencies) {
277
+ async function collectPackReport(scopeRoots, unavailableScopes, userAgentCoverage, providerContexts, dependencies) {
278
278
  const roots = {
279
279
  ...(scopeRoots.has('project')
280
280
  ? { projectRoot: scopeRoots.get('project') }
@@ -322,7 +322,7 @@ async function collectPackReport(scopeRoots, unavailableScopes, userAgentCoverag
322
322
  const states = inventories
323
323
  .map((inventory) => toStatusPackState(inventory, roots))
324
324
  .filter((state) => state !== null);
325
- const evidence = packEvidenceBlock(inventories.map((canonical) => projectRenderablePackEvidence(canonical, roots)));
325
+ const evidence = packEvidenceBlock(inventories.map((canonical) => projectRenderablePackEvidence(canonical, roots, providerContexts)));
326
326
  const projectRoot = scopeRoots.get('project');
327
327
  if (!projectRoot) {
328
328
  return {
@@ -699,7 +699,9 @@ async function runStatusCommand(context, dependencies, options = {}) {
699
699
  ? 'all'
700
700
  : scopeCollections.some((collection) => collection.userAgentMaterializationCoverage === 'bundled')
701
701
  ? 'bundled'
702
- : 'none', dependencies);
702
+ : 'none', scopeCollections
703
+ .map(({ providerContext }) => providerContext)
704
+ .filter((providerContext) => providerContext !== null), dependencies);
703
705
  if (context.json) {
704
706
  const payload = {
705
707
  scope: context.scope,
@@ -1,3 +1,4 @@
1
+ import { type CommandContext } from '../../app/command-context.js';
1
2
  import { type SyncConfig } from '../../config/index.js';
2
3
  import { type ProviderScopeContext } from '../../providers/shared/index.js';
3
4
  import { type CanonicalScanTarget, type ConcreteScope } from '../../shared/types.js';
@@ -15,5 +16,18 @@ type ContextualSyncDependencies = Omit<SyncCommandDependencies, 'computeSyncPlan
15
16
  }) => Promise<ProviderScopeContext>;
16
17
  };
17
18
  export declare function createSyncCommand(overrides?: Partial<ContextualSyncDependencies>): Command;
19
+ /**
20
+ * Runs the sync command in-process against a caller-supplied context.
21
+ *
22
+ * The tools lifecycle uses this instead of spawning `oat sync --json` and
23
+ * parsing its stdout: the caller passes a JSON-capturing logger and receives
24
+ * the evidence object the sync run already builds, with no serialization
25
+ * round trip and no subprocess. Canonical path filters are validated here
26
+ * with the same rules the CLI flags use.
27
+ */
28
+ export declare function runSyncInProcess(context: CommandContext, filter?: {
29
+ installedCanonicalPaths?: string[];
30
+ removedCanonicalPaths?: string[];
31
+ }, overrides?: Partial<ContextualSyncDependencies>): Promise<void>;
18
32
  export {};
19
33
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
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;AAC3B,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;AA2fF,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,OAAO,CA+DT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAYhF,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,eAAe,CAAC;AAWvB,OAAO,EAOL,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAC3B,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;AA2fF,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,OAAO,CA+DT;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE;IACP,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;IACnC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CAClC,EACD,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -409,3 +409,24 @@ export function createSyncCommand(overrides = {}) {
409
409
  : undefined);
410
410
  });
411
411
  }
412
+ /**
413
+ * Runs the sync command in-process against a caller-supplied context.
414
+ *
415
+ * The tools lifecycle uses this instead of spawning `oat sync --json` and
416
+ * parsing its stdout: the caller passes a JSON-capturing logger and receives
417
+ * the evidence object the sync run already builds, with no serialization
418
+ * round trip and no subprocess. Canonical path filters are validated here
419
+ * with the same rules the CLI flags use.
420
+ */
421
+ export async function runSyncInProcess(context, filter, overrides = {}) {
422
+ const installPaths = validateInstallCanonicalPaths(filter?.installedCanonicalPaths);
423
+ const removePaths = validateRemoveCanonicalPaths(filter?.removedCanonicalPaths);
424
+ if (installPaths?.length && removePaths?.length) {
425
+ throw new CliError('--install-canonical and --remove-canonical cannot be combined', 1);
426
+ }
427
+ await runSyncCommand(context, { ...defaultDependencies(), ...overrides }, installPaths?.length
428
+ ? { mode: 'install', paths: installPaths }
429
+ : removePaths?.length
430
+ ? { mode: 'remove', paths: removePaths }
431
+ : undefined);
432
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/info/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,oBAAoB,EAG1B,MAAM,aAAa,CAAC;AA2DrB,wBAAgB,sBAAsB,CACpC,YAAY,GAAE,oBAA0C,GACvD,OAAO,CAYT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/info/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,oBAAoB,EAG1B,MAAM,aAAa,CAAC;AAsErB,wBAAgB,sBAAsB,CACpC,YAAY,GAAE,oBAA0C,GACvD,OAAO,CAYT"}
@@ -1,15 +1,18 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
3
  import { buildCommandContext } from '../../../app/command-context.js';
4
- import { getFrontmatterBlock, getFrontmatterField, parseFrontmatterField, } from '../../shared/frontmatter.js';
4
+ import { getFrontmatterBlock, getFrontmatterField, getSkillVersion, parseFrontmatterField, } from '../../shared/frontmatter.js';
5
5
  import { withScopeOption } from '../../shared/scope-option.js';
6
6
  import { readGlobalOptions } from '../../shared/shared.utils.js';
7
7
  import { scanTools } from '../../tools/shared/scan-tools.js';
8
+ import { detectDrift, resolveExpectedSkillProjections } from '../../../drift/index.js';
8
9
  import { resolveAssetsRoot } from '../../../fs/assets.js';
9
10
  import { fileExists } from '../../../fs/io.js';
10
11
  import { resolveProjectRoot, resolveScopeRoot } from '../../../fs/paths.js';
12
+ import { loadManifest } from '../../../manifest/manager.js';
11
13
  import { Command } from 'commander';
12
14
  import { runInfoTool, } from './info-tool.js';
15
+ import { probeProviderPath, readProjectedSkillVersion } from './skill-views.js';
13
16
  async function getToolDetail(tool, scopeRoot) {
14
17
  if (tool.type === 'skill') {
15
18
  const skillDir = join(scopeRoot, '.agents', 'skills', tool.name);
@@ -59,6 +62,16 @@ const defaultDependencies = {
59
62
  },
60
63
  resolveAssetsRoot,
61
64
  getToolDetail,
65
+ // Read-only by construction: load, detect, probe, and read a version. No
66
+ // manifest save and no writer is reachable from `oat tools info`.
67
+ skillViews: {
68
+ loadManifest,
69
+ detectDrift: (entry, scopeRoot) => detectDrift(entry, scopeRoot),
70
+ resolveExpectedProjections: resolveExpectedSkillProjections,
71
+ pathExists: probeProviderPath,
72
+ getSkillVersion,
73
+ readProjectedVersion: readProjectedSkillVersion,
74
+ },
62
75
  };
63
76
  export function createToolsInfoCommand(dependencies = defaultDependencies) {
64
77
  return withScopeOption(new Command('info'))
@@ -1,8 +1,11 @@
1
1
  import type { CommandContext } from '../../../app/command-context.js';
2
2
  import { type PackEvidenceBlockV1 } from '../../tools/shared/format-pack-inventory.js';
3
3
  import { type InventoryPackInput, type PackInventory } from '../../tools/shared/pack-inventory.js';
4
+ import { type ProviderContextDependencies } from '../../tools/shared/provider-context.js';
4
5
  import type { ScanToolsOptions } from '../../tools/shared/scan-tools.js';
5
6
  import type { ToolInfo } from '../../tools/shared/types.js';
7
+ import type { SkillViewDiagnosis } from '../../../drift/index.js';
8
+ import { type SkillViewDependencies } from './skill-views.js';
6
9
  export interface ToolDetail extends ToolInfo {
7
10
  description: string | null;
8
11
  argumentHint: string | null;
@@ -15,12 +18,21 @@ export interface InfoToolDependencies {
15
18
  resolveAssetsRoot: () => Promise<string>;
16
19
  getToolDetail: (tool: ToolInfo, scopeRoot: string) => Promise<Omit<ToolDetail, keyof ToolInfo>>;
17
20
  inventoryPack?: (input: InventoryPackInput) => Promise<PackInventory>;
21
+ providerContext?: ProviderContextDependencies;
22
+ /**
23
+ * Read-only manifest, drift, and expected-projection access for the
24
+ * provider-view diagnostic. Omitted in unit harnesses that only exercise the
25
+ * inventory surface; the command wiring always supplies it.
26
+ */
27
+ skillViews?: SkillViewDependencies;
18
28
  }
19
29
  export interface InfoToolResult {
20
30
  found: boolean;
21
31
  tool: ToolDetail | null;
22
32
  pack: PackInventory | null;
23
33
  packEvidence?: PackEvidenceBlockV1;
34
+ /** Per-scope provider-view diagnosis; additive, skills only. */
35
+ providerViews?: SkillViewDiagnosis[];
24
36
  }
25
37
  export declare function runInfoTool(context: CommandContext, name: string, dependencies: InfoToolDependencies): Promise<InfoToolResult>;
26
38
  //# 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;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
+ {"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;AAG/C,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;AAEvB,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;IACtE,eAAe,CAAC,EAAE,2BAA2B,CAAC;IAC9C;;;;OAIG;IACH,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;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;IACnC,gEAAgE;IAChE,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACtC;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,cAAc,CAAC,CA6JzB"}