wayfind 2.0.70 → 2.0.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,68 +1,55 @@
1
1
  # Wayfind
2
2
 
3
- **Team decision trail for AI-assisted development.**
3
+ **Team memory for AI-assisted engineering.**
4
4
 
5
- > AI makes individual engineers faster. Nobody has solved coherent, maintainable software built by a *team* over time. Every handoff loses context. Wayfind captures it.
5
+ Your AI coding assistant forgets everything between sessions. Wayfind gives it a memory for you and your whole team.
6
+
7
+ Plain markdown files. No infrastructure. Works with any MCP client.
6
8
 
7
9
  [![CI](https://github.com/usewayfind/wayfind/actions/workflows/ci.yml/badge.svg)](https://github.com/usewayfind/wayfind/actions/workflows/ci.yml)
8
- [![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
9
10
  [![npm](https://img.shields.io/npm/v/wayfind)](https://www.npmjs.com/package/wayfind)
11
+ [![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
10
12
 
11
- ---
12
-
13
- ## Install
14
-
15
- ### Claude Code plugin (recommended)
13
+ **Works with:** Claude Code | Cursor | Any MCP client
16
14
 
17
- In a Claude Code session:
15
+ ---
18
16
 
19
- ```
20
- /plugin marketplace add usewayfind/wayfind
21
- /plugin install wayfind@usewayfind
22
- ```
17
+ ## The Problem
23
18
 
24
- Then initialize a repo:
19
+ AI coding assistants are stateless. Every session starts cold. The decisions you made yesterday, the architecture you agreed on last week, the reason you chose Postgres over Mongo — gone. You re-explain, or the AI guesses wrong.
25
20
 
26
- ```
27
- /wayfind:init-memory
28
- ```
21
+ Now multiply that across a team. Five engineers, each with their own AI sessions, none of them aware of what the others decided. Your PM reads the standup notes, but the AI that writes the code doesn't.
29
22
 
30
- Your AI sessions now resume where you left off instead of cold-starting.
23
+ ## What Wayfind Does
31
24
 
32
- ### npm CLI
25
+ **For you:** Sessions resume where they left off. Decisions are extracted automatically and become searchable history. Drift detection flags when work veers from the stated goal.
33
26
 
34
- The plugin includes the CLI, but you can also install it standalone:
27
+ **For your team:** A daily digest summarizes what everyone shipped, decided, and discovered tailored per role (engineering, product, design, strategy). Team members who use AI tools get session memory directly. Everyone else gets a Slack digest.
35
28
 
36
- ```bash
37
- npm install -g wayfind
38
- wayfind init
39
- ```
29
+ **For your AI tools:** An MCP server exposes your team's full decision history as tools. Claude, Cursor, or any MCP client can search decisions, browse by date, and retrieve context — no file reading or guessing.
40
30
 
41
- The CLI is required for digest generation, Slack bot, signal connectors, and team management. The plugin handles session hooks and slash commands.
31
+ <!-- TODO: demo GIF here see #175 -->
42
32
 
43
33
  ---
44
34
 
45
- ## What It Does
35
+ ## Quick Start
46
36
 
47
- ### For You (solo engineer)
37
+ ### Option A: Claude Code plugin
48
38
 
49
- - **Persistent memory** — sessions pick up where the last one ended
50
- - **Automatic journal** — decisions and rationale extracted from every session
51
- - **Searchable history** — `wayfind search-journals "auth refactor"`
52
- - **Drift detection** — AI flags when work drifts from the stated goal
53
-
54
- ### For Your Team
55
-
56
- - **Digests** — weekly summaries tailored per role (engineering, product, design, strategy)
57
- - **Slack bot** — anyone on the team asks `@wayfind` and gets answers from the decision trail
58
- - **Signal connectors** — pull context from GitHub, Intercom, and Notion into digests
59
- - **Context shift detection** — surfaces significant pivots and architecture changes
39
+ ```
40
+ /plugin marketplace add usewayfind/wayfind
41
+ /plugin install wayfind@usewayfind
42
+ /wayfind:init-memory
43
+ ```
60
44
 
61
- Only the engineer installs anything. Everyone else sees a Slack digest.
45
+ ### Option B: npm (works with any AI tool)
62
46
 
47
+ ```bash
48
+ npm install -g wayfind
49
+ wayfind init
63
50
  ```
64
- /wayfind:init-team # Set up team context, journals, and digests
65
- ```
51
+
52
+ Your next AI session has memory. That's it.
66
53
 
67
54
  ---
68
55
 
@@ -85,118 +72,72 @@ All context is plain markdown in directories you control:
85
72
 
86
73
  No proprietary formats. No vendor lock-in. `grep` works if Wayfind breaks.
87
74
 
88
- ### The Session Protocol
89
-
90
- **Start:** AI reads state files, summarizes context, asks "What's the goal?"
91
-
92
- **Mid-session:** If work drifts from the goal, the AI flags it.
75
+ ### The Session Loop
93
76
 
94
- **End:** Decisions are extracted, written as journal entries, and synced to the team repo — automatically via hooks.
77
+ 1. **Start** AI reads state files, summarizes context, asks "What's the goal?"
78
+ 2. **Mid-session** — If work drifts from the goal, the AI flags it.
79
+ 3. **End** — Decisions are extracted, written as journal entries, and synced to the team repo — automatically via hooks.
95
80
 
96
- ### Digests
81
+ ### Team Digests
97
82
 
98
- Each role sees the same underlying data through a different lens:
83
+ Each role sees the same data through a different lens:
99
84
 
100
- - **Engineering**: What shipped, what drifted, patterns
85
+ - **Engineering**: What shipped, what drifted, what patterns emerged
101
86
  - **Product**: What shipped vs. planned, discovery signals
102
- - **Design**: UX decisions, implementation gaps vs. design intent
103
87
  - **Strategy**: Cross-team patterns, drift trends, capability gaps
104
88
 
105
- ### Signal Connectors
89
+ The digest posts to Slack. Anyone on the team — engineer, PM, CEO — who uses an AI tool gets session memory. Everyone else gets the digest.
106
90
 
107
- ```bash
108
- wayfind pull github # Issues, PRs, Actions status
109
- wayfind pull intercom # Support conversations, tags, response times
110
- wayfind pull notion # Pages, databases, comments
111
- wayfind pull --all # All configured channels
112
- ```
91
+ ### MCP Server
113
92
 
114
- ---
93
+ Wayfind includes an MCP server that exposes team context to any MCP-compatible AI tool. Auto-registered during `wayfind init`.
115
94
 
116
- ## Commands
117
-
118
- ### Plugin skills (in Claude Code)
119
-
120
- | Skill | Description |
121
- |-------|-------------|
122
- | `/wayfind:init-memory` | Initialize context for the current repo |
123
- | `/wayfind:init-team` | Set up team context, journals, and digests |
124
- | `/wayfind:doctor` | Check installation health |
125
- | `/wayfind:standup` | Daily standup summary |
126
- | `/wayfind:journal` | Weekly journal digest and drift detection |
127
- | `/wayfind:review-prs` | Review overnight PRs |
128
-
129
- ### CLI commands
130
-
131
- | Command | Description |
132
- |---------|-------------|
133
- | `wayfind init` | Install for your AI tool |
134
- | `wayfind doctor` | Check installation health |
135
- | `wayfind update` | Update hooks and commands |
136
- | `wayfind status` | Cross-project status |
137
- | `wayfind team create` | Create a new team |
138
- | `wayfind team join` | Join an existing team |
139
- | `wayfind digest` | Generate persona-specific digests |
140
- | `wayfind digest --deliver` | Generate and post to Slack |
141
- | `wayfind bot` | Start the Slack bot |
142
- | `wayfind reindex` | Index journals + conversations |
143
- | `wayfind search-journals <q>` | Search decision history |
144
- | `wayfind pull <channel>` | Pull signals from a source |
145
- | `wayfind journal sync` | Sync journals to team repo |
146
- | `wayfind onboard <repo>` | Generate onboarding context pack |
147
- | `wayfind deploy init` | Scaffold Docker deployment |
148
- | `wayfind deploy --team <id>` | Scaffold per-team Docker deployment |
149
- | `wayfind deploy set-endpoint <url>` | Set container endpoint for team search |
150
- | `wayfind deploy list` | List running team containers |
151
- | `wayfind deploy status` | Check container health |
152
- | `wayfind migrate-to-plugin` | Remove old hooks (after plugin install) |
153
-
154
- Run `wayfind help` for the full list.
95
+ **Tools:**
155
96
 
156
- ---
97
+ | Tool | What it does |
98
+ |------|-------------|
99
+ | `search_context` | Search decisions by query, date range, author, or repo. Semantic or browse mode. |
100
+ | `get_entry` | Retrieve the full content of a specific entry. |
101
+ | `get_signals` | Recent GitHub, Intercom, and Notion activity. |
102
+ | `get_team_status` | Current team state: who's working on what, active projects, blockers. |
103
+ | `add_context` | Capture a decision or blocker from the current session. |
104
+ | `record_feedback` | Rate whether a result was useful (improves future retrieval). |
157
105
 
158
- ## MCP Server
106
+ Each team member's MCP server searches their local content store — journals synced from the shared team repo, with local embeddings generated automatically. No infrastructure required.
159
107
 
160
- Wayfind includes an MCP server (`wayfind-mcp`) that exposes team context to any MCP-compatible AI tool.
108
+ ---
161
109
 
162
- **Tools:** `search_context`, `get_entry`, `list_recent`, `get_signals`, `get_team_status`, `get_personas`, `record_feedback`, `add_context`
110
+ ## Signal Connectors
163
111
 
164
- Auto-registered during `wayfind init`. When a team container is running, the local MCP server proxies semantic search to it automatically — no config needed beyond the team-context repo.
112
+ Pull external context into digests:
165
113
 
166
- ---
167
-
168
- ## Environment Variables
114
+ ```bash
115
+ wayfind pull github # Issues, PRs, Actions status
116
+ wayfind pull intercom # Support conversations, tags, response times
117
+ wayfind pull notion # Pages, databases, comments
118
+ wayfind pull --all # All configured channels
119
+ ```
169
120
 
170
- ### For digests and bot
121
+ ---
171
122
 
172
- | Variable | Description |
173
- |----------|-------------|
174
- | `ANTHROPIC_API_KEY` | Digest generation and bot answers |
175
- | `SLACK_BOT_TOKEN` | Slack bot token (`xoxb-...`) |
176
- | `SLACK_APP_TOKEN` | Slack app-level token (`xapp-...`) |
177
- | `GITHUB_TOKEN` | Signal data and journal sync |
123
+ ## Team Setup
178
124
 
179
- ### Optional
125
+ ```
126
+ /wayfind:init-team
127
+ ```
180
128
 
181
- | Variable | Description |
182
- |----------|-------------|
183
- | `OPENAI_API_KEY` | Upgrade semantic search to OpenAI embeddings (Xenova local model is used by default — no key needed) |
184
- | `TEAM_CONTEXT_LLM_MODEL` | LLM for digests (default: `claude-sonnet-4-5-20250929`) |
185
- | `TEAM_CONTEXT_DIGEST_SCHEDULE` | Cron schedule (default: `0 8 * * 1` — Monday 8am) |
186
- | `TEAM_CONTEXT_EXCLUDE_REPOS` | Repos to exclude from digests |
187
- | `TEAM_CONTEXT_TELEMETRY` | `true` for anonymous usage telemetry |
129
+ This walks you through creating a team, setting up profiles, creating a shared team-context repo, and configuring Slack digest delivery. Multi-team support built in — bind repos to different teams, each with isolated context.
188
130
 
189
131
  ---
190
132
 
191
133
  ## Tool Support
192
134
 
193
- | Tool | Status | Setup |
194
- |------|--------|-------|
195
- | Claude Code | Full support (plugin) | `/plugin marketplace add usewayfind/wayfind` |
196
- | Claude Code | Full support (npm) | `wayfind init` |
197
- | Cursor | Session protocol | `wayfind init-cursor` |
198
- | Generic | Manual | See `specializations/generic/` |
199
- | Any MCP client | Full support (MCP) | `wayfind init` auto-registers |
135
+ | Tool | How | Setup |
136
+ |------|-----|-------|
137
+ | **Claude Code** | Plugin (full support) | `/plugin marketplace add usewayfind/wayfind` |
138
+ | **Cursor** | MCP server | `wayfind init` auto-registers |
139
+ | **Any MCP client** | MCP server | `wayfind init` auto-registers |
140
+ | **Slack** | Bot + digests | `wayfind bot --configure` |
200
141
 
201
142
  ---
202
143
 
@@ -206,27 +147,23 @@ Everything that runs on your machine is open source (Apache 2.0).
206
147
 
207
148
  | Open Source (this repo) | Commercial (future) |
208
149
  |---|---|
209
- | CLI and all commands | Cloud-hosted team aggregation |
150
+ | CLI, plugin, and all commands | Cloud-hosted team aggregation |
210
151
  | Session protocol and journal extraction | Managed digest delivery |
211
- | Content store and search | Web dashboard |
152
+ | Content store, semantic search, MCP server | Web dashboard |
212
153
  | Signal connectors (GitHub, Intercom, Notion) | SSO and tenant isolation |
213
154
  | Digest generation (your API key) | |
214
155
  | Slack bot (self-hosted) | |
215
156
  | Multi-team support | |
216
- | MCP server (local + container proxy) | |
217
- | Per-team content store isolation | |
218
-
219
- See [LICENSING.md](LICENSING.md) for details.
220
157
 
221
158
  ---
222
159
 
223
160
  ## Architecture
224
161
 
225
162
  - [Data Flow](docs/architecture/data-flow.md) — sessions to digests
226
- - [Principles](docs/architecture/architecture-principles.md) — the eight constraints
163
+ - [Query Path](docs/architecture/query-path.md) — how queries reach the content store
227
164
  - [Content Store](docs/architecture/content-store.md) — indexing, search, schema
165
+ - [Principles](docs/architecture/architecture-principles.md) — the eight constraints
228
166
  - [Signal Channels](docs/architecture/architecture-signal-channels.md) — connector architecture
229
- - [Signal Roadmap](docs/architecture/signal-source-roadmap.md) — planned connectors
230
167
 
231
168
  ---
232
169
 
@@ -242,4 +179,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md). Good first contributions:
242
179
 
243
180
  ## License
244
181
 
245
- Apache 2.0. See [LICENSE](LICENSE) and [LICENSING.md](LICENSING.md).
182
+ Apache 2.0. See [LICENSE](LICENSE).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wayfind",
3
- "version": "2.0.70",
3
+ "version": "2.0.72",
4
4
  "description": "Team decision trail for AI-assisted development. The connective tissue between product, engineering, and strategy.",
5
5
  "bin": {
6
6
  "wayfind": "./bin/team-context.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wayfind",
3
- "version": "2.0.70",
3
+ "version": "2.0.72",
4
4
  "description": "Team decision trail for AI-assisted development. Session memory, decision journals, and team digests.",
5
5
  "author": {
6
6
  "name": "Wayfind",
package/setup.sh CHANGED
@@ -145,7 +145,6 @@ if [ ! -d "$SPEC_DIR" ]; then
145
145
  fi
146
146
 
147
147
  echo ""
148
- echo "Installing Wayfind for: $TOOL"
149
148
  [ "$DRY_RUN" = true ] && warn "Dry-run mode — no files will be modified"
150
149
  [ "$UPDATE" = true ] && warn "Update mode: overwriting hook scripts and commands (memory files untouched)"
151
150
 
@@ -184,23 +183,24 @@ case "$TOOL" in
184
183
  ;;
185
184
  esac
186
185
 
187
- # ── Step 1: Directories ────────────────────────────────────────────────────────
186
+ # ── Counters for aggregate output ─────────────────────────────────────────────
187
+
188
+ CONFIG_FILES=0
189
+ HOOKS_INSTALLED=0
190
+ COMMANDS_INSTALLED=0
191
+ MCP_OK=false
188
192
 
189
- header "Creating directories"
193
+ # ── Step 1: Directories ────────────────────────────────────────────────────────
190
194
 
191
195
  run mkdir -p "$MEMORY_SUBDIR/journal"
192
- log "Memory directories: $MEMORY_SUBDIR/journal"
193
196
 
194
197
  if [ "$TOOL" = "claude-code" ]; then
195
198
  run mkdir -p "$HOME/.claude/hooks"
196
199
  run mkdir -p "$HOME/.claude/commands"
197
- log "Claude Code hooks and commands directories"
198
200
  fi
199
201
 
200
202
  # ── Step 2: Global state file ─────────────────────────────────────────────────
201
203
 
202
- header "Global state file"
203
-
204
204
  if [ ! -f "$GLOBAL_STATE" ]; then
205
205
  if [ "$TOOL" = "claude-code" ]; then
206
206
  if [ "$DRY_RUN" = false ]; then
@@ -214,30 +214,18 @@ if [ ! -f "$GLOBAL_STATE" ]; then
214
214
  else
215
215
  run cp "$SCRIPT_DIR/templates/global.md" "$GLOBAL_STATE"
216
216
  fi
217
- log "Created $GLOBAL_STATE"
218
- warn "Edit $GLOBAL_STATE to add your name, preferences, and projects"
219
- else
220
- info "Already exists: $GLOBAL_STATE — skipped"
217
+ CONFIG_FILES=$((CONFIG_FILES + 1))
221
218
  fi
222
219
 
223
220
  # ── Step 3: Admin state file (team/personal split) ───────────────────────────
224
- # For team repos, use templates/team-state.md (committed, shared context).
225
- # For personal notes, use templates/personal-state.md (gitignored, private).
226
- # The admin state file at ADMIN_STATE is the non-repo catch-all (email, admin, misc).
227
-
228
- header "Admin state file"
229
221
 
230
222
  if [ ! -f "$ADMIN_STATE" ]; then
231
223
  run cp "$SCRIPT_DIR/templates/repo-state.md" "$ADMIN_STATE"
232
- log "Created $ADMIN_STATE"
233
- else
234
- info "Already exists: $ADMIN_STATE — skipped"
224
+ CONFIG_FILES=$((CONFIG_FILES + 1))
235
225
  fi
236
226
 
237
227
  # ── Step 3b: Persona configuration ────────────────────────────────────────────
238
228
 
239
- header "Persona configuration"
240
-
241
229
  case "$TOOL" in
242
230
  claude-code) PERSONAS_DIR="$HOME/.claude/team-context" ;;
243
231
  *) PERSONAS_DIR="$HOME/.ai-memory/team-context" ;;
@@ -247,15 +235,11 @@ PERSONAS_DEST="$PERSONAS_DIR/personas.json"
247
235
  if [ ! -f "$PERSONAS_DEST" ]; then
248
236
  run mkdir -p "$PERSONAS_DIR"
249
237
  run cp "$SCRIPT_DIR/templates/personas.json" "$PERSONAS_DEST"
250
- log "Created $PERSONAS_DEST (default personas — edit to customize)"
251
- else
252
- info "Already exists: $PERSONAS_DEST — skipped (your customizations are preserved)"
238
+ CONFIG_FILES=$((CONFIG_FILES + 1))
253
239
  fi
254
240
 
255
241
  # ── Step 4: Tool-specific files ───────────────────────────────────────────────
256
242
 
257
- header "Tool-specific files ($TOOL)"
258
-
259
243
  case "$TOOL" in
260
244
  claude-code)
261
245
  # Global CLAUDE.md fragment
@@ -264,9 +248,10 @@ case "$TOOL" in
264
248
  info "[dry-run] Would append Session State Protocol to $GLOBAL_CLAUDE_MD"
265
249
  else
266
250
  touch "$GLOBAL_CLAUDE_MD"
267
- append_if_missing "Session State Protocol" \
268
- "$(cat "$SPEC_DIR/CLAUDE.md-global-fragment.md")" \
269
- "$GLOBAL_CLAUDE_MD"
251
+ if ! grep -qF "Session State Protocol" "$GLOBAL_CLAUDE_MD" 2>/dev/null; then
252
+ cat "$SPEC_DIR/CLAUDE.md-global-fragment.md" >> "$GLOBAL_CLAUDE_MD"
253
+ CONFIG_FILES=$((CONFIG_FILES + 1))
254
+ fi
270
255
  fi
271
256
  fi
272
257
 
@@ -275,88 +260,63 @@ case "$TOOL" in
275
260
  if [ ! -f "$HOOK_DEST" ] || [ "$UPDATE" = true ]; then
276
261
  run cp "$SPEC_DIR/hooks/check-global-state.sh" "$HOOK_DEST"
277
262
  run chmod +x "$HOOK_DEST"
278
- log "Installed hook: $HOOK_DEST"
279
- else
280
- info "Hook already exists: $HOOK_DEST — skipped"
263
+ HOOKS_INSTALLED=$((HOOKS_INSTALLED + 1))
281
264
  fi
282
265
 
283
266
  SESSION_END_DEST="$HOME/.claude/hooks/session-end.sh"
284
267
  if [ ! -f "$SESSION_END_DEST" ] || [ "$UPDATE" = true ]; then
285
268
  run cp "$SPEC_DIR/hooks/session-end.sh" "$SESSION_END_DEST"
286
269
  run chmod +x "$SESSION_END_DEST"
287
- log "Installed hook: $SESSION_END_DEST"
288
- else
289
- info "Hook already exists: $SESSION_END_DEST — skipped"
270
+ HOOKS_INSTALLED=$((HOOKS_INSTALLED + 1))
290
271
  fi
291
272
 
292
- # init-memory command
273
+ # Commands
293
274
  CMD_DEST="$HOME/.claude/commands/init-memory.md"
294
275
  if [ ! -f "$CMD_DEST" ] || [ "$UPDATE" = true ]; then
295
276
  run cp "$SPEC_DIR/commands/init-memory.md" "$CMD_DEST"
296
- log "Installed command: /init-memory"
297
- else
298
- info "/init-memory command already exists — skipped"
277
+ COMMANDS_INSTALLED=$((COMMANDS_INSTALLED + 1))
299
278
  fi
300
279
 
301
- # doctor command
302
280
  DOCTOR_CMD_DEST="$HOME/.claude/commands/doctor.md"
303
281
  if [ ! -f "$DOCTOR_CMD_DEST" ] || [ "$UPDATE" = true ]; then
304
282
  run cp "$SPEC_DIR/commands/doctor.md" "$DOCTOR_CMD_DEST"
305
- log "Installed command: /doctor"
306
- else
307
- info "/doctor command already exists — skipped"
283
+ COMMANDS_INSTALLED=$((COMMANDS_INSTALLED + 1))
308
284
  fi
309
285
 
310
- # doctor.sh script
286
+ # Support scripts
311
287
  run mkdir -p "$HOME/.claude/team-context"
312
288
  DOCTOR_DEST="$HOME/.claude/team-context/doctor.sh"
313
289
  if [ ! -f "$DOCTOR_DEST" ] || [ "$UPDATE" = true ]; then
314
290
  run cp "$SCRIPT_DIR/doctor.sh" "$DOCTOR_DEST"
315
291
  run chmod +x "$DOCTOR_DEST"
316
- log "Installed doctor script: $DOCTOR_DEST"
317
- else
318
- info "doctor.sh already exists: $DOCTOR_DEST — skipped"
319
292
  fi
320
293
 
321
- # journal-summary.sh script
322
294
  JOURNAL_DEST="$HOME/.claude/team-context/journal-summary.sh"
323
295
  if [ ! -f "$JOURNAL_DEST" ] || [ "$UPDATE" = true ]; then
324
296
  run cp "$SCRIPT_DIR/journal-summary.sh" "$JOURNAL_DEST"
325
297
  run chmod +x "$JOURNAL_DEST"
326
- log "Installed journal summary script: $JOURNAL_DEST"
327
- else
328
- info "journal-summary.sh already exists: $JOURNAL_DEST — skipped"
329
298
  fi
330
299
 
331
- # /journal command
332
300
  JOURNAL_CMD_DEST="$HOME/.claude/commands/journal.md"
333
301
  if [ ! -f "$JOURNAL_CMD_DEST" ] || [ "$UPDATE" = true ]; then
334
302
  run cp "$SPEC_DIR/commands/journal.md" "$JOURNAL_CMD_DEST"
335
- log "Installed command: /journal"
336
- else
337
- info "/journal command already exists — skipped"
303
+ COMMANDS_INSTALLED=$((COMMANDS_INSTALLED + 1))
338
304
  fi
339
305
 
340
- # /init-team command
341
306
  TEAM_CMD_DEST="$HOME/.claude/commands/init-team.md"
342
307
  if [ ! -f "$TEAM_CMD_DEST" ] || [ "$UPDATE" = true ]; then
343
308
  if [ -f "$SPEC_DIR/commands/init-team.md" ]; then
344
309
  run cp "$SPEC_DIR/commands/init-team.md" "$TEAM_CMD_DEST"
345
- log "Installed command: /init-team"
310
+ COMMANDS_INSTALLED=$((COMMANDS_INSTALLED + 1))
346
311
  fi
347
- else
348
- info "/init-team command already exists — skipped"
349
312
  fi
350
313
 
351
- # /review-prs command
352
314
  REVIEW_CMD_DEST="$HOME/.claude/commands/review-prs.md"
353
315
  if [ ! -f "$REVIEW_CMD_DEST" ] || [ "$UPDATE" = true ]; then
354
316
  if [ -f "$SPEC_DIR/commands/review-prs.md" ]; then
355
317
  run cp "$SPEC_DIR/commands/review-prs.md" "$REVIEW_CMD_DEST"
356
- log "Installed command: /review-prs"
318
+ COMMANDS_INSTALLED=$((COMMANDS_INSTALLED + 1))
357
319
  fi
358
- else
359
- info "/review-prs command already exists — skipped"
360
320
  fi
361
321
 
362
322
  # settings.json — merge hooks, don't overwrite
@@ -366,7 +326,7 @@ case "$TOOL" in
366
326
 
367
327
  if [ ! -f "$SETTINGS" ]; then
368
328
  run cp "$SPEC_DIR/settings.json" "$SETTINGS"
369
- log "Created $SETTINGS with hook registration"
329
+ CONFIG_FILES=$((CONFIG_FILES + 1))
370
330
  else
371
331
  # Merge both hooks into existing settings.json using Python
372
332
  NEEDS_MERGE=false
@@ -427,7 +387,6 @@ with open(out_path, "w") as f:
427
387
  f.write("\n")
428
388
  PYEOF
429
389
  mv "$TMP_SETTINGS" "$SETTINGS"
430
- log "Merged hooks into existing $SETTINGS"
431
390
  else
432
391
  rm -f "$TMP_SETTINGS"
433
392
  warn "Could not auto-merge hooks into $SETTINGS (malformed JSON or python3 unavailable)."
@@ -436,8 +395,6 @@ PYEOF
436
395
  else
437
396
  info "[dry-run] Would merge hooks into $SETTINGS"
438
397
  fi
439
- else
440
- info "Hooks already registered in settings.json — skipped"
441
398
  fi
442
399
  fi
443
400
 
@@ -470,20 +427,19 @@ with open(out_path, "w") as f:
470
427
  f.write("\n")
471
428
  PYEOF
472
429
  mv "$TMP_SETTINGS" "$SETTINGS"
473
- log "Registered wayfind MCP server in ~/.claude/settings.json"
430
+ MCP_OK=true
474
431
  else
475
432
  rm -f "$TMP_SETTINGS"
476
- warn "Could not register MCP server — add manually to ~/.claude/settings.json:"
477
- warn " \"mcpServers\": { \"wayfind\": { \"command\": \"$MCP_BIN\" } }"
433
+ warn "Could not register MCP server — add manually to ~/.claude/settings.json"
478
434
  fi
479
435
  else
480
436
  info "[dry-run] Would register wayfind MCP server ($MCP_BIN) in $SETTINGS"
481
437
  fi
482
438
  else
483
- info "MCP server already registered in settings.json — skipped"
439
+ MCP_OK=true
484
440
  fi
485
441
  else
486
- warn "wayfind-mcp binary not found — skipping MCP registration. Re-run after npm install."
442
+ warn "wayfind-mcp not found — MCP registration skipped. Re-run setup after npm install."
487
443
  fi
488
444
 
489
445
  ;;
@@ -494,9 +450,7 @@ PYEOF
494
450
  GLOBAL_RULE="$HOME/.cursor/rules/ai-memory.mdc"
495
451
  if [ ! -f "$GLOBAL_RULE" ] || [ "${UPDATE:-false}" = true ]; then
496
452
  run cp "$SPEC_DIR/global-rule.mdc" "$GLOBAL_RULE"
497
- log "Installed global Cursor rule: $GLOBAL_RULE"
498
- else
499
- info "Global Cursor rule already exists — skipped"
453
+ CONFIG_FILES=$((CONFIG_FILES + 1))
500
454
  fi
501
455
 
502
456
  # Per-repo rule (if --repo was passed)
@@ -506,8 +460,7 @@ PYEOF
506
460
  run mkdir -p "$RULE_DIR"
507
461
  if [ ! -f "$RULE_DIR/memory.mdc" ] || [ "${UPDATE:-false}" = true ]; then
508
462
  run cp "$SPEC_DIR/repo-rule.mdc" "$RULE_DIR/memory.mdc"
509
- log "Installed repo rule: $RULE_DIR/memory.mdc"
510
- warn "Edit $RULE_DIR/memory.mdc to add repo name and initial status"
463
+ CONFIG_FILES=$((CONFIG_FILES + 1))
511
464
  else
512
465
  info "Repo rule already exists — skipped"
513
466
  fi
@@ -531,7 +484,7 @@ PYEOF
531
484
  if [ "$DRY_RUN" = false ]; then
532
485
  if [ ! -f "$CURSOR_MCP" ]; then
533
486
  printf '{\n "mcpServers": {\n "wayfind": {\n "command": "%s",\n "args": []\n }\n }\n}\n' "$CURSOR_MCP_BIN" > "$CURSOR_MCP"
534
- log "Created ~/.cursor/mcp.json with wayfind MCP server"
487
+ MCP_OK=true
535
488
  else
536
489
  TMP_MCP="$(mktemp)"
537
490
  if python3 - "$CURSOR_MCP" "$CURSOR_MCP_BIN" "$TMP_MCP" <<'PYEOF' 2>/dev/null; then
@@ -550,21 +503,20 @@ with open(out_path, "w") as f:
550
503
  f.write("\n")
551
504
  PYEOF
552
505
  mv "$TMP_MCP" "$CURSOR_MCP"
553
- log "Registered wayfind MCP server in ~/.cursor/mcp.json"
506
+ MCP_OK=true
554
507
  else
555
508
  rm -f "$TMP_MCP"
556
- warn "Could not register MCP server — add manually to ~/.cursor/mcp.json:"
557
- warn " \"mcpServers\": { \"wayfind\": { \"command\": \"$CURSOR_MCP_BIN\", \"args\": [] } }"
509
+ warn "Could not register MCP server — add manually to ~/.cursor/mcp.json"
558
510
  fi
559
511
  fi
560
512
  else
561
513
  info "[dry-run] Would register wayfind MCP server ($CURSOR_MCP_BIN) in ~/.cursor/mcp.json"
562
514
  fi
563
515
  else
564
- info "MCP server already registered in ~/.cursor/mcp.json — skipped"
516
+ MCP_OK=true
565
517
  fi
566
518
  else
567
- warn "wayfind-mcp binary not found — skipping Cursor MCP registration. Re-run after npm install."
519
+ warn "wayfind-mcp not found — MCP registration skipped. Re-run setup after npm install."
568
520
  fi
569
521
  ;;
570
522
 
@@ -592,7 +544,6 @@ if [ -n "$INSTALL_VERSION" ]; then
592
544
  TMP_VER="$(mktemp)"
593
545
  echo "$INSTALL_VERSION" > "$TMP_VER"
594
546
  mv "$TMP_VER" "$VERSION_DEST"
595
- log "Version v${INSTALL_VERSION} written to $VERSION_DEST"
596
547
  else
597
548
  info "[dry-run] Would write v${INSTALL_VERSION} to $KIT_DEST_DIR/.wayfind-version"
598
549
  fi
@@ -656,40 +607,43 @@ Do not ask more than once per decision. Do not ask during routine implementation
656
607
  fi
657
608
  fi
658
609
 
659
- # ── Step 7: Personas (informational) ─────────────────────────────────────────
660
-
661
- header "Personas"
610
+ # ── Summary ──────────────────────────────────────────────────────────────────
662
611
 
663
612
  echo ""
664
- echo " Default personas: Product, Design, Engineering, Strategy"
665
- echo " You can customize personas later with 'wayfind personas'"
666
- echo ""
667
-
668
- # ── Step 8: Summary ───────────────────────────────────────────────────────────
669
613
 
670
- header "Done"
614
+ # Aggregate summary of what was installed
615
+ SUMMARY_PARTS=""
616
+ [ "$CONFIG_FILES" -gt 0 ] && SUMMARY_PARTS="${SUMMARY_PARTS}${CONFIG_FILES} config files"
617
+ if [ "$HOOKS_INSTALLED" -gt 0 ]; then
618
+ [ -n "$SUMMARY_PARTS" ] && SUMMARY_PARTS="${SUMMARY_PARTS}, "
619
+ SUMMARY_PARTS="${SUMMARY_PARTS}${HOOKS_INSTALLED} hooks"
620
+ fi
621
+ if [ "$COMMANDS_INSTALLED" -gt 0 ]; then
622
+ [ -n "$SUMMARY_PARTS" ] && SUMMARY_PARTS="${SUMMARY_PARTS}, "
623
+ SUMMARY_PARTS="${SUMMARY_PARTS}${COMMANDS_INSTALLED} commands"
624
+ fi
625
+ if [ "$MCP_OK" = true ]; then
626
+ [ -n "$SUMMARY_PARTS" ] && SUMMARY_PARTS="${SUMMARY_PARTS}, "
627
+ SUMMARY_PARTS="${SUMMARY_PARTS}MCP server"
628
+ fi
629
+ if [ -n "$SUMMARY_PARTS" ]; then
630
+ log "Created ${SUMMARY_PARTS}"
631
+ fi
671
632
 
633
+ echo -e "${GREEN}✓${RESET} Wayfind installed for ${TOOL}."
672
634
  echo ""
673
- echo "Wayfind installed for $TOOL."
674
- echo ""
675
- echo "Next steps:"
676
- echo " 1. Edit $GLOBAL_STATE with your preferences and projects"
677
635
 
678
636
  if [ "$TOOL" = "claude-code" ]; then
679
- echo " 2. Open a repo and run /init-memory to set it up"
680
- echo " 3. Start a Claude Code session — it will load your state automatically"
681
- echo " 4. Run /journal for a weekly digest of your AI session logs"
682
- echo " 5. Set up your profile: wayfind whoami --setup"
683
- echo " 6. Create or join a team: wayfind team create"
637
+ echo " Next: open a repo and run /init-memory to set it up."
638
+ echo " Then start a Claude Code session — Wayfind captures context automatically."
684
639
  elif [ "$TOOL" = "cursor" ]; then
685
- echo " 2. Open a repo and run: bash setup.sh --tool cursor --repo <path>"
686
- echo " 3. Start a Cursor session — the global rule loads your state automatically"
687
- echo " 4. See specializations/cursor/README.md for full documentation"
640
+ echo " Next: open a repo and run: bash setup.sh --tool cursor --repo <path>"
641
+ echo " Then start a Cursor session — the global rule loads your state automatically."
688
642
  else
689
- echo " 2. Add the session protocol to your tool's system prompt"
690
- echo " See: specializations/generic/README.md"
643
+ echo " Next: add the session protocol to your tool's system prompt."
644
+ echo " See: specializations/generic/README.md"
691
645
  fi
692
646
 
693
647
  echo ""
694
- echo " Full documentation: README.md"
648
+ echo " Docs: https://github.com/usewayfind/wayfind"
695
649
  echo ""