claude-dev-env 1.7.0 → 1.8.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.
@@ -0,0 +1,237 @@
1
+ ---
2
+ name: session-log
3
+ description: Log a session report to the Obsidian vault, track vault context usage, extract unrecorded decisions, tidy the project's session folder, and output a /rename command. Use when the user says /session-log, journal this session, log this work, session report, or any variation of "summarize/log/record this session". Also triggers on "save session", "capture session", or "document what we did".
4
+ ---
5
+
6
+ # Session Log
7
+
8
+ ## Overview
9
+
10
+ Write a structured session report, then run vault context tracking, decision extraction, and session tidying.
11
+
12
+ **Announce at start:** "I'm logging this session."
13
+
14
+ This skill runs as a 5-step workflow. Every step runs automatically -- no user prompts between steps except where noted.
15
+
16
+ ## Backend Detection (run before Step 1)
17
+
18
+ Determine which storage backend is available. Try in this order and use the first that succeeds:
19
+
20
+ 1. **Headless vault** -- run `ob --version` via Bash to verify the obsidian-headless CLI is installed. Then check `OBSIDIAN_VAULT_PATH` environment variable or `~/.claude/vault/` for a vault directory. If the CLI exists and a vault directory resolves, optionally run `ob sync-status --path <vault-path>` to verify sync is active. Set `backend = "headless"`.
21
+
22
+ 2. **Obsidian MCP** -- call `mcp__obsidian__list_directory` with `path="sessions"`. If it succeeds, use Obsidian MCP for all operations. Set `backend = "obsidian"`.
23
+
24
+ 3. **Local vault** -- if neither headless nor MCP is available, use `~/.claude/vault/` as a local vault directory. Create it via `mkdir -p ~/.claude/vault/sessions` if it does not exist. Set `backend = "local"`. This provides a working vault structure that can be upgraded to headless sync later.
25
+
26
+ **Backend capabilities:**
27
+
28
+ | Capability | headless | obsidian | local |
29
+ |---|---|---|---|
30
+ | Write session reports | Write tool | `mcp__obsidian__write_note` | Write tool |
31
+ | Search prior sessions | Bash `ls` + Grep | `mcp__obsidian__search_notes` | Bash `ls` + Grep |
32
+ | Session number detection | parse filenames | frontmatter search | parse filenames |
33
+ | Frontmatter | YAML `---` fences | handled by MCP | YAML `---` fences |
34
+ | Step 2 (vault context tracking) | skip | runs | skip |
35
+ | Step 4 (session tidy) | skip | runs | skip |
36
+ | Sync | Obsidian Sync | Obsidian Sync | none (local only) |
37
+
38
+ **Session number detection (headless and local):**
39
+ - List files in the project directory via Bash `ls`
40
+ - Parse filenames matching `[N]. *.md`
41
+ - Highest N + 1. If directory does not exist, create it and start at 1
42
+
43
+ **Output paths:**
44
+ - headless: `$OBSIDIAN_VAULT_PATH/sessions/[Project]/[N]. [Title].md` or `~/.claude/vault/sessions/[Project]/[N]. [Title].md`
45
+ - obsidian: `sessions/[Project]/[N]. [Title].md` (vault-relative)
46
+ - local: `~/.claude/vault/sessions/[Project]/[N]. [Title].md`
47
+
48
+ Announce the backend: "Using headless vault at [path].", "Using Obsidian vault.", or "Using local vault at ~/.claude/vault/. Run `/obsidian-check` for upgrade options."
49
+
50
+ ---
51
+
52
+ ## Step 1: Write Session Report
53
+
54
+ 1. Review the conversation to identify: key outcomes, blockers, decisions, and next steps.
55
+
56
+ 2. Determine session metadata:
57
+ - **Project name:** infer from conversation context
58
+ - **Session number:** search existing vault notes to find the latest session number for this project, then increment. Use `mcp__obsidian__search_notes` with `searchFrontmatter: true` and the project name. If no prior sessions exist, start at 1.
59
+ - **Date:** today's date
60
+ - **Title:** a 2-5 word summary of the session's primary outcome or focus area. Pick the single most important thing that happened. Examples: "Amazon Auth Migration", "Source Loading Fix", "Vault Reorganization". Avoid generic titles like "Bug Fixes" or "Various Updates".
61
+
62
+ 3. **Write to vault** via `mcp__obsidian__write_note`:
63
+ - **Path:** `sessions/[Project]/[N]. [Title].md`
64
+ - **Frontmatter:** `{"type": "session-report", "project": "[name]", "session": [N], "date": "[YYYY-MM-DD]", "status": "completed"|"in-progress"|"blocked", "blocked": true|false, "tags": ["session", "[project-tag]"]}`
65
+ - **Content:** Markdown formatted (see Vault Format below)
66
+
67
+ 4. **Backend-specific write:**
68
+ - **headless:** Write tool to the headless vault path. Include frontmatter as YAML `---` fences at the top of the file. Create the project directory via `mkdir -p` if it does not exist.
69
+ - **obsidian:** `mcp__obsidian__write_note` with path and frontmatter object
70
+ - **local:** Write tool to `~/.claude/vault/sessions/[Project]/[N]. [Title].md`. Include frontmatter as YAML `---` fences. Create the project directory via `mkdir -p` if it does not exist.
71
+ - **If the write fails:** output the content in the conversation so the user can copy it manually. Skip Steps 2-4 and go directly to Step 5.
72
+
73
+ ### Vault Format -- Markdown Session Report
74
+
75
+ The vault note uses markdown (not HTML).
76
+
77
+ ```markdown
78
+ ## Session [N] Report -- [Month Day, Year]
79
+
80
+ ### [emoji] [Section Title]
81
+
82
+ [1-3 sentence explanation of what happened and why it matters]
83
+
84
+ - **[Label]:** [detail]
85
+
86
+ **Fix:** [what was done]
87
+
88
+ ### [emoji] [Section with tabular data]
89
+
90
+ [Context sentence]
91
+
92
+ | # | Item | Status |
93
+ |---|------|--------|
94
+ | 1 | ... | ... |
95
+
96
+ ### [emoji] Notes
97
+
98
+ - **[Topic]:** [detail]
99
+ ```
100
+
101
+ ### Emoji Status Indicators
102
+
103
+ | Emoji | Meaning | Use when |
104
+ |-------|---------|----------|
105
+ | ✅ | Done/Fixed | A problem was resolved or a deliverable completed |
106
+ | 🚫 | Blocked | Something couldn't be done (external limit, dependency, etc.) |
107
+ | ⚠️ | Warning/Note | Important context, gotchas, or things to remember |
108
+ | 🔧 | In Progress | Work started but not finished |
109
+ | 📋 | Queued | Work identified but not yet started |
110
+
111
+ ### Formatting Rules
112
+
113
+ - **Section headers** (`###`) get one emoji + descriptive title
114
+ - **Explanatory paragraphs** under each header -- not just bullets. Explain what happened and why.
115
+ - **Bold inline labels** for key facts: `**Fix:**`, `**Account:**`, etc.
116
+ - **Tables** for anything with 3+ rows of structured data (queued items, test results, file lists)
117
+ - **Bullets** for lists of 2+ related items
118
+ - **Links** where useful: file paths, URLs, PR links as markdown links
119
+
120
+ ### What NOT to include
121
+
122
+ - Play-by-play of debugging steps or failed approaches
123
+ - Process narration ("First I tried X, then Y")
124
+ - Redundant sections -- if nothing was blocked, skip the blocked section
125
+
126
+ ### Example
127
+
128
+ ```markdown
129
+ ## Session 6 Report -- March 27, 2026
130
+
131
+ ### ✅ Developer Docs Sources Fixed
132
+
133
+ Both Developer Docs notebooks that had been broken since Session 5 are now fully loaded with working sources:
134
+
135
+ - **Notebook #28 -- Building with Claude & Tools:** 52 sources loaded (all green)
136
+ - **Notebook #29 -- Agent SDK & Testing:** 49 sources loaded (all green)
137
+
138
+ **Fix:** Swapped `platform.claude.com/docs/en/X.md` URLs to `docs.anthropic.com/en/docs/X` (drop .md, swap domain). Tested one URL first, then bulk-loaded.
139
+
140
+ ### 🚫 Audio Generation Blocked
141
+
142
+ All 10 Audio Overviews (8 System Card + 2 Developer Docs) are ready to generate but hit the daily limit wall. The 19 overviews from Session 5 (15 Academy + 4 Opus) are still within the rolling 24-hour window.
143
+
144
+ ### ⚠️ Session 7 Notes
145
+
146
+ - **Account:** Notebooks live under secondary@example.com (authuser=1), NOT the default primary@example.com.
147
+ - **Audio budget:** Once the 24h window resets, all 10 overviews fit within the 20/day Pro limit.
148
+ ```
149
+
150
+ ---
151
+
152
+ ## Step 2: Vault Context Tracking
153
+
154
+ This step runs automatically after Step 1 completes.
155
+
156
+ 1. **Check vault context usage.** Review the conversation history for any use of these MCP tools (excluding this skill's own calls during Step 1):
157
+ - `mcp__obsidian__search_notes`
158
+ - `mcp__obsidian__read_note`
159
+ - `mcp__obsidian__read_multiple_notes`
160
+
161
+ If any were used, set `vault_context_retrieved: true`. Otherwise `false`.
162
+ If true, also note which vault notes were read (list the paths).
163
+
164
+ 2. **Update frontmatter.** Use `mcp__obsidian__update_frontmatter` to add the tracking field:
165
+ ```
166
+ mcp__obsidian__update_frontmatter(
167
+ path="[session note path from Step 1]",
168
+ frontmatter={"vault_context_retrieved": true|false},
169
+ merge=true
170
+ )
171
+ ```
172
+ If `update_frontmatter` fails, fall back to: read the note with `mcp__obsidian__read_note`, add the field to frontmatter manually, rewrite with `mcp__obsidian__write_note`.
173
+
174
+ 3. **Append tracking line.** Use `mcp__obsidian__patch_note` to append a vault context line to the Notes section (or end of the note if no Notes section exists):
175
+ - If retrieved: `- **Vault context:** Retrieved ([list of note paths])`
176
+ - If not retrieved: `- **Vault context:** Not retrieved`
177
+
178
+ If `patch_note` fails, fall back to read-modify-write via `read_note` + `write_note`.
179
+
180
+ ---
181
+
182
+ ## Step 3: Decision Extraction
183
+
184
+ This step runs automatically after Step 2 completes.
185
+
186
+ Scan the conversation for decisions, gotchas, or architectural choices that were not already saved via `/remember` or to memory. For each one found, ask the user:
187
+
188
+ > "I noticed this decision: [summary]. Want me to save it to the vault with /remember?"
189
+
190
+ Only write decision notes the user confirms. If no unrecorded decisions are found, skip silently.
191
+
192
+ ---
193
+
194
+ ## Step 4: Session Tidy (Project Scope)
195
+
196
+ This step runs automatically after Step 3 completes. It runs a scoped version of `/session-tidy` -- only for the current project's session folder, not the entire vault.
197
+
198
+ 1. **List files** in `sessions/[Project]/` via `mcp__obsidian__list_directory`.
199
+
200
+ 2. **Quick audit** each file for:
201
+ - **Naming convention:** must match `[N]. [Title].md`
202
+ - **Frontmatter completeness:** all required fields present (`type`, `project`, `session`, `date`, `status`, `blocked`, `tags`)
203
+ - **Status coherence:** `status: "completed"` with `blocked: true` is contradictory. `status: "in-progress"` or `status: "blocked"` on sessions older than 7 days is stale.
204
+
205
+ 3. **Auto-fix minor issues silently:**
206
+ - Missing frontmatter fields that can be inferred (e.g., `blocked: false` when status is `completed`)
207
+ - Type field set to wrong value (correct to `session-report`)
208
+
209
+ 4. **Report issues that need user input:**
210
+ - Files with wrong naming convention (propose new name)
211
+ - Stale statuses (propose update to `completed` or ask)
212
+ - Contradictory status/blocked combos
213
+
214
+ If no issues are found, skip silently. Do not report "all clean."
215
+
216
+ 5. **Rollup check:** if the project has 5+ sessions and no `Summary.md`, mention it:
217
+ > "This project has [N] sessions and no summary. Run `/session-tidy` for a full rollup."
218
+
219
+ ---
220
+
221
+ ## Step 5: Finalize
222
+
223
+ Copy a `/rename` command to the user's clipboard using `echo -n "/rename [Project] - [Primary Outcome]" | clip.exe`, then tell the user:
224
+
225
+ > "Copied `/rename [Project] - [Primary Outcome]` to your clipboard. Paste it to rename this session."
226
+
227
+ The primary outcome comes from the session title determined in Step 1.
228
+
229
+ ---
230
+
231
+ ## Best Practices
232
+
233
+ - Each section in the session report is an outcome, not a process step ("Sources Fixed" not "We debugged source loading")
234
+ - Body should be self-contained -- no context needed beyond the note itself
235
+ - If the session was exploratory with no concrete outcome, use 🔧 or 📋 sections to describe what was investigated and what's next
236
+ - Keep it scannable: a reader should grasp the session in 15 seconds from headers alone
237
+ - Tables are powerful -- use them whenever you have structured data (queued work, test results, file inventories)
@@ -0,0 +1,181 @@
1
+ ---
2
+ name: session-tidy
3
+ description: Audit, clean, and consolidate session logs in the Obsidian vault. Fixes format drift, resolves orphaned next-steps, updates stale statuses, and generates project rollup summaries. Use when session logs feel cluttered or before starting a new project milestone. Triggers on '/session-tidy', 'tidy sessions', 'clean up session logs', 'session audit'.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # Session Tidy: Session Log Consolidation
8
+
9
+ ## Overview
10
+
11
+ Audit and consolidate session logs in the Obsidian vault (`sessions/[Project]/`) by enforcing the format contract, categorizing uncategorized files into project subfolders, resolving orphaned next-steps, updating stale statuses, and generating project rollup summaries.
12
+
13
+ **Announce at start:** "Running session log consolidation."
14
+
15
+ **Context:** Standalone maintenance utility. Run periodically, after completing a project milestone, or when starting fresh on a project. Companion to `/dream` (memory consolidation) and `/session-log` (session creation).
16
+
17
+ ## The Format Contract
18
+
19
+ Source: `journal:session-log` skill definition. Read that skill's SKILL.md if you need to verify the authoritative format.
20
+
21
+ **Directory structure:** `sessions/[Project]/[N]. [Title].md`
22
+ - Each project gets its own subfolder under `sessions/`
23
+ - Session files are named `[N]. [Title].md` where Title is a 2-5 word summary of the primary outcome (e.g., `3. Amazon Auth Migration.md`)
24
+ - Summary files are named `Summary.md` in the same project folder
25
+ - No parenthetical suffixes like `(Wrap-Up)`
26
+ - Files missing a title (e.g., `Session 1.md` or `1.md`) should be flagged for renaming -- read the content to derive a title
27
+
28
+ **Required frontmatter fields:**
29
+ ```yaml
30
+ ---
31
+ type: session-report
32
+ project: "[name]"
33
+ session: [N]
34
+ date: "[YYYY-MM-DD]"
35
+ status: "completed" | "in-progress" | "blocked"
36
+ blocked: true | false
37
+ tags: ["session", "[project-tag]"]
38
+ ---
39
+ ```
40
+
41
+ **Content structure:**
42
+ - Section headers (`###`) use one emoji + outcome-oriented title
43
+ - Valid emojis: ✅ (done), 🚫 (blocked), ⚠️ (note), 🔧 (in-progress), 📋 (queued)
44
+ - Explanatory paragraphs under each header, not just bullets
45
+ - Tables for 3+ rows of structured data
46
+ - No play-by-play or process narration
47
+
48
+ ## The Process
49
+
50
+ ### Phase 0: Preflight
51
+
52
+ Determine which storage backend is available. Try in this order and use the first that succeeds:
53
+
54
+ 1. **Headless vault** -- run `ob --version` via Bash to verify the obsidian-headless CLI is installed. Then check `OBSIDIAN_VAULT_PATH` environment variable or `~/.claude/vault/` for a vault directory. If the CLI exists and a vault directory resolves, set `backend = "headless"`.
55
+
56
+ 2. **Obsidian MCP** -- call `mcp__obsidian__list_directory` with `path="sessions"`. If it succeeds, set `backend = "obsidian"`.
57
+
58
+ 3. **Local vault** -- use `~/.claude/vault/` as a local vault directory. Create it via `mkdir -p ~/.claude/vault/sessions` if it does not exist. Set `backend = "local"`.
59
+
60
+ **Headless and local capability notes:** When running without Obsidian MCP, the following operations use alternative methods:
61
+ - **Move/rename:** `mv` via Bash
62
+ - **Frontmatter update:** Read + modify YAML + Write
63
+ - **Search:** Bash `ls` + Grep
64
+
65
+ ### Phase 1: Audit
66
+
67
+ List project subdirectories in `sessions/` via `mcp__obsidian__list_directory`. For each project folder, read its files via `mcp__obsidian__read_note`. Also check for any files sitting directly in `sessions/` (uncategorized). For each file, check:
68
+
69
+ 1. **Naming convention?** Must match `[N]. [Title].md` where N is the session number and Title is a 2-5 word outcome summary. Flag bracket prefixes, date-only names, parenthetical suffixes, or legacy `Session [N].md` patterns missing a title.
70
+ 2. **Frontmatter complete?** All required fields present: `type`, `project`, `session`, `date`, `status`, `blocked`, `tags`.
71
+ 3. **Type correct?** Must be `session-report`. Flag other types like `rule-audit`.
72
+ 4. **Status coherent?** `status: "completed"` with `blocked: true` is contradictory. `status: "in-progress"` or `status: "blocked"` on sessions older than 7 days is likely stale.
73
+ 5. **Orphaned next-steps?** Scan content for sections containing "Next", "Queued", "Session N+1", "TODO", or clipboard emoji sections. Cross-reference against subsequent sessions for the same project to determine if the items were addressed.
74
+ 6. **Categorized?** Files sitting directly in `sessions/` (not in a project subfolder) are uncategorized. Infer the project name from the filename pattern (e.g., `BudgetBridge Session 3.md` belongs in `sessions/BudgetBridge/`) or from the frontmatter `project` field. Flag for move into the correct subfolder.
75
+
76
+ ### Phase 2: Propose Changes
77
+
78
+ Present a structured report:
79
+
80
+ **Format violations** -- files with wrong naming, missing/wrong frontmatter fields, wrong type
81
+ **Stale statuses** -- in-progress or blocked sessions older than 7 days, contradictory status+blocked combos
82
+ **Orphaned next-steps** -- queued items from session N with no evidence of resolution in session N+1 or later. For each item, state whether it was:
83
+ - **Resolved:** found evidence in a later session
84
+ - **Orphaned:** no later session addresses it
85
+ - **Unknown:** later sessions exist but don't clearly address or skip the item
86
+ **Uncategorized files** -- files in `sessions/` root that should be moved into a project subfolder
87
+ **Rollup candidates** -- projects with 3+ sessions that have no rollup/summary session
88
+ **Proposed actions** -- numbered list of specific changes
89
+
90
+ Do NOT execute any changes yet. Wait for user approval.
91
+
92
+ ### Phase 3: Execute
93
+
94
+ After user approves (all or selected items):
95
+
96
+ 1. **Rename** non-conforming files via `mcp__obsidian__move_note`.
97
+ 2. **Fix frontmatter** via `mcp__obsidian__update_frontmatter` -- set correct type, add missing fields.
98
+ 3. **Update stale statuses** -- change old in-progress/blocked to completed (or ask user for correct status).
99
+ 4. **Clean orphaned next-steps** -- for confirmed orphaned items, either:
100
+ - Remove the section if all items are orphaned and the session is old
101
+ - Add a strikethrough or "(not pursued)" annotation if some items remain relevant
102
+ - Leave unchanged if user declines
103
+ 5. **Generate project rollups** -- for each qualifying project, write a summary note via `mcp__obsidian__write_note`:
104
+ - **Path:** `sessions/[Project]/Summary.md`
105
+ - **Frontmatter:** `{"type": "project-summary", "project": "[name]", "sessions": [count], "date_range": "[first] to [last]", "tags": ["summary", "[project-tag]"]}`
106
+ - **Content:** Use this template:
107
+
108
+ ```markdown
109
+ ## [Project] -- Project Summary
110
+
111
+ ### Timeline
112
+
113
+ | # | Title | Date | Status |
114
+ |---|-------|------|--------|
115
+ | 1 | [title from filename] | [date] | ✅/🔧/🚫 |
116
+
117
+ ### Key Outcomes
118
+ - **Session [N]:** [one-line summary of primary outcome]
119
+
120
+ ### Current Status
121
+ [One paragraph: where the project stands now, what's active, what's done]
122
+
123
+ ### Carried Forward
124
+ - [ ] [unresolved item from latest session]
125
+ ```
126
+ 6. **Categorize uncategorized files** -- move files from `sessions/` root into the correct project subfolder via `mcp__obsidian__move_note`. When moving, rename to match the `[N]. [Title].md` convention (e.g., `sessions/BudgetBridge Session 3.md` becomes `sessions/BudgetBridge/3. [Title derived from content].md`).
127
+
128
+ ### Phase 4: Verify
129
+
130
+ After execution, re-read the vault and confirm:
131
+ - Every session file lives in a project subfolder under `sessions/[Project]/`
132
+ - Every file has valid frontmatter with all required fields
133
+ - Every filename matches the naming convention (`[N]. [Title].md` or `Summary.md`)
134
+ - No contradictory status/blocked combos
135
+ - All orphaned next-steps resolved or annotated
136
+ - Rollup summaries exist for qualifying projects
137
+
138
+ Report the results: files renamed, frontmatter fixed, statuses updated, next-steps resolved, rollups generated.
139
+
140
+ If Phase 1 finds zero issues across all checks, skip Phases 2-4 and report: "All session logs are tidy. Nothing to do."
141
+
142
+ ## Output Format
143
+
144
+ Phase 2 report structure:
145
+
146
+ ```
147
+ ## Session Tidy Report
148
+
149
+ ### Format Violations (X found)
150
+ - [file] -- [issue]
151
+
152
+ ### Stale Statuses (X found)
153
+ - [file] -- [status] since [date] ([age] days ago)
154
+
155
+ ### Uncategorized Files (X found)
156
+ - [file] -- move to sessions/[Project]/[new filename]
157
+
158
+ ### Orphaned Next-Steps (X found)
159
+ - [file] -- "[item text]" -- [resolved/orphaned/unknown]
160
+
161
+ ### Rollup Candidates (X projects)
162
+ - [project] -- [N] sessions, [date range], no summary exists
163
+
164
+ ### Proposed Actions
165
+ 1. [action] -- [file] -- [reason]
166
+ 2. ...
167
+
168
+ Approve all, select by number, or cancel?
169
+ ```
170
+
171
+ ## After Completion
172
+
173
+ Report summary: files renamed, frontmatter fixes, status updates, next-steps cleaned, rollups generated.
174
+
175
+ ## Best Practices
176
+
177
+ - Run after finishing a multi-session project
178
+ - Run before starting a new milestone on an existing project (clears stale context)
179
+ - Cross-reference next-steps manually when the skill flags "unknown" -- it cannot determine intent from content alone
180
+ - The 7-day staleness threshold is a heuristic -- adjust based on how frequently you session-log
181
+ - Rollup summaries are not a replacement for individual session logs -- they are a navigational aid