Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Fixed

- `apm compile --watch` now honors `apm.yml` `targets:` and the CLI `--target` flag, restoring parity with one-shot `apm compile`. Previously the watcher rebuilt `CompilationConfig` directly inside `_watch_mode` without going through the target-resolution pipeline that `compile()` runs (read `target:` / `targets:` from `apm.yml`, run `_resolve_compile_target`, run `detect_target`), so `CompilationConfig.target` stayed at its default `"all"` regardless of user intent — a project with `targets: [claude, cursor]` produced a stub `GEMINI.md @./AGENTS.md` redirect on every `--watch` recompile, and `apm compile --watch --target claude` was silently ignored too, both of which were regressions of the #1019 / #1074 fixes. The compile body is now extracted into a shared `_run_compile_once` helper that both the one-shot and watch paths call; `apm.yml` is re-read on every watcher recompile so mid-session edits to `targets:` take effect on the next file event, and `apm compile --watch --clean` now prints `[!] --clean is ignored in watch mode; run 'apm compile --clean' separately to remove orphaned outputs.` instead of silently dropping the flag. (#1345)
Comment thread
edenfunf marked this conversation as resolved.
Outdated
- MCP server installation now respects the `targets:` whitelist exactly like `apm install`: drop a non-listed runtime even when its `.cursor/`, `.codex/`, or other on-disk signal exists. Previously the MCP install path called `active_targets()` reading the singular `target:` key only, so projects whitelisting `targets: [copilot]` could still receive `~/.codex/config.toml` and `.cursor/mcp.json` writes from foreign signals. The fix audits both paths: (a) the call site at `local_bundle_handler.py` now forwards the canonical plural list; (b) the gate now delegates to the same `resolve_targets` resolver that backs `apm install` skills, so a malformed `targets:` field (conflicting `target:` + `targets:`, `targets: []`, or unknown target name) fails closed with the same `[x]` red error voice + remediation block. The same delegation closes a related asymmetry: a greenfield project (no `targets:`, no `--target` flag, no detected signals) used to silently fall back to `[copilot]` for MCP-only invocations, while `apm install` raised `NoHarnessError` on the same input -- both surfaces now error consistently. Drop lines now use the `[i] Skipped MCP config for X (active targets: Y)` format mirroring the canonical `Targets: X (source: Y)` provenance line. The `-g`/`--global` carve-out is unchanged: `apm install -g --mcp NAME` writes to user-scope (`~/.config/...`, `~/.codex/`, etc.) bypassing the project-scope gate by design. (#1335)
- Gemini CLI: `apm install -g --mcp NAME` now correctly writes to `~/.gemini/settings.json` (user scope) and `apm install` from outside the target project writes to `<project_root>/.gemini/settings.json` instead of `cwd`. Previously `--global` had no effect on Gemini and project-scope writes silently landed in the wrong directory. The matching opt-in gate and cleanup paths in `MCPIntegrator` are aligned in the same change. (#1299)
- `apm install --target claude` now preserves self-defined stdio MCP `env` values from `apm.yml` and writes non-string values such as `PORT: 3000` and `DEBUG: false` as MCP-compatible strings. (#1222)
Expand Down
Loading
Loading