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 +74 -137
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/setup.sh +62 -108
package/README.md
CHANGED
|
@@ -1,68 +1,55 @@
|
|
|
1
1
|
# Wayfind
|
|
2
2
|
|
|
3
|
-
**Team
|
|
3
|
+
**Team memory for AI-assisted engineering.**
|
|
4
4
|
|
|
5
|
-
|
|
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
|
[](https://github.com/usewayfind/wayfind/actions/workflows/ci.yml)
|
|
8
|
-
[](LICENSE)
|
|
9
10
|
[](https://www.npmjs.com/package/wayfind)
|
|
11
|
+
[](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
|
-
|
|
15
|
+
---
|
|
18
16
|
|
|
19
|
-
|
|
20
|
-
/plugin marketplace add usewayfind/wayfind
|
|
21
|
-
/plugin install wayfind@usewayfind
|
|
22
|
-
```
|
|
17
|
+
## The Problem
|
|
23
18
|
|
|
24
|
-
|
|
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
|
-
|
|
23
|
+
## What Wayfind Does
|
|
31
24
|
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
31
|
+
<!-- TODO: demo GIF here — see #175 -->
|
|
42
32
|
|
|
43
33
|
---
|
|
44
34
|
|
|
45
|
-
##
|
|
35
|
+
## Quick Start
|
|
46
36
|
|
|
47
|
-
###
|
|
37
|
+
### Option A: Claude Code plugin
|
|
48
38
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
-
|
|
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
|
-
|
|
45
|
+
### Option B: npm (works with any AI tool)
|
|
62
46
|
|
|
47
|
+
```bash
|
|
48
|
+
npm install -g wayfind
|
|
49
|
+
wayfind init
|
|
63
50
|
```
|
|
64
|
-
|
|
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
|
|
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
|
-
**
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
108
|
+
---
|
|
161
109
|
|
|
162
|
-
|
|
110
|
+
## Signal Connectors
|
|
163
111
|
|
|
164
|
-
|
|
112
|
+
Pull external context into digests:
|
|
165
113
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
121
|
+
---
|
|
171
122
|
|
|
172
|
-
|
|
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
|
-
|
|
125
|
+
```
|
|
126
|
+
/wayfind:init-team
|
|
127
|
+
```
|
|
180
128
|
|
|
181
|
-
|
|
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 |
|
|
194
|
-
|
|
195
|
-
| Claude Code |
|
|
196
|
-
|
|
|
197
|
-
|
|
|
198
|
-
|
|
|
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
|
|
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
|
-
- [
|
|
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)
|
|
182
|
+
Apache 2.0. See [LICENSE](LICENSE).
|
package/package.json
CHANGED
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
|
-
# ──
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
268
|
-
|
|
269
|
-
|
|
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
|
-
|
|
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
|
-
|
|
288
|
-
else
|
|
289
|
-
info "Hook already exists: $SESSION_END_DEST — skipped"
|
|
270
|
+
HOOKS_INSTALLED=$((HOOKS_INSTALLED + 1))
|
|
290
271
|
fi
|
|
291
272
|
|
|
292
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
306
|
-
else
|
|
307
|
-
info "/doctor command already exists — skipped"
|
|
283
|
+
COMMANDS_INSTALLED=$((COMMANDS_INSTALLED + 1))
|
|
308
284
|
fi
|
|
309
285
|
|
|
310
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
439
|
+
MCP_OK=true
|
|
484
440
|
fi
|
|
485
441
|
else
|
|
486
|
-
warn "wayfind-mcp
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
516
|
+
MCP_OK=true
|
|
565
517
|
fi
|
|
566
518
|
else
|
|
567
|
-
warn "wayfind-mcp
|
|
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
|
-
# ──
|
|
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
|
-
|
|
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 "
|
|
680
|
-
echo "
|
|
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 "
|
|
686
|
-
echo "
|
|
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 "
|
|
690
|
-
echo "
|
|
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 "
|
|
648
|
+
echo " Docs: https://github.com/usewayfind/wayfind"
|
|
695
649
|
echo ""
|