| name | session-management |
| description | Manage work sessions with creation, loading, syncing, and archiving capabilities. |
Session Management
Manages work sessions. Session paths must be explicitly provided or known from context.
Session Path Resolution
IMPORTANT: Sessions do NOT have a default location. The session path must be:
- Provided explicitly in arguments (e.g.,
start ~/projects/my-project/_sessions/session-name)
- Already known from conversation context (active session in working memory)
- Defined in project's
.samocode file under SESSIONS path
If session path cannot be determined: STOP and ask the user for the session location.
Finding .samocode: Look in current working directory (where the provider CLI was started). Never guess paths - if .samocode not found, ask user.
Repository Resolution
IMPORTANT: All git operations (fetch, branch creation, worktree management) MUST run from the correct repository directory.
- Read
.samocode from CWD — use MAIN_REPO value as the repo directory for all git commands
- If
.samocode not found or MAIN_REPO not set: fall back to git rev-parse --show-toplevel from CWD
- Never run git branch/worktree/fetch commands from CWD directly — always resolve and use the repo directory first
- Store the resolved repo path alongside the session for use in all actions
Actions
Use $ARGUMENTS to specify action and parameters:
start [session-path/name] - Create new session
continue [session-name-pattern] - Load existing session
sync - Sync current conversation to active session
archive [session-name-pattern] - Archive a session
Action: start
Create a new work session.
Steps
-
Resolve session location:
- If full path provided in arguments: use it
- If only name provided: read
.samocode from current working directory, use SESSIONS path
- If
.samocode not found: STOP and ask user - never guess or create arbitrary folders
-
Parse session name:
- Take session name from arguments after "start"
- If empty, ERROR: "Session name required. Usage: start [session-name]"
- Sanitize name (lowercase, replace spaces with hyphens)
-
Create session folder:
- Path:
[SESSIONS_DIR]/[YY-MM-DD]-[session-name]/ (use current date for folder name)
- If folder exists, ERROR: "Session already exists"
-
Create worktree (if .samocode has WORKTREES):
Read MAIN_REPO and WORKTREES from .samocode. If both are set, create a worktree:
BRANCH_NAME=[session-name]
cd [MAIN_REPO]
git fetch origin
DEFAULT_BRANCH=$(git remote show origin | grep 'HEAD branch' | cut -d: -f2 | xargs)
git worktree add -b [BRANCH_NAME] [WORKTREES]/[YY-MM-DD]-[session-name] origin/$DEFAULT_BRANCH
If worktree creation fails (branch already exists), try attaching to existing branch:
git worktree add [WORKTREES]/[YY-MM-DD]-[session-name] [BRANCH_NAME]
Working Dir = [WORKTREES]/[YY-MM-DD]-[session-name]
Restore gitignored env files in the worktree (git worktree add does not copy gitignored files):
- If the project relies on a
.env (or per-service .env) that lives outside git, copy it from the main repo, or seed it from a secrets store. Path layout is project-specific — check MAIN_REPO's .env* files and the project README.
If WORKTREES not set (non-repo project): fall back to MAIN_REPO, or git rev-parse --show-toplevel, or current directory.
-
Create _overview.md:
# Session: [session-name]
Started: [TIMESTAMP_LOG]
Working Dir: [worktree-path or fallback]
## Status
Phase: investigation
Iteration: 1
Blocked: no
Last Action: Session created
Next: Ready to work
## Flow Log
- [TIMESTAMP_ITERATION] Session created
## Files
(none yet)
## Plans
(none yet)
## Linear Tasks
(none yet)
-
Commit (if sessions dir is a git repo):
cd [SESSIONS_DIR] && git add . && git commit -m "Start session: [session-name]"
-
Confirm to user:
Session created: [YY-MM-DD]-[session-name]
Path: [full-path]
Working Dir: [worktree-path or fallback]
Branch: [BRANCH_NAME]
IMPORTANT: This is now your active session. Remember this path for subsequent commands.
Ready to work. Use /dive, /task, or /create-plan to continue.
IMPORTANT: After creating the session, keep the session path in your working memory for all subsequent session-aware commands.
Action: continue
Load and continue working in an existing session.
Steps
-
Resolve session location:
- If full path provided: use it
- Check project
.samocode file for SESSIONS path
- If not found: STOP and ask user for sessions directory
-
Find matching sessions:
- Search sessions directory for folders matching
*$ARGUMENTS* (exclude _archive/)
- Sort by modification time (most recent first)
-
Handle results:
- No matches: ERROR: "No sessions found matching '$ARGUMENTS'. Use start action to create one."
- One match: Proceed to load
- Multiple matches: List them with dates and ask user to specify
-
Load session:
- Read
_overview.md from the session folder
- Add Flow Log entry:
- [TIMESTAMP_ITERATION] Session resumed
- Commit if git repo:
git add . && git commit -m "Resume session: [session-name]"
-
Present summary:
Session: [session-name]
Path: [full-path]
Working Dir: [from _overview.md]
Started: [date]
Recent Activity:
[Last 5-10 Flow Log entries]
Files: [count]
[List with brief descriptions]
Plans: [list if any]
Linear Tasks: [list if any]
---
Session loaded. Ready to continue.
IMPORTANT: After loading, keep the session path in your working memory for all subsequent session-aware commands.
Action: sync
Ensure all work from this conversation is recorded in the active session.
Steps
-
Check for active session:
- If no session in working memory: ERROR: "No active session. Use continue action to load one first."
-
Read current session state:
- Read
[SESSION_PATH]/_overview.md
-
Review conversation for unrecorded work:
- Code changes (files created, modified, deleted)
- Decisions made
- Problems solved
- Discoveries about the codebase
- Commits made
- Blockers/TODOs remaining
-
Update _overview.md:
- Add missing Flow Log entries
- Add missing Files entries
- Update other sections as needed
-
Create detail files if warranted:
- Only for complex topics that need more than a log entry
-
Commit (if git repo):
cd [SESSION_DIR] && git add . && git commit -m "Sync session: [session-name]"
-
Extract learnings:
- If the conversation contained friction moments (failed approaches, workarounds discovered): you MUST use "learn" skill now.
- If nothing notable was learned: skip
-
Report:
- "Session synced: [what was added]"
- Or: "Session already up to date."
Action: archive
Archive a session (full) or archive work within a session (partial).
Usage Patterns
archive - Archive entire active session (moves folder to _archive/)
archive [session-name] - Archive entire named session
archive keep file1.md file2.md - Archive work files within session, keep specified files
archive [session-path] keep file1.md - Archive work in specific session, keep files
Full Archive (no "keep" keyword)
Session Resolution
-
If arguments after "archive" are empty:
- Check for active session in working memory
- If no active session: ERROR: "No active session and no session name provided."
- Use active session path
-
If arguments provided (no "keep"):
- Search sessions directory for folders matching
*$ARGUMENTS* (exclude _archive/)
- No matches: ERROR: "No sessions found matching '$ARGUMENTS'"
- One match: Confirm with user: "Archive session [name]? (y/n)"
- Multiple matches: List and ask user to specify
Full Archive Process
-
Get session info:
- Read
[SESSION_PATH]/_overview.md
- Extract Working Dir line
-
Create archive folder if needed:
mkdir -p [SESSIONS_DIR]/_archive
-
Remove worktree (if applicable):
- If Working Dir contains
/worktrees/:
- If removal fails (uncommitted changes), warn user and ask to proceed or abort
- Note: Branch is preserved, only worktree removed
-
Move session folder:
mv [SESSION_PATH] [SESSIONS_DIR]/_archive/
-
Commit changes (if git repo):
cd [SESSIONS_DIR] && git add . && git commit -m "Archive session: [session-name]"
-
Clear active session (if archiving active session):
- Remove from working memory
-
Extract learnings:
- If the conversation contained friction moments (failed approaches, workarounds discovered): you MUST use "learn" skill now.
- If nothing notable was learned: skip
-
Confirm to user:
Session archived: [session-name]
Moved to: [archive-path]
Worktree removed: [path] (branch preserved)
Session closed.
Partial Archive (with "keep" keyword)
Archives completed work within a session while keeping important deliverables accessible.
Argument Parsing
- Split arguments on "keep" keyword
- Before "keep": session path (optional, defaults to active session)
- After "keep": list of files to keep in place (space-separated)
Example: archive keep competitor-analysis.md → archive active session, keep competitor-analysis.md
Partial Archive Process
-
Resolve session:
- If path before "keep": use it
- Otherwise: use active session from working memory
- ERROR if no session found
-
Get timestamp and slug:
TIMESTAMP_FOLDER=$(date '+%y-%m-%d')
- Extract slug from session folder name or task name from _overview.md
- Archive folder:
[SESSION_PATH]/_archive/[YY-MM-DD]-[slug]/
-
Create archive subfolder:
mkdir -p [SESSION_PATH]/_archive/[YY-MM-DD]-[slug]
-
Identify files to archive:
- All
.md files in session root EXCEPT:
_overview.md (always kept - session state)
_qa.md (always kept if exists)
_signal.json (always kept)
- Files listed after "keep" keyword
- All timestamped files (pattern:
[MM-DD-HH:mm]-*.md)
-
Move files to archive:
for file in [files_to_archive]; do
mv "$file" [SESSION_PATH]/_archive/[YY-MM-DD]-[slug]/
done
-
Update _overview.md:
- Add Flow Log entry:
- [TIMESTAMP_LOG] Archived work to _archive/[YY-MM-DD]-[slug]/, kept: [kept_files]
- Reset Status section for next task
-
Extract learnings:
- If the conversation contained friction moments (failed approaches, workarounds discovered): you MUST use "learn" skill now.
- If nothing notable was learned: skip
-
Report to user:
Work archived within session.
Archived to: [SESSION_PATH]/_archive/[YY-MM-DD]-[slug]/
Files moved: [count] files
Kept in place: [kept_files]