@open-agent-toolkit/cli 0.2.45 → 0.2.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.2.45"
3
+ "oatVersion": "0.2.46"
4
4
  }
@@ -140,6 +140,12 @@ Two independent facts describe a pack:
140
140
  release manifest declares for that pack and scope, its presence, and its
141
141
  version or content digest.
142
142
 
143
+ Versioned skills and agents must match on both version metadata and canonical
144
+ content. A same-version content change is therefore reported as outdated rather
145
+ than current. Content comparison ignores the executable-bit normalization OAT
146
+ intentionally applies while materializing managed scripts, but still detects
147
+ file content, entry-type, and symlink-target changes.
148
+
143
149
  Commands report both. `oat tools list` and `oat tools info` show placement,
144
150
  intent source, and completeness. `oat status` and `oat doctor` report drift
145
151
  between intent and inventory with a scoped recovery command.
@@ -182,11 +188,12 @@ without qualification. Install the pack at **project scope** when you need its
182
188
  agents; `oat tools update` cannot repair this, because it is a scope limitation
183
189
  rather than drift.
184
190
 
185
- Repository templates under `.oat/templates/` are **owner overrides**. Once a
186
- project-scope template exists, OAT will not rewrite it: the managed default now
187
- lives at user scope and in the bundle. Delete the repository copy to resume
188
- managed-default behavior. `oat status` and `oat doctor` report retained
189
- overrides so the divergence is visible rather than silent.
191
+ Repository templates under `.oat/templates/` are **owner-owned seeds**. OAT
192
+ compares a source-backed seed with its bundled default: a byte-equivalent copy
193
+ is reported as current, while an edited copy is retained and reported as a
194
+ `retained-override`. OAT will not rewrite the retained copy. Delete a repository
195
+ template only when you intentionally want the bundled default seeded again;
196
+ never delete edited mutable seed content merely to clear the diagnostic.
190
197
 
191
198
  ### Evolving pack membership
192
199
 
@@ -454,8 +461,15 @@ Key behavior:
454
461
  - Every pack's fresh-install default is user scope (`defaultScope` in the release manifest); existing installs keep their current placement on re-install, so a re-install never moves a pack between scopes or creates a second copy at the other one. This applies to the per-pack subcommands too: a bare `oat tools install docs` in a repository where `docs` is already at project scope stays at project scope, and only an explicit `--scope` overrides that
455
462
  - Removing a pack from a scope happens only when you explicitly choose a narrower end-state in the interactive flow (e.g. a pack at `both` set to `project` only). All staged removals are shown in a single change summary and applied only after one batch confirmation — declining makes no changes
456
463
  - Non-interactive installs (including `--scope project`, `--scope user`, and the default pack set) are strictly additive and never remove a pack from a scope. Removal is interactive-only
457
- - Tracks installed vs bundled skill versions and reports outdated skills
464
+ - Tracks installed versus bundled skill and agent versions and canonical
465
+ content, reporting same-version content drift as outdated while ignoring
466
+ expected executable-bit normalization
458
467
  - Writes pack intent into the config file for the scope you installed into: a project install sets `tools.<pack>: true` in `.oat/config.json`, and a user install sets it in `~/.oat/config.json`. A user-only install never writes repository config
468
+ - When a project install discovers existing project-scoped packs whose intent
469
+ is missing, it writes those exact intents in canonical pack order. Human
470
+ output prints `Adopted project tool pack: <pack>` once per adopted pack;
471
+ JSON output adds `adoptedPacks` only when the list is non-empty. This is pack
472
+ intent reconciliation, not repository PJM adoption
459
473
  - A user-only install needs no Git repository and performs no repository writes
460
474
  - Refreshes the managed `OAT tools` section in the repository-root `AGENTS.md` **only for project-scope runs of the aggregate `oat tools install`**. The per-pack subcommands (`oat tools install workflows`, `oat tools install docs`, and the rest) never write `AGENTS.md`, at either scope
461
475
  - Repository `AGENTS.md` guidance for project management is owned by adoption, not by pack placement. Installing the `project-management` pack no longer upserts a managed `OAT project-management` section; `oat pjm init` writes that repository guidance when the repository actually adopts PJM
@@ -474,12 +488,17 @@ Key behavior:
474
488
 
475
489
  - Accepts a tool name, `--pack <pack>`, or `--all` (mutually exclusive)
476
490
  - With no target, exits without mutation and suggests the explicit bulk command `oat tools update --all`; invalid packs and conflicting targets keep their own targeted diagnostics
477
- - Compares installed versions against bundled versions and copies updated assets
491
+ - Compares installed versions and canonical content against bundled assets and
492
+ copies updates; equal version metadata does not hide content drift
478
493
  - For `--pack <pack>` and `--all`, an already-installed pack is reconciled to the **current** release membership in the scopes where it is installed, adding newly bundled skills, agents, templates, and scripts
479
494
  - A pack whose managed assets are all missing but whose intent is still declared is repaired from intent rather than skipped
480
495
  - Managed template and script companions are refreshed at **user** scope. A project-scope repository template is an owner override and is left alone
481
496
  - Non-versioned assets are compared by content digest, so an identical refresh is a no-op instead of a rewrite
482
497
  - Update persists inferred legacy intent only after a successful explicit mutation, so a read never rewrites your config
498
+ - A successful project-scope update reports the exact newly adopted legacy pack
499
+ intents in canonical order. Human output uses
500
+ `Adopted project tool pack: <pack>`; JSON output adds the optional
501
+ `adoptedPacks` array only when at least one intent was written
483
502
  - `--scope all` outside a Git repository completes the user-scope work instead of failing. Unlike `oat status` and `oat doctor`, update skips project scope silently and does not name it in the result; an explicitly requested `--scope project` outside a repository is still a hard failure
484
503
  - Dry-run mode with `--dry-run`; auto-sync after mutations by default
485
504
  - Use `--no-sync` to skip auto-sync
@@ -735,8 +754,9 @@ Removal and migration use the symmetric contract: the follow-up sync prunes exac
735
754
  User-scope tool packs and explicit PJM adoption changed several defaults and
736
755
  exit codes. Nothing here is data-destructive, and legacy config keeps working —
737
756
  `tools.<pack>: false` still parses, complete pre-adoption PJM scaffolds are
738
- grandfathered as `inferred-legacy`, and no CLI flag was removed or renamed. But
739
- several commands you already run behave differently.
757
+ grandfathered as `inferred-legacy`, and existing installs remain additive. One
758
+ inert per-pack install flag was removed, and several commands you already run
759
+ behave differently.
740
760
 
741
761
  ### Install scope defaults flipped to user
742
762
 
@@ -781,6 +801,26 @@ is not installed. Test for a truthy value instead. Legacy `false` values that
781
801
  already exist in a config file are still read (see
782
802
  [Legacy `false` intent](#legacy-false-intent)) — they are just never written.
783
803
 
804
+ Direct config writes now enforce the same true-or-absent contract.
805
+ `oat config set tools.<pack> false` exits `1` without changing the config. To
806
+ remove a project-scoped pack and clear its intent, run:
807
+
808
+ ```bash
809
+ oat tools remove --pack <pack> --scope project
810
+ ```
811
+
812
+ Existing legacy `false` values remain readable migration input.
813
+
814
+ ### Per-pack install `--force` was removed
815
+
816
+ `oat tools install <pack> --force` is now rejected as an unknown option. The
817
+ flag was inert in the unified additive lifecycle. To reconcile installed
818
+ assets, use the scoped update command instead:
819
+
820
+ ```bash
821
+ oat tools update --pack <pack> --scope <scope>
822
+ ```
823
+
784
824
  ### Per-pack install `--json` changed shape
785
825
 
786
826
  The per-pack subcommands (`oat tools install docs`, `oat tools install
@@ -803,6 +843,12 @@ above. The previous single-scope payload's `scope`, `targetRoot`, `assetsRoot`,
803
843
  keying on them reads `undefined` rather than failing. Read `scopes` for the
804
844
  scopes acted on, and `results[].request.scopeRoot` for the target root of each.
805
845
 
846
+ When a project-scope aggregate install, direct pack install, or update adopts
847
+ missing legacy pack intents, the same single payload also contains
848
+ `"adoptedPacks": ["docs", "workflows"]`. The field is omitted when nothing was
849
+ adopted, and entries follow the manifest's canonical pack order. Human output
850
+ reports the same set as one `Adopted project tool pack: <pack>` line per pack.
851
+
806
852
  ### Other behavior changes worth knowing
807
853
 
808
854
  - `oat tools remove --pack <pack>` deletes every managed asset the release
@@ -77,8 +77,10 @@ Use [Instruction Sync](../provider-sync/instruction-sync.md) for the full strate
77
77
 
78
78
  - Run `oat init tools` to install/update bundled OAT tool packs.
79
79
  - In TTY mode, select which outdated skills to update when prompted.
80
- - In non-interactive mode, rerun the relevant pack subcommand with `--force` if you want to overwrite outdated installed skills.
81
- - For pack-level drift rather than a single skill, prefer the scoped command doctor prints: `oat tools update --pack <pack> --scope <scope>`.
80
+ - In non-interactive mode, run the scoped command doctor prints:
81
+ `oat tools update --pack <pack> --scope <scope>`.
82
+ - Per-pack install commands no longer accept the previously inert `--force`
83
+ option.
82
84
 
83
85
  ## `sync` reports an unsafe provider parent
84
86
 
@@ -147,18 +149,23 @@ Both commands report managed pack state with a scoped recovery command:
147
149
 
148
150
  - `partial` — some managed assets are missing, or intent is declared with none
149
151
  installed. Fix with `oat tools update --pack <pack> --scope <scope>`.
150
- - `stale` — installed assets are behind the bundled release. Same fix.
152
+ - `stale` — installed assets are behind the bundled release, or a managed skill
153
+ or agent has the bundled version metadata but different canonical content.
154
+ Expected executable-bit normalization on managed scripts is ignored. Fix with
155
+ the same scoped update command.
151
156
  - `newer` — installed assets are ahead of the bundle. This is informational and
152
157
  usually means the CLI is older than the assets; update the CLI rather than
153
158
  downgrading the pack.
154
- - `retained-override` — an owner-owned seeded asset exists at the scope, so the
155
- managed default is intentionally not applied there. This covers repository
156
- templates under `.oat/templates/` **and** seeded content such as
157
- `.oat/ideas/backlog.md` and `.oat/ideas/scratchpad.md`. Deleting the file is
158
- the right move only for a **template** you want OAT to manage again; never
159
- delete seeded content you have edited, because the next install or update
160
- reseeds the bundled default in its place and your edits are gone. The finding
161
- is informational and carries no recovery command for exactly that reason.
159
+ - `retained-override` — a source-backed owner-owned seed differs from its
160
+ bundled default, so OAT retains the edited copy instead of overwriting it. A
161
+ bundle-equal seed is current and does not produce this finding. Retained
162
+ overrides cover repository templates under `.oat/templates/` **and** seeded
163
+ content such as `.oat/ideas/backlog.md` and `.oat/ideas/scratchpad.md`.
164
+ Deleting the file is the right move only for a **template** you intentionally
165
+ want OAT to seed from the bundle again; never delete seeded content you have
166
+ edited, because the next install or update reseeds the bundled default in its
167
+ place and your edits are gone. The finding is informational and carries no
168
+ recovery command for exactly that reason.
162
169
  - `user-agent-unmaterialized` — the pack installed canonical agents into
163
170
  `~/.agents/agents/`, but user scope materializes no provider view for them
164
171
  beyond the bundled managed role files. `oat tools update` cannot fix this.
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.2.45",
3
- "docs-config": "0.2.45",
4
- "docs-theme": "0.2.45",
5
- "docs-transforms": "0.2.45"
2
+ "cli": "0.2.46",
3
+ "docs-config": "0.2.46",
4
+ "docs-theme": "0.2.46",
5
+ "docs-transforms": "0.2.46"
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAmBzC,OAAO,EAML,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAgBhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,mCAAmC,EACnC,0BAA0B,EAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0GpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kCAAkC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7E,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC7C,mCAAmC,EAAE,OAAO,mCAAmC,CAAC;IAChF,0BAA0B,EAAE,OAAO,0BAA0B,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAgkFD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAsKT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAmBzC,OAAO,EAML,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAgBhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,mCAAmC,EACnC,0BAA0B,EAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0GpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kCAAkC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7E,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC7C,mCAAmC,EAAE,OAAO,mCAAmC,CAAC;IAChF,0BAA0B,EAAE,OAAO,0BAA0B,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAqkFD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAsKT"}
@@ -1701,8 +1701,11 @@ async function setConfigValue(repoRoot, userConfigDir, key, rawValue, surface, d
1701
1701
  }
1702
1702
  if (key.startsWith('tools.')) {
1703
1703
  const packName = key.slice('tools.'.length);
1704
+ if (rawValue.trim().toLowerCase() !== 'true') {
1705
+ throw new Error(`Pack intent '${key}' can only be declared with true. To remove the pack and clear its intent, run: oat tools remove --pack ${packName} --scope project`);
1706
+ }
1704
1707
  const tools = { ...config.tools };
1705
- tools[packName] = rawValue.trim().toLowerCase() === 'true';
1708
+ tools[packName] = true;
1706
1709
  await dependencies.writeOatConfig(repoRoot, {
1707
1710
  ...config,
1708
1711
  tools,
@@ -60,6 +60,7 @@ export interface InitToolsDependencies {
60
60
  interface InitToolsRunMetadata {
61
61
  affectedScopes: ConcreteScope[];
62
62
  appliedScopes: ConcreteScope[];
63
+ adoptedPacks: ToolPack[];
63
64
  }
64
65
  interface PackScopeChange {
65
66
  pack: ToolPack;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/init/tools/index.ts"],"names":[],"mappings":"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"}
@@ -411,15 +411,19 @@ function buildPackEndStateChoices(pack, currentLocation, defaultEndState) {
411
411
  const rest = annotated.filter((choice) => choice.value !== defaultEndState);
412
412
  return defaultChoice ? [defaultChoice, ...rest] : annotated;
413
413
  }
414
- function reportSuccess(context, packs, syncScopes) {
414
+ function reportSuccess(context, packs, syncScopes, adoptedPacks) {
415
415
  if (context.json) {
416
416
  context.logger.json({
417
417
  status: 'ok',
418
418
  installedPacks: packs,
419
419
  syncScopes,
420
+ ...(adoptedPacks.length > 0 ? { adoptedPacks } : {}),
420
421
  });
421
422
  return;
422
423
  }
424
+ for (const pack of adoptedPacks) {
425
+ context.logger.info(`Adopted project tool pack: ${pack}`);
426
+ }
423
427
  context.logger.info(`Installed tool packs: ${packs.map(({ pack, scope }) => `${pack} (${formatInstalledLocation(scope)})`).join(', ')}`);
424
428
  syncScopes.forEach((scope, index) => {
425
429
  context.logger.info(`${index === 0 ? 'Run' : 'Also run'}: oat sync --scope ${scope}`);
@@ -515,7 +519,11 @@ export async function runInitTools(context, dependencies) {
515
519
  selectedPacks.push('project-management');
516
520
  }
517
521
  if (selectedPacks.length === 0) {
518
- lastRunInitToolsMetadata = { affectedScopes: [], appliedScopes: [] };
522
+ lastRunInitToolsMetadata = {
523
+ affectedScopes: [],
524
+ appliedScopes: [],
525
+ adoptedPacks: [],
526
+ };
519
527
  if (!context.json) {
520
528
  context.logger.info('No tool packs selected.');
521
529
  }
@@ -838,11 +846,19 @@ export async function runInitTools(context, dependencies) {
838
846
  const appliedScopes = [
839
847
  ...new Set(packScopeInfo.flatMap(({ scope }) => scopesForEndState(scope))),
840
848
  ];
849
+ const adoptedPacks = projectRoot && appliedScopes.includes('project')
850
+ ? (await reconcileProjectToolsConfig({
851
+ repoRoot: projectRoot,
852
+ cwd: context.cwd,
853
+ home: context.home,
854
+ }, dependencies)).adoptedPacks
855
+ : [];
841
856
  lastRunInitToolsMetadata = {
842
857
  affectedScopes: affectedScopesList,
843
858
  appliedScopes,
859
+ adoptedPacks,
844
860
  };
845
- reportSuccess(context, packScopeInfo, affectedScopesList);
861
+ reportSuccess(context, packScopeInfo, affectedScopesList, adoptedPacks);
846
862
  process.exitCode = 0;
847
863
  return selectedPacks;
848
864
  }
@@ -912,7 +928,7 @@ function createReconciledPackCommand(pack, dependencies) {
912
928
  const base = new Command(pack).description(descriptions[pack]);
913
929
  const packCommand = pack === 'core' ? base : withScopeOption(base);
914
930
  return packCommand
915
- .option('--force', 'Reconcile managed assets to bundled content')
931
+ .allowUnknownOption(false)
916
932
  .action(async (_options, command) => {
917
933
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
918
934
  try {
@@ -946,15 +962,26 @@ function createReconciledPackCommand(pack, dependencies) {
946
962
  // Project-scope placement installs capability only. The
947
963
  // project-management and decisions AGENTS sections are written by the
948
964
  // explicit adoption action (`oat pjm init`), never by pack placement.
965
+ const adoptedPacks = scopes.includes('project')
966
+ ? (await reconcileProjectToolsConfig({
967
+ repoRoot: await dependencies.resolveProjectRoot(context.cwd),
968
+ cwd: context.cwd,
969
+ home: context.home,
970
+ }, dependencies)).adoptedPacks
971
+ : [];
949
972
  if (context.json) {
950
973
  context.logger.json({
951
974
  status: 'ok',
952
975
  pack,
953
976
  scopes,
954
977
  results,
978
+ ...(adoptedPacks.length > 0 ? { adoptedPacks } : {}),
955
979
  });
956
980
  }
957
981
  else {
982
+ for (const adoptedPack of adoptedPacks) {
983
+ context.logger.info(`Adopted project tool pack: ${adoptedPack}`);
984
+ }
958
985
  context.logger.info(`Installed ${pack} tool pack.`);
959
986
  for (const result of results) {
960
987
  context.logger.info(`Scope: ${result.request.scope}`);
@@ -1045,10 +1072,12 @@ export function createInitToolsCommand(overrides = {}) {
1045
1072
  scanTools: dependencies.scanTools,
1046
1073
  }),
1047
1074
  ];
1048
- for (const packCommand of packCommands) {
1049
- packCommand.hook('postAction', async (_thisCommand, actionCommand) => {
1050
- await reconcileAfterInstall(actionCommand);
1051
- });
1075
+ if (!dependencies.reconcilePacks) {
1076
+ for (const packCommand of packCommands) {
1077
+ packCommand.hook('postAction', async (_thisCommand, actionCommand) => {
1078
+ await reconcileAfterInstall(actionCommand);
1079
+ });
1080
+ }
1052
1081
  }
1053
1082
  const command = new Command('tools').description('Install OAT tool packs (core, ideas, docs, workflows, utility, project-management, research, brainstorm)');
1054
1083
  for (const packCommand of packCommands) {
@@ -1059,7 +1088,6 @@ export function createInitToolsCommand(overrides = {}) {
1059
1088
  const selectedPacks = await runInitTools(context, dependencies);
1060
1089
  appliedScopesByCommand.set(actionCommand, lastRunInitToolsMetadata?.appliedScopes ?? []);
1061
1090
  setInstalledCanonicalPaths(actionCommand, canonicalPathsForPacks(selectedPacks));
1062
- await reconcileAfterInstall(actionCommand);
1063
1091
  });
1064
1092
  return command;
1065
1093
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pack-inventory.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/pack-inventory.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,eAAe,CAAC;AAIvB,OAAO,EAEL,KAAK,gBAAgB,EAEtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACT,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,mBAAmB,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EACA,uBAAuB,GACvB,iBAAiB,GACjB,0BAA0B,GAC1B,2BAA2B,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;IACvD,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoLD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAmC9B;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,mBAAmB,GAC7B,OAAO,CAUT;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,aAAa,CAAC,CA0DxB"}
1
+ {"version":3,"file":"pack-inventory.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/pack-inventory.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,eAAe,CAAC;AAIvB,OAAO,EAEL,KAAK,gBAAgB,EAEtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACT,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,mBAAmB,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EACA,uBAAuB,GACvB,iBAAiB,GACjB,0BAA0B,GAC1B,2BAA2B,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;IACvD,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA8QD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAmC9B;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,mBAAmB,GAC7B,OAAO,CAUT;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,aAAa,CAAC,CA0DxB"}
@@ -1,9 +1,9 @@
1
- import { lstat } from 'node:fs/promises';
1
+ import { lstat, readdir, readlink } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
3
  import { compareVersions } from '../../init/tools/shared/version.js';
4
4
  import { getAgentVersion, getSkillVersion } from '../../shared/frontmatter.js';
5
5
  import { readOatConfig } from '../../../config/oat-config.js';
6
- import { resolveManagedScopeRoots, validateManagedPath, } from '../../../fs/paths.js';
6
+ import { resolveManagedScopeRoots, validateManagedPath, validateRealPathWithinScope, } from '../../../fs/paths.js';
7
7
  import { USER_SCOPE_MANAGED_AGENT_FILES, } from '../../../shared/types.js';
8
8
  import { digestDirectory, digestFile } from './content-digest.js';
9
9
  import { getPackDefinition } from './pack-manifest.js';
@@ -29,14 +29,62 @@ async function inventoryVersionedAsset(definition, installedPath, bundledPath) {
29
29
  readVersion(installedPath),
30
30
  readVersion(bundledPath),
31
31
  ]);
32
+ const versionStatus = compareVersions(installedVersion, bundledVersion);
33
+ const contentMatches = versionStatus !== 'current'
34
+ ? null
35
+ : definition.kind === 'skill'
36
+ ? await canonicalDirectoryMatches(installedPath, bundledPath)
37
+ : await canonicalFileMatches(installedPath, bundledPath);
32
38
  return {
33
39
  definition,
34
40
  path: installedPath,
35
- status: compareVersions(installedVersion, bundledVersion),
41
+ status: versionStatus === 'current' && !contentMatches
42
+ ? 'outdated'
43
+ : versionStatus,
36
44
  installedVersion,
37
45
  bundledVersion,
38
46
  };
39
47
  }
48
+ async function canonicalFileMatches(installedPath, bundledPath) {
49
+ const [installedDigest, bundledDigest] = await Promise.all([
50
+ digestFile(installedPath, 0o644),
51
+ digestFile(bundledPath, 0o644),
52
+ ]);
53
+ return installedDigest === bundledDigest;
54
+ }
55
+ async function canonicalDirectoryMatches(installedRoot, bundledRoot) {
56
+ const entries = await readdir(bundledRoot, { withFileTypes: true });
57
+ for (const entry of entries) {
58
+ const installedPath = join(installedRoot, entry.name);
59
+ const bundledPath = join(bundledRoot, entry.name);
60
+ if (!(await pathExists(installedPath)))
61
+ return false;
62
+ const installedMetadata = await lstat(installedPath);
63
+ if (entry.isDirectory()) {
64
+ if (!installedMetadata.isDirectory() ||
65
+ !(await canonicalDirectoryMatches(installedPath, bundledPath))) {
66
+ return false;
67
+ }
68
+ continue;
69
+ }
70
+ if (entry.isFile()) {
71
+ if (!installedMetadata.isFile() ||
72
+ !(await canonicalFileMatches(installedPath, bundledPath))) {
73
+ return false;
74
+ }
75
+ continue;
76
+ }
77
+ if (entry.isSymbolicLink()) {
78
+ if (!installedMetadata.isSymbolicLink() ||
79
+ (await readlink(installedPath)) !== (await readlink(bundledPath))) {
80
+ return false;
81
+ }
82
+ continue;
83
+ }
84
+ throw new Error(`Unsupported filesystem entry in pack asset: ${bundledPath}`);
85
+ }
86
+ return true;
87
+ }
40
88
  async function inventoryStaticAsset(definition, installedPath, bundledPath) {
41
89
  const [installedDigest, bundledDigest] = definition.kind === 'directory'
42
90
  ? await Promise.all([
@@ -72,28 +120,40 @@ async function inventoryAsset(definition, scope, scopeRoot, assetsRoot, managedR
72
120
  };
73
121
  }
74
122
  if (definition.ownership[scope] === 'seed-if-missing') {
75
- if (definition.generation === 'projects-config-default') {
76
- const config = await readOatConfig(scopeRoot);
123
+ if (definition.generation) {
124
+ if (definition.generation === 'projects-config-default') {
125
+ const config = await readOatConfig(scopeRoot);
126
+ return {
127
+ definition,
128
+ path: installedPath,
129
+ status: config.projects?.root?.trim() ? 'present' : 'outdated',
130
+ installedVersion: null,
131
+ bundledVersion: null,
132
+ };
133
+ }
77
134
  return {
78
135
  definition,
79
136
  path: installedPath,
80
- status: config.projects?.root?.trim() ? 'present' : 'outdated',
137
+ status: 'present',
81
138
  installedVersion: null,
82
139
  bundledVersion: null,
83
140
  };
84
141
  }
142
+ if (!definition.source) {
143
+ throw new Error(`Seeded pack asset ${definition.id} has no materialized source`);
144
+ }
145
+ const { realPath: bundledPath } = await validateRealPathWithinScope(join(assetsRoot, definition.source), assetsRoot);
146
+ const inventory = await inventoryStaticAsset(definition, realPath, bundledPath);
85
147
  return {
86
- definition,
148
+ ...inventory,
87
149
  path: installedPath,
88
- status: 'present',
89
- installedVersion: null,
90
- bundledVersion: null,
150
+ status: inventory.status === 'current' ? 'current' : 'present',
91
151
  };
92
152
  }
93
153
  if (!definition.source) {
94
154
  throw new Error(`Managed pack asset ${definition.id} has no materialized source`);
95
155
  }
96
- const bundledPath = join(assetsRoot, definition.source);
156
+ const { realPath: bundledPath } = await validateRealPathWithinScope(join(assetsRoot, definition.source), assetsRoot);
97
157
  if (definition.kind === 'skill' || definition.kind === 'agent') {
98
158
  const inventory = await inventoryVersionedAsset(definition, realPath, bundledPath);
99
159
  return { ...inventory, path: installedPath };
@@ -1,6 +1,6 @@
1
1
  import { type OatConfig } from '../../../config/oat-config.js';
2
2
  import { type ScanToolsOptions } from './scan-tools.js';
3
- import type { ToolInfo } from './types.js';
3
+ import type { PackName, ToolInfo } from './types.js';
4
4
  export interface ReconcileProjectToolsOptions {
5
5
  repoRoot: string;
6
6
  cwd: string;
@@ -12,5 +12,9 @@ export interface ProjectToolsConfigDependencies {
12
12
  readOatConfig: (repoRoot: string) => Promise<OatConfig>;
13
13
  writeOatConfig: (repoRoot: string, config: OatConfig) => Promise<void>;
14
14
  }
15
- export declare function reconcileProjectToolsConfig(options: ReconcileProjectToolsOptions, dependencies?: ProjectToolsConfigDependencies): Promise<'written' | 'unchanged'>;
15
+ export interface ReconcileProjectToolsResult {
16
+ action: 'written' | 'unchanged';
17
+ adoptedPacks: PackName[];
18
+ }
19
+ export declare function reconcileProjectToolsConfig(options: ReconcileProjectToolsOptions, dependencies?: ProjectToolsConfigDependencies): Promise<ReconcileProjectToolsResult>;
16
20
  //# sourceMappingURL=project-tools-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-tools-config.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/project-tools-config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAIf,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,8BAA8B;IAC7C,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE;AASD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,4BAA4B,EACrC,YAAY,GAAE,8BAAoD,GACjE,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,CA2BlC"}
1
+ {"version":3,"file":"project-tools-config.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/shared/project-tools-config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAIf,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAElD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,8BAA8B;IAC7C,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,YAAY,EAAE,QAAQ,EAAE,CAAC;CAC1B;AASD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,4BAA4B,EACrC,YAAY,GAAE,8BAAoD,GACjE,OAAO,CAAC,2BAA2B,CAAC,CA6BtC"}
@@ -1,5 +1,6 @@
1
1
  import { readOatConfig, writeOatConfig, } from '../../../config/oat-config.js';
2
2
  import { resolveAssetsRoot } from '../../../fs/assets.js';
3
+ import { PACK_NAMES } from './pack-manifest.js';
3
4
  import { scanTools } from './scan-tools.js';
4
5
  const defaultDependencies = {
5
6
  resolveAssetsRoot,
@@ -16,18 +17,19 @@ export async function reconcileProjectToolsConfig(options, dependencies = defaul
16
17
  });
17
18
  const config = await dependencies.readOatConfig(options.repoRoot);
18
19
  const tools = { ...config.tools };
19
- let changed = false;
20
+ const adopted = new Set();
20
21
  for (const tool of projectTools) {
21
22
  if (tool.scope === 'project' &&
22
23
  tool.pack !== 'custom' &&
23
24
  tools[tool.pack] !== true) {
24
25
  tools[tool.pack] = true;
25
- changed = true;
26
+ adopted.add(tool.pack);
26
27
  }
27
28
  }
28
- if (!changed) {
29
- return 'unchanged';
29
+ const adoptedPacks = PACK_NAMES.filter((pack) => adopted.has(pack));
30
+ if (adoptedPacks.length === 0) {
31
+ return { action: 'unchanged', adoptedPacks };
30
32
  }
31
33
  await dependencies.writeOatConfig(options.repoRoot, { ...config, tools });
32
- return 'written';
34
+ return { action: 'written', adoptedPacks };
33
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAK1C,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAKvE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AAmBxB,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,GAClD,MAAM,EAAE,CAaV;AAgCD,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,uBAA6C,EAC3D,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CA6LT;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAS7E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACnB,OAAO,CAOT;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,OAAO,GACd,MAAM,CAMR"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAK1C,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAKvE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AAmBxB,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,GAClD,MAAM,EAAE,CAaV;AAgCD,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,uBAA6C,EAC3D,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CA8MT;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAS7E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACnB,OAAO,CAOT;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,OAAO,GACd,MAAM,CAMR"}
@@ -130,11 +130,12 @@ export function createToolsUpdateCommand(dependencies = defaultDependencies, syn
130
130
  const changedProjectScope = [...result.updated, ...result.current, ...result.newer].some(({ scope }) => scope === 'project') ||
131
131
  result.assetRefreshes.some(({ scope }) => scope === 'project') ||
132
132
  result.plans.some(({ scope }) => scope === 'project');
133
+ let adoptedPacks = [];
133
134
  if (assetsRoot &&
134
135
  result.notInstalled.length === 0 &&
135
136
  changedProjectScope) {
136
137
  const repoRoot = await resolveProjectRoot(context.cwd);
137
- await reconcileProjectToolsConfig({
138
+ adoptedPacks = (await reconcileProjectToolsConfig({
138
139
  repoRoot,
139
140
  cwd: context.cwd,
140
141
  home: context.home,
@@ -143,11 +144,16 @@ export function createToolsUpdateCommand(dependencies = defaultDependencies, syn
143
144
  scanTools: dependencies.scanTools,
144
145
  readOatConfig,
145
146
  writeOatConfig,
146
- });
147
+ })).adoptedPacks;
147
148
  }
148
149
  if (result.notInstalled.length > 0) {
149
150
  if (context.json) {
150
- logger.json({ target: describeTarget(target), dryRun, result });
151
+ logger.json({
152
+ target: describeTarget(target),
153
+ dryRun,
154
+ result,
155
+ ...(adoptedPacks.length > 0 ? { adoptedPacks } : {}),
156
+ });
151
157
  }
152
158
  else {
153
159
  logger.error(`Tool '${result.notInstalled[0]}' not found.`);
@@ -170,9 +176,17 @@ export function createToolsUpdateCommand(dependencies = defaultDependencies, syn
170
176
  }
171
177
  }
172
178
  if (context.json) {
173
- logger.json({ target: describeTarget(target), dryRun, result });
179
+ logger.json({
180
+ target: describeTarget(target),
181
+ dryRun,
182
+ result,
183
+ ...(adoptedPacks.length > 0 ? { adoptedPacks } : {}),
184
+ });
174
185
  return;
175
186
  }
187
+ for (const pack of adoptedPacks) {
188
+ logger.info(`Adopted project tool pack: ${pack}`);
189
+ }
176
190
  if (result.updated.length > 0) {
177
191
  for (const tool of result.updated) {
178
192
  logger.success(formatUpdatedToolMessage(tool, dryRun));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.2.45",
3
+ "version": "0.2.46",
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",
@@ -34,7 +34,7 @@
34
34
  "ora": "^9.0.0",
35
35
  "yaml": "2.8.2",
36
36
  "zod": "^3.25.76",
37
- "@open-agent-toolkit/control-plane": "0.2.45"
37
+ "@open-agent-toolkit/control-plane": "0.2.46"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^22.10.0",