wayfind 0.0.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BOOTSTRAP_PROMPT.md +120 -0
- package/bin/connectors/github.js +617 -0
- package/bin/connectors/index.js +13 -0
- package/bin/connectors/intercom.js +595 -0
- package/bin/connectors/llm.js +469 -0
- package/bin/connectors/notion.js +747 -0
- package/bin/connectors/transport.js +325 -0
- package/bin/content-store.js +2006 -0
- package/bin/digest.js +813 -0
- package/bin/rebuild-status.js +297 -0
- package/bin/slack-bot.js +1535 -0
- package/bin/slack.js +342 -0
- package/bin/storage/index.js +171 -0
- package/bin/storage/json-backend.js +348 -0
- package/bin/storage/sqlite-backend.js +415 -0
- package/bin/team-context.js +4209 -0
- package/bin/telemetry.js +159 -0
- package/doctor.sh +291 -0
- package/install.sh +144 -0
- package/journal-summary.sh +577 -0
- package/package.json +48 -6
- package/setup.sh +641 -0
- package/specializations/claude-code/CLAUDE.md-global-fragment.md +53 -0
- package/specializations/claude-code/CLAUDE.md-repo-fragment.md +16 -0
- package/specializations/claude-code/README.md +99 -0
- package/specializations/claude-code/commands/doctor.md +31 -0
- package/specializations/claude-code/commands/init-memory.md +154 -0
- package/specializations/claude-code/commands/init-team.md +415 -0
- package/specializations/claude-code/commands/journal.md +66 -0
- package/specializations/claude-code/commands/review-prs.md +119 -0
- package/specializations/claude-code/hooks/check-global-state.sh +20 -0
- package/specializations/claude-code/hooks/session-end.sh +36 -0
- package/specializations/claude-code/settings.json +15 -0
- package/specializations/cursor/README.md +120 -0
- package/specializations/cursor/global-rule.mdc +53 -0
- package/specializations/cursor/repo-rule.mdc +25 -0
- package/specializations/generic/README.md +47 -0
- package/templates/autopilot/design.md +22 -0
- package/templates/autopilot/engineering.md +22 -0
- package/templates/autopilot/product.md +22 -0
- package/templates/autopilot/strategy.md +22 -0
- package/templates/autopilot/unified.md +24 -0
- package/templates/deploy/.env.example +110 -0
- package/templates/deploy/docker-compose.yml +63 -0
- package/templates/deploy/slack-app-manifest.json +45 -0
- package/templates/github-actions/meridian-digest.yml +85 -0
- package/templates/global.md +79 -0
- package/templates/memory-file.md +18 -0
- package/templates/personal-state.md +14 -0
- package/templates/personas.json +28 -0
- package/templates/product-state.md +41 -0
- package/templates/prompts-readme.md +19 -0
- package/templates/repo-state.md +18 -0
- package/templates/session-protocol-fragment.md +46 -0
- package/templates/slack-app-manifest.json +27 -0
- package/templates/statusline.sh +22 -0
- package/templates/strategy-state.md +39 -0
- package/templates/team-state.md +55 -0
- package/uninstall.sh +105 -0
- package/README.md +0 -4
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Cursor Integration — Wayfind
|
|
2
|
+
|
|
3
|
+
Full setup guide for Cursor users.
|
|
4
|
+
|
|
5
|
+
## Quick Setup
|
|
6
|
+
|
|
7
|
+
Install Wayfind globally, then run the Cursor initializer:
|
|
8
|
+
```bash
|
|
9
|
+
npm install -g wayfind
|
|
10
|
+
wayfind init-cursor
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Or use the shell installer directly: `bash setup.sh --tool cursor`. Manual steps below.
|
|
14
|
+
|
|
15
|
+
## How It Works
|
|
16
|
+
|
|
17
|
+
Cursor injects rule files into the AI context at session start. The memory kit hooks into this system to load your state files automatically.
|
|
18
|
+
|
|
19
|
+
### Memory Directory
|
|
20
|
+
|
|
21
|
+
The Cursor specialization uses `~/.ai-memory/` as the memory root (tool-agnostic, not tied to Cursor's config location):
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
~/.ai-memory/
|
|
25
|
+
global.md # Always loaded — thin index of all state
|
|
26
|
+
state.md # Admin/non-repo work
|
|
27
|
+
memory/
|
|
28
|
+
<topic>.md # Loaded on demand
|
|
29
|
+
journal/
|
|
30
|
+
YYYY-MM-DD.md # Daily session log
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Per-Repo Files
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
<repo>/.cursor/
|
|
37
|
+
rules/
|
|
38
|
+
memory.mdc # Repo-level memory rules (committed to git)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Session Flow
|
|
42
|
+
|
|
43
|
+
**Session start:** Cursor reads `.cursor/rules/memory.mdc` → AI loads `~/.ai-memory/global.md` + repo state
|
|
44
|
+
|
|
45
|
+
**Session end (manual):** Say "done for today, update state files" — the AI updates the state files and appends a journal entry
|
|
46
|
+
|
|
47
|
+
## Setup
|
|
48
|
+
|
|
49
|
+
### Step 1: Memory directory
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
mkdir -p ~/.ai-memory/memory/journal
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Step 2: Global index
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
cp templates/global.md ~/.ai-memory/global.md
|
|
59
|
+
# Edit with your preferences, projects, team context
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Step 3: Global Cursor rules
|
|
63
|
+
|
|
64
|
+
Cursor supports global rules in `~/.cursor/rules/`. Create the memory rule:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
mkdir -p ~/.cursor/rules
|
|
68
|
+
cp specializations/cursor/global-rule.mdc ~/.cursor/rules/ai-memory.mdc
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Step 4: Initialize a repo
|
|
72
|
+
|
|
73
|
+
In any repo you work in with Cursor, run:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
bash setup.sh --tool cursor --repo .
|
|
77
|
+
# Or manually:
|
|
78
|
+
mkdir -p .cursor/rules
|
|
79
|
+
cp specializations/cursor/repo-rule.mdc .cursor/rules/memory.mdc
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Edit `.cursor/rules/memory.mdc` to reflect the repo name and what it's about.
|
|
83
|
+
|
|
84
|
+
### Step 5: Fill in your global index
|
|
85
|
+
|
|
86
|
+
Open `~/.ai-memory/global.md` and fill in:
|
|
87
|
+
- Your preferences and working style
|
|
88
|
+
- Active projects table
|
|
89
|
+
- Team context (using the examples as a guide)
|
|
90
|
+
|
|
91
|
+
## Session End Triggers
|
|
92
|
+
|
|
93
|
+
Since Cursor has no native hooks, use these natural language triggers to end a session:
|
|
94
|
+
|
|
95
|
+
- "done for today" — triggers state file updates + journal entry
|
|
96
|
+
- "stop, update memory" — same
|
|
97
|
+
- "save session state" — same
|
|
98
|
+
|
|
99
|
+
The rule file instructs the AI to perform all updates when it hears these phrases.
|
|
100
|
+
|
|
101
|
+
## What Gets Committed
|
|
102
|
+
|
|
103
|
+
- `.cursor/rules/memory.mdc` — **commit this** (shared context for any AI tool that reads the repo)
|
|
104
|
+
- `~/.ai-memory/` files — **never commit** (personal memory, lives outside the repo)
|
|
105
|
+
|
|
106
|
+
## Limitations vs. Claude Code
|
|
107
|
+
|
|
108
|
+
| Feature | Claude Code | Cursor |
|
|
109
|
+
|---------|------------|--------|
|
|
110
|
+
| Auto session-start | ✓ Hook fires automatically | ✓ Rule file injected automatically |
|
|
111
|
+
| Auto session-end | ✓ Hook triggers on stop | ✗ Manual trigger required |
|
|
112
|
+
| `/init-memory` command | ✓ | ✗ Use `wayfind init-cursor` or `setup.sh --tool cursor --repo .` |
|
|
113
|
+
| Team commands (`/init-team`) | ✓ | ✗ Not available |
|
|
114
|
+
| Context sync | ✓ | ✗ Not available |
|
|
115
|
+
| Deploy | ✓ | ✗ Not available |
|
|
116
|
+
| Bot | ✓ | ✗ Not available |
|
|
117
|
+
| Digest reactions | ✓ | ✗ Not available |
|
|
118
|
+
| Telemetry | ✓ (opt-in) | ✗ Not available |
|
|
119
|
+
| Prompts | ✓ | ✗ Not available |
|
|
120
|
+
| Global memory path | `~/.claude/` | `~/.ai-memory/` |
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Wayfind — Session Protocol (Global)
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Session State Protocol
|
|
7
|
+
|
|
8
|
+
**Memory system:** Hierarchical plain-markdown files at `~/.ai-memory/`. No CLI tools, no databases.
|
|
9
|
+
|
|
10
|
+
### File Hierarchy
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
~/.ai-memory/
|
|
14
|
+
global.md # Thin index — ALWAYS load at session start
|
|
15
|
+
state.md # Admin/non-repo work
|
|
16
|
+
memory/ # Topic files — load on demand
|
|
17
|
+
<topic>.md
|
|
18
|
+
journal/YYYY-MM-DD.md # Daily log
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Session Start (REQUIRED)
|
|
22
|
+
|
|
23
|
+
1. Read `~/.ai-memory/global.md`
|
|
24
|
+
2. Read `.cursor/rules/memory.mdc` in the current repo for repo-specific context
|
|
25
|
+
3. Check the Memory Files table in `global.md` — load any `~/.ai-memory/memory/` files whose keywords match this session's topic
|
|
26
|
+
4. Summarize current state, then ask: **"What's the goal for this session? What does success look like?"**
|
|
27
|
+
|
|
28
|
+
### Mid-Session
|
|
29
|
+
|
|
30
|
+
If work drifts from the stated goal, flag it: *"Quick check — we set out to [goal]. This feels like [tangent]. Stay the course or pivot?"*
|
|
31
|
+
|
|
32
|
+
### Session End Triggers
|
|
33
|
+
|
|
34
|
+
When the user says "done", "stop", "done for today", "save session state", or "update memory":
|
|
35
|
+
|
|
36
|
+
1. Update `<repo>/.cursor/rules/memory.mdc` with current branch, status, next steps
|
|
37
|
+
2. Update the Active Projects row in `~/.ai-memory/global.md`
|
|
38
|
+
3. Create/update topic files in `~/.ai-memory/memory/` for significant new cross-repo context
|
|
39
|
+
4. Append to `~/.ai-memory/memory/journal/YYYY-MM-DD.md`:
|
|
40
|
+
```
|
|
41
|
+
## [Repo] — [Title]
|
|
42
|
+
**Why:** [Stated goal]
|
|
43
|
+
**What:** [What was done]
|
|
44
|
+
**Outcome:** [Did we hit it?]
|
|
45
|
+
**On track?:** [Focused or drift?]
|
|
46
|
+
**Lessons:** [Cross-session learnings]
|
|
47
|
+
```
|
|
48
|
+
5. Confirm: **"State saved. Say 'let's continue' next time."**
|
|
49
|
+
|
|
50
|
+
### Rules
|
|
51
|
+
|
|
52
|
+
- Keep `global.md` under 80 lines. Detail goes in `~/.ai-memory/memory/` files.
|
|
53
|
+
- Do NOT use any CLI memory tools — plain markdown files only.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Wayfind — Repo State ([REPO_NAME])
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Repo State: [REPO_NAME]
|
|
7
|
+
|
|
8
|
+
Last updated: YYYY-MM-DD
|
|
9
|
+
|
|
10
|
+
### Current Branch
|
|
11
|
+
[branch]
|
|
12
|
+
|
|
13
|
+
### Current Status
|
|
14
|
+
[what's happening in this repo]
|
|
15
|
+
|
|
16
|
+
### What's Next
|
|
17
|
+
[concrete next action]
|
|
18
|
+
|
|
19
|
+
### Gotchas
|
|
20
|
+
[anything to know before diving in]
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
*This file is maintained by the AI. Update it at session end.*
|
|
25
|
+
*Global memory lives at `~/.ai-memory/global.md`.*
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Generic Specialization
|
|
2
|
+
## Any AI Tool with System Prompt Support
|
|
3
|
+
|
|
4
|
+
If your tool doesn't have a file-based instruction system, you can still use this kit by pasting the session protocol into your system prompt or the beginning of each conversation.
|
|
5
|
+
|
|
6
|
+
## Option 1: System Prompt Injection
|
|
7
|
+
|
|
8
|
+
Paste the contents of `../../templates/session-protocol-fragment.md` into your tool's system prompt field. Adjust the memory directory path from `~/.ai-memory/` to wherever you want to store the files.
|
|
9
|
+
|
|
10
|
+
## Option 2: Conversation Starter
|
|
11
|
+
|
|
12
|
+
If your tool has no persistent system prompt, start each session with:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
Before we begin: read ~/.ai-memory/global.md and .ai-memory/state.md in this repo.
|
|
16
|
+
Summarize where we left off, then ask what the goal is for this session.
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Memory Directory
|
|
20
|
+
|
|
21
|
+
Use `~/.ai-memory/` as a tool-neutral memory root:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
mkdir -p ~/.ai-memory/memory/journal
|
|
25
|
+
cp ../../templates/global.md ~/.ai-memory/global.md
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Session End
|
|
29
|
+
|
|
30
|
+
Since there are no hooks, you must explicitly trigger the state update:
|
|
31
|
+
|
|
32
|
+
> "We're done for today. Please update the state files."
|
|
33
|
+
|
|
34
|
+
The AI will update `.ai-memory/state.md` and append to the journal. Do NOT update `~/.ai-memory/global.md` at session end — it is rebuilt automatically by `wayfind status`.
|
|
35
|
+
|
|
36
|
+
## Limitations
|
|
37
|
+
|
|
38
|
+
- No automatic session-start file loading (must be in system prompt or triggered manually)
|
|
39
|
+
- No hook support for automation
|
|
40
|
+
- No custom commands
|
|
41
|
+
|
|
42
|
+
## What Still Works
|
|
43
|
+
|
|
44
|
+
- All the file templates
|
|
45
|
+
- The protocol itself (session goals, drift checks, journal)
|
|
46
|
+
- Topic memory files
|
|
47
|
+
- Cross-session continuity (as long as the AI reads the files)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Design Persona — Autopilot Prompt
|
|
2
|
+
|
|
3
|
+
You are the Design persona for this team. You scan session journals and signal data to surface what a design lead needs to know — and nothing else.
|
|
4
|
+
|
|
5
|
+
## Your job
|
|
6
|
+
|
|
7
|
+
Find the 5 most consequential design items from this period. "Consequential" means: UX consistency broke, user-facing changes shipped without design review, accessibility regressed, or design debt is accumulating in a way that will compound.
|
|
8
|
+
|
|
9
|
+
## Rules
|
|
10
|
+
|
|
11
|
+
- **Maximum 5 items.** If fewer than 5 things matter, output fewer. Never pad.
|
|
12
|
+
- **Rank by consequence, not category.** Lead with the item that most affects user experience.
|
|
13
|
+
- **No category headers.** No "UX Consistency" / "Accessibility" sections. Just a ranked list.
|
|
14
|
+
- **Each item: bold headline + one sentence of context.** The headline should make someone stop scrolling. The context sentence explains what the user impact is or what needs design attention.
|
|
15
|
+
- **Include the "so what?"** Don't just state facts — say what breaks for the user or what gets harder to fix later.
|
|
16
|
+
- **Skip anything routine.** If the UI change is minor and consistent, it's not digest-worthy.
|
|
17
|
+
- **Reference specifics** — features, screens, PRs, interaction patterns.
|
|
18
|
+
- **Do not include a title or header line.** The digest system adds its own header.
|
|
19
|
+
|
|
20
|
+
## Tone
|
|
21
|
+
|
|
22
|
+
Write for someone scrolling Slack on their phone. Observational, specific, zero filler. Every word earns its place.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Engineering Persona — Autopilot Prompt
|
|
2
|
+
|
|
3
|
+
You are the Engineering persona for this team. You scan session journals and signal data to surface what an engineering lead needs to know — and nothing else.
|
|
4
|
+
|
|
5
|
+
## Your job
|
|
6
|
+
|
|
7
|
+
Find the 5 most consequential engineering items from this period. "Consequential" means: something broke, something risky shipped, a pattern is forming that will bite us, or a decision was made that the team should know about.
|
|
8
|
+
|
|
9
|
+
## Rules
|
|
10
|
+
|
|
11
|
+
- **Maximum 5 items.** If fewer than 5 things matter, output fewer. Never pad.
|
|
12
|
+
- **Rank by consequence, not category.** Lead with the most surprising or highest-risk item.
|
|
13
|
+
- **No category headers.** No "Technical Debt" / "Architecture" sections. Just a ranked list.
|
|
14
|
+
- **Each item: bold headline + one sentence of context.** The headline should make someone stop scrolling. The context sentence explains why it matters or what's at risk.
|
|
15
|
+
- **Include the "so what?"** Don't just state facts — say what breaks, slows down, or gets harder if this isn't addressed.
|
|
16
|
+
- **Skip anything routine.** If it shipped on schedule with no issues, it's not digest-worthy.
|
|
17
|
+
- **Reference specifics** — PR numbers, issue titles, repo names, session entries.
|
|
18
|
+
- **Do not include a title or header line.** The digest system adds its own header.
|
|
19
|
+
|
|
20
|
+
## Tone
|
|
21
|
+
|
|
22
|
+
Write for someone scrolling Slack on their phone. Direct, technical, zero filler. Every word earns its place.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Product Persona — Autopilot Prompt
|
|
2
|
+
|
|
3
|
+
You are the Product persona for this team. You scan session journals and signal data to surface what a product leader needs to know — and nothing else.
|
|
4
|
+
|
|
5
|
+
## Your job
|
|
6
|
+
|
|
7
|
+
Find the 5 most consequential product items from this period. "Consequential" means: priorities shifted without discussion, customer pain surfaced, scope drifted, a product decision was made without PM input, or what shipped doesn't match what was planned.
|
|
8
|
+
|
|
9
|
+
## Rules
|
|
10
|
+
|
|
11
|
+
- **Maximum 5 items.** If fewer than 5 things matter, output fewer. Never pad.
|
|
12
|
+
- **Rank by consequence, not category.** Lead with the item that most affects customers or roadmap.
|
|
13
|
+
- **No category headers.** No "Scope Drift" / "Customer Issues" sections. Just a ranked list.
|
|
14
|
+
- **Each item: bold headline + one sentence of context.** The headline should make someone stop scrolling. The context sentence explains why it matters or what to do about it.
|
|
15
|
+
- **Include the "so what?"** Don't just state facts — say what's at risk for the user, the roadmap, or the business.
|
|
16
|
+
- **Skip anything routine.** If it shipped as planned with no surprises, it's not digest-worthy.
|
|
17
|
+
- **Reference specifics** — issue titles, feature names, customer signals, data points.
|
|
18
|
+
- **Do not include a title or header line.** The digest system adds its own header.
|
|
19
|
+
|
|
20
|
+
## Tone
|
|
21
|
+
|
|
22
|
+
Write for someone scrolling Slack on their phone. Concise, actionable, zero filler. Every word earns its place.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Strategy Persona — Autopilot Prompt
|
|
2
|
+
|
|
3
|
+
You are the Strategy persona for this team. You scan session journals and signal data to surface what a CTO or founder needs to know — and nothing else.
|
|
4
|
+
|
|
5
|
+
## Your job
|
|
6
|
+
|
|
7
|
+
Find the 5 most consequential strategic items from this period. "Consequential" means: competitive positioning changed, effort isn't mapping to business goals, cross-team patterns suggest an organizational issue, or day-to-day work is drifting from strategic objectives.
|
|
8
|
+
|
|
9
|
+
## Rules
|
|
10
|
+
|
|
11
|
+
- **Maximum 5 items.** If fewer than 5 things matter, output fewer. Never pad.
|
|
12
|
+
- **Rank by consequence, not category.** Lead with the item that most affects the business trajectory.
|
|
13
|
+
- **No category headers.** No "Competitive" / "Strategic Drift" sections. Just a ranked list.
|
|
14
|
+
- **Each item: bold headline + one sentence of context.** The headline should make someone stop scrolling. The context sentence connects the dots — why this pattern matters at the company level.
|
|
15
|
+
- **Include the "so what?"** Don't just state facts — say what's at risk strategically or what opportunity is being missed.
|
|
16
|
+
- **Skip anything routine.** If it's business as usual, it's not digest-worthy.
|
|
17
|
+
- **Reference specifics** — repos, team patterns, data points, timelines.
|
|
18
|
+
- **Do not include a title or header line.** The digest system adds its own header.
|
|
19
|
+
|
|
20
|
+
## Tone
|
|
21
|
+
|
|
22
|
+
Write for someone scrolling Slack on their phone. High-level but specific, pattern-oriented, zero filler. Every word earns its place.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Unified Digest — Autopilot Prompt
|
|
2
|
+
|
|
3
|
+
You are a team digest generator. You scan session journals and signal data across all disciplines — engineering, product, design, and strategy — to surface what the team needs to know this week.
|
|
4
|
+
|
|
5
|
+
## Your job
|
|
6
|
+
|
|
7
|
+
Find the 5 most consequential things from this period. Pick from any discipline. "Consequential" means: something that changes plans, reveals risk, creates an opportunity, or would surprise someone who wasn't paying attention.
|
|
8
|
+
|
|
9
|
+
## Rules
|
|
10
|
+
|
|
11
|
+
- **Maximum 5 items.** If fewer than 5 things matter, output fewer. Never pad.
|
|
12
|
+
- **Rank by consequence.** Lead with the item most likely to change what someone does tomorrow.
|
|
13
|
+
- **Each item: bold headline (under 10 words) + one sentence of context.** The headline makes someone stop scrolling. The sentence says why it matters.
|
|
14
|
+
- **Include the "so what?"** — what breaks, stalls, or gets missed if nobody acts.
|
|
15
|
+
- **Skip anything routine.** On-schedule, on-plan work is not digest-worthy.
|
|
16
|
+
- **Cross-discipline is fine.** If the top 5 are all engineering items, so be it. Don't force balance.
|
|
17
|
+
- **Reference specifics** — PR numbers, issue titles, repo names, metrics, dates.
|
|
18
|
+
- **Do not repeat items from the previous digest** unless there is a meaningful update or status change. Surface what changed, not what's still true.
|
|
19
|
+
- **Consider the author's role** when assessing consequence. A CTO flagging a strategic risk carries different weight than routine engineering notes. Use team member context to calibrate importance.
|
|
20
|
+
- **Do not include a title or header line.** The digest system adds its own.
|
|
21
|
+
|
|
22
|
+
## Tone
|
|
23
|
+
|
|
24
|
+
Write for someone scrolling Slack on their phone between meetings. Crisp, specific, zero filler. Every word earns its place.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Wayfind — Docker environment configuration
|
|
2
|
+
# Copy to .env and fill in your values: cp .env.example .env
|
|
3
|
+
|
|
4
|
+
# ── Required ──────────────────────────────────────────────────────────────────
|
|
5
|
+
|
|
6
|
+
# Slack bot tokens — from the Slack app you created using slack-app-manifest.json.
|
|
7
|
+
# Go to api.slack.com/apps → your Wayfind app → OAuth & Permissions for the bot token,
|
|
8
|
+
# and Basic Information → App-Level Tokens for the app token.
|
|
9
|
+
SLACK_BOT_TOKEN=xoxb-your-bot-token
|
|
10
|
+
SLACK_APP_TOKEN=xapp-your-app-token
|
|
11
|
+
|
|
12
|
+
# Anthropic API key (for digests and bot answers)
|
|
13
|
+
# Get one at console.anthropic.com
|
|
14
|
+
ANTHROPIC_API_KEY=sk-ant-your-key
|
|
15
|
+
|
|
16
|
+
# GitHub token (for pulling team journals and signal data from repos)
|
|
17
|
+
# Auto-detected from `gh auth token` during deploy init, or set manually.
|
|
18
|
+
# Needs read access to the team-context repo.
|
|
19
|
+
GITHUB_TOKEN=
|
|
20
|
+
|
|
21
|
+
# ── Digest delivery ───────────────────────────────────────────────────────────
|
|
22
|
+
# Primary: bot token + channel. The bot posts digests via chat.postMessage,
|
|
23
|
+
# which enables reaction tracking and threaded feedback.
|
|
24
|
+
# Fallback: webhook. Used only if bot delivery fails.
|
|
25
|
+
|
|
26
|
+
# Slack channel for digest delivery (channel ID, not name)
|
|
27
|
+
# Right-click channel in Slack → View channel details → copy the ID at bottom
|
|
28
|
+
# SLACK_DIGEST_CHANNEL=C0123456789
|
|
29
|
+
|
|
30
|
+
# Slack webhook — fallback for digest delivery if bot token is unavailable
|
|
31
|
+
# TEAM_CONTEXT_SLACK_WEBHOOK=https://hooks.slack.com/services/T.../B.../...
|
|
32
|
+
|
|
33
|
+
# ── Optional ──────────────────────────────────────────────────────────────────
|
|
34
|
+
|
|
35
|
+
# Tenant identifier (prefixes storage paths)
|
|
36
|
+
# TEAM_CONTEXT_TENANT_ID=my-team
|
|
37
|
+
|
|
38
|
+
# Exclude repos from digests and bot queries (comma-separated, case-insensitive)
|
|
39
|
+
# Useful when engineers work on repos belonging to different teams on the same machine
|
|
40
|
+
# TEAM_CONTEXT_EXCLUDE_REPOS=wayfind,personal-project
|
|
41
|
+
|
|
42
|
+
# Encryption key — generate with: openssl rand -base64 32
|
|
43
|
+
# TEAM_CONTEXT_ENCRYPTION_KEY=
|
|
44
|
+
|
|
45
|
+
# Author slug for CLI telemetry attribution
|
|
46
|
+
# TEAM_CONTEXT_AUTHOR=greg
|
|
47
|
+
|
|
48
|
+
# ── LLM models ───────────────────────────────────────────────────────────────
|
|
49
|
+
|
|
50
|
+
# Model for digest generation and onboarding packs (default: claude-sonnet-4-5-20250929)
|
|
51
|
+
# TEAM_CONTEXT_LLM_MODEL=claude-sonnet-4-5-20250929
|
|
52
|
+
|
|
53
|
+
# Model for conversation transcript extraction (default: claude-sonnet-4-5-20250929)
|
|
54
|
+
# TEAM_CONTEXT_EXTRACTION_MODEL=claude-sonnet-4-5-20250929
|
|
55
|
+
|
|
56
|
+
# ── Embeddings (without these, bot uses keyword search only) ─────────────────
|
|
57
|
+
# Option A: OpenAI
|
|
58
|
+
# OPENAI_API_KEY=sk-your-openai-key
|
|
59
|
+
# Option B: Azure OpenAI (if you have an AOAI deployment)
|
|
60
|
+
# AZURE_OPENAI_EMBEDDING_ENDPOINT=https://your-resource.openai.azure.com/
|
|
61
|
+
# AZURE_OPENAI_EMBEDDING_KEY=your-key
|
|
62
|
+
# AZURE_OPENAI_EMBEDDING_DEPLOYMENT=text-embedding-3-small
|
|
63
|
+
|
|
64
|
+
# ── Path overrides ───────────────────────────────────────────────────────────
|
|
65
|
+
|
|
66
|
+
# Override content store path (default: ~/.claude/team-context/content-store)
|
|
67
|
+
# TEAM_CONTEXT_STORE_PATH=/data/content-store
|
|
68
|
+
|
|
69
|
+
# Override signals directory (default: ~/.claude/team-context/signals)
|
|
70
|
+
# TEAM_CONTEXT_SIGNALS_DIR=/data/signals
|
|
71
|
+
|
|
72
|
+
# Override conversations directory (default: ~/.claude/projects)
|
|
73
|
+
# TEAM_CONTEXT_CONVERSATIONS_DIR=/data/conversations
|
|
74
|
+
|
|
75
|
+
# ── Schedules ────────────────────────────────────────────────────────────────
|
|
76
|
+
|
|
77
|
+
# Digest schedule (cron, default: daily 12pm UTC / 7am ET)
|
|
78
|
+
# TEAM_CONTEXT_DIGEST_SCHEDULE=0 12 * * *
|
|
79
|
+
|
|
80
|
+
# Signal pull schedule (cron, default: daily 6am UTC)
|
|
81
|
+
# TEAM_CONTEXT_SIGNAL_SCHEDULE=0 6 * * *
|
|
82
|
+
|
|
83
|
+
# Reindex schedule (cron, default: hourly)
|
|
84
|
+
# TEAM_CONTEXT_REINDEX_SCHEDULE=0 * * * *
|
|
85
|
+
|
|
86
|
+
# ── Signal sources ───────────────────────────────────────────────────────────
|
|
87
|
+
|
|
88
|
+
# GitHub repos to pull signals from (comma-separated, org/repo format)
|
|
89
|
+
# TEAM_CONTEXT_GITHUB_REPOS=myorg/repo1,myorg/repo2
|
|
90
|
+
|
|
91
|
+
# Intercom API token for support signal ingestion
|
|
92
|
+
# INTERCOM_TOKEN=your-intercom-token
|
|
93
|
+
|
|
94
|
+
# Filter Intercom conversations by tags (comma-separated)
|
|
95
|
+
# TEAM_CONTEXT_INTERCOM_TAGS=bug,feature-request
|
|
96
|
+
|
|
97
|
+
# Notion integration token for page/database signal ingestion
|
|
98
|
+
# Create at: https://www.notion.so/my-integrations
|
|
99
|
+
# NOTION_TOKEN=ntn_your-integration-token
|
|
100
|
+
|
|
101
|
+
# Specific Notion database IDs to monitor (comma-separated, or blank for all shared pages)
|
|
102
|
+
# TEAM_CONTEXT_NOTION_DATABASES=db_id1,db_id2
|
|
103
|
+
|
|
104
|
+
# ── Monitoring ───────────────────────────────────────────────────────────────
|
|
105
|
+
|
|
106
|
+
# Health check port (default: 3141)
|
|
107
|
+
# TEAM_CONTEXT_HEALTH_PORT=3141
|
|
108
|
+
|
|
109
|
+
# Telemetry — opt-in anonymous usage data to help improve Wayfind
|
|
110
|
+
# TEAM_CONTEXT_TELEMETRY=true
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Wayfind — self-hosted deployment for your team context repo.
|
|
2
|
+
# Run: docker compose up -d
|
|
3
|
+
# Docs: https://github.com/usewayfind/wayfind
|
|
4
|
+
|
|
5
|
+
services:
|
|
6
|
+
wayfind:
|
|
7
|
+
image: ghcr.io/usewayfind/wayfind:latest
|
|
8
|
+
container_name: wayfind
|
|
9
|
+
restart: unless-stopped
|
|
10
|
+
environment:
|
|
11
|
+
TEAM_CONTEXT_MODE: all-in-one
|
|
12
|
+
TEAM_CONTEXT_TENANT_ID: ${TEAM_CONTEXT_TENANT_ID:-my-team}
|
|
13
|
+
TEAM_CONTEXT_AUTHOR: ${TEAM_CONTEXT_AUTHOR:-}
|
|
14
|
+
|
|
15
|
+
# Slack
|
|
16
|
+
SLACK_BOT_TOKEN: ${SLACK_BOT_TOKEN}
|
|
17
|
+
SLACK_APP_TOKEN: ${SLACK_APP_TOKEN}
|
|
18
|
+
SLACK_DIGEST_CHANNEL: ${SLACK_DIGEST_CHANNEL:-}
|
|
19
|
+
TEAM_CONTEXT_SLACK_WEBHOOK: ${TEAM_CONTEXT_SLACK_WEBHOOK:-}
|
|
20
|
+
|
|
21
|
+
# Exclude repos from digests/queries (comma-separated, case-insensitive)
|
|
22
|
+
TEAM_CONTEXT_EXCLUDE_REPOS: ${TEAM_CONTEXT_EXCLUDE_REPOS:-}
|
|
23
|
+
|
|
24
|
+
# Telemetry (opt-in, sends anonymous usage data to improve Wayfind)
|
|
25
|
+
TEAM_CONTEXT_TELEMETRY: ${TEAM_CONTEXT_TELEMETRY:-false}
|
|
26
|
+
|
|
27
|
+
# GitHub signals
|
|
28
|
+
GITHUB_TOKEN: ${GITHUB_TOKEN:-}
|
|
29
|
+
|
|
30
|
+
# Intercom signals
|
|
31
|
+
INTERCOM_TOKEN: ${INTERCOM_TOKEN:-}
|
|
32
|
+
TEAM_CONTEXT_INTERCOM_TAGS: ${TEAM_CONTEXT_INTERCOM_TAGS:-}
|
|
33
|
+
|
|
34
|
+
# LLM
|
|
35
|
+
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
|
|
36
|
+
TEAM_CONTEXT_LLM_MODEL: ${TEAM_CONTEXT_LLM_MODEL:-claude-sonnet-4-5-20250929}
|
|
37
|
+
|
|
38
|
+
# Embeddings (for semantic search — falls back to keyword search without these)
|
|
39
|
+
# Option A: OpenAI
|
|
40
|
+
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
|
|
41
|
+
# Option B: Azure OpenAI
|
|
42
|
+
AZURE_OPENAI_EMBEDDING_ENDPOINT: ${AZURE_OPENAI_EMBEDDING_ENDPOINT:-}
|
|
43
|
+
AZURE_OPENAI_EMBEDDING_KEY: ${AZURE_OPENAI_EMBEDDING_KEY:-}
|
|
44
|
+
AZURE_OPENAI_EMBEDDING_DEPLOYMENT: ${AZURE_OPENAI_EMBEDDING_DEPLOYMENT:-text-embedding-3-small}
|
|
45
|
+
|
|
46
|
+
# Encryption — generate with: openssl rand -base64 32
|
|
47
|
+
TEAM_CONTEXT_ENCRYPTION_KEY: ${TEAM_CONTEXT_ENCRYPTION_KEY:-}
|
|
48
|
+
|
|
49
|
+
# Scheduling
|
|
50
|
+
TEAM_CONTEXT_DIGEST_SCHEDULE: ${TEAM_CONTEXT_DIGEST_SCHEDULE:-0 8 * * 1}
|
|
51
|
+
TEAM_CONTEXT_SIGNAL_SCHEDULE: ${TEAM_CONTEXT_SIGNAL_SCHEDULE:-0 6 * * *}
|
|
52
|
+
|
|
53
|
+
# Team context repo (mounted at /data/team-context for git pull)
|
|
54
|
+
TEAM_CONTEXT_TEAM_CONTEXT_DIR: /data/team-context
|
|
55
|
+
TEAM_CONTEXT_JOURNALS_DIR: /data/team-context/journals
|
|
56
|
+
volumes:
|
|
57
|
+
- ${TEAM_CONTEXT_TEAM_CONTEXT_PATH:-..}:/data/team-context
|
|
58
|
+
- wayfind-data:/home/node/.claude/team-context
|
|
59
|
+
ports:
|
|
60
|
+
- "3141:3141"
|
|
61
|
+
|
|
62
|
+
volumes:
|
|
63
|
+
wayfind-data:
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"display_information": {
|
|
3
|
+
"name": "Wayfind",
|
|
4
|
+
"description": "Team context layer — persona digests from engineering journals and signal channels.",
|
|
5
|
+
"background_color": "#1a1a2e"
|
|
6
|
+
},
|
|
7
|
+
"features": {
|
|
8
|
+
"bot_user": {
|
|
9
|
+
"display_name": "Wayfind",
|
|
10
|
+
"always_online": false
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"oauth_config": {
|
|
14
|
+
"scopes": {
|
|
15
|
+
"bot": [
|
|
16
|
+
"app_mentions:read",
|
|
17
|
+
"channels:history",
|
|
18
|
+
"chat:write",
|
|
19
|
+
"im:write",
|
|
20
|
+
"users:read",
|
|
21
|
+
"groups:history",
|
|
22
|
+
"incoming-webhook",
|
|
23
|
+
"reactions:read",
|
|
24
|
+
"reactions:write"
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"settings": {
|
|
29
|
+
"event_subscriptions": {
|
|
30
|
+
"bot_events": [
|
|
31
|
+
"app_mention",
|
|
32
|
+
"message.channels",
|
|
33
|
+
"message.groups",
|
|
34
|
+
"reaction_added",
|
|
35
|
+
"reaction_removed"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
"interactivity": {
|
|
39
|
+
"is_enabled": true
|
|
40
|
+
},
|
|
41
|
+
"org_deploy_enabled": false,
|
|
42
|
+
"socket_mode_enabled": true,
|
|
43
|
+
"token_rotation_enabled": false
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Wayfind Digest — GitHub Actions workflow
|
|
2
|
+
# Generates and delivers persona-based digests on a schedule.
|
|
3
|
+
# No Docker container needed — runs directly via npx.
|
|
4
|
+
#
|
|
5
|
+
# Setup:
|
|
6
|
+
# 1. Copy this file to .github/workflows/meridian-digest.yml in your team-context repo
|
|
7
|
+
# 2. Add these secrets to the repo (Settings → Secrets → Actions):
|
|
8
|
+
# - ANTHROPIC_API_KEY: Your Anthropic API key
|
|
9
|
+
# - SLACK_WEBHOOK_URL: Slack incoming webhook URL (optional — digests are also committed to the repo)
|
|
10
|
+
# 3. Adjust the cron schedule below (default: Monday 8am UTC)
|
|
11
|
+
# 4. Push — the workflow runs on schedule and can be triggered manually
|
|
12
|
+
|
|
13
|
+
name: Wayfind Digest
|
|
14
|
+
|
|
15
|
+
on:
|
|
16
|
+
schedule:
|
|
17
|
+
# Every Monday at 8:00 AM UTC — adjust to your team's timezone
|
|
18
|
+
- cron: '0 8 * * 1'
|
|
19
|
+
workflow_dispatch:
|
|
20
|
+
inputs:
|
|
21
|
+
persona:
|
|
22
|
+
description: 'Persona to generate (empty = all configured)'
|
|
23
|
+
required: false
|
|
24
|
+
default: ''
|
|
25
|
+
|
|
26
|
+
permissions:
|
|
27
|
+
contents: write
|
|
28
|
+
|
|
29
|
+
jobs:
|
|
30
|
+
digest:
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
steps:
|
|
33
|
+
- name: Checkout team-context repo
|
|
34
|
+
uses: actions/checkout@v4
|
|
35
|
+
with:
|
|
36
|
+
fetch-depth: 0
|
|
37
|
+
|
|
38
|
+
- name: Setup Node.js
|
|
39
|
+
uses: actions/setup-node@v4
|
|
40
|
+
with:
|
|
41
|
+
node-version: '20'
|
|
42
|
+
|
|
43
|
+
- name: Install Wayfind
|
|
44
|
+
run: npm install -g wayfind
|
|
45
|
+
|
|
46
|
+
- name: Generate digest
|
|
47
|
+
env:
|
|
48
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
49
|
+
TEAM_CONTEXT_TEAM_CONTEXT_DIR: ${{ github.workspace }}
|
|
50
|
+
TEAM_CONTEXT_JOURNALS_DIR: ${{ github.workspace }}/journals
|
|
51
|
+
TEAM_CONTEXT_SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
52
|
+
run: |
|
|
53
|
+
# Configure wayfind to use this repo as team context
|
|
54
|
+
wayfind context init "${{ github.workspace }}" 2>/dev/null || true
|
|
55
|
+
|
|
56
|
+
# Build flags
|
|
57
|
+
FLAGS=""
|
|
58
|
+
PERSONA="${{ github.event.inputs.persona }}"
|
|
59
|
+
if [ -n "$PERSONA" ]; then
|
|
60
|
+
FLAGS="--persona $PERSONA"
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
# Add --deliver if webhook is configured
|
|
64
|
+
if [ -n "$TEAM_CONTEXT_SLACK_WEBHOOK" ]; then
|
|
65
|
+
FLAGS="$FLAGS --deliver"
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
wayfind digest $FLAGS
|
|
69
|
+
|
|
70
|
+
- name: Commit digest to repo
|
|
71
|
+
run: |
|
|
72
|
+
DIGEST_DIR="$HOME/.claude/team-context/digests"
|
|
73
|
+
REPO_DIGEST_DIR="digests"
|
|
74
|
+
|
|
75
|
+
if [ -d "$DIGEST_DIR" ]; then
|
|
76
|
+
mkdir -p "$REPO_DIGEST_DIR"
|
|
77
|
+
cp -r "$DIGEST_DIR"/* "$REPO_DIGEST_DIR/" 2>/dev/null || true
|
|
78
|
+
|
|
79
|
+
git config user.name "Wayfind Bot"
|
|
80
|
+
git config user.email "wayfind@noreply.github.com"
|
|
81
|
+
git add "$REPO_DIGEST_DIR/"
|
|
82
|
+
DATE=$(date +%Y-%m-%d)
|
|
83
|
+
git diff --cached --quiet || git commit -m "Digest: $DATE"
|
|
84
|
+
git push
|
|
85
|
+
fi
|