@event4u/agent-config 3.0.0 → 3.1.1

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 (208) hide show
  1. package/.agent-src/commands/install-via-agent.md +129 -0
  2. package/.agent-src/commands/video/from-script.md +1 -1
  3. package/.agent-src/commands/video.md +1 -1
  4. package/.agent-src/contexts/execution/cheap-question-mechanics.md +81 -0
  5. package/.agent-src/rules/caveman-speak.md +2 -2
  6. package/.agent-src/rules/context-hygiene.md +36 -0
  7. package/.agent-src/rules/engineering-safety-floor.md +102 -0
  8. package/.agent-src/rules/finance-safety-floor.md +114 -0
  9. package/.agent-src/rules/git-history-discipline.md +1 -1
  10. package/.agent-src/rules/no-cheap-questions.md +34 -32
  11. package/.agent-src/rules/provider-lifecycle-discipline.md +4 -4
  12. package/.agent-src/rules/strategy-safety-floor.md +114 -0
  13. package/.agent-src/skills/agents-md-thin-root/SKILL.md +15 -9
  14. package/.agent-src/skills/async-python-patterns/SKILL.md +1 -1
  15. package/.agent-src/skills/project-analysis-node-express/SKILL.md +1 -1
  16. package/.agent-src/skills/readme-reviewer/SKILL.md +52 -3
  17. package/.agent-src/skills/readme-writing/SKILL.md +52 -4
  18. package/.agent-src/skills/readme-writing-package/SKILL.md +48 -5
  19. package/.agent-src/skills/systematic-debugging/SKILL.md +41 -0
  20. package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  21. package/.agent-src/templates/hooks/pre-commit-frontmatter +66 -0
  22. package/.agent-src/templates/hooks/pre-commit-roadmap-progress +78 -39
  23. package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +4 -1
  24. package/.agent-src/templates/scripts/work_engine/orchestration.py +25 -11
  25. package/.claude-plugin/marketplace.json +2 -1
  26. package/AGENTS.md +10 -8
  27. package/CHANGELOG.md +233 -123
  28. package/README.md +165 -553
  29. package/config/agent-settings.template.yml +0 -7
  30. package/config/discovery/packs.yml +20 -0
  31. package/config/discovery/unassigned-artefacts.yml +2 -0
  32. package/config/gitignore-block.txt +19 -3
  33. package/dist/cli/commands/uiServe.js +13 -4
  34. package/dist/cli/commands/uiServe.js.map +1 -1
  35. package/dist/cli/registry.js +2 -0
  36. package/dist/cli/registry.js.map +1 -1
  37. package/dist/discovery/deprecation-report.md +7 -0
  38. package/dist/discovery/discovery-manifest.json +2107 -1409
  39. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  40. package/dist/discovery/discovery-manifest.summary.md +9 -9
  41. package/dist/discovery/orphan-report.md +10 -0
  42. package/dist/discovery/packs.json +1002 -0
  43. package/dist/discovery/trust-report.md +26 -0
  44. package/dist/discovery/workspaces.json +705 -0
  45. package/dist/mcp/registry-manifest.json +4 -4
  46. package/dist/router.json +1623 -0
  47. package/dist/server/app.js +11 -3
  48. package/dist/server/app.js.map +1 -1
  49. package/dist/server/io/atomicMultiWrite.js +3 -1
  50. package/dist/server/io/atomicMultiWrite.js.map +1 -1
  51. package/dist/server/io/yamlIO.js +22 -0
  52. package/dist/server/io/yamlIO.js.map +1 -1
  53. package/dist/server/routes/ping.js +8 -0
  54. package/dist/server/routes/ping.js.map +1 -1
  55. package/dist/server/routes/schema.js +2 -2
  56. package/dist/server/routes/schema.js.map +1 -1
  57. package/dist/server/routes/settings.js +104 -23
  58. package/dist/server/routes/settings.js.map +1 -1
  59. package/dist/server/routes/userMd.js +37 -27
  60. package/dist/server/routes/userMd.js.map +1 -1
  61. package/dist/server/routes/wizard.js +256 -20
  62. package/dist/server/routes/wizard.js.map +1 -1
  63. package/dist/server/schemas/settings.js +0 -1
  64. package/dist/server/schemas/settings.js.map +1 -1
  65. package/dist/server/token.js +10 -3
  66. package/dist/server/token.js.map +1 -1
  67. package/dist/server/writeRoot.js +28 -11
  68. package/dist/server/writeRoot.js.map +1 -1
  69. package/dist/server/writeRoot.test.js +22 -4
  70. package/dist/server/writeRoot.test.js.map +1 -1
  71. package/dist/shared/userMd/formAdapter.js +29 -51
  72. package/dist/shared/userMd/formAdapter.js.map +1 -1
  73. package/dist/shared/userMd/schema.js +32 -104
  74. package/dist/shared/userMd/schema.js.map +1 -1
  75. package/dist/shared/userMd/utils.js +64 -50
  76. package/dist/shared/userMd/utils.js.map +1 -1
  77. package/dist/ui/assets/index-D-DY1ywI.js +35 -0
  78. package/dist/ui/assets/index-D-DY1ywI.js.map +1 -0
  79. package/dist/ui/index.html +1 -1
  80. package/docs/adrs/router/0001-three-tier-routing.md +5 -5
  81. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +1 -1
  82. package/docs/architecture.md +3 -3
  83. package/docs/archive/CHANGELOG-pre-3.1.0.md +167 -0
  84. package/docs/catalog.md +30 -26
  85. package/docs/contracts/CHANGELOG-conventions.md +1 -1
  86. package/docs/contracts/agent-user-schema.md +6 -9
  87. package/docs/contracts/consumer-bridge.md +79 -0
  88. package/docs/contracts/discovery-manifest.md +209 -0
  89. package/docs/contracts/discovery-manifest.schema.json +77 -4
  90. package/docs/contracts/explain-trace.schema.json +1 -1
  91. package/docs/contracts/file-ownership-matrix.json +197 -13
  92. package/docs/contracts/frontmatter-contract.md +140 -0
  93. package/docs/contracts/gui-wizard.md +223 -0
  94. package/docs/contracts/installer-agent-mode.md +137 -0
  95. package/docs/contracts/kernel-membership.md +1 -1
  96. package/docs/contracts/mcp-tool-inventory.md +9 -9
  97. package/docs/contracts/namespace.md +6 -6
  98. package/docs/contracts/provider-lifecycle.md +5 -5
  99. package/docs/contracts/rule-router.md +4 -4
  100. package/docs/contracts/settings-api.md +53 -6
  101. package/docs/contracts/smoke-contracts.md +3 -3
  102. package/docs/contracts/trust-and-safety.md +144 -0
  103. package/docs/customization.md +2 -2
  104. package/docs/decisions/ADR-007-agent-discovery-scopes.md +12 -0
  105. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +24 -0
  106. package/docs/decisions/ADR-015-discovery-manifest-contract.md +146 -0
  107. package/docs/decisions/ADR-016-installer-architecture.md +189 -0
  108. package/docs/decisions/ADR-017-monorepo-physical-layout.md +261 -0
  109. package/docs/decisions/ADR-018-trust-and-safety-layer.md +159 -0
  110. package/docs/decisions/ADR-019-router-json-dist-location.md +124 -0
  111. package/docs/decisions/ADR-020-global-only-consumer-scope.md +123 -0
  112. package/docs/decisions/ADR-021-deployment-shape.md +153 -0
  113. package/docs/decisions/INDEX.md +7 -0
  114. package/docs/deploy/connector-setup.md +129 -0
  115. package/docs/deploy/env-vars.md +70 -0
  116. package/docs/deploy/policy-cookbook.md +130 -0
  117. package/docs/deploy/quickstart.md +112 -0
  118. package/docs/distribution/public-install-smoke.md +68 -0
  119. package/docs/distribution/registries.md +55 -0
  120. package/docs/distribution/telemetry-privacy.md +128 -0
  121. package/docs/distribution/telemetry-schema.md +174 -0
  122. package/docs/featured-skills.md +95 -0
  123. package/docs/getting-started-by-role.md +19 -1
  124. package/docs/getting-started.md +2 -2
  125. package/docs/guidelines/agent-infra/installed-tools-manifest.md +11 -8
  126. package/docs/guidelines/docs/readme-size-and-splitting.md +53 -1
  127. package/docs/installation.md +27 -14
  128. package/docs/maintainers/dev-mode.md +105 -0
  129. package/docs/setup/per-ide/claude-desktop.md +3 -2
  130. package/docs/wizard.md +39 -4
  131. package/package.json +18 -1
  132. package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
  133. package/scripts/_cli/cmd_doctor.py +150 -2
  134. package/scripts/_cli/cmd_explain.py +2 -1
  135. package/scripts/_cli/cmd_migrate_to_global.py +415 -0
  136. package/scripts/_cli/cmd_settings_migrate.py +146 -0
  137. package/scripts/_cli/explain_last/route.py +2 -1
  138. package/scripts/_dispatch.bash +36 -3
  139. package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
  140. package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
  141. package/scripts/_lib/agent_settings.py +4 -1
  142. package/scripts/_lib/agent_src.py +157 -0
  143. package/scripts/agent-config +17 -6
  144. package/scripts/audit_skill_descriptions.py +18 -6
  145. package/scripts/build_discovery_manifest.py +373 -17
  146. package/scripts/check_artefact_checksums.py +104 -0
  147. package/scripts/check_cluster_patterns.py +20 -4
  148. package/scripts/check_command_count_messaging.py +33 -14
  149. package/scripts/check_council_references.py +43 -4
  150. package/scripts/check_overlay_cascade_subdirs.py +7 -3
  151. package/scripts/check_references.py +5 -2
  152. package/scripts/check_reply_consistency.py +32 -9
  153. package/scripts/check_template_pin_drift.py +24 -7
  154. package/scripts/check_token_optimizer_freshness.py +18 -3
  155. package/scripts/compile_router.py +34 -2
  156. package/scripts/compress.py +162 -44
  157. package/scripts/config/presets.py +19 -1
  158. package/scripts/config/profiles.py +16 -1
  159. package/scripts/discovery_stats.py +70 -0
  160. package/scripts/expected_perms.json +47 -0
  161. package/scripts/generate_index.py +78 -46
  162. package/scripts/generate_ownership_matrix.py +98 -43
  163. package/scripts/generate_pack_manifests.py +183 -0
  164. package/scripts/install +18 -1
  165. package/scripts/install.py +934 -59
  166. package/scripts/install.sh +27 -9
  167. package/scripts/lint_agents_layout.py +93 -13
  168. package/scripts/lint_agents_md.py +1 -1
  169. package/scripts/lint_archived_skills.py +32 -16
  170. package/scripts/lint_bench_corpus.py +14 -2
  171. package/scripts/lint_command_tiers.py +15 -2
  172. package/scripts/lint_featured_skills.py +139 -0
  173. package/scripts/lint_framework_leakage.py +33 -6
  174. package/scripts/lint_global_paths.py +147 -0
  175. package/scripts/lint_orchestration_dsl.py +6 -3
  176. package/scripts/lint_pack_boundaries.py +147 -0
  177. package/scripts/lint_pack_first_win.py +103 -0
  178. package/scripts/lint_readme_jargon.py +131 -0
  179. package/scripts/lint_readme_size.py +33 -0
  180. package/scripts/lint_rule_interactions.py +23 -5
  181. package/scripts/lint_rule_tiers.py +12 -3
  182. package/scripts/lint_trust_coherence.py +212 -0
  183. package/scripts/measure_rule_budget.py +22 -4
  184. package/scripts/move_artefact.py +143 -0
  185. package/scripts/new_skill.py +148 -0
  186. package/scripts/plan_physical_move.py +353 -0
  187. package/scripts/refine_ticket_detect.py +30 -7
  188. package/scripts/release.py +22 -2
  189. package/scripts/schemas/command.schema.json +4 -0
  190. package/scripts/skill_linter.py +248 -118
  191. package/scripts/skill_trigger_eval.py +28 -8
  192. package/scripts/smoke/kernel.sh +1 -1
  193. package/scripts/smoke/router.sh +24 -5
  194. package/scripts/smoke/skills.sh +15 -7
  195. package/scripts/smoke_quickstart.py +11 -2
  196. package/scripts/snapshot_agent_outputs.py +144 -0
  197. package/scripts/update_counts.py +45 -17
  198. package/scripts/validate_decision_engine.py +9 -1
  199. package/scripts/validate_discovery_manifest.py +94 -0
  200. package/scripts/validate_frontmatter.py +39 -20
  201. package/scripts/verify_physical_move.py +185 -0
  202. package/templates/agent-user.md +0 -1
  203. package/templates/agent-user.yml +21 -0
  204. package/templates/minimal/agents-overrides-readme.md +46 -0
  205. package/templates/minimal/overrides-gitkeep +2 -0
  206. package/dist/ui/assets/index-BTRcKDlB.js +0 -39
  207. package/dist/ui/assets/index-BTRcKDlB.js.map +0 -1
  208. package/templates/minimal/agents-gitkeep +0 -2
@@ -0,0 +1,128 @@
1
+ # Install-Funnel Telemetry — Privacy
2
+
3
+ > **3-minute read.** This page explains what the `@event4u/agent-config`
4
+ > installer collects when you opt in, what it never collects, and how to
5
+ > opt out.
6
+
7
+ ## TL;DR
8
+
9
+ - **Off by default.** You see one prompt during install. If you do nothing,
10
+ nothing is sent.
11
+ - **Anonymous.** No IP, no machine ID, no project name, no file paths.
12
+ - **Short retention.** Raw events live 14 days; sessions live 2 hours.
13
+ - **One-click off.** `--no-telemetry`, the wizard "No thanks" button, or
14
+ unsetting `TELEMETRY_OPT_IN=1` for the next install.
15
+
16
+ ## 1. What we collect (only if you opt in)
17
+
18
+ Per install attempt, we send one event per funnel stage with these fields:
19
+
20
+ - **Funnel stage** — one of: `started`, `wizard_opt_in_seen`,
21
+ `wizard_opt_in_accepted`, `packs_selected`, `applied`,
22
+ `first_command_run`, `errored`.
23
+ - **Entry path** — `npx`, `curl`, or `gui`.
24
+ - **Host agent family** — coarse bucket: `vscode`, `jetbrains`, `cli`,
25
+ `browser`, or `unknown`. Specific tool names (Cursor, Copilot, Windsurf)
26
+ are collapsed into the family bucket.
27
+ - **Operating-system family** — `linux`, `macos`, or `windows`.
28
+ - **Node major version** — `20` or `22`.
29
+ - **agent-config version** — the semver string of the installer release.
30
+ - **Pack categories** — a list of broad categories from a fixed enum
31
+ (`finance`, `founder`, `engineering`, `content`, `consultant`, `meta`,
32
+ `other`). Specific pack names are never sent.
33
+ - **Wizard used** — boolean.
34
+ - **Duration bucket** — one of `<30s`, `30s-2m`, `2m-10m`, `>10m`. We never
35
+ send millisecond timings.
36
+ - **Error class** (only on `errored`) — one of `network`, `filesystem`,
37
+ `config_invalid`, `dependency`, `unknown`. Never a stack, never a
38
+ message.
39
+ - **Session ID** — a 128-bit random token issued by our server with a
40
+ 2-hour time-to-live, used to stitch the funnel. It is never persisted
41
+ on your machine.
42
+
43
+ The full wire contract is in [`telemetry-schema.md`](telemetry-schema.md).
44
+
45
+ ## 2. What we NEVER collect
46
+
47
+ - IP address. Cloudflare drops it before our worker reads the request body;
48
+ our code does not log `cf-connecting-ip`.
49
+ - Machine identifiers — no MAC, no hostname, no username, no home directory.
50
+ - Project name, project path, repository slug, git remote URL.
51
+ - Pack names (only the coarse `pack_categories` enum).
52
+ - File paths of any kind.
53
+ - Error stacks, error messages, or any freeform error text.
54
+ - Anything you typed: prompts, ticket IDs, ad-hoc commands.
55
+ - Sub-bucket timing (no `duration_ms`).
56
+
57
+ ## 3. How to opt out
58
+
59
+ Three paths, any one works:
60
+
61
+ 1. **Wizard (browser GUI)** — click "No thanks" on the telemetry screen.
62
+ This is the default focus; pressing Enter without picking declines.
63
+ 2. **CLI / TUI** — answer `n` at the telemetry prompt (default `n`).
64
+ 3. **CI / `--yes` mode** — telemetry is **always off** unless you pass
65
+ `--telemetry-opt-in` explicitly. There is no implicit consent in
66
+ non-interactive runs.
67
+
68
+ You can also disable telemetry for one specific install by setting
69
+ `AGENT_CONFIG_NO_TELEMETRY=1` in the environment.
70
+
71
+ ## 4. Per-install scope — choice is never persisted
72
+
73
+ The opt-in choice applies **only to the current install session**. We do
74
+ not write a preference file under your project, your home directory, or
75
+ anywhere else. If you run the installer again, you will see the prompt
76
+ again. This is intentional — every install is an explicit consent moment.
77
+
78
+ ## 5. How long we keep it
79
+
80
+ | What | Storage | Time to live |
81
+ |---|---|---|
82
+ | Session ID + stage events | Cloudflare KV | 14 days |
83
+ | Session token only | Cloudflare KV | 2 hours |
84
+ | Weekly aggregates (no session ID) | Cloudflare KV | 24 months |
85
+
86
+ Aggregates contain only counts — number of installs per stage, per OS, per
87
+ entry path. No identifier survives beyond 14 days.
88
+
89
+ ## 6. Where the source lives, who can see the data
90
+
91
+ - Client SDK source — [`packages/core/installer/src/telemetry/`](../../packages/core/installer/src/telemetry/).
92
+ - Worker source — [`packages/cloud/telemetry-worker/`](../../packages/cloud/telemetry-worker/).
93
+ - Aggregates are visible only to the named maintainers of
94
+ `event4u/agent-config`. No third-party access. No advertising integration.
95
+ No resale.
96
+
97
+ ## 7. Remote kill-switch
98
+
99
+ We host a public feature-flag JSON. If we ever need to disable telemetry
100
+ across all installs — for an incident, a privacy concern, or a deprecation
101
+ — we flip the flag to `enabled: false`. The installer reads the flag
102
+ before opening a session; if disabled, no events are sent regardless of
103
+ your opt-in choice. The flag defaults to `false` when unreachable.
104
+
105
+ ## 8. Legal basis
106
+
107
+ Lawful basis under the General Data Protection Regulation is consent
108
+ under Article 6(1)(a). You give consent by clicking "opt in" or passing
109
+ `--telemetry-opt-in`; you withdraw consent by choosing any of the opt-out
110
+ paths in §3. Withdrawal applies to all future installs immediately.
111
+
112
+ Because session IDs are server-issued, short-lived (2 hours), and not
113
+ combined with re-identifying quasi-identifiers, the resulting records are
114
+ designed to fall outside the GDPR Art. 4(1) definition of personal data.
115
+ We treat them as personal data anyway for safety.
116
+
117
+ ## 9. Changes to this policy
118
+
119
+ Material changes ship as a new section in this file plus a bump of
120
+ `schema_version` in the wire format. Non-material changes (typo fixes,
121
+ clearer wording) ship as plain edits. The current version corresponds to
122
+ `schema_version: "1"` in [`telemetry-schema.md`](telemetry-schema.md).
123
+
124
+ ## See also
125
+
126
+ - [`telemetry-schema.md`](telemetry-schema.md) — full wire contract.
127
+ - `agents/roadmaps/road-to-product-adoption.md § Phase 4`.
128
+ - `non-destructive-by-default` — why worker deploy is a separate PR.
@@ -0,0 +1,174 @@
1
+ # Install-Funnel Telemetry — Wire Schema
2
+
3
+ > **Status: source-only / inert.** This document specifies the install-funnel
4
+ > telemetry contract. The client SDK ships in this repository with the remote
5
+ > kill-switch defaulting to **off** and the production endpoint unset, so no
6
+ > traffic is emitted from any consumer install until the maintainer deploys
7
+ > the worker under a separate PR. See `non-destructive-by-default` — worker
8
+ > deploy is Hard-Floor and requires explicit per-turn maintainer authorization.
9
+
10
+ This is **install-funnel** telemetry. It is distinct from
11
+ `telemetry.artifact_engagement` (agent-runtime skill/rule/command usage,
12
+ stored locally per consumer project — see
13
+ [`artifact-engagement-flow`](../../packages/core/.agent-src.uncompressed/contexts/contracts/artifact-engagement-flow.md)).
14
+ The two systems do not share storage, transport, or opt-in state.
15
+
16
+ ## Goals
17
+
18
+ Close the "we have no idea where consumers drop in the install funnel" blind
19
+ spot named in `feedback6.txt § 10`, while staying inside three hard
20
+ constraints:
21
+
22
+ 1. **Privacy-by-default** — opt-in, off by default, anonymous beyond
23
+ reasonable doubt, no PII, no quasi-IDs that re-identify under combination.
24
+ 2. **GDPR-fit out of the box** — lawful basis is consent under
25
+ Art. 6(1)(a); short retention; no cross-session linkability beyond a
26
+ 2-hour server-issued session.
27
+ 3. **Cheap to drop** — if we kill the system we leave no orphan data.
28
+
29
+ ## Funnel stages (one event per stage)
30
+
31
+ ```text
32
+ started
33
+ └→ wizard_opt_in_seen (browser GUI only)
34
+ └→ wizard_opt_in_accepted (browser GUI only)
35
+ └→ packs_selected
36
+ └→ applied
37
+ └→ first_command_run (optional, ≤ 7 days after applied)
38
+ └→ errored (terminal; mutually exclusive with applied)
39
+ ```
40
+
41
+ ## Wire shape (one POST per stage event)
42
+
43
+ `POST <worker-base-url>/install-event` with JSON body:
44
+
45
+ ```jsonc
46
+ {
47
+ "schema_version": "1",
48
+ "event": "install_stage",
49
+ "stage": "started" | "wizard_opt_in_seen" | "wizard_opt_in_accepted"
50
+ | "packs_selected" | "applied" | "first_command_run" | "errored",
51
+ "ts": "2026-05-24T10:00:00Z",
52
+ "session_id": "<server-issued, 128-bit, 2h TTL; omit on first event>",
53
+ "entry_path": "npx" | "curl" | "gui",
54
+ "host_agent_family": "vscode" | "jetbrains" | "cli" | "browser" | "unknown",
55
+ "os": "linux" | "macos" | "windows",
56
+ "node_major": "20" | "22",
57
+ "agent_config_version": "<semver>",
58
+ "pack_categories": ["finance" | "founder" | "engineering" | "content"
59
+ | "consultant" | "meta" | "other"],
60
+ "wizard_used": true | false,
61
+ "duration_bucket": "<30s" | "30s-2m" | "2m-10m" | ">10m",
62
+ "error_class": "network" | "filesystem" | "config_invalid"
63
+ | "dependency" | "unknown"
64
+ }
65
+ ```
66
+
67
+ ### `session_id` is server-issued, not client-issued
68
+
69
+ Per the AI Council Round-2 verdict, the client never generates an identifier.
70
+ The first event in a session POSTs **without** `session_id`. The worker
71
+ generates a random 128-bit token, writes it to KV with a 2-hour TTL, and
72
+ returns it in the response. Subsequent stage events include the returned
73
+ `session_id` so the worker can stitch the funnel.
74
+
75
+ Sessions that exceed 2 hours appear as two unstitched events. This is
76
+ acceptable — sessions that long are statistical outliers.
77
+
78
+ ### Field-by-field rationale
79
+
80
+ | Field | Rationale | Re-identification risk |
81
+ |---|---|---|
82
+ | `session_id` | Server-controlled session stitching; 2h TTL; never persisted client-side | None (auto-expires) |
83
+ | `entry_path` | Required to compare npx vs curl vs GUI funnels | None (3 buckets) |
84
+ | `host_agent_family` | Required to compare IDE vs CLI completion rates | Low (4 buckets) |
85
+ | `os` | Required to spot OS-specific install failures | Low (3 buckets) |
86
+ | `node_major` | Required to spot Node version issues | Low (2 buckets) |
87
+ | `agent_config_version` | Required to spot regression on a new release | Low |
88
+ | `pack_categories` | Actionable funnel signal (which packs convert?) | Low (small fixed enum, no pack names) |
89
+ | `wizard_used` | Wizard vs TUI completion comparison | None |
90
+ | `duration_bucket` | Coarse timing; 4 buckets; no side-channel | None (vs `duration_ms` which leaks CI vs human) |
91
+ | `error_class` | 5 buckets; never freeform; never a stack | None |
92
+
93
+ ## What we NEVER send
94
+
95
+ - IP address (Cloudflare drops it before the worker reads the request body;
96
+ the worker code does not log or persist `cf-connecting-ip`).
97
+ - Any machine identifier, MAC, hostname, username, home-directory path.
98
+ - Project name, project path, repository slug, git remote URL.
99
+ - Pack **names** (only the small fixed `pack_categories` enum is sent).
100
+ - File paths of any kind.
101
+ - Error stacks, error messages, or freeform `error_class` strings.
102
+ - Anything the user typed (prompts, ticket IDs, ad-hoc commands).
103
+ - Any timing field with sub-bucket precision (no `duration_ms`).
104
+
105
+ ## Retention
106
+
107
+ | Tier | Storage | TTL | Notes |
108
+ |---|---|---|---|
109
+ | Raw stage events | Cloudflare KV | 14 days | Keyed by `event:<session_id>:<stage>` |
110
+ | Sessions | Cloudflare KV | 2 hours | Keyed by `session:<session_id>` |
111
+ | Weekly aggregates | Cloudflare KV | 24 months | Keyed by `funnel:weekly:<iso-week>`, no `session_id` |
112
+
113
+ Aggregates contain only stage counts and bucketed dimension counts. No
114
+ `session_id` is retained beyond 14 days.
115
+
116
+ ## Authentication and abuse resistance
117
+
118
+ - **Per-channel HMAC signing.** Each entry path (`npx`, `curl`, `gui`) ships
119
+ with its own pre-shared HMAC secret embedded at build time. The installer
120
+ computes `HMAC-SHA256(secret, body)` and sends it in the `x-install-sig`
121
+ header. The worker validates the signature before parsing the body.
122
+ Rotation is handled by shipping a new installer release.
123
+ - **Rate-limit per `session_id`.** The worker caps each session at 20 events
124
+ total. Excess events return `429`.
125
+ - **Body size cap.** Bodies > 4 KB are rejected with `413`.
126
+ - **Schema strictness.** Unknown fields cause `400`. Validators run before
127
+ KV writes.
128
+
129
+ ## Remote kill-switch
130
+
131
+ The installer reads a Cloudflare-hosted feature-flag JSON
132
+ (`https://<flag-host>/install-telemetry-flags.json`, cached for 1 hour,
133
+ default `enabled=false` if unreachable) before each session. If the flag
134
+ returns `enabled: false`, the SDK is a no-op for the entire session — no
135
+ session is opened, no `started` event is sent, no opt-in prompt is shown.
136
+
137
+ This gives the maintainer a one-line config change to disable telemetry
138
+ across all consumers within 1 hour, independent of installer releases.
139
+
140
+ ## Worker contract
141
+
142
+ `POST /install-event` — see fields above. Returns:
143
+
144
+ - `200 { session_id }` on the first event of a session.
145
+ - `204 No Content` on subsequent stage events.
146
+ - `400 { error }` on schema mismatch or unknown fields.
147
+ - `401` on missing or invalid HMAC.
148
+ - `413` on body > 4 KB.
149
+ - `429` on per-session rate limit.
150
+ - `5xx` on worker error — the SDK fails open (no retry, no log).
151
+
152
+ `GET /install-telemetry-flags.json` — see kill-switch above. Returns
153
+ `{ enabled: bool, schema_version: "1" }`.
154
+
155
+ ## Versioning
156
+
157
+ `schema_version: "1"` is the contract above. A breaking change ships
158
+ `schema_version: "2"` alongside `/install-event/v2`. The worker maintains v1
159
+ for ≥ 90 days after v2 ships. The installer always reports the version it
160
+ was built with — no client-side migration.
161
+
162
+ ## Open questions for a follow-up PR
163
+
164
+ - Should `pack_categories` include `other` or omit unknown? Currently `other`
165
+ is included to avoid silent loss.
166
+ - Should `errored` events be retained longer (30 days) for incident
167
+ investigation? Decision deferred to first operational quarter.
168
+
169
+ ## See also
170
+
171
+ - [`telemetry-privacy.md`](telemetry-privacy.md) — reader-facing privacy doc.
172
+ - [AI Council Round-2 transcript](../../agents/runtime/council/responses/install-telemetry.json) — verdict + revisions.
173
+ - `agents/roadmaps/road-to-product-adoption.md § Phase 4`.
174
+ - `non-destructive-by-default` — worker deploy is Hard-Floor.
@@ -0,0 +1,95 @@
1
+ # Featured Skills
2
+
3
+ A curated subset of the ~218 active skills. Three tiers, one per primary audience. Full catalog lives in [`.agent-src/skills/`](../.agent-src/skills/); see also [`docs/catalog.md`](catalog.md) for the complete index and [`docs/featured-commands.md`](featured-commands.md) for command-level highlights.
4
+
5
+ > **Eval-gated messaging note.** Until `task bench --corpus non-dev` reports `selection_accuracy >= 0.60` (see `road-to-product-adoption.md` Phase 1), this page is documentation, not marketing. The entries below are the candidates the corpus tests against; their description quality is what the eval validates.
6
+
7
+ Each row links to the canonical artefact under `.agent-src/`. Substitutions vs. the original roadmap proposal: `pitch-narrative` → [`fundraising-narrative`](../.agent-src/skills/fundraising-narrative/SKILL.md) (closest existing skill; pitch-narrative is not yet authored).
8
+
9
+ ---
10
+
11
+ ## Featured for Founders & Consultants
12
+
13
+ **Install:** `npx -y @event4u/agent-config init --pack founder-strategy`
14
+ (Consultants: pair with `--pack product-discovery` for discovery / interview tooling.)
15
+
16
+ **You reach for this when:** you switch between investor pitch, hiring decision, product spec, and unit-economics modeling in the same week — and need cross-domain skills that respect a board-defensible bar.
17
+
18
+ | Artefact | What it does |
19
+ |---|---|
20
+ | [`/refine-prompt`](../.agent-src/skills/refine-prompt/SKILL.md) | Reconstruct a free-form prompt into actionable AC + assumptions + confidence band before the engine plans |
21
+ | [`/work`](../.agent-src/commands/work.md) | Drive a free-form prompt end-to-end through refine → score → plan → implement → test → verify → report |
22
+ | [`/grill-me`](../.agent-src/commands/grill-me.md) | Interactive grill-style interview that sharpens a fuzzy plan / idea into a copyable Markdown pitch |
23
+ | [`/optimize-prompt`](../.agent-src/commands/optimize-prompt.md) | Optimize a raw prompt for ChatGPT / Claude / Gemini via the 4-D methodology |
24
+ | [`decision-record`](../.agent-src/skills/decision-record/SKILL.md) | Lock a trade-off — options · trade-offs · consequences — before the ADR file is written |
25
+ | [`fundraising-narrative`](../.agent-src/skills/fundraising-narrative/SKILL.md) | Why-now / why-us / why-this framing, market-size reasoning, traction-story construction |
26
+ | [`okr-tree-modeling`](../.agent-src/skills/okr-tree-modeling/SKILL.md) | Decompose a company objective into team OKRs; audit a draft tree for measurability and laddering |
27
+ | [`voc-extract`](../.agent-src/skills/voc-extract/SKILL.md) | Extract Voice-of-Customer themes from existing artefacts — GH issues, PR threads, Sentry patterns |
28
+ | [`dcf-modeling`](../.agent-src/skills/dcf-modeling/SKILL.md) | Valuation cognition for a CFO / finance-partner — DCF, WACC, terminal value, sensitivity |
29
+ | [`runway-cognition`](../.agent-src/skills/runway-cognition/SKILL.md) | Cash runway, burn shape, fundraise triggers, layoff-vs-cut-vs-grow decisions |
30
+
31
+ → Pack details: [`packages/founder-strategy/`](../packages/founder-strategy/) · Role guide: [`docs/getting-started-by-role.md#founder`](getting-started-by-role.md#founder-early-stage-operator-wearing-every-hat)
32
+
33
+ ---
34
+
35
+ ## Featured for Content Creators
36
+
37
+ **Install:** `npx -y @event4u/agent-config init --pack ai-video`
38
+ (Writers / marketers without video: pair with `--pack gtm-marketing` for editorial / brand tooling.)
39
+
40
+ **You reach for this when:** you draft blog posts, marketing emails, launch copy, release announcements, or produce AI-generated video — and need brand-voice discipline plus a cinematic-grade prompting pipeline more than code-quality enforcement.
41
+
42
+ | Artefact | What it does |
43
+ |---|---|
44
+ | [`/video:from-script`](../.agent-src/commands/video/from-script.md) | End-to-end pipeline: script → character-locked image → motion + audio prompt → provider render → stitched clip |
45
+ | [`/video:scene`](../.agent-src/commands/video/scene.md) | Render a single scene from an existing blueprint against the configured provider adapter |
46
+ | [`/video:storyboard`](../.agent-src/commands/video/storyboard.md) | Expand a one-line idea into the 12-block Cinematic Scene Blueprint (provider-agnostic) |
47
+ | [`pixar-storyteller`](../.agent-src/skills/pixar-storyteller/SKILL.md) | Turn an idea into a Pixar-style animation prompt — character sheet, scene, image, video — anchored in emotional beat, want, obstacle |
48
+ | [`motion-choreographer`](../.agent-src/skills/motion-choreographer/SKILL.md) | Turn a locked still + blueprint into a provider-tuned motion prompt — camera, primary + secondary motion, physics, native-audio sync |
49
+ | [`canvas-design`](../.agent-src/skills/canvas-design/SKILL.md) | Create static visual art — posters, marketing visuals, brand assets, PDF / PNG design pieces |
50
+ | [`voice-and-tone-design`](../.agent-src/skills/voice-and-tone-design/SKILL.md) | Define and audit brand voice — voice attributes, tone-by-context matrix, consistency review |
51
+ | [`editorial-calendar`](../.agent-src/skills/editorial-calendar/SKILL.md) | Cadence shape — evergreen vs campaign vs reactive, beat-mapping across channel stages, content-debt management |
52
+
53
+ `AIV_DRYRUN=true` is the mandatory default for video pipelines — no provider call, no spend until you opt in.
54
+
55
+ → Pack details: [`packages/ai-video/`](../packages/ai-video/) · Role guide: [`docs/getting-started-by-role.md#creator`](getting-started-by-role.md#creator-writer-marketer-indie-content-shop)
56
+
57
+ ---
58
+
59
+ ## Featured for Engineering Leads
60
+
61
+ **Install:** `npx -y @event4u/agent-config init --pack engineering-base`
62
+ (Stack-specific add-ons: `--pack laravel`, `--pack nextjs`, `--pack symfony`, `--pack react`, `--pack typescript`.)
63
+
64
+ **You reach for this when:** you write code daily and want testing / quality / git / CI / security guardrails baked into the agent's behavior — covering both the daily loop (`/work`, `/commit`) and the review surface (`/review-changes`, judges).
65
+
66
+ | Artefact | What it does |
67
+ |---|---|
68
+ | [`/work`](../.agent-src/commands/work.md) | Free-form prompt end-to-end loop — refine → plan → implement → test → verify, confidence-band gated |
69
+ | [`/implement-ticket`](../.agent-src/commands/implement-ticket.md) | Drive a Jira / Linear ticket end-to-end — same loop, ticket-anchored |
70
+ | [`/review-changes`](../.agent-src/commands/review-changes.md) | Self-review local changes before creating a PR — dispatches to five specialized judges and consolidates verdicts |
71
+ | [`/commit`](../.agent-src/commands/commit.md) | Stage and commit all uncommitted changes — splits into logical commits following Conventional Commits |
72
+ | [`judge-bug-hunter`](../.agent-src/skills/judge-bug-hunter/SKILL.md) | Correctness review — null-safety, edge cases, off-by-one, races, error handling |
73
+ | [`judge-code-quality`](../.agent-src/skills/judge-code-quality/SKILL.md) | Readability review — naming, single-responsibility, DRY, dead code, codebase-convention drift |
74
+ | [`judge-security-auditor`](../.agent-src/skills/judge-security-auditor/SKILL.md) | Security review — authZ, injection, secrets, unsafe deserialization, SSRF, XSS, mass assignment |
75
+ | [`judge-test-coverage`](../.agent-src/skills/judge-test-coverage/SKILL.md) | Test review — missing assertions, uncovered branches, over-mocking, regression coverage |
76
+ | [`playwright-architect`](../.agent-src/skills/playwright-architect/SKILL.md) | Shape a Playwright suite — locator strategy, Page Object boundaries, fixture composition, flake prevention |
77
+ | [`threat-modeling`](../.agent-src/skills/threat-modeling/SKILL.md) | Pre-implementation threat model — trust boundaries + abuse cases mapped to files, BEFORE the first line of code |
78
+
79
+ → Pack details: [`packages/engineering-base/`](../packages/engineering-base/) · Role guide: [`docs/getting-started-by-role.md#developer`](getting-started-by-role.md#developer-the-original-audience)
80
+
81
+ ---
82
+
83
+ ## Lint contract
84
+
85
+ Every entry above MUST resolve in [`dist/discovery/discovery-manifest.json`](../dist/discovery/discovery-manifest.json). The check is automated:
86
+
87
+ ```bash
88
+ task lint-featured-skills
89
+ # or directly:
90
+ python3 scripts/lint_featured_skills.py
91
+ ```
92
+
93
+ CI runs this in `taskfiles/ci-fast.yml`. Stale entries (renamed / removed skill or command) fail the build. See [`scripts/lint_featured_skills.py`](../scripts/lint_featured_skills.py) for the matcher.
94
+
95
+ → Browse all ~218 active skills: [`.agent-src/skills/`](../.agent-src/skills/) · all ~129 commands: [`.agent-src/commands/`](../.agent-src/commands/)
@@ -4,6 +4,8 @@
4
4
 
5
5
  `agent-config` ships ~210 skills, ~67 rules, and ~124 commands. You do not need all of them. Each role below filters to the slice that pays back in week one; the rest stays available and shows up on demand when a task references it.
6
6
 
7
+ > **Quickstart for every role.** Run `npx -y @event4u/agent-config init` — the browser wizard auto-launches and walks you through role, pack, and identity. Headless install path lives at [`docs/wizard.md`](wizard.md#headless--ci--no-browser). The wizard writes `.agent-settings.yml`, `.augment/`, and `.claude/` atomically; nothing leaves your disk.
8
+
7
9
  > **Eval-gated messaging note.** Until `task bench --corpus non-dev` reports `selection_accuracy >= 0.60` (step-12 Phase 1 exit), this page is documentation, not marketing. The skills listed below are the candidates the corpus tests against; their description quality is what the eval validates.
8
10
 
9
11
  ---
@@ -16,7 +18,9 @@
16
18
  - [`messaging-architecture`](../.agent-src/skills/messaging-architecture/SKILL.md) — primary message + supporting proofs + audience-by-message matrix.
17
19
  - [`editorial-calendar`](../.agent-src/skills/editorial-calendar/SKILL.md) — evergreen vs campaign vs reactive cadence across channels.
18
20
 
19
- ### Video
21
+ ### AI Video Pipeline
22
+
23
+ Cinematic-blueprint approach: the agent expands your script into a 12-block scene plan, locks a character identity, then drives the rendering provider you have chosen. Provider-agnostic and dry-run-by-default.
20
24
 
21
25
  - [`/video:from-script`](../.agent-src/commands/video/from-script.md) — end-to-end pipeline: script → character-locked image → motion+audio prompt → provider render → stitched clip.
22
26
  - [`/video:storyboard`](../.agent-src/commands/video/storyboard.md) — expand a one-line idea into the 12-block Cinematic Scene Blueprint (provider-agnostic).
@@ -26,6 +30,10 @@
26
30
 
27
31
  `AIV_DRYRUN=true` is the mandatory default — no provider call, no spend until you opt in.
28
32
 
33
+ **Try the first win →** [`pack-ai-video/FIRST_WIN.md`](../packages/pack-ai-video/FIRST_WIN.md) — one-line idea to a provider-tuned motion prompt in ~12 minutes.
34
+
35
+ > **What this is not:** the package does **not** host a video model. It orchestrates prompts against the provider you select (Veo, Kling, Sora, Runway, …). Trust level is set by the provider's adapter lifecycle tier — see [`provider-lifecycle-discipline`](../.agent-src/rules/provider-lifecycle-discipline.md). You pay the provider directly, the package never sees your API key.
36
+
29
37
  **Install path:** **MCP recommended.** Claude Desktop is the lowest-friction entry; no terminal required. See [`docs/mcp.md`](mcp.md). CLI install works too if you already use a code editor.
30
38
 
31
39
  ---
@@ -38,6 +46,8 @@
38
46
  - [`unit-economics-modeling`](../.agent-src/skills/unit-economics-modeling/SKILL.md) — CAC, LTV, payback, contribution margin per customer.
39
47
  - [`fundraising-narrative`](../.agent-src/skills/fundraising-narrative/SKILL.md) — why-now / why-us / why-this framing, market-size reasoning.
40
48
 
49
+ **Try the first win →** [`pack-founder-strategy/FIRST_WIN.md`](../packages/pack-founder-strategy/FIRST_WIN.md) — investor question reshaped into a defensible memo in ~10 minutes.
50
+
41
51
  **Install path:** **MCP for advisory work, CLI when you touch code.** Claude Desktop covers strategy / finance / narrative; CLI is needed only when you sit in the repo with the dev team.
42
52
 
43
53
  ---
@@ -74,6 +84,10 @@
74
84
  - [`deal-qualification-meddic`](../.agent-src/skills/deal-qualification-meddic/SKILL.md) — MEDDIC slots with evidence, inversion test, disqualification heuristic.
75
85
  - [`release-comms`](../.agent-src/skills/release-comms/SKILL.md) — value-not-feature framing, audience-segmented surfaces.
76
86
 
87
+ Use the AI Video skills (see [Creator → AI Video Pipeline](#ai-video-pipeline)) when you need a launch asset, not a documentary — 8-second hero clips, social cutdowns, or feature-announcement teasers.
88
+
89
+ **Try the first win →** [`pack-gtm-sales/FIRST_WIN.md`](../packages/pack-gtm-sales/FIRST_WIN.md) — single deal to a MEDDIC scorecard with inversion test in ~7 minutes.
90
+
77
91
  **Install path:** **MCP recommended.** GTM artifacts are documents, decks, and Notion pages; Claude Desktop is the natural home.
78
92
 
79
93
  ---
@@ -86,6 +100,10 @@
86
100
  - [`scenario-modeling`](../.agent-src/skills/scenario-modeling/SKILL.md) — base / upside / downside, three-statement modeling, sensitivity.
87
101
  - [`privacy-review`](../.agent-src/skills/privacy-review/SKILL.md) — GDPR / CCPA / HIPAA fit, cross-border transfer, breach-impact triage.
88
102
 
103
+ Outputs are flagged for human-accountant review by default — the agent surfaces a trust banner on every forecast / scenario reply so downstream readers see the human-in-the-loop expectation. See [`finance-safety-floor`](../.agent-src/rules/finance-safety-floor.md).
104
+
105
+ **Try the first win →** [`pack-finance-basic/FIRST_WIN.md`](../packages/pack-finance-basic/FIRST_WIN.md) — runway question to a base/upside/downside narrative with trust banner in ~8 minutes. People-leaders running 1:1s: [`pack-ops-people/FIRST_WIN.md`](../packages/pack-ops-people/FIRST_WIN.md) — 1:1 cadence audit to a concrete recommendation in ~6 minutes.
106
+
89
107
  **Install path:** **MCP recommended.** Finance / ops workflows are spreadsheet- and document-heavy; the CLI buys nothing here unless you also export models into a code repo.
90
108
 
91
109
  ---
@@ -106,7 +106,7 @@ Your agent is now:
106
106
  - **Respecting your codebase** — no conflicting patterns
107
107
  - **Following standards** — consistent code quality
108
108
 
109
- This is enforced automatically by 72 rules. No configuration needed.
109
+ This is enforced automatically by 75 rules. No configuration needed.
110
110
 
111
111
  ---
112
112
 
@@ -146,7 +146,7 @@ Your agent now understands slash commands:
146
146
  | `/quality-fix` | Run and fix all quality checks |
147
147
  | `/chat-history` | Inspect the persistent chat-history log (read-only `show`) |
148
148
 
149
- → [Browse all 128 active commands](../.agent-src/commands/)
149
+ → [Browse all 129 active commands](../.agent-src/commands/)
150
150
 
151
151
  ---
152
152
 
@@ -86,14 +86,17 @@ intentionally pin an older version of the manifest.
86
86
 
87
87
  ## Scope migration
88
88
 
89
- Moving a tool between `project` and `global` is supported but loud:
90
-
91
- 1. Run `init --tools=<id> --scope=<new> --force`. The installer detects
92
- the conflict, warns, and rewrites the entry only when `--force` is
93
- present.
94
- 2. The old bridge is **not** removed automatically clean up the
95
- leftover marker yourself (`rm .windsurf/agent-config.md` etc.).
96
- 3. `validate` afterwards confirms the new state.
89
+ Under [ADR-020](../../decisions/ADR-020-global-only-consumer-scope.md)
90
+ global is the only consumer scope. Consumers carrying a pre-2.5
91
+ project-scope payload move to global with the one-shot
92
+ `npx @event4u/agent-config migrate-to-global` subcommand it copies
93
+ each tool's project payload into the matching user-scope path, drops
94
+ the bridge marker, and removes the legacy project artefacts.
95
+
96
+ For maintainers running `AGENT_CONFIG_DEV_MODE=1`, project-scope
97
+ re-installs remain available; the installer still detects scope
98
+ conflicts and refuses to rewrite without `--force`. `validate`
99
+ afterwards confirms the new state.
97
100
 
98
101
  Reasoning: scope is a project-wide decision; flipping it silently
99
102
  would surprise other team members who never asked for the change. The
@@ -142,9 +142,61 @@ in the other audience must find their link within the first screen too.
142
142
 
143
143
  ---
144
144
 
145
+ ## First-screen contract
146
+
147
+ The "first screen" is roughly the **first ~40 rendered lines** (one
148
+ laptop viewport on GitHub at default zoom). Every README must place
149
+ the following inside the first screen:
150
+
151
+ 1. **Project name** as `# H1`
152
+ 2. **One-sentence pitch** — what it is, who it's for
153
+ 3. **Status badges** (CI, version, license) when they exist
154
+ 4. **Primary CTA** — either the install command or an explicit deep
155
+ link to the install section
156
+ 5. **Audience marker** — at least a chip / sentence telling the reader
157
+ which audience this README is written for
158
+
159
+ What does **not** belong on the first screen: feature lists longer
160
+ than a single line, architecture diagrams, contributor notes, license
161
+ boilerplate.
162
+
163
+ The skills `readme-writing`, `readme-writing-package`, and
164
+ `readme-reviewer` enforce this checklist verbatim. Drift here is a
165
+ hard finding, not a stylistic preference.
166
+
167
+ ---
168
+
169
+ ## Banner / visual-identity preservation
170
+
171
+ When a README already carries a banner, hero image, badge row, or
172
+ official logo lockup, the rewrite must preserve it **byte-identical**
173
+ unless the user explicitly asks to change it. This includes:
174
+
175
+ - The `<p align="center">` / banner image block (with its surrounding
176
+ HTML and the source URL of the image asset)
177
+ - The status / npm / build badge block, including the exact badge
178
+ order if it was deliberate
179
+ - Any profile / role / persona grid that establishes audience routing
180
+
181
+ The re-analysis gate in each writing skill captures the exact line
182
+ range as `visual_keep:` in the evidence ledger; the rewrite must
183
+ echo those lines without paraphrase. If the badges' **counts** are
184
+ out of date, propose new counts via the link-delta / currency-check
185
+ output — do not silently rewrite the badge HTML to update numbers
186
+ without surfacing the diff.
187
+
188
+ Visual changes that are allowed without explicit user opt-in:
189
+
190
+ - Repointing a badge whose `href` 404s to its current location
191
+ - Repointing a banner image whose source path moved, when the file
192
+ is unambiguously the same asset
193
+
194
+ ---
195
+
145
196
  ## Validation checklist
146
197
 
147
- - [ ] First screen answers what / why / install
198
+ - [ ] First screen answers what / why / install (see *First-screen contract*)
199
+ - [ ] Banner / badge block preserved byte-identical (see *Banner / visual-identity preservation*)
148
200
  - [ ] Size is below the "overloaded" threshold, or splitting is in place
149
201
  - [ ] ToC present if > 150 lines or > 6 top-level sections
150
202
  - [ ] No duplication between README and `/docs/`
@@ -1,23 +1,27 @@
1
1
  # Installation
2
2
 
3
- **Principle:** Global-first install (cross-project, in `~/.claude/`,
4
- `~/.cursor/`, …), opt-in project export when a team wants the config
5
- committed to a repo. No Task, no Make, no build tools required.
6
-
7
- > **v2.1+** the installer detects intent. Running `npx
8
- > @event4u/agent-config init` in `~/` or any directory without a
9
- > project manifest defaults to **global**. Running it inside a project
10
- > (`package.json` / `composer.json` / `pyproject.toml` / etc.) defaults
11
- > to **project**. Pass `--scope=global` or `--scope=project` to override
12
- > detection. See `--scope` in the CLI help for the full matrix.
13
-
14
- A global install records itself in `~/.event4u/agent-config/installed.lock`
3
+ **Principle:** Global is the only consumer scope. `init` writes to
4
+ user-scope paths (`~/.event4u/agent-config/`, `~/.claude/`,
5
+ `~/.cursor/`, …); the project tree only gets `agents/overrides/`
6
+ and `agents/.event4u-bridge.yml`. Opt-in `export` if a team wants
7
+ a tool's config committed to a repo. No Task, no Make, no build
8
+ tools required.
9
+
10
+ > **v2.5+** `npx @event4u/agent-config init` always installs
11
+ > globally. The `--project` / `--scope=project` flag is no longer
12
+ > exposed to consumers; project-scope survives only behind the
13
+ > maintainer-only `AGENT_CONFIG_DEV_MODE=1` flag (see
14
+ > [`docs/maintainers/dev-mode.md`](maintainers/dev-mode.md)). The
15
+ > legacy `--global` flag is accepted as a no-op for back-compat.
16
+ > Rationale: [ADR-020](decisions/ADR-020-global-only-consumer-scope.md).
17
+
18
+ The install records itself in `~/.event4u/agent-config/installed.lock`
15
19
  (schema_version, agent_config_version, installed_at, tools[]; the legacy
16
20
  `~/.config/agent-config/installed.lock` is read as a fallback). `npx
17
21
  @event4u/agent-config update` keeps that manifest in lockstep
18
22
  with the project pin in `.agent-settings.yml`. A version-mismatched
19
- re-run of `init --scope=global` is refused with exit code 1 until you
20
- `update` or pass `--force`.
23
+ re-run of `init` is refused with exit code 1 until you `update` or
24
+ pass `--force`.
21
25
 
22
26
  To commit a specific tool's config into a project repo, use:
23
27
 
@@ -311,6 +315,15 @@ Under the hood:
311
315
 
312
316
  - `scripts/install.sh` — payload sync (callable directly for sync-only runs).
313
317
  - `scripts/install.py` — bridge files (callable directly for bridge-only runs).
318
+ Two install.py-specific flags worth knowing:
319
+ - `--dry-run` prints a plan summary (profile · scope · tools · target ·
320
+ wizard auto-launch decision) and exits 0 without writing files or
321
+ spawning subprocesses. Distinct from the bash wrapper's `--dry-run`,
322
+ which only skips bridges.
323
+ - `--no-ui` suppresses the post-install browser-wizard auto-launch.
324
+ Also honored via `AGENT_CONFIG_NO_UI=1`. CI runners (`CI=1`) and
325
+ non-TTY stdouts auto-suppress regardless. See
326
+ [`docs/wizard.md § Auto-launch`](wizard.md#auto-launch-from-npx--init).
314
327
 
315
328
  A full run creates:
316
329