Skip to content

Commit a867aac

Browse files
committed
feat(claude,nvim): add obsidian skills, claudecode.nvim, and statusline improvements
- add 6 obsidian vault skills: meeting-note, spike, add-recipe, add-vinyl, weekly-review, quick-note - wire new skills into claude.mk install and clean targets - add claudecode.nvim plugin with keybindings for toggle, focus, resume, diff management - show session cost and hide default effort level in statusline - remove vim mode bracket indicator (rendered natively now) - format reset times more compactly in usage bar - switch model to opus[1m], enable voice, add obsidian-skills marketplace - allow git show in permissions, disable smear-cursor
1 parent 024e179 commit a867aac

File tree

13 files changed

+455
-23
lines changed

13 files changed

+455
-23
lines changed

ai-stuff/claude/scripts/statusline.sh

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ input=$(cat)
99
cwd=$(echo "$input" | jq -r ".workspace.current_dir")
1010
model=$(echo "$input" | jq -r ".model.display_name")
1111
time=$(date +%H:%M:%S)
12+
cost_usd=$(echo "$input" | jq -r ".cost_usd // empty")
1213

1314
# Git info
1415
git_branch=""
@@ -25,16 +26,8 @@ if git -C "$cwd" rev-parse --git-dir >/dev/null 2>&1; then
2526
fi
2627
fi
2728

28-
# Vim mode
29+
# Vim mode (bracket indicator removed; Claude Code renders -- INSERT --/-- NORMAL -- natively)
2930
vim_mode=""
30-
vim_mode_json=$(echo "$input" | jq -r ".vim.mode // empty")
31-
if [ -n "$vim_mode_json" ]; then
32-
if [ "$vim_mode_json" = "NORMAL" ]; then
33-
vim_mode=" [N]"
34-
else
35-
vim_mode=" [I]"
36-
fi
37-
fi
3831

3932
# Reasoning effort from settings
4033
effort_level=""
@@ -218,6 +211,19 @@ if [ -n "$usage_data" ]; then
218211
seven_day_reset=$(format_reset_time "$seven_day_reset_iso" "datetime")
219212
fi
220213

214+
# Format cost as $X.XXXX (4 decimal places), dropping trailing zeros after 2
215+
format_cost() {
216+
local raw=$1
217+
if [ -z "$raw" ]; then return; fi
218+
# Use awk to format: show 4 sig decimals but drop trailing zeros beyond 2
219+
echo "$raw" | awk '{
220+
val = $1 + 0
221+
printf "$%.4f", val
222+
}' | sed 's/\(\.[0-9][0-9]\)0\+$/\1/'
223+
}
224+
225+
cost_fmt=$(format_cost "$cost_usd")
226+
221227
SEP=" ${C_DIM}|${C_RESET} "
222228

223229
# ===== OUTPUT =====
@@ -260,9 +266,15 @@ esac
260266
printf "\n"
261267
printf "%b%s%b" "$C_BLUE" "$model" "$C_RESET"
262268
printf "%b" "$SEP"
263-
printf "%b%s / %s%b %b(%s%%)%b" "$C_ORANGE" "$used_fmt" "$total_fmt" "$C_RESET" "$C_GREEN" "$pct_used" "$C_RESET"
264-
printf "%b" "$SEP"
265-
printf "effort: %b%s%b" "$effort_color" "$effort_level" "$C_RESET"
269+
printf "ctx: %b%s / %s%b %b(%s%%)%b" "$C_ORANGE" "$used_fmt" "$total_fmt" "$C_RESET" "$C_GREEN" "$pct_used" "$C_RESET"
270+
if [ -n "$cost_fmt" ]; then
271+
printf "%b" "$SEP"
272+
printf "cost: %b%s%b" "$C_CYAN" "$cost_fmt" "$C_RESET"
273+
fi
274+
if [ "$effort_level" != "default" ]; then
275+
printf "%b" "$SEP"
276+
printf "effort: %b%s%b" "$effort_color" "$effort_level" "$C_RESET"
277+
fi
266278

267279
# Line 2: Current (5h) bar | Weekly (7d) bar
268280
if [ -n "$usage_data" ]; then
@@ -277,7 +289,7 @@ if [ -n "$usage_data" ]; then
277289

278290
# Line 3: Reset times
279291
printf "\n"
280-
printf "%bresets %s%b" "$C_WHITE" "$five_hour_reset" "$C_RESET"
292+
printf "%bresets:%b 5h @ %s" "$C_WHITE" "$C_RESET" "$five_hour_reset"
281293
printf "%b" "$SEP"
282-
printf "%bresets %s%b" "$C_WHITE" "$seven_day_reset" "$C_RESET"
294+
printf "7d @ %s" "$seven_day_reset"
283295
fi

ai-stuff/claude/settings.json

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,19 @@
2020
"Read(~/.claude/personas/**)",
2121
"Read(~/.claude/config/**)",
2222
"Read(~/vault/personal/nl/house search/buying a house/**)",
23+
"Bash(git show *)",
2324
"Bash(glab mr view *)",
2425
"Bash(glab mr diff *)",
2526
"Bash(glab mr list *)",
2627
"Bash(gh pr view *)",
2728
"Bash(gh pr diff *)",
2829
"Bash(gh pr list *)"
2930
],
30-
"ask": ["Write(~/vault/personal/nl/house search/buying a house/**)"]
31+
"ask": [
32+
"Write(~/vault/personal/nl/house search/buying a house/**)"
33+
]
3134
},
32-
"model": "opus",
35+
"model": "opus[1m]",
3336
"hooks": {
3437
"Notification": [
3538
{
@@ -53,9 +56,19 @@
5356
"playwright@claude-plugins-official": false,
5457
"context7@claude-plugins-official": false,
5558
"ralph-loop@claude-plugins-official": false,
56-
"feature-dev@claude-plugins-official": true
59+
"feature-dev@claude-plugins-official": false,
60+
"obsidian@obsidian-skills": false
61+
},
62+
"extraKnownMarketplaces": {
63+
"obsidian-skills": {
64+
"source": {
65+
"source": "github",
66+
"repo": "kepano/obsidian-skills"
67+
}
68+
}
5769
},
70+
"effortLevel": "medium",
5871
"promptSuggestionEnabled": false,
5972
"autoUpdatesChannel": "latest",
60-
"effortLevel": "medium"
73+
"voiceEnabled": true
6174
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
---
2+
name: add-recipe
3+
description: Add a cooking recipe to the vault with proper frontmatter. Accepts a recipe name, description, or URL to parse.
4+
tools: Write, Read, Glob, WebFetch
5+
argument-hint: <recipe name or URL>
6+
---
7+
8+
# Add Recipe
9+
10+
Add a cooking recipe to the Obsidian vault following the established format.
11+
12+
## Instructions
13+
14+
1. Parse input from: `$ARGUMENTS`
15+
- If a URL: fetch the page and extract the recipe
16+
- If a recipe name/description: use it to create the note
17+
- If no arguments: ask what recipe to add
18+
2. Create the file at: `~/vault/personal/cooking/<recipe-name-slug>.md`
19+
- Use the vault path: `/Users/denizgokcin/Library/Mobile Documents/iCloud~md~obsidian/Documents/vault`
20+
- slug: lowercase with spaces (e.g., "citir tavuk.md", "boyoz.md")
21+
22+
### File Format
23+
24+
```markdown
25+
---
26+
title: <Recipe Name>
27+
ingredients:
28+
- ingredient 1
29+
- ingredient 2
30+
steps:
31+
- Step 1 description.
32+
- Step 2 description.
33+
tags:
34+
- cooking
35+
- <category tag: e.g., breakfast, dinner, snack>
36+
- <cuisine tag: e.g., Turkish, Italian>
37+
- <type tag: e.g., pastry, meat, vegetarian>
38+
prep_time: X min
39+
cook_time: X min
40+
difficulty: Easy|Medium|Hard
41+
servings: X
42+
category: <Breakfast|Lunch|Dinner|Snack|Dessert|Side>
43+
rating: <1-5, leave empty if new>
44+
notes: <brief personal note about the recipe>
45+
---
46+
47+
<Optional personal notes in Turkish or English - casual cooking tips, shortcuts, or reminders>
48+
```
49+
50+
### Rules
51+
52+
- Keep steps concise and practical (not essay-style)
53+
- The body text below frontmatter is for casual personal notes (can be in Turkish)
54+
- If the user provides info in Turkish, keep it in Turkish in the body
55+
- Frontmatter fields (title, steps, ingredients) should be in English
56+
- Tags should include `cooking` plus relevant category/cuisine/type tags
57+
- Report the created file path when done
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
---
2+
name: add-vinyl
3+
description: Add a vinyl record to the collection with Discogs metadata. Accepts artist and album name, or a Discogs URL.
4+
tools: Write, Read, Glob, WebFetch, WebSearch
5+
argument-hint: <"artist - album" or Discogs URL>
6+
---
7+
8+
# Add Vinyl Record
9+
10+
Add a vinyl record to the Obsidian vault collection.
11+
12+
## Instructions
13+
14+
1. Parse input from: `$ARGUMENTS`
15+
- If a Discogs URL: fetch and extract metadata
16+
- If "artist - album" format: use web search to find the Discogs release page and extract metadata
17+
- If no arguments: ask for artist and album name
18+
2. Create the file at: `~/vault/personal/vinyl/records/collection/<artist> - <album>.md`
19+
- Use the vault path: `/Users/denizgokcin/Library/Mobile Documents/iCloud~md~obsidian/Documents/vault`
20+
- filename: all lowercase (e.g., "daft punk - random access memories.md")
21+
22+
### File Format
23+
24+
```markdown
25+
---
26+
artist: <lowercase artist name>
27+
album_name: <lowercase album name>
28+
cover: <discogs cover image URL>
29+
released: <release year>
30+
country: <country code: EU, US, UK, etc.>
31+
genre: <comma-separated genres, lowercase>
32+
style: <comma-separated styles, lowercase>
33+
discogs_link: <full discogs release URL>
34+
date_of_purchase: <YYYY-MM-DD, default to today>
35+
purchased_store: <store name, ask user if not provided>
36+
---
37+
tags:: [[virtual library]]
38+
39+
### Album Cover
40+
41+
![cover](<cover image URL>)
42+
43+
### Album Information
44+
45+
N/A
46+
```
47+
48+
### Rules
49+
50+
- All text values in frontmatter are lowercase
51+
- Genre and style are comma-separated strings (not arrays)
52+
- `date_of_purchase` defaults to today if not specified
53+
- Ask the user for `purchased_store` if not provided
54+
- The cover image URL should be from Discogs
55+
- `tags::` (with double colon) is inline Dataview syntax, not frontmatter
56+
- Report the created file path when done
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
---
2+
name: meeting-note
3+
description: Create a meeting note in the vault with proper frontmatter and structure. Use when starting or documenting a meeting.
4+
tools: Write, Read, Glob
5+
argument-hint: <meeting title>
6+
---
7+
8+
# Create Meeting Note
9+
10+
Create a meeting note in the Obsidian vault following the established template.
11+
12+
## Instructions
13+
14+
1. Parse the meeting title from: `$ARGUMENTS`
15+
- If no arguments provided, ask for the meeting title
16+
2. Get today's date in `YYYY-MM-DD` format
17+
3. Create the file at: `~/vault/work/meetings/YYYY-MM-DD <title>.md`
18+
- Use the vault path: `/Users/denizgokcin/Library/Mobile Documents/iCloud~md~obsidian/Documents/vault`
19+
20+
### File Format
21+
22+
```markdown
23+
---
24+
date: YYYY-MM-DD HH:mm
25+
type: meeting
26+
client: N/A
27+
tags: meeting
28+
summary: " "
29+
---
30+
tags: [[salonized/meetings/moc]]
31+
Date: [[YYYY-MM-DD]]
32+
33+
# [[YYYY-MM-DD <title>]]
34+
35+
**Attendees**:
36+
-
37+
38+
## Agenda
39+
40+
*What is the meeting agenda*
41+
42+
## Questions
43+
-
44+
45+
## Notes
46+
-
47+
48+
## Action Items
49+
```
50+
51+
4. Use the current time for the `date` field (YYYY-MM-DD HH:mm format)
52+
5. The H1 title must be a wikilink wrapping the full filename (without .md)
53+
6. Report the created file path when done
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
name: quick-note
3+
description: Quick capture a note to work/random or personal/random. Use for ad-hoc ideas, links, or anything that needs a quick home.
4+
tools: Write, Read, Glob
5+
argument-hint: <note title> [--personal]
6+
---
7+
8+
# Quick Note
9+
10+
Quickly capture a note to the vault's random folders.
11+
12+
## Instructions
13+
14+
1. Parse input from: `$ARGUMENTS`
15+
- If `--personal` flag is present: file to `personal/random/`
16+
- Otherwise: default to `work/random/`
17+
- The remaining text is the note title
18+
- If no arguments: ask what to capture
19+
2. Create the file at the appropriate path:
20+
- Work: `~/vault/work/random/<title-slug>.md`
21+
- Personal: `~/vault/personal/random/<title-slug>.md`
22+
- Use the vault path: `/Users/denizgokcin/Library/Mobile Documents/iCloud~md~obsidian/Documents/vault`
23+
- title-slug: lowercase with spaces (e.g., "devx support bot idea.md")
24+
25+
### File Format
26+
27+
```markdown
28+
# <Title>
29+
30+
<content from conversation or user input>
31+
```
32+
33+
### Rules
34+
35+
- Minimal structure - no frontmatter needed (random notes don't use it)
36+
- Just a title and content
37+
- If the user provides content in the same message, include it
38+
- If only a title, create the note with the title and leave room for content
39+
- Report the created file path when done

0 commit comments

Comments
 (0)