@event4u/agent-config 1.39.0 → 1.41.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 (65) hide show
  1. package/.agent-src/commands/orchestrate.md +123 -0
  2. package/.agent-src/commands/sync-gitignore/fix.md +135 -0
  3. package/.agent-src/commands/sync-gitignore.md +31 -5
  4. package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +30 -2
  5. package/.agent-src/skills/subagent-orchestration/SKILL.md +9 -0
  6. package/.agent-src/skills/using-git-worktrees/SKILL.md +25 -0
  7. package/.agent-src/templates/agent-settings.md +9 -0
  8. package/.agent-src/templates/scripts/work_engine/orchestration.py +168 -0
  9. package/.claude-plugin/marketplace.json +3 -1
  10. package/CHANGELOG.md +75 -0
  11. package/README.md +52 -26
  12. package/bin/install.php +13 -6
  13. package/config/agent-settings.template.yml +21 -0
  14. package/docs/DISTRIBUTION_CHECKLIST.md +169 -0
  15. package/docs/architecture.md +1 -1
  16. package/docs/catalog.md +5 -3
  17. package/docs/contracts/audit-log-v1.md +142 -0
  18. package/docs/contracts/command-clusters.md +2 -0
  19. package/docs/contracts/file-ownership-matrix.json +47 -0
  20. package/docs/contracts/mcp-discovery-phase-notice.md +56 -0
  21. package/docs/contracts/mcp-tool-stub-envelope.md +78 -0
  22. package/docs/contracts/orchestration-dsl-v1.md +152 -0
  23. package/docs/getting-started.md +1 -1
  24. package/docs/installation.md +132 -0
  25. package/docs/setup/mcp-client-config.md +94 -13
  26. package/docs/setup/mcp-cloud-setup.md +32 -1
  27. package/docs/setup/per-ide/aider.md +48 -0
  28. package/docs/setup/per-ide/claude-code.md +108 -0
  29. package/docs/setup/per-ide/claude-desktop.md +173 -0
  30. package/docs/setup/per-ide/cline.md +43 -0
  31. package/docs/setup/per-ide/codex.md +46 -0
  32. package/docs/setup/per-ide/copilot.md +80 -0
  33. package/docs/setup/per-ide/cursor.md +125 -0
  34. package/docs/setup/per-ide/gemini-cli.md +45 -0
  35. package/docs/setup/per-ide/windsurf.md +120 -0
  36. package/package.json +1 -1
  37. package/scripts/_lib/script_output.py +15 -11
  38. package/scripts/ai_council/session.py +14 -8
  39. package/scripts/chat_history.py +29 -53
  40. package/scripts/command_suggester/settings.py +15 -13
  41. package/scripts/compile_router.py +13 -9
  42. package/scripts/compress.py +175 -20
  43. package/scripts/council_cli.py +9 -3
  44. package/scripts/extract_audit_patterns.py +202 -0
  45. package/scripts/install +156 -1
  46. package/scripts/install.py +270 -10
  47. package/scripts/install.sh +52 -7
  48. package/scripts/lint_orchestration_dsl.py +214 -0
  49. package/scripts/mcp_parity_smoke.py +20 -2
  50. package/scripts/mcp_server/catalog.py +125 -0
  51. package/scripts/mcp_server/consumer_tool_catalog.json +275 -0
  52. package/scripts/mcp_server/telemetry.py +128 -0
  53. package/scripts/mcp_server/tools.py +474 -15
  54. package/scripts/mcp_telemetry_health.py +214 -0
  55. package/scripts/mcp_telemetry_query.py +203 -0
  56. package/scripts/mcp_telemetry_store.py +211 -0
  57. package/scripts/memory_signal.py +12 -10
  58. package/scripts/pack_mcp_content.py +18 -4
  59. package/scripts/skill_linter.py +9 -0
  60. package/scripts/sync_gitignore.py +56 -1
  61. package/templates/claude_desktop_config.json.template +22 -0
  62. package/templates/cursor-rule.mdc.j2 +7 -0
  63. package/templates/global-install-manifest.yml +91 -0
  64. package/templates/marketing-copy.yml +64 -0
  65. package/templates/windsurf-rule.md.j2 +7 -0
@@ -435,6 +435,12 @@
435
435
  "load_context": [],
436
436
  "load_context_eager": []
437
437
  },
438
+ ".agent-src.uncompressed/commands/orchestrate.md": {
439
+ "kind": "command",
440
+ "rule_type": null,
441
+ "load_context": [],
442
+ "load_context_eager": []
443
+ },
438
444
  ".agent-src.uncompressed/commands/override.md": {
439
445
  "kind": "command",
440
446
  "rule_type": null,
@@ -585,6 +591,12 @@
585
591
  "load_context": [],
586
592
  "load_context_eager": []
587
593
  },
594
+ ".agent-src.uncompressed/commands/sync-gitignore/fix.md": {
595
+ "kind": "command",
596
+ "rule_type": null,
597
+ "load_context": [],
598
+ "load_context_eager": []
599
+ },
588
600
  ".agent-src.uncompressed/commands/tests.md": {
589
601
  "kind": "command",
590
602
  "rule_type": null,
@@ -3495,6 +3507,20 @@
3495
3507
  "via": "self",
3496
3508
  "depth": 0
3497
3509
  },
3510
+ {
3511
+ "source": ".agent-src.uncompressed/commands/orchestrate.md",
3512
+ "target": ".agent-src.uncompressed/commands/orchestrate.md",
3513
+ "type": "WRITE",
3514
+ "via": "self",
3515
+ "depth": 0
3516
+ },
3517
+ {
3518
+ "source": ".agent-src.uncompressed/commands/orchestrate.md",
3519
+ "target": ".agent-src.uncompressed/skills/subagent-orchestration/SKILL.md",
3520
+ "type": "READ_ONLY",
3521
+ "via": "body_link",
3522
+ "depth": 1
3523
+ },
3498
3524
  {
3499
3525
  "source": ".agent-src.uncompressed/commands/override.md",
3500
3526
  "target": ".agent-src.uncompressed/commands/override.md",
@@ -4055,6 +4081,27 @@
4055
4081
  "via": "self",
4056
4082
  "depth": 0
4057
4083
  },
4084
+ {
4085
+ "source": ".agent-src.uncompressed/commands/sync-gitignore.md",
4086
+ "target": ".agent-src.uncompressed/commands/sync-gitignore/fix.md",
4087
+ "type": "READ_ONLY",
4088
+ "via": "body_link",
4089
+ "depth": 1
4090
+ },
4091
+ {
4092
+ "source": ".agent-src.uncompressed/commands/sync-gitignore/fix.md",
4093
+ "target": ".agent-src.uncompressed/commands/sync-gitignore.md",
4094
+ "type": "READ_ONLY",
4095
+ "via": "body_link",
4096
+ "depth": 1
4097
+ },
4098
+ {
4099
+ "source": ".agent-src.uncompressed/commands/sync-gitignore/fix.md",
4100
+ "target": ".agent-src.uncompressed/commands/sync-gitignore/fix.md",
4101
+ "type": "WRITE",
4102
+ "via": "self",
4103
+ "depth": 0
4104
+ },
4058
4105
  {
4059
4106
  "source": ".agent-src.uncompressed/commands/tests.md",
4060
4107
  "target": ".agent-src.uncompressed/commands/tests.md",
@@ -0,0 +1,56 @@
1
+ # MCP Discovery-Phase Notice
2
+
3
+ **Audience:** MCP consumers integrating with `event4u/agent-config` — host
4
+ applications, CLIs, agents calling our stdio server or the Cloudflare Worker.
5
+ **Status:** active during Phase 1 of
6
+ [`road-to-mcp-full-coverage`](../../agents/roadmaps/road-to-mcp-full-coverage.md).
7
+
8
+ ## What you will see
9
+
10
+ `tools/list` advertises ~20 tools. Most return a `not_implemented` envelope when
11
+ called — wire shape in [`mcp-tool-stub-envelope`](mcp-tool-stub-envelope.md).
12
+ This is intentional. Phase 1 is *discovery*: every call — implemented, stub, or
13
+ unknown — is logged so Phase 2's implementation cut is derived from real
14
+ consumer behaviour, not guesses.
15
+
16
+ ## What we need from you
17
+
18
+ **Keep calling the tools you would naturally call.** A call against a stub is
19
+ not a failed integration; it is a vote. Telemetry records carry
20
+ `{tool_name, client_id_hash, ts, transport, outcome}` — no payload bodies, no
21
+ raw identifiers (J4 in the roadmap). Three outcomes are logged:
22
+
23
+ - `implemented` — a real handler ran.
24
+ - `stub` — catalog entry, no transport handler; you received the envelope.
25
+ - `latent_demand` — name not in the catalog at all. **The most valuable
26
+ signal.** If you want a tool that does not exist, call it — do not work
27
+ around the absence silently.
28
+
29
+ ## How to verify telemetry is flowing
30
+
31
+ On any host running the stdio server:
32
+
33
+ ```bash
34
+ python3 scripts/mcp_telemetry_health.py
35
+ ```
36
+
37
+ Healthy → exit 0 with the 24 h count. Silent → exit 1; treat as an alert.
38
+ Wire it into Sentry, a GitHub Actions cron, a mailer, or `launchd` — whatever
39
+ you already trust. Worker telemetry lands in Cloudflare Workers Logs
40
+ (structured `mcp.telemetry` lines); query via the dashboard or `wrangler tail`.
41
+
42
+ ## Phase 1 → Phase 2 gate
43
+
44
+ When the gate fires (≥ 4 weeks of healthy telemetry, ≥ 500 logged attempts,
45
+ ≥ 50 distinct `client_id_hash` values), the council ranks tools by demand and
46
+ picks the implementation cut. Tools above the line move from stub → real;
47
+ tools below stay stubbed and may be removed. Silent windows ≥ 24 h refuse the
48
+ K3 gate and restart the observation period — that is why the healthcheck
49
+ output matters.
50
+
51
+ ## Contact
52
+
53
+ Open an issue against
54
+ [`event4u-app/agent-config`](https://github.com/event4u-app/agent-config) with
55
+ the `mcp-discovery` label if a call returns something other than the documented
56
+ envelope or if `latent_demand` is not landing for a tool you call.
@@ -0,0 +1,78 @@
1
+ ---
2
+ stability: experimental
3
+ ---
4
+
5
+ # MCP Tool Stub Envelope — Phase 1 Discovery Contract
6
+
7
+ > **Status:** Active · governs Phase 1 (J1–J6) of
8
+ > [`road-to-mcp-full-coverage.md`](../../agents/roadmaps/road-to-mcp-full-coverage.md).
9
+ > **Stability:** experimental — internal index reference only per
10
+ > `STABILITY.md`.
11
+
12
+ ## Purpose
13
+
14
+ Locks the wire shape of the `not_implemented` envelope returned by
15
+ `tools/call` when a consumer agent invokes a catalog entry that has no
16
+ implementation on the active transport. Every denied call returns a
17
+ structured payload with a recovery hint, never a silent 404 and never
18
+ a 500.
19
+
20
+ ## Source of truth
21
+
22
+ `scripts/mcp_server/consumer_tool_catalog.json` (schema_version 1).
23
+ Both the stdio server and the Cloud Worker bundle (`workers/mcp/`,
24
+ packed by `scripts/pack_mcp_content.py`) read from this file. The
25
+ manifest returned by `tools/list` is byte-identical apart from
26
+ per-tool `implemented_on` metadata.
27
+
28
+ ## Catalog entry
29
+
30
+ ```json
31
+ {
32
+ "name": "<snake_case>",
33
+ "description": "<≤500 chars; agent-facing>",
34
+ "side_effect": "ro | fs-write | shell",
35
+ "implemented_on": ["stdio"],
36
+ "input_schema": { "type": "object", "...": "JSON Schema draft-7" }
37
+ }
38
+ ```
39
+
40
+ `implemented_on` lists transports where a real handler is wired;
41
+ missing transports return the envelope.
42
+
43
+ ## Envelope wire shape
44
+
45
+ ```json
46
+ {
47
+ "code": "not_implemented",
48
+ "tool": "<catalog name>",
49
+ "transport": "stdio | worker",
50
+ "install_hint": "<copyable shell command>",
51
+ "alternative": "stdio",
52
+ "message": "<one-sentence explainer>"
53
+ }
54
+ ```
55
+
56
+ Stdio returns this as the JSON-RPC `result` (SDK wraps in
57
+ `TextContent`); the Worker returns it as `error.data` alongside
58
+ `code: -32601`. Field invariants: `code` is the frozen literal
59
+ `not_implemented`; `tool` echoes the caller; `transport` is set per
60
+ surface; `install_hint` comes from the catalog's `install_hint_stdio`
61
+ field; `alternative` is the frozen literal `stdio` until Phase 3.
62
+ Consumer agents must drive logic from `code`, not `message`.
63
+
64
+ ## Unknown-tool / latent-demand path
65
+
66
+ A call to a name not in the catalog returns JSON-RPC error `-32601`
67
+ with the same envelope shape, `code: "unknown_tool"`. Both transports
68
+ log the attempt with `outcome: "latent_demand"` so Phase 2 can
69
+ promote unforeseen names.
70
+
71
+ ## Acceptance
72
+
73
+ - Both transports return `code == "not_implemented"` for every
74
+ catalog entry whose `implemented_on` excludes the transport.
75
+ - Both transports return `code == "unknown_tool"` for any name not in
76
+ the catalog.
77
+ - Schema version bumps on any incompatible field rename; new optional
78
+ fields are compatible.
@@ -0,0 +1,152 @@
1
+ ---
2
+ stability: beta
3
+ ---
4
+
5
+ # Orchestration DSL v1
6
+
7
+ **Purpose.** Pin the YAML schema that the `/orchestrate` command
8
+ reads to chain personas / skills / sub-agents into reproducible
9
+ pipelines. A pipeline file is a deterministic, reviewable artifact
10
+ that re-runs the same step sequence with the same inputs.
11
+
12
+ **Scope.** Defines the file location, top-level shape, step kinds,
13
+ input / output wiring, and the linter contract. Does **not** define
14
+ the runtime semantics of each step kind — those live in the
15
+ [`/orchestrate`](../../.agent-src.uncompressed/commands/orchestrate.md)
16
+ command and the `work_engine` directive modules it delegates to.
17
+
18
+ Last refreshed: 2026-05-11.
19
+
20
+ ## File location
21
+
22
+ ```
23
+ .agent-config/orchestrations/<name>.yaml
24
+ ```
25
+
26
+ `<name>` is kebab-case, matches the `name` field inside the file,
27
+ and is unique across the consumer project's orchestrations directory.
28
+ The directory is opt-in — `/orchestrate` falls back to the prompt
29
+ when no file exists.
30
+
31
+ ## Top-level shape
32
+
33
+ ```yaml
34
+ schema_version: 1
35
+ name: pr-readiness-check
36
+ description: |
37
+ Run the four review-lens judges against the current diff, then
38
+ consolidate verdicts into a single Markdown report.
39
+ inputs:
40
+ - id: diff_target
41
+ description: Git ref to diff against. Default origin/main.
42
+ default: origin/main
43
+ steps:
44
+ - id: bug
45
+ kind: skill
46
+ ref: judge-bug-hunter
47
+ with:
48
+ diff_target: ${{ inputs.diff_target }}
49
+ - id: security
50
+ kind: skill
51
+ ref: judge-security-auditor
52
+ with:
53
+ diff_target: ${{ inputs.diff_target }}
54
+ - id: tests
55
+ kind: skill
56
+ ref: judge-test-coverage
57
+ with:
58
+ diff_target: ${{ inputs.diff_target }}
59
+ - id: quality
60
+ kind: skill
61
+ ref: judge-code-quality
62
+ with:
63
+ diff_target: ${{ inputs.diff_target }}
64
+ - id: consolidate
65
+ kind: command
66
+ ref: review-changes
67
+ with:
68
+ verdicts:
69
+ - ${{ steps.bug.output }}
70
+ - ${{ steps.security.output }}
71
+ - ${{ steps.tests.output }}
72
+ - ${{ steps.quality.output }}
73
+ outputs:
74
+ report: ${{ steps.consolidate.output }}
75
+ ```
76
+
77
+ ## Field semantics
78
+
79
+ | Field | Type | Required | Meaning |
80
+ |---|---|---|---|
81
+ | `schema_version` | int | yes | Always `1`. Major bump on breaking changes. |
82
+ | `name` | string | yes | Kebab-case identifier; matches filename. |
83
+ | `description` | string | yes | One-paragraph statement of intent. |
84
+ | `inputs[]` | list | no | Named pipeline inputs. Each has `id`, `description`, optional `default`. |
85
+ | `steps[]` | list | yes | Ordered list of steps. Min 1, max 32. |
86
+ | `steps[].id` | string | yes | Snake-case identifier; unique within the pipeline. |
87
+ | `steps[].kind` | enum | yes | One of `skill` · `command` · `persona` · `subagent`. |
88
+ | `steps[].ref` | string | yes | Reference id matching the `kind` namespace. |
89
+ | `steps[].with` | map | no | Inputs to the step. Values MAY use `${{ inputs.X }}` / `${{ steps.Y.output }}` interpolation. |
90
+ | `steps[].when` | string | no | Conditional expression — runs the step only if truthy. Limited to `${{ steps.X.output }}` equality and `success` / `failure` predicates. |
91
+ | `outputs` | map | no | Named pipeline outputs. Surfaced in the final delivery report. |
92
+
93
+ ## Step kinds
94
+
95
+ | `kind` | `ref` resolves to | Runtime |
96
+ |---|---|---|
97
+ | `skill` | `.agent-src.uncompressed/skills/<ref>/SKILL.md` | Dispatched via `work_engine` directive matching the skill's domain. |
98
+ | `command` | `.agent-src.uncompressed/commands/<ref>.md` | Same dispatch path the slash-command takes when typed by the user. |
99
+ | `persona` | `.agent-src.uncompressed/personas/<ref>.md` | Sets `roles.active_role` for the next dependent step; does not produce its own output. |
100
+ | `subagent` | `subagent-orchestration` mode name | Spawned per [`subagent-orchestration`](../../.agent-src.uncompressed/skills/subagent-orchestration/SKILL.md). |
101
+
102
+ ## Interpolation
103
+
104
+ Two namespaces only:
105
+
106
+ ```
107
+ ${{ inputs.<input-id> }}
108
+ ${{ steps.<step-id>.output }}
109
+ ```
110
+
111
+ Unknown namespaces hard-fail at lint time. The interpolation engine
112
+ does string substitution — there are no expressions, no arithmetic,
113
+ no shell-out.
114
+
115
+ ## Linter contract
116
+
117
+ `scripts/lint_orchestration_dsl.py` hard-fails on:
118
+
119
+ - missing or malformed top-level keys (`schema_version`, `name`,
120
+ `description`, `steps`)
121
+ - `schema_version != 1`
122
+ - `name` not matching `[a-z][a-z0-9-]*` or not matching the filename
123
+ - duplicate `steps[].id`
124
+ - `steps[].kind` outside the enum
125
+ - `steps[].ref` pointing at a non-existent skill / command / persona
126
+ - `${{ ... }}` reference to an unknown input or step id
127
+ - `steps[]` length > 32 or < 1
128
+ - `outputs` referencing an unknown step
129
+
130
+ Exit codes mirror [`lint_hook_manifest.py`](../../scripts/lint_hook_manifest.py): `0` clean, `1` failure, `2` schema-load error.
131
+
132
+ ## Privacy floor
133
+
134
+ Pipeline files are committed artifacts. They MUST NOT contain:
135
+
136
+ - Secrets, tokens, environment values.
137
+ - Conversation bodies or transcripts.
138
+ - File contents (only paths and refs).
139
+
140
+ ## Stability
141
+
142
+ Beta. Breaking changes between v1 and v2 are allowed in a minor
143
+ release if the change appears in `CHANGELOG.md` under a `### Breaking`
144
+ heading. Engines MUST gate on `schema_version` and refuse unknown
145
+ majors.
146
+
147
+ ## Cross-references
148
+
149
+ - Command surface: [`/orchestrate`](../../.agent-src.uncompressed/commands/orchestrate.md).
150
+ - Linter: [`lint_orchestration_dsl.py`](../../scripts/lint_orchestration_dsl.py).
151
+ - Runtime dispatcher precedent: [`implement-ticket-flow.md`](implement-ticket-flow.md).
152
+ - Subagent runtime: [`subagent-orchestration`](../../.agent-src.uncompressed/skills/subagent-orchestration/SKILL.md).
@@ -153,7 +153,7 @@ Your agent now understands slash commands:
153
153
  | `/quality-fix` | Run and fix all quality checks |
154
154
  | `/chat-history` | Inspect the persistent chat-history log (read-only `show`) |
155
155
 
156
- → [Browse all 104 active commands](../.agent-src/commands/)
156
+ → [Browse all 106 active commands](../.agent-src/commands/)
157
157
 
158
158
  ---
159
159
 
@@ -3,6 +3,41 @@
3
3
  **Principle:** Project-installed by default, plugin-enhanced when available.
4
4
  No Task, no Make, no build tools required for installation.
5
5
 
6
+ ## Per-IDE setup — quick index
7
+
8
+ Pick your editor, follow the linked page, done. Each page lists its
9
+ own one-liner, verification, and troubleshooting. The mechanisms
10
+ section below this index is reference material for advanced installs
11
+ (Composer, npm, manual, plugin marketplaces).
12
+
13
+ | Surface | One-liner | Per-IDE page |
14
+ |---|---|---|
15
+ | **Claude Code** | `npx @event4u/create-agent-config init --tools=claude-code` | [`per-ide/claude-code.md`](setup/per-ide/claude-code.md) |
16
+ | **Claude Desktop** | (uses `~/.claude/skills/` from Claude Code global install) | [`per-ide/claude-desktop.md`](setup/per-ide/claude-desktop.md) |
17
+ | **Cursor** | `npx @event4u/create-agent-config init --tools=cursor` | [`per-ide/cursor.md`](setup/per-ide/cursor.md) |
18
+ | **Windsurf** | `npx @event4u/create-agent-config init --tools=windsurf` | [`per-ide/windsurf.md`](setup/per-ide/windsurf.md) |
19
+ | **Cline** | `npx @event4u/create-agent-config init --tools=cline` | [`per-ide/cline.md`](setup/per-ide/cline.md) |
20
+ | **Aider** | `npx @event4u/create-agent-config init --tools=aider` | [`per-ide/aider.md`](setup/per-ide/aider.md) |
21
+ | **Codex CLI** | `npx @event4u/create-agent-config init --tools=codex` | [`per-ide/codex.md`](setup/per-ide/codex.md) |
22
+ | **Gemini CLI** | `npx @event4u/create-agent-config init --tools=gemini` | [`per-ide/gemini-cli.md`](setup/per-ide/gemini-cli.md) |
23
+ | **GitHub Copilot** | `npx @event4u/create-agent-config init --tools=copilot` | [`per-ide/copilot.md`](setup/per-ide/copilot.md) |
24
+ | **All surfaces** | `npx @event4u/create-agent-config init` (default) | (each page above applies) |
25
+
26
+ Combine surfaces by comma-separating: `--tools=claude-code,cursor,windsurf`.
27
+
28
+ > Looking for **global** (cross-project) install? Each per-IDE page
29
+ > documents its own `npx @event4u/agent-config global --tools=<ide>`
30
+ > command.
31
+
32
+ ---
33
+
34
+ ## Mechanisms reference
35
+
36
+ The rest of this page documents the underlying install mechanisms
37
+ (Composer, npm, manual clone, plugin marketplaces). Most users want
38
+ the per-IDE index above.
39
+
40
+
6
41
  > **Primary installer:** `scripts/install` — a small bash orchestrator that
7
42
  > runs the two real installer stages in order:
8
43
  >
@@ -42,6 +77,63 @@ No Task, no Make, no build tools required for installation.
42
77
 
43
78
  ---
44
79
 
80
+ ## Quickstart — one-liner entrypoints
81
+
82
+ 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.
86
+
87
+ ### `npx` (Node ≥ 18)
88
+
89
+ ```bash
90
+ # Pick tools interactively (TTY checkbox prompt)
91
+ npx @event4u/create-agent-config init
92
+
93
+ # Pick tools explicitly, non-interactive
94
+ npx @event4u/create-agent-config init --tools=claude-code,cursor --yes
95
+
96
+ # Install everything (the default — backward-compatible)
97
+ npx @event4u/create-agent-config init --tools=all --yes
98
+
99
+ # Test a specific git ref (branch, tag, sha) instead of the latest npm tag
100
+ npx @event4u/create-agent-config init --ref=main --yes
101
+ ```
102
+
103
+ The `@event4u/create-agent-config` package is a thin wrapper: it
104
+ downloads the latest `@event4u/agent-config` tarball into a temp
105
+ directory, runs `bash scripts/install --target <cwd> ...`, and cleans
106
+ up after itself. The project-local payload package
107
+ (`@event4u/agent-config`) is unchanged.
108
+
109
+ ### `curl | bash` (no Node required)
110
+
111
+ ```bash
112
+ # Defaults (interactive picker if your terminal is a TTY, else --tools=all)
113
+ curl -sSL https://raw.githubusercontent.com/event4u-app/agent-config/main/setup.sh | bash
114
+
115
+ # Explicit tools, non-interactive (same flags as scripts/install)
116
+ curl -sSL https://raw.githubusercontent.com/event4u-app/agent-config/main/setup.sh \
117
+ | bash -s -- --tools=claude-code,cursor --yes
118
+
119
+ # Install from a specific git ref
120
+ curl -sSL https://raw.githubusercontent.com/event4u-app/agent-config/main/setup.sh \
121
+ | bash -s -- --ref=v1.39.0 --tools=cursor --yes
122
+ ```
123
+
124
+ Requires `bash`, `tar`, `curl` (or `wget`), and Python ≥ 3.10 on the
125
+ host. Mirrors the agent-os `setup.sh` pattern.
126
+
127
+ ### Interactive `--tools` picker
128
+
129
+ When `scripts/install` runs without an explicit `--tools` flag in an
130
+ interactive terminal (stdin + stdout both TTYs, `--yes` not passed), it
131
+ prompts for a comma-separated tool selection. In CI / piped invocations
132
+ the picker is skipped and the backward-compatible `all` default is
133
+ used. Pass `--yes` (or `-y`) to force non-interactive mode anywhere.
134
+
135
+ ---
136
+
45
137
  ## Project-installed mode (recommended for teams)
46
138
 
47
139
  Install once in the project — available to everyone working on it.
@@ -426,6 +518,8 @@ Options:
426
518
  --quiet Suppress non-error output
427
519
  --skip-sync Skip payload sync (install.sh)
428
520
  --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
429
523
  --help, -h Show this help
430
524
  ```
431
525
 
@@ -434,6 +528,44 @@ The underlying stages keep their own CLI surfaces:
434
528
 
435
529
  ---
436
530
 
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.
557
+
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.
566
+
567
+ ---
568
+
437
569
  ## Updating
438
570
 
439
571
  When a new version of the package is published: