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.
Files changed (60) hide show
  1. package/BOOTSTRAP_PROMPT.md +120 -0
  2. package/bin/connectors/github.js +617 -0
  3. package/bin/connectors/index.js +13 -0
  4. package/bin/connectors/intercom.js +595 -0
  5. package/bin/connectors/llm.js +469 -0
  6. package/bin/connectors/notion.js +747 -0
  7. package/bin/connectors/transport.js +325 -0
  8. package/bin/content-store.js +2006 -0
  9. package/bin/digest.js +813 -0
  10. package/bin/rebuild-status.js +297 -0
  11. package/bin/slack-bot.js +1535 -0
  12. package/bin/slack.js +342 -0
  13. package/bin/storage/index.js +171 -0
  14. package/bin/storage/json-backend.js +348 -0
  15. package/bin/storage/sqlite-backend.js +415 -0
  16. package/bin/team-context.js +4209 -0
  17. package/bin/telemetry.js +159 -0
  18. package/doctor.sh +291 -0
  19. package/install.sh +144 -0
  20. package/journal-summary.sh +577 -0
  21. package/package.json +48 -6
  22. package/setup.sh +641 -0
  23. package/specializations/claude-code/CLAUDE.md-global-fragment.md +53 -0
  24. package/specializations/claude-code/CLAUDE.md-repo-fragment.md +16 -0
  25. package/specializations/claude-code/README.md +99 -0
  26. package/specializations/claude-code/commands/doctor.md +31 -0
  27. package/specializations/claude-code/commands/init-memory.md +154 -0
  28. package/specializations/claude-code/commands/init-team.md +415 -0
  29. package/specializations/claude-code/commands/journal.md +66 -0
  30. package/specializations/claude-code/commands/review-prs.md +119 -0
  31. package/specializations/claude-code/hooks/check-global-state.sh +20 -0
  32. package/specializations/claude-code/hooks/session-end.sh +36 -0
  33. package/specializations/claude-code/settings.json +15 -0
  34. package/specializations/cursor/README.md +120 -0
  35. package/specializations/cursor/global-rule.mdc +53 -0
  36. package/specializations/cursor/repo-rule.mdc +25 -0
  37. package/specializations/generic/README.md +47 -0
  38. package/templates/autopilot/design.md +22 -0
  39. package/templates/autopilot/engineering.md +22 -0
  40. package/templates/autopilot/product.md +22 -0
  41. package/templates/autopilot/strategy.md +22 -0
  42. package/templates/autopilot/unified.md +24 -0
  43. package/templates/deploy/.env.example +110 -0
  44. package/templates/deploy/docker-compose.yml +63 -0
  45. package/templates/deploy/slack-app-manifest.json +45 -0
  46. package/templates/github-actions/meridian-digest.yml +85 -0
  47. package/templates/global.md +79 -0
  48. package/templates/memory-file.md +18 -0
  49. package/templates/personal-state.md +14 -0
  50. package/templates/personas.json +28 -0
  51. package/templates/product-state.md +41 -0
  52. package/templates/prompts-readme.md +19 -0
  53. package/templates/repo-state.md +18 -0
  54. package/templates/session-protocol-fragment.md +46 -0
  55. package/templates/slack-app-manifest.json +27 -0
  56. package/templates/statusline.sh +22 -0
  57. package/templates/strategy-state.md +39 -0
  58. package/templates/team-state.md +55 -0
  59. package/uninstall.sh +105 -0
  60. 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