@event4u/agent-config 1.41.2 → 2.1.0

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 (48) hide show
  1. package/.agent-src/commands/fix/{pr-bots.md → pr-bot-comments.md} +3 -3
  2. package/.agent-src/commands/fix/{pr.md → pr-comments.md} +6 -6
  3. package/.agent-src/commands/fix/{pr-developers.md → pr-developer-comments.md} +3 -3
  4. package/.agent-src/commands/fix.md +6 -6
  5. package/.agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +2 -2
  6. package/.agent-src/templates/agents/agent-project-settings.example.yml +14 -0
  7. package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +120 -11
  8. package/.claude-plugin/marketplace.json +4 -4
  9. package/CHANGELOG.md +54 -0
  10. package/README.md +39 -31
  11. package/config/agent-settings.template.yml +25 -0
  12. package/docs/architecture.md +47 -1
  13. package/docs/catalog.md +3 -3
  14. package/docs/contracts/command-clusters.md +3 -3
  15. package/docs/contracts/file-ownership-matrix.json +9 -9
  16. package/docs/customization.md +125 -9
  17. package/docs/getting-started.md +16 -25
  18. package/docs/installation.md +66 -82
  19. package/docs/migration/v1-to-v2.md +98 -0
  20. package/docs/migrations/commands-1.15.0.md +3 -3
  21. package/docs/setup/per-ide/claude-code.md +0 -17
  22. package/docs/setup/per-ide/claude-desktop.md +35 -48
  23. package/docs/setup/per-ide/windsurf.md +0 -11
  24. package/docs/skills-catalog.md +23 -2
  25. package/docs/troubleshooting.md +20 -32
  26. package/llms.txt +22 -1
  27. package/package.json +1 -6
  28. package/scripts/_cli/__init__.py +0 -0
  29. package/scripts/_cli/cmd_migrate.py +270 -0
  30. package/scripts/_cli/cmd_update.py +226 -0
  31. package/scripts/_lib/agent_settings.py +120 -11
  32. package/scripts/_lib/agents_overlay.py +109 -0
  33. package/scripts/_lib/pin_resolver.py +152 -0
  34. package/scripts/_lib/update_check.py +183 -0
  35. package/scripts/agent-config +73 -1
  36. package/scripts/check_overlay_cascade_subdirs.py +125 -0
  37. package/scripts/check_template_pin_drift.py +112 -0
  38. package/scripts/check_update_banner.py +86 -0
  39. package/scripts/install +27 -40
  40. package/scripts/install.py +17 -228
  41. package/scripts/install.sh +6 -11
  42. package/templates/agent-config-wrapper.sh +40 -25
  43. package/templates/consumer-settings/README.md +2 -2
  44. package/bin/install.php +0 -45
  45. package/composer.json +0 -33
  46. package/scripts/postinstall.sh +0 -76
  47. package/scripts/setup.sh +0 -230
  48. package/templates/global-install-manifest.yml +0 -91
@@ -11,7 +11,7 @@ stability: beta
11
11
  The agent-config command surface collapses related atomic commands
12
12
  into **verb clusters**. A cluster is a single top-level command
13
13
  (e.g. `/fix`) that dispatches to sub-commands (e.g. `/fix ci`,
14
- `/fix pr`). Old atomic commands stay one release as deprecation
14
+ `/fix pr-comments`). Old atomic commands stay one release as deprecation
15
15
  shims, then disappear.
16
16
 
17
17
  This file is the **locked source of truth** for which clusters
@@ -27,7 +27,7 @@ column 1 of this table.
27
27
 
28
28
  | Cluster | Phase | Sub-commands | Replaces |
29
29
  |---|:-:|---|---|
30
- | `fix` | 1 | `ci` · `pr` · `pr-bots` · `pr-developers` · `portability` · `refs` · `seeder` | `fix-ci` · `fix-pr-comments` · `fix-pr-bot-comments` · `fix-pr-developer-comments` · `fix-portability` · `fix-references` · `fix-seeder` |
30
+ | `fix` | 1 | `ci` · `pr-comments` · `pr-bot-comments` · `pr-developer-comments` · `portability` · `refs` · `seeder` | `fix-ci` · `fix-pr-comments` · `fix-pr-bot-comments` · `fix-pr-developer-comments` · `fix-portability` · `fix-references` · `fix-seeder` |
31
31
  | `optimize` | 1 | `agents-dir` · `augmentignore` · `rtk` · `skills` | `optimize-augmentignore` · `optimize-rtk-filters` · `optimize-skills` · former `/optimize agents` and `/optimize agents-md` moved to the `/agents` file-family cluster 2026-05-09; `/agents prepare/audit/cleanup` collapsed into the single `/optimize agents-dir` (flags or wizard) per the agent-doc consolidation |
32
32
  | `feature` | 1 | `explore` · `plan` · `refactor` · `roadmap` · `dev` | `feature-explore` · `feature-plan` · `feature-refactor` · `feature-roadmap` · `feature-dev` |
33
33
  | `chat-history` | 2 | `show` · `import` · `learn` | `chat-history` (legacy status) — `resume` / `clear` / `checkpoint` removed in `road-to-chat-history-hook-only` (auto-adopt + structural hooks); `import` (verbatim cross-session render) and `learn` (project-improving learning extraction) added in the v4 stateless schema |
@@ -84,7 +84,7 @@ every new sub-command added to an existing cluster.
84
84
  cluster's primary verb (e.g. `/roadmap:create` + `process-*`
85
85
  composites).
86
86
 
87
- 3. **Sub-name format.** kebab-case (`pr-bots`, `process-phase`),
87
+ 3. **Sub-name format.** kebab-case (`pr-bot-comments`, `process-phase`),
88
88
  ≤ 24 chars, no leading verb that duplicates the cluster name
89
89
  (use `/fix:ci`, not `/fix:fix-ci`).
90
90
 
@@ -261,19 +261,19 @@
261
261
  "load_context": [],
262
262
  "load_context_eager": []
263
263
  },
264
- ".agent-src.uncompressed/commands/fix/pr-bots.md": {
264
+ ".agent-src.uncompressed/commands/fix/pr-bot-comments.md": {
265
265
  "kind": "command",
266
266
  "rule_type": null,
267
267
  "load_context": [],
268
268
  "load_context_eager": []
269
269
  },
270
- ".agent-src.uncompressed/commands/fix/pr-developers.md": {
270
+ ".agent-src.uncompressed/commands/fix/pr-comments.md": {
271
271
  "kind": "command",
272
272
  "rule_type": null,
273
273
  "load_context": [],
274
274
  "load_context_eager": []
275
275
  },
276
- ".agent-src.uncompressed/commands/fix/pr.md": {
276
+ ".agent-src.uncompressed/commands/fix/pr-developer-comments.md": {
277
277
  "kind": "command",
278
278
  "rule_type": null,
279
279
  "load_context": [],
@@ -3088,22 +3088,22 @@
3088
3088
  "depth": 0
3089
3089
  },
3090
3090
  {
3091
- "source": ".agent-src.uncompressed/commands/fix/pr-bots.md",
3092
- "target": ".agent-src.uncompressed/commands/fix/pr-bots.md",
3091
+ "source": ".agent-src.uncompressed/commands/fix/pr-bot-comments.md",
3092
+ "target": ".agent-src.uncompressed/commands/fix/pr-bot-comments.md",
3093
3093
  "type": "WRITE",
3094
3094
  "via": "self",
3095
3095
  "depth": 0
3096
3096
  },
3097
3097
  {
3098
- "source": ".agent-src.uncompressed/commands/fix/pr-developers.md",
3099
- "target": ".agent-src.uncompressed/commands/fix/pr-developers.md",
3098
+ "source": ".agent-src.uncompressed/commands/fix/pr-comments.md",
3099
+ "target": ".agent-src.uncompressed/commands/fix/pr-comments.md",
3100
3100
  "type": "WRITE",
3101
3101
  "via": "self",
3102
3102
  "depth": 0
3103
3103
  },
3104
3104
  {
3105
- "source": ".agent-src.uncompressed/commands/fix/pr.md",
3106
- "target": ".agent-src.uncompressed/commands/fix/pr.md",
3105
+ "source": ".agent-src.uncompressed/commands/fix/pr-developer-comments.md",
3106
+ "target": ".agent-src.uncompressed/commands/fix/pr-developer-comments.md",
3107
3107
  "type": "WRITE",
3108
3108
  "via": "self",
3109
3109
  "depth": 0
@@ -67,30 +67,76 @@ personal.autonomy
67
67
  caveman.speak_scope
68
68
  ```
69
69
 
70
- **Merge order** (lowest → highest precedence):
70
+ **Merge order** (lowest → highest precedence; every layer optional):
71
71
 
72
72
  ```
73
73
  1. Package defaults (shipped by event4u/agent-config)
74
74
  2. ~/.config/agent-config/agent-settings.yml (user-global · whitelist-filtered)
75
- 3. <project>/.agent-settings.yml (project-local · always wins)
75
+ 3. <repo-root>/.agent-settings.yml (project-wide · all keys)
76
+ 4. <intermediate-dir>/.agent-settings.yml (subsystem-scoped · all keys · optional)
77
+ 5. <CWD>/.agent-settings.yml (deepest · all keys · wins)
76
78
  ```
77
79
 
78
- Project-local values **always win**. The user-global file is a
79
- fallback, never a lock. Non-whitelisted keys in the user-global file
80
- are dropped without error adding `personal.theme` there has no
81
- effect.
82
-
83
- The file is created **only on explicit opt-in via `/onboard`**. The
84
- loader at [`scripts/_lib/agent_settings.py`](../scripts/_lib/agent_settings.py)
80
+ `<repo-root>` is the nearest ancestor of the CWD that contains a `.git`
81
+ directory **or** file (submodule support). The walk stops there it
82
+ never drifts into a parent repo or `$HOME`. Callers that omit the
83
+ ``cwd`` argument get the legacy two-layer behaviour (user-global +
84
+ single project file) — back-compat is hard.
85
+
86
+ Project-local values **always win** over user-global. The user-global
87
+ file is a fallback, never a lock. Non-whitelisted keys in the
88
+ user-global file are dropped without error — adding `personal.theme`
89
+ there has no effect.
90
+
91
+ **Whitelist asymmetry.** The six-key whitelist applies **only** to the
92
+ user-global layer. Non-root in-project layers (intermediate +
93
+ ``<CWD>``) carry arbitrary keys — they live inside the project
94
+ boundary, are tracked in git, and reviewed in PRs like any other
95
+ config. Use a subdirectory `.agent-settings.yml` to scope a single
96
+ field (e.g. a `cost_profile` override for `services/heavy-ml/`) without
97
+ duplicating the root file.
98
+
99
+ The user-global file is created **only on explicit opt-in via
100
+ `/onboard`**. The loader at
101
+ [`scripts/_lib/agent_settings.py`](../scripts/_lib/agent_settings.py)
85
102
  is **read-only** — no script can create or mutate it without an
86
103
  explicit `/onboard` confirmation. Edit the file by hand for mid-life
87
104
  changes; `/sync-agent-settings` stays project-scoped and never touches
88
105
  user-global state.
89
106
 
107
+ ### Agent config version pin
108
+
109
+ The top-level `agent_config_version` key pins the project to an exact
110
+ release of `@event4u/agent-config`. Under the npx-only distribution
111
+ model (see [`docs/architecture.md`](architecture.md) §
112
+ *"npx-only distribution + version-pin governance"*), there is no
113
+ local `node_modules/` or `vendor/` lockfile to anchor the runtime —
114
+ the pin is the substitute mechanism.
115
+
116
+ ```yaml
117
+ agent_config_version: "2.0.3" # exact semver, no ranges
118
+ ```
119
+
120
+ Rules:
121
+
122
+ - **Exact semver only.** Ranges (`^2.0`, `~2.0.3`, `>=2.0`) are
123
+ rejected — the pin must be reproducible across the team.
124
+ - **Empty string = unpinned.** The resolver picks the latest release
125
+ on every invocation. Only safe for greenfield projects; production
126
+ consumers should pin.
127
+ - **Owned by the project, not the developer.** Lives in
128
+ `.agent-settings.yml` (committed), reviewed in PRs like any other
129
+ config change. Never merged from `~/.config/agent-config/agent-settings.yml`.
130
+ - **Resolver enforcement.** `npx @event4u/agent-config <cmd>`
131
+ compares the resolved CLI version against the pin; mismatch
132
+ triggers a re-exec at the pinned version
133
+ (`npx @event4u/agent-config@<pin> <cmd>`).
134
+
90
135
  ### Available settings
91
136
 
92
137
  | Setting | Default | Description |
93
138
  |---|---|---|
139
+ | `agent_config_version` | *(empty)* | Exact semver pin of the agent-config release (see above). Empty = unpinned. |
94
140
  | `cost_profile` | `minimal` | Token budget (`minimal`, `balanced`, `full`, `custom`) |
95
141
  | `personal.user_name` | *(empty)* | User's first name for personalized responses |
96
142
  | `personal.minimal_output` | `true` | Suppress intermediate output |
@@ -254,6 +300,76 @@ agents/
254
300
 
255
301
  Module-level documentation goes into `app/Modules/*/agents/`.
256
302
 
303
+ ### `agents/` overlay cascade
304
+
305
+ A subset of `agents/` subdirs participates in the same deepest-wins
306
+ cascade as `.agent-settings.yml` (see *"User-global DX-comfort
307
+ defaults"* above). The cascade is **per-file** by basename — the
308
+ deepest existing `agents/<kind>/<name>.md` wins; the rest are silently
309
+ shadowed.
310
+
311
+ | Subdir | Cascade? | User-global allowed? | Why |
312
+ |---|---|---|---|
313
+ | `agents/overrides/` | ✅ Yes — deepest wins by basename. | ✅ Yes — weakest layer. | Personal developer overrides. |
314
+ | `agents/contexts/` | ✅ Yes — deepest wins by basename. | ❌ No — project-shaped. | Shared knowledge; would leak across projects. |
315
+ | `agents/decisions/` | ✅ Yes — deepest wins by basename. | ❌ No — project-shaped ADRs. | Decisions are repo-bound. |
316
+ | `agents/roadmaps/` | ❌ No — project-rooted only. | ❌ No. | Active delivery plans. |
317
+ | `agents/state/`, `agents/memory/`, `agents/work_engine/`, `agents/.agent-prices.md`, `agents/council-*/` | ❌ No — stateful / session-scoped. | ❌ No. | Per-session state, not shareable. |
318
+
319
+ **User-global asymmetry.** `~/.config/agent-config/agents/overrides/`
320
+ is the only user-global overlay path consulted by the loader. Files
321
+ under `~/.config/agent-config/agents/contexts/` or
322
+ `.../agents/decisions/` are silently skipped — these kinds are
323
+ project-shaped and must not leak across projects.
324
+
325
+ The resolver lives at
326
+ [`scripts/_lib/agents_overlay.py`](../scripts/_lib/agents_overlay.py)
327
+ and is enforced by `scripts/check_overlay_cascade_subdirs.py` — drift
328
+ between the code constants (`CASCADE_ELIGIBLE_KINDS`,
329
+ `USER_GLOBAL_OVERLAY_KINDS`) and the table above breaks the build.
330
+
331
+ ---
332
+
333
+ ## Update check
334
+
335
+ `npx @event4u/agent-config <cmd>` checks the npm registry once per
336
+ 24 h for a newer release of the package and, when one is available,
337
+ writes a two-line banner to **stderr** *after* the subcommand has
338
+ finished. There is no prompt — the user updates when they want with
339
+ `npx @event4u/agent-config update` (Phase 3).
340
+
341
+ ```
342
+ ℹ️ agent-config 1.42.0 available (you have 1.38.0).
343
+ Update: npx @event4u/agent-config update
344
+ ```
345
+
346
+ State is persisted at `~/.config/agent-config/update-check.json`
347
+ (mode `0600`) — sibling of `anthropic.key`, `council-spend.jsonl`.
348
+ The fetch is hard-capped at 1 s and silent on any error.
349
+
350
+ ### Suppression matrix
351
+
352
+ The banner is silently skipped when **any** of the following match:
353
+
354
+ | Condition | Reason |
355
+ |---|---|
356
+ | `CI=1` / `CI=true` / `GITHUB_ACTIONS=true` | CI noise, breaks log scrapers. |
357
+ | `stdout` is not a TTY | Piped / redirected output must stay clean. |
358
+ | `AGENT_CONFIG_NO_UPDATE_CHECK=1` | Per-invocation escape hatch. |
359
+ | `update_check.enabled: false` in `.agent-settings.yml` | Project / user opt-out. |
360
+ | Registry call exceeds 1 s | Network must never delay `npx`. |
361
+ | Registry call raises any exception | Best-effort — failure is silent. |
362
+
363
+ `update_check.enabled` is a **project-scoped** key — it is *not* on
364
+ the user-global whitelist (see [§ Agent Settings](#agent-settings)).
365
+ Each project decides; the user-global file cannot flip it on or off
366
+ for unrelated projects.
367
+
368
+ The decision logic lives at
369
+ [`scripts/_lib/update_check.py`](../scripts/_lib/update_check.py); the
370
+ dispatcher integration lives in [`scripts/agent-config`](../scripts/agent-config)
371
+ (`run_update_check_banner`).
372
+
257
373
  ---
258
374
 
259
375
  ← [Back to README](../README.md)
@@ -1,33 +1,23 @@
1
1
  # Getting Started
2
2
 
3
3
  `agent-config` is a stack-agnostic orchestration contract for coding
4
- agents. The installer detects the project shape (Composer / npm / both /
5
- neither) and wires the matching glue. **Pick the entrypoint that
6
- matches the project**, not the language you happen to prefer.
4
+ agents. Installation is npx-first; the package itself is npm-published
5
+ and works in any project regardless of language.
7
6
 
8
7
  ## Installation
9
8
 
10
- The installer is the same orchestrator across stacks — it reads
11
- `composer.json` and/or `package.json`, syncs the payload, and generates
12
- the tool-specific glue. Pick one entrypoint:
9
+ Pick one entrypoint:
13
10
 
14
11
  ```bash
15
- # Composer-based projects (PHP / Laravel / Symfony / Zend / Laminas)
16
- composer require --dev event4u/agent-config
17
- php vendor/bin/install.php
18
- # Equivalent: bash vendor/event4u/agent-config/scripts/install
19
-
20
- # npm-based projects (Next.js / React / Node / Vue / plain JS/TS)
21
- npm install --save-dev @event4u/agent-config
22
- # Postinstall runs the orchestrator. Re-run or pick a profile:
23
- # bash node_modules/@event4u/agent-config/scripts/install --profile=balanced
24
-
25
- # Mixed Composer + npm projects (Laravel + Inertia, Symfony + Vue, …)
26
- # Run both — the orchestrator merges results, no double-write.
27
-
28
- # Stack-less or polyglot repos (no Composer, no npm)
29
- git clone https://github.com/event4u-app/agent-config /tmp/agent-config
30
- bash /tmp/agent-config/scripts/install --target "$PWD"
12
+ # Recommended one-shot, no local dependency
13
+ npx @event4u/create-agent-config init --tools=claude-code,cursor
14
+
15
+ # No-Node fallback — curl | bash entrypoint (downloads a tarball)
16
+ curl -sSL https://raw.githubusercontent.com/event4u-app/agent-config/main/setup.sh | bash
17
+
18
+ # Global CLI (one install per machine, all projects)
19
+ npm install -g @event4u/agent-config
20
+ agent-config --help
31
21
  ```
32
22
 
33
23
  That's it. Your agent now follows your team's standards. The orchestrator
@@ -49,9 +39,10 @@ so you can run a few package scripts without installing `go-task`,
49
39
  ./agent-config help # full command list
50
40
  ```
51
41
 
52
- The wrapper is regenerated on every `npm install` / `composer install`
53
- and delegates to the copy under `node_modules/@event4u/agent-config/`
54
- or `vendor/event4u/agent-config/`.
42
+ The wrapper is regenerated on every install and delegates to (in order):
43
+ `$AGENT_CONFIG_MASTER`, `./node_modules/@event4u/agent-config/`,
44
+ `agent-config` on `$PATH` (global npm install), or
45
+ `npx @event4u/agent-config@latest`.
55
46
 
56
47
  ## First Run
57
48
 
@@ -31,6 +31,41 @@ Combine surfaces by comma-separating: `--tools=claude-code,cursor,windsurf`.
31
31
 
32
32
  ---
33
33
 
34
+ ## Upgrading from v1
35
+
36
+ v2 is a breaking change: the local-install scheme (Composer
37
+ `require-dev`, npm `devDependency`, the `--global` symlink namespace
38
+ under `~/.claude/`, `~/.cursor/`, `~/.codeium/windsurf/`,
39
+ `~/.config/agent-config/`) is **retired**. v2 is npx-only — the
40
+ runtime is resolved per invocation, pinned by
41
+ `agent_config_version` in `.agent-settings.yml`.
42
+
43
+ One command does the cutover, idempotently:
44
+
45
+ ```bash
46
+ ./agent-config migrate # remove legacy install signals
47
+ ./agent-config migrate --dry-run # detect only, no writes
48
+ ```
49
+
50
+ What `migrate` cleans up:
51
+
52
+ | What | Action |
53
+ |---|---|
54
+ | `package.json` → `devDependencies.@event4u/agent-config` | Removed (lockfile updated on next `npm install`). |
55
+ | `composer.json` → `require*.event4u/agent-config` | Removed (lockfile updated on next `composer update`). |
56
+ | Symlinks `.augment/`, `.claude/`, `.cursor/`, `.clinerules/`, `.windsurfrules` pointing into `vendor/` or `node_modules/` | Deleted. User-owned links are preserved with a warning. |
57
+ | `.agent-settings.yml` | Written fresh if missing, with `agent_config_version` pinned. |
58
+ | `.gitignore` agent-config block | Refreshed. |
59
+
60
+ After `migrate` runs, you can drop the now-unreferenced
61
+ `node_modules/@event4u/agent-config/` and `vendor/event4u/agent-config/`
62
+ directories with `npm prune` and `composer update` respectively.
63
+
64
+ Full contract sketch + the retired `--global` namespace teardown:
65
+ [`docs/migration/v1-to-v2.md`](migration/v1-to-v2.md).
66
+
67
+ ---
68
+
34
69
  ## Mechanisms reference
35
70
 
36
71
  The rest of this page documents the underlying install mechanisms
@@ -46,9 +81,9 @@ the per-IDE index above.
46
81
  > 2. `scripts/install.py` — bridge files (`.agent-settings.yml`, VSCode /
47
82
  > Augment / Copilot JSON descriptors).
48
83
  >
49
- > `bin/install.php` and `scripts/postinstall.sh` are thin wrappers that
50
- > delegate to `scripts/install`. Both underlying stages remain callable
51
- > directly for advanced use; see their `--help`.
84
+ > `npx @event4u/create-agent-config init` and `setup.sh` (curl-based)
85
+ > are thin wrappers that delegate to `scripts/install`. Both underlying
86
+ > stages remain callable directly for advanced use; see their `--help`.
52
87
  >
53
88
  > Python 3.10+ is required for bridges. If it is missing, the orchestrator
54
89
  > prints a warning and continues with the payload sync only.
@@ -80,9 +115,9 @@ the per-IDE index above.
80
115
  ## Quickstart — one-liner entrypoints
81
116
 
82
117
  Try `@event4u/agent-config` in any directory in under 30 seconds, without
83
- `composer require` or `git clone` first. Both entrypoints are thin
84
- wrappers around `scripts/install` — same payload, same flags, no extra
85
- state.
118
+ adding it as a dev dependency or cloning the repo first. Both
119
+ entrypoints are thin wrappers around `scripts/install` — same payload,
120
+ same flags, no extra state.
86
121
 
87
122
  ### `npx` (Node ≥ 18)
88
123
 
@@ -139,41 +174,26 @@ used. Pass `--yes` (or `-y`) to force non-interactive mode anywhere.
139
174
  Install once in the project — available to everyone working on it.
140
175
  The package is versioned with the project. Settings are committed once.
141
176
 
142
- ### Composer (PHP projects)
177
+ ### npx (recommended for any project)
143
178
 
144
179
  ```bash
145
- composer require --dev event4u/agent-config
146
- php vendor/bin/install.php
180
+ npx @event4u/create-agent-config init --tools=claude-code,cursor
147
181
  ```
148
182
 
149
- Composer does **not** run a post-install hook for this package — the
150
- installer is an explicit step. `bin/install.php` is a thin wrapper that
151
- calls `scripts/install` (the bash orchestrator). To pick a non-default
152
- profile:
183
+ The wrapper downloads the latest `@event4u/agent-config` tarball into a
184
+ temp dir, runs `scripts/install` with the selected tools, and cleans up
185
+ afterwards. Nothing is added to `package.json`.
153
186
 
154
- ```bash
155
- php vendor/bin/install.php --profile=balanced
156
- ```
157
-
158
- The `--profile` flag controls the initial `cost_profile` value written
159
- to `.agent-settings.yml`.
160
-
161
- ### npm (JavaScript/TypeScript projects)
187
+ ### Global CLI (one install per machine)
162
188
 
163
189
  ```bash
164
- npm install --save-dev @event4u/agent-config
190
+ npm install -g @event4u/agent-config
191
+ agent-config --help
165
192
  ```
166
193
 
167
- npm runs `scripts/postinstall.sh` automatically, which invokes
168
- `scripts/install` the same orchestrator every other entry point uses.
169
-
170
- If your setup disables install scripts (`npm config set ignore-scripts
171
- true` or similar), nothing happens and the command prints no warning.
172
- Re-run the installer manually in that case:
173
-
174
- ```bash
175
- bash node_modules/@event4u/agent-config/scripts/install
176
- ```
194
+ The global install puts `agent-config` on `$PATH` so the project
195
+ wrapper (`./agent-config`) can fall through to it when no
196
+ `node_modules/@event4u/agent-config/` exists.
177
197
 
178
198
  ### Installer orchestrator (`scripts/install`)
179
199
 
@@ -188,12 +208,6 @@ bash scripts/install --skip-sync # bridges only
188
208
  bash scripts/install --dry-run # show payload sync plan, skip bridges
189
209
  ```
190
210
 
191
- PHP users can use the Composer wrapper, which forwards all flags:
192
-
193
- ```bash
194
- php vendor/bin/install.php --profile=balanced
195
- ```
196
-
197
211
  Under the hood:
198
212
 
199
213
  - `scripts/install.sh` — payload sync (callable directly for sync-only runs).
@@ -518,8 +532,6 @@ Options:
518
532
  --quiet Suppress non-error output
519
533
  --skip-sync Skip payload sync (install.sh)
520
534
  --skip-bridges Skip bridge files (install.py)
521
- --global Ship kernel rules + curated skills to user-scope dirs
522
- --uninstall With --global: remove the event4u/ namespace dir
523
535
  --help, -h Show this help
524
536
  ```
525
537
 
@@ -528,41 +540,16 @@ The underlying stages keep their own CLI surfaces:
528
540
 
529
541
  ---
530
542
 
531
- ## Global user-level install (`--global`)
532
-
533
- `--global` ships a curated subset of kernel rules + top-N skills into
534
- **per-tool user-scope directories**, so the agent has them in every
535
- project on the machine without a per-project install.
536
-
537
- ```bash
538
- # Default: every supported surface, namespaced under event4u/.
539
- bash scripts/install --global
540
-
541
- # Scope to specific surfaces (mirrors the project install --tools flag).
542
- bash scripts/install --global --tools=claude-code,cursor
543
-
544
- # Remove only what we put there — never touches user files.
545
- bash scripts/install --global --uninstall
546
- ```
547
-
548
- | Surface | Target directory |
549
- | ------------- | --------------------------------------------------------------- |
550
- | Claude Code | `~/.claude/rules/event4u/`, `~/.claude/skills/event4u/` |
551
- | Cursor | `~/.cursor/rules/imported/event4u/{rules,skills}/` |
552
- | Windsurf | `~/.codeium/windsurf/global_workflows/event4u/{rules,skills}/` |
553
- | Fallback | `~/.config/agent-config/{rules,skills}/event4u/` |
554
-
555
- The fallback path is always written so an editor we don't yet know
556
- about can still pick the files up.
543
+ ## Global user-level install — retired
557
544
 
558
- **Curation source:** `templates/global-install-manifest.yml`. Edit
559
- post-install to grow or shrink the global set; re-run `--global` to
560
- re-project. `--uninstall` only removes the `event4u/` namespace
561
- user-added rules / skills under sibling paths stay untouched.
562
-
563
- **When to use:** running multiple unrelated projects where a per-project
564
- install is overkill, or wiring up a new editor (Claude Desktop, Cursor)
565
- that benefits from a baseline set of skills out of the box.
545
+ The previous `--global` symlink scheme (kernel rules + curated skills
546
+ copied into `~/.claude/`, `~/.cursor/`, `~/.codeium/windsurf/`, and
547
+ `~/.config/agent-config/` under an `event4u/` namespace) has been
548
+ **retired** under the npx-only distribution model. Run
549
+ `npx @event4u/agent-config init` per project instead; the
550
+ `agent_config_version` pin in `.agent-settings.yml` keeps every
551
+ invocation reproducible. See [`migration/v1-to-v2.md`](migration/v1-to-v2.md)
552
+ for the upgrade path.
566
553
 
567
554
  ---
568
555
 
@@ -571,15 +558,12 @@ that benefits from a baseline set of skills out of the box.
571
558
  When a new version of the package is published:
572
559
 
573
560
  ```bash
574
- composer update event4u/agent-config
575
- php vendor/bin/install.php # refresh bridges + symlinks
576
- ```
561
+ # npx (one-shot, recommended) — always uses the latest tarball
562
+ npx @event4u/create-agent-config init --tools=claude-code,cursor
577
563
 
578
- Or for npm projects:
579
-
580
- ```bash
581
- npm update @event4u/agent-config
582
- bash node_modules/@event4u/agent-config/scripts/install
564
+ # Global CLI
565
+ npm install -g @event4u/agent-config@latest
566
+ agent-config --help
583
567
  ```
584
568
 
585
569
  The installer is idempotent — re-running it after an update refreshes
@@ -0,0 +1,98 @@
1
+ # Migration — v1 → v2 (npx-only runtime)
2
+
3
+ > **Status:** skeleton. The one-shot `npx @event4u/agent-config migrate`
4
+ > is implemented in P3.5 of
5
+ > [`road-to-portable-runtime-and-update-check`](../../agents/roadmaps/road-to-portable-runtime-and-update-check.md);
6
+ > this document tracks the user-facing cutover contract so consumers can
7
+ > rehearse the change before the command lands.
8
+
9
+ ## Why this change
10
+
11
+ v2 retires the local-install scheme (Composer dependency, npm
12
+ `postinstall`, `--global` symlink namespace under `~/.claude/`,
13
+ `~/.cursor/`, `~/.codeium/windsurf/`, `~/.config/agent-config/`) in
14
+ favour of an **npx-only runtime**. The trade-off and the council's Q1
15
+ rejection + the user's override are recorded in
16
+ [`docs/architecture.md` § Distribution model](../architecture.md#distribution-model--npx-only--version-pin-governance).
17
+
18
+ ## TL;DR
19
+
20
+ ```bash
21
+ npx @event4u/agent-config migrate
22
+ ```
23
+
24
+ One command, idempotent. Re-runs on an already-migrated repo do nothing.
25
+
26
+ ## What disappears from the consumer
27
+
28
+ | Path / entry | Reason |
29
+ |-------------------------------------------------------|-----------------------------------------|
30
+ | `composer.json` → `require-dev.event4u/agent-config` | No Composer dependency under v2. |
31
+ | `composer.lock` line for `event4u/agent-config` | Same; lockfile updated by Composer. |
32
+ | `package.json` → `devDependencies.@event4u/agent-config` | No npm dependency under v2. |
33
+ | `package-lock.json` / `pnpm-lock.yaml` entries | Same. |
34
+ | `node_modules/@event4u/agent-config/` | Removed by the package manager once the `package.json` entry is gone. |
35
+ | `vendor/event4u/agent-config/` | Removed by Composer once the require entry is gone. |
36
+ | `~/.claude/{rules,skills}/event4u/` | Retired `--global` namespace dir. |
37
+ | `~/.cursor/rules/imported/event4u/` | Same. |
38
+ | `~/.codeium/windsurf/global_workflows/event4u/` | Same. |
39
+ | `~/.config/agent-config/{rules,skills}/event4u/` | Same (fallback path). |
40
+ | Legacy `.gitignore` block lines marked `event4u/agent-config (legacy local install)` | Replaced by the v2 block written by `sync-gitignore`. |
41
+
42
+ The retired `templates/global-install-manifest.yml` shipped inside the
43
+ package and is gone in v2; consumers never carried it directly.
44
+
45
+ ## What appears in the consumer
46
+
47
+ | Path / entry | Owner / shape |
48
+ |-------------------------------------------------------|-----------------------------------------|
49
+ | `.agent-settings.yml` → `agent_config_version: "<pin>"` | Project version pin, reviewed in PRs. |
50
+ | `.agent-settings.yml` → `update_check:` block | Defaults shipped by `init`; opt-out per knob. |
51
+ | Updated `.gitignore` block | v2 entries written by `sync-gitignore`. |
52
+
53
+ The per-tool glue (`.claude/`, `.cursor/`, `.clinerules/`,
54
+ `.windsurfrules`, `GEMINI.md`, `.github/copilot-instructions.md`,
55
+ `.augment/`, `.vscode/settings.json`) keeps the same shape as v1 — only
56
+ the source that writes them changed (from `vendor/` /
57
+ `node_modules/` scripts to the npx-resolved runtime).
58
+
59
+ ## The `migrate` command — contract sketch
60
+
61
+ ```bash
62
+ npx @event4u/agent-config migrate # interactive, default
63
+ npx @event4u/agent-config migrate --dry-run # plan only, no writes
64
+ npx @event4u/agent-config migrate --yes # non-interactive
65
+ ```
66
+
67
+ Order of operations (locked once P3.5 lands):
68
+
69
+ 1. Detect pre-v2 markers: `composer.json` require entry,
70
+ `package.json` devDependency, `vendor/event4u/agent-config/`,
71
+ `node_modules/@event4u/agent-config/`, legacy `.gitignore` lines,
72
+ `~/.claude/{rules,skills}/event4u/` and siblings.
73
+ 2. Print the planned change set (file removals, file writes, pin
74
+ value). Stop here under `--dry-run`.
75
+ 3. Remove dependency entries via the appropriate package manager
76
+ (`composer remove`, `npm uninstall` / `pnpm remove` / `yarn remove`).
77
+ 4. Wipe the retired user-scope `event4u/` namespace dirs.
78
+ 5. Write / update `.agent-settings.yml` with the new shape +
79
+ `agent_config_version` pin.
80
+ 6. Re-run `sync-gitignore` to refresh the project `.gitignore` block.
81
+ 7. Print a one-screen post-migration verification list.
82
+
83
+ Idempotency: each step is a no-op when the v1 marker is absent. Re-runs
84
+ print *"already on v2 — nothing to do"* and exit 0.
85
+
86
+ ## Verification after migration
87
+
88
+ ```bash
89
+ npx @event4u/agent-config doctor # P3 — runtime sanity check
90
+ ```
91
+
92
+ Expected: pin resolved, no v1 markers detected, `update_check` reachable.
93
+
94
+ ## See also
95
+
96
+ - [`docs/architecture.md` § Distribution model](../architecture.md#distribution-model--npx-only--version-pin-governance) — Q1 council rejection + override + pin substitution.
97
+ - [`agents/roadmaps/road-to-portable-runtime-and-update-check.md`](../../agents/roadmaps/road-to-portable-runtime-and-update-check.md) — full delivery plan and acceptance criteria.
98
+ - [`docs/installation.md`](../installation.md) — v2 install reference.
@@ -15,9 +15,9 @@ invocation and are removed in `1.16.0`.
15
15
  | Old command | New invocation | Removed in |
16
16
  |---|---|---|
17
17
  | `/fix-ci` | `/fix ci` | 1.16.0 |
18
- | `/fix-pr-comments` | `/fix pr` | 1.16.0 |
19
- | `/fix-pr-bot-comments` | `/fix pr-bots` | 1.16.0 |
20
- | `/fix-pr-developer-comments` | `/fix pr-developers` | 1.16.0 |
18
+ | `/fix-pr-comments` | `/fix pr-comments` | 1.16.0 |
19
+ | `/fix-pr-bot-comments` | `/fix pr-bot-comments` | 1.16.0 |
20
+ | `/fix-pr-developer-comments` | `/fix pr-developer-comments` | 1.16.0 |
21
21
  | `/fix-portability` | `/fix portability` | 1.16.0 |
22
22
  | `/fix-references` | `/fix refs` | 1.16.0 |
23
23
  | `/fix-seeder` | `/fix seeder` | 1.16.0 |
@@ -29,23 +29,6 @@ Either form populates:
29
29
  - `CLAUDE.md` — agent root pointer (auto-loaded by Claude Code)
30
30
  - `.agent-settings.yml` — your per-project knobs (kept out of git)
31
31
 
32
- ## Global install (cross-project skills)
33
-
34
- ```bash
35
- npx @event4u/agent-config global --tools=claude-code
36
- ```
37
-
38
- Seeds `~/.claude/skills/` with the curated top-N skills from
39
- [`templates/global-install-manifest.yml`](../../../templates/global-install-manifest.yml).
40
- Available across every project on the machine; project-level files
41
- always take precedence.
42
-
43
- Uninstall:
44
-
45
- ```bash
46
- npx @event4u/agent-config global --uninstall
47
- ```
48
-
49
32
  ## Plugin marketplace (Claude Code 2026+)
50
33
 
51
34
  Claude Code 2026 supports plugin marketplaces via