From forwward-teams
Consolidates recent team work — commits, PRs, decisions, fixes, learnings — into a shared MEMORY.md file. Use after PR merges, releases, sprint-end, or when asked about shipped work.
How this skill is triggered — by the user, by Claude, or both
Slash command
/forwward-teams:team-memoryThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
While you work, context is rich. Decisions, rejected paths, root causes, the "we tried X and it didn't work because Y" — all of it lives in your head and in the conversation transcript. Then the session ends and that context dies.
While you work, context is rich. Decisions, rejected paths, root causes, the "we tried X and it didn't work because Y" — all of it lives in your head and in the conversation transcript. Then the session ends and that context dies.
The next teammate (human or AI) reads the code and the git log, but those only capture what changed, not why. They re-discover the same dead ends. They re-debug the same root causes. They suggest the same approach you already rejected.
/team-memory is REM sleep for the team. It consolidates the rich in-session context into a durable, git-tracked memory file every team member can read — and every future AI agent can grep before suggesting a path you've already walked.
team-memory/MEMORY.md lives at the repo root and is intentionally separate from:
~/.claude/projects/.../memory/) — personal, agent-specificCLAUDE.md / AGENTS.md — project instructions, not historyThis file is project-scoped team history only. It belongs to the team, not to any individual agent or user.
Manual triggers:
Proactive triggers (invoke without being asked):
Before writing anything, apply this filter. The memory file is git-tracked and visible to the whole team — it must never contain:
Strip out:
~/.claude/) — that stays personalKeep:
If you encounter content that mixes project signal with personal content (e.g., a chat log where someone describes a bug but also mentions personal details), extract only the technical signal and discard the rest.
Before reading anything, find all context files across the whole repo. This handles monorepos, multi-package workspaces, and projects where sub-teams maintain their own CLAUDE.md or local memory.
# All CLAUDE.md / AGENTS.md files (exclude node_modules, .git, generated dirs)
find . \( -name "CLAUDE.md" -o -name "AGENTS.md" \) \
-not -path "*/node_modules/*" -not -path "*/.git/*" -not -path "*/dist/*"
# All .claude/ directories (local project settings, hooks, nested memory)
find . -type d -name ".claude" \
-not -path "*/node_modules/*" -not -path "*/.git/*"
# All existing team-memory files (nested packages may have their own)
find . -path "*/team-memory/MEMORY.md" \
-not -path "*/node_modules/*" -not -path "*/.git/*"
For each CLAUDE.md found: read it — nested packages often declare their own tracker, conventions, or off-limits decisions that root CLAUDE.md doesn't know about.
For each .claude/ found: check for local project.local.json/project.json (build commands), hooks/ (automation decisions), or settings.json (team-level tool permissions). These are signal for the Decisions section.
For each nested team-memory/MEMORY.md found: read it as an additional watermark source. Use the most recent date across all memory files as the global watermark in Step 2. When writing, append to each file that covers the affected package — don't collapse a multi-package monorepo into the root memory if the packages have independent histories.
Read all discovered CLAUDE.md / AGENTS.md files (not just root) for signals about where work is tracked:
| Signal in CLAUDE.md | Tracker |
|---|---|
linear.app URL or "Linear" | Linear |
jira URL or "Jira" | Jira |
github.com/*/issues or "GitHub Issues" | GitHub Issues |
notion.so or "Notion" | Notion |
.json ticket file path | Local JSON |
.md ticket file path | Local markdown |
| None found | Git log + PRs only |
If a tracker is identified, pull from it after pulling git data. Use the appropriate tool or MCP if available (Linear MCP, Jira MCP, GitHub Issues via gh). If no integration is available, note the tracker name in the memory entry so humans can cross-reference.
Read all team-memory/MEMORY.md files discovered in Step 0.5. Scan each for its most recent date header (## YYYY-MM-DD). Take the latest date across all files as the global watermark — anything since that date is new and needs consolidation.
If no memory file exists anywhere, this is the first run. Use 30 days ago as the watermark and create the file(s) in Step 5.
Pull from these sources in this order. The conversation is the most valuable signal — that's where the WHY lives.
git log --since="<watermark>" --pretty=format:"%h %s (%ad)" --date=shortgh pr list --state merged --search "merged:>=<watermark>" --json number,title,body,mergedAtls docs/adr/ 2>/dev/null, ls decisions/ 2>/dev/nullApply the PII filter from Step 0 to everything before writing.
Every entry earns its line. If a fact doesn't help a future reader make a decision or avoid a mistake, cut it.
What landed. One line each, present tense, outcome-first. Link the PR or ticket.
/standupskill — outcome-first status updates with options + lean for blockers (#11)- Auth service migrated to OIDC — removed legacy session tokens (#34)
What was chosen, WHY, and what was rejected. The why is non-negotiable.
- Chose cursor-based pagination over offset. Why: offset breaks on concurrent inserts; cursor is stable at scale. Rejected: keyset (more complex, no benefit at current volume).
- Deferred SSO to v1.1. Why: protects the Friday demo milestone and the margin. Client agreed.
Bug + root cause + symptom. Helps future debugging when the same shape recurs.
- CI publish failed with ENEEDAUTH. Symptom:
npm publishrejected. Root cause: NPM_TOKEN not set on repo. Fix: add secret or use OIDC trusted publishing.- N+1 on dashboard load. Root cause:
user.postscalled inside a loop without eager loading. Fix: addedinclude: { posts: true }to the parent query.
Surprises. Things that would have saved time if known earlier.
- GitHub Actions
releasetrigger fires onrelease: published, not on tag push.- Hook
iffilters use permission-rule syntax, not shell glob syntax.
Work in flight. What's NOT done. What's blocked and on whom.
- SSO scoped to v1.1 — revisit after Friday demo.
- Linear integration for team-memory not yet wired — tickets tracked manually for now.
Decide where to write based on what Step 0.5 found:
team-memory/MEMORY.md at the root.team-memory/): write to each package's own team-memory/MEMORY.md, scoping each entry to that package's changes only. Also write a brief cross-package summary to root team-memory/MEMORY.md — major decisions that span multiple packages belong at the root level.Open the target file(s) and append a new dated section. Do not rewrite earlier sections — memory is append-only.
If the file doesn't exist, create it with this header first:
# Team Memory
Consolidated by `/team-memory`. Each section is a snapshot of what shipped, what was decided and why, what broke and why, what to remember, and what's still open.
Append-only. Read top-to-bottom for chronological history; grep for the topic you're about to work on before you start.
This file is project-scoped team history. It contains no PII, personal content, or individual performance data.
Then append:
## YYYY-MM-DD
### Shipped
- ...
### Decisions
- ...
### Fixes
- ...
### Learnings
- ...
### Open threads
- ...
Skip empty sections. If there were no fixes, omit the heading.
git add team-memory/MEMORY.md
git commit -m "memory: consolidate <YYYY-MM-DD>"
If you can't commit (dirty working tree, no auth), tell the user the file is updated and give them the command.
In:
Out:
git log)~/.claude/, CLAUDE.md preferences)/standup — reads team-memory/MEMORY.md to find what shipped since the last update/onboard and /start — point a new teammate at the memory file as the canonical "what's been built and why" doc/architect, /buildit, /cto — grep the memory before suggesting an approach the team already tried and rejected/review — reads recent Decisions to know what conventions are in forceteam-memory/MEMORY.md at repo root.
/standup~/.claude/)CHANGELOG.mdnpx claudepluginhub iankiku/forwward-teamsOrchestrates GitHub issues/PRs/branches as knowledge graph for traceability in planning, brainstorming, designs, architectural decisions, session resumption. /shiplog.
Loads and applies project memories from prior sessions for consistent decisions, conventions, and preferences. Stores new entries automatically or via /remember.
Summarizes recent changes from git history, meeting notes, sprint progress, documents, or logs for context recovery, handoffs, and sprint reviews.