@iseoane/agent-depot 0.6.15 → 0.6.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.6.16] - 2026-11-13
11
+
12
+ ### Changed
13
+
14
+ - `app install` names the Hosts whose setup the recipe declares and the `app setup` command to run, since install never runs Host setup and wiring is not tracked (#131).
15
+ - The built-in `agent-depot-apprecipe` Skill (1.3) checks Host wiring in its preflight (unattended setup per Host, conflicting MCP entries, plugins and packages), prefers `argv` setup when possible, rechecks manual setup on repair and hands off the pending `app setup` command per Host (#131).
16
+
10
17
  ## [0.6.15] - 2026-11-12
11
18
 
12
19
  ### Changed
@@ -1,6 +1,6 @@
1
1
  import { PROJECT_HOSTS } from "./project-manifest.js";
2
2
  import { APP_RECIPE_SCHEMA } from "./app-schema.js";
3
- import { checkAppUpdates } from "./app-flow.js";
3
+ import { checkAppUpdates, declaredSetupHosts } from "./app-flow.js";
4
4
  import { NO_PROGRESS } from "./progress.js";
5
5
  import { CliUsageError } from "./usage-error.js";
6
6
  const ACTION_PROGRESS = {
@@ -158,15 +158,27 @@ async function runLifecycle(action, args, apps, output, usage, progress) {
158
158
  output(`Manual (never executed): ${result.manual}`);
159
159
  output(describeManualCompletion(plan));
160
160
  }
161
+ if (action === "install" && result.status === "installed")
162
+ showSetupHosts(plan);
161
163
  return result.status === "installed" || result.status === "untracked" || result.status === "completed" ? 0 : 1;
162
164
  }
165
+ function showSetupHosts(plan) {
166
+ const hosts = declaredSetupHosts(plan.entry.recipe);
167
+ if (!hosts.length)
168
+ return;
169
+ output(`Host setup is separate and not tracked; this recipe declares it for: ${hosts.join(", ")}.`);
170
+ output(`Run app setup ${quoteAppName(name)} --host <host> --yes for each Host you use.`);
171
+ }
172
+ }
173
+ function quoteAppName(name) {
174
+ return process.platform === "win32"
175
+ ? "'" + name.replaceAll("'", "''") + "'"
176
+ : "'" + name.replaceAll("'", "'\\''") + "'";
163
177
  }
164
178
  /** Copyable completion command for the platform's documented shell. */
165
179
  export function describeManualCompletion(plan) {
166
180
  const name = plan.entry.recipe.name;
167
- const quotedName = process.platform === "win32"
168
- ? "'" + name.replaceAll("'", "''") + "'"
169
- : "'" + name.replaceAll("'", "'\\''") + "'";
181
+ const quotedName = quoteAppName(name);
170
182
  const shell = process.platform === "win32" ? "PowerShell" : "POSIX shell";
171
183
  return `After completing it, run app ${plan.action} ${quotedName}${plan.host ? ` --host ${plan.host}` : ""} --manual-done --yes to check version (${shell}).`;
172
184
  }
@@ -7,6 +7,7 @@ import { fetchAppLatest } from "./app-latest.js";
7
7
  import { writeFileAtomically } from "./atomic-file.js";
8
8
  import { parseAppRecipe } from "./app-recipes.js";
9
9
  import { createPortableExecutableResolver } from "./executable-resolution.js";
10
+ import { PROJECT_HOSTS } from "./project-manifest.js";
10
11
  import { runProcess } from "./process-runner.js";
11
12
  import { defaultSourceStatePath } from "./source-state.js";
12
13
  const APP_OUTPUT_LIMIT = 1024 * 1024;
@@ -489,6 +490,10 @@ export function createAppOperations(environment = {}) {
489
490
  }
490
491
  return { directory, approvalStatus, checkUpdate, load, preview, approve, inspect, inspectForExport, planLifecycle, executeLifecycle, completeManual, cancelManual, trackedApps, previewForget, forgetApp };
491
492
  }
493
+ /** Hosts whose user-global setup the recipe declares; install never runs them and wiring is not tracked. */
494
+ export function declaredSetupHosts(recipe) {
495
+ return PROJECT_HOSTS.filter(host => recipe.setup?.[host] !== undefined);
496
+ }
492
497
  /** Concurrent independent checks; one broken App must not hide the rest of a batch. */
493
498
  export async function checkAppUpdates(apps) {
494
499
  const entries = (await apps.load()).filter(entry => entry.applicable || entry.error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iseoane/agent-depot",
3
- "version": "0.6.15",
3
+ "version": "0.6.16",
4
4
  "description": "A cross-platform catalog for reusable coding-agent skills.",
5
5
  "license": "MIT",
6
6
  "author": "iseoane",
@@ -4,7 +4,7 @@ description: "Trigger: App recipe creation or repair. Research an App's actual i
4
4
  license: MIT
5
5
  metadata:
6
6
  author: "iseoane"
7
- version: "1.2"
7
+ version: "1.3"
8
8
  ---
9
9
 
10
10
  ## Activation Contract
@@ -43,6 +43,7 @@ Check installation **and** update, uninstall, version/latest and each Host setup
43
43
  - **Runtime/build and hook requirements:** verify documented engine ranges, compiler/toolchain minimums, architecture/libc support and utilities such as `git`, `curl`, `jq` or extraction tools. Check write access to the actual global prefix and required elevation; never assume sudo or request credentials in chat. Inspect prerequisites for Host plugins separately from the App binary.
44
44
  - **Unattended behavior:** use installed manager `--help`/documented help and upstream installer source to establish confirmation defaults and supported flags. Verify explicit formula/cask or package disambiguation where necessary. Do not invent `--yes` flags or rely on stdin EOF to count as consent. Run dry-run/read-only probes only after checking they do not install, register, authenticate or rewrite configuration; never test a lifecycle command just to see whether it prompts.
45
45
  - **Version and update signals:** verify a release-meaningful version (not an unchanged `dev`) and a latest signal for the chosen channel. A GitHub release can be ahead of a package-manager formula. Use channel metadata when available and disclose freshness limits; do not run `brew update` or another mutating refresh as a read-only latest probe.
46
+ - **Host wiring:** for each Host the user uses, read the installed App's setup help (for example `<app> setup --help`) and establish, per Host, whether setup runs unattended and which flags it accepts; a flag valid for one Host can be rejected for another. Inspect existing wiring that setup may conflict with or duplicate: user MCP entries (for Claude, `mcpServers` in `~/.claude.json`), Host plugins (`claude plugin list`), Host packages (`pi list`) and permissions entries. Setup that refuses to overwrite a conflicting entry needs a documented removal step first. Flags that grant permissions or bypass prompts are the user's choice: present them, never select them silently.
46
47
  - **Preserved state:** identify existing binary copies, data directories and Host wiring without reading private memory content. Explain migrations, backups and teardown scope outside executable argv where appropriate; never delete user data or remove a shared tap/marketplace implicitly.
47
48
 
48
49
  ### Homebrew checklist
@@ -59,10 +60,10 @@ Read the current schema; do not assume it has dependency or multi-command fields
59
60
 
60
61
  1. Record upstream evidence and platform support. Inspect all PATH matches (`which -a`/`whence -a`, or Windows `Get-Command -All`), resolved paths, and channel inventories such as `brew list`, `npm ls -g` or `pipx list`. List Windows shims seen from WSL separately: `/mnt/<drive>/` executables cannot serve a Linux recipe. Finish only when the actual channel is established or the user has chosen one.
61
62
  2. Complete the Installer Preflight and resolve the prerequisite decision gate before writing required `name`, `install`, `update`, `uninstall`, and `version`. Each lifecycle step uses `argv`, `manual`, or both; manual fallback applies only to spawn failure, never non-zero exit. `version` needs read-only argv and a JavaScript regex with exactly one capture group. Choose optional `latest` as `github: owner/repo`, `npm: package`, or read-only `argv` plus `pattern`; omit it when unknown. Consult [the illustrative example](assets/example.md), not as upstream command evidence.
62
- 3. Put user-global Host wiring in optional `setup`/`teardown` maps keyed by `pi`, `claude`, `codex`, or `opencode`. Keep install separate; uninstall never implicitly runs teardown. Delegate wiring to App commands or manual user instructions, not direct agent edits of Host configuration. Exclude project initialization.
63
+ 3. Ask which Hosts the user uses when it is not already established. Put user-global Host wiring in optional `setup`/`teardown` maps keyed by `pi`, `claude`, `codex`, or `opencode`. Keep install separate; uninstall never implicitly runs teardown. Agent Depot never executes `manual` text and does not track wiring, so a manual setup stays undone unless the user runs it: use `argv` whenever the Host Wiring preflight shows an unattended route, and keep `manual` only for steps that need a terminal or a user decision. When repairing a recipe or after an App update, recheck every `manual` setup step against the installed version's help; a new non-interactive flag can make it automatable. Delegate wiring to App commands or manual user instructions, not direct agent edits of Host configuration. Exclude project initialization.
63
64
  4. Declare optional `skills` only for documented App-owned directory/link names. Match whole names case-sensitively; only `*` is special, while `?` and brackets are literal. Reject empty/whitespace-only, path separators, NUL and star-only patterns. These declarations filter unmanaged adoption/removal even before approval/install; they verify no artifacts or provenance.
64
65
  5. Run `agent-depot app validate <file>...` for current-platform recipes. Fix structural errors; report unapproved recipes as needs approval, not runtime-verified. Distinguish structural validity, recipe approval, prerequisite readiness, installed version and Host wiring; none proves the others. A known missing prerequisite remains a blocker even when validation succeeds. Version commands run only for approved applicable content. Mark other platforms unverified. After user approval, the user can inspect `app list` and separately preview `app install|update|uninstall <name>` or `app setup|teardown <name> --host <host>`.
65
66
 
66
67
  ## Output Contract
67
68
 
68
- Return file paths, platform/channel evidence, a concise prerequisite status (satisfied/missing/unverified) with preparation commands and whether the recipe is ready or blocked, validation results and runtime-verification limits; unsupported platforms; omitted optional fields and why; license, telemetry/update-check behavior (or unknown); and conflicting duplicate install routes, including plugin-marketplace versus setup routes. Explain that version alone determines installed state, updates require a changed version, and unknown latest is not an available update. End with the user's approval command, without running it.
69
+ Return file paths, platform/channel evidence, a per-Host wiring status for each Host the user uses (wired, pending, manual or conflicting, with the evidence inspected) and the exact `agent-depot app setup <name> --host <host>` command for each pending Host, a concise prerequisite status (satisfied/missing/unverified) with preparation commands and whether the recipe is ready or blocked, validation results and runtime-verification limits; unsupported platforms; omitted optional fields and why; license, telemetry/update-check behavior (or unknown); and conflicting duplicate install routes, including plugin-marketplace versus setup routes. Explain that version alone determines installed state, updates require a changed version, and unknown latest is not an available update. End with the user's approval command, without running it.