Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 0 additions & 23 deletions .claude/commands/openspec/apply.md

This file was deleted.

27 changes: 0 additions & 27 deletions .claude/commands/openspec/archive.md

This file was deleted.

27 changes: 0 additions & 27 deletions .claude/commands/openspec/proposal.md

This file was deleted.

24 changes: 24 additions & 0 deletions .claude/commands/spectr/apply.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
name: Spectr: Apply
description: Implement an approved Spectr change and keep tasks in sync.
category: Spectr
tags: [spectr, apply]
---
<!-- spectr:START -->
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `spectr/AGENTS.md` (located inside the `spectr/` directory—run `ls spectr` or `spectr update` if you don't see it) if you need additional Spectr conventions or clarifications.

**Steps**
Track these steps as TODOs and complete them one by one.
1. Read `spectr/changes/<id>/proposal.md`, `design.md` (if present), and `tasks.md` to confirm scope and acceptance criteria.
2. Work through tasks sequentially, keeping edits minimal and focused on the requested change.
3. Confirm completion before updating statuses—make sure every item in `tasks.md` is finished.
4. Update the checklist after all work is done so each task is marked `- [x]` and reflects reality.
5. Reference `spectr list` or `spectr show <item>` when additional context is required.

**Reference**
- Use `spectr show <id> --json --deltas-only` if you need additional context from the proposal while implementing.

<!-- spectr:END -->
28 changes: 28 additions & 0 deletions .claude/commands/spectr/archive.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
name: Spectr: Archive
description: Archive a deployed Spectr change and update specs.
category: Spectr
tags: [spectr, archive]
---
<!-- spectr:START -->
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `spectr/AGENTS.md` (located inside the `spectr/` directory—run `ls spectr` or `spectr update` if you don't see it) if you need additional Spectr conventions or clarifications.

**Steps**
1. Determine the change ID to archive:
- If this prompt already includes a specific change ID (for example inside a `<ChangeId>` block populated by slash-command arguments), use that value after trimming whitespace.
- If the conversation references a change loosely (for example by title or summary), run `spectr list` to surface likely IDs, share the relevant candidates, and confirm which one the user intends.
- Otherwise, review the conversation, run `spectr list`, and ask the user which change to archive; wait for a confirmed change ID before proceeding.
- If you still cannot identify a single change ID, stop and tell the user you cannot archive anything yet.
2. Validate the change ID by running `spectr list` (or `spectr show <id>`) and stop if the change is missing, already archived, or otherwise not ready to archive.
3. Run `spectr archive <id> --yes` so the CLI moves the change and applies spec updates without prompts.
4. Review the command output to confirm the target specs were updated and the change landed in `spectr/changes/archive/`.
5. Validate with `spectr validate --strict` and inspect with `spectr show <id>` if anything looks off.

**Reference**
- Use `spectr list` to confirm change IDs before archiving.
- Inspect refreshed specs with `spectr list --specs` and address any validation issues before handing off.

<!-- spectr:END -->
28 changes: 28 additions & 0 deletions .claude/commands/spectr/proposal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
name: Spectr: Proposal
description: Scaffold a new Spectr change and validate strictly.
category: Spectr
tags: [spectr, change]
---
<!-- spectr:START -->
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `spectr/AGENTS.md` (located inside the `spectr/` directory—run `ls spectr` or `spectr update` if you don't see it) if you need additional Spectr conventions or clarifications.
- Identify any vague or ambiguous details and ask the necessary follow-up questions before editing files.

**Steps**
1. Review `spectr/project.md`, run `spectr list` and `spectr list --specs`, and inspect related code or docs (e.g., via `rg`/`ls`) to ground the proposal in current behaviour; note any gaps that require clarification.
2. Choose a unique verb-led `change-id` and scaffold `proposal.md`, `tasks.md`, and `design.md` (when needed) under `spectr/changes/<id>/`.
3. Map the change into concrete capabilities or requirements, breaking multi-scope efforts into distinct spec deltas with clear relationships and sequencing.
4. Capture architectural reasoning in `design.md` when the solution spans multiple systems, introduces new patterns, or demands trade-off discussion before committing to specs.
5. Draft spec deltas in `spectr/changes/<id>/specs/<capability>/spec.md` (one folder per capability) using `## ADDED|MODIFIED|REMOVED Requirements` with at least one `#### Scenario:` per requirement and cross-reference related capabilities when relevant.
6. Draft `tasks.md` as an ordered list of small, verifiable work items that deliver user-visible progress, include validation (tests, tooling), and highlight dependencies or parallelizable work.
7. Validate with `spectr validate <id> --strict` and resolve every issue before sharing the proposal.

**Reference**
- Use `spectr show <id> --json --deltas-only` or `spectr show <spec> --type spec` to inspect details when validation fails.
- Search existing requirements with `rg -n "Requirement:|Scenario:" spectr/specs` before writing new ones.
- Explore the codebase with `rg <keyword>`, `ls`, or direct file reads so proposals align with current implementation realities.

<!-- spectr:END -->
36 changes: 18 additions & 18 deletions .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,101 +17,101 @@
"deny": []
},
"hooks": {
"PreCompact": [
"SessionStart": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "conclaude PreCompact"
"command": "conclaude SessionStart"
}
]
}
],
"SessionStart": [
"PostToolUse": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "conclaude SessionStart"
"command": "conclaude PostToolUse"
}
]
}
],
"SubagentStop": [
"UserPromptSubmit": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "conclaude SubagentStop"
"command": "conclaude UserPromptSubmit"
}
]
}
],
"PreToolUse": [
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "conclaude PreToolUse"
"command": "conclaude Notification"
}
]
}
],
"SessionEnd": [
"PreCompact": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "conclaude SessionEnd"
"command": "conclaude PreCompact"
}
]
}
],
"Notification": [
"SubagentStop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "conclaude Notification"
"command": "conclaude SubagentStop"
}
]
}
],
"Stop": [
"PreToolUse": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "conclaude Stop"
"command": "conclaude PreToolUse"
}
]
}
],
"PostToolUse": [
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "conclaude PostToolUse"
"command": "conclaude Stop"
}
]
}
],
"UserPromptSubmit": [
"SessionEnd": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "conclaude UserPromptSubmit"
"command": "conclaude SessionEnd"
}
]
}
Expand Down
6 changes: 1 addition & 5 deletions .conclaude.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,7 @@

# Stop hook configuration - runs when Claude is about to stop
stop:
# Commands to run during Stop hook
# Each line is executed as a separate bash command
run: ""

# Alternative structured command format with optional custom error messages
# Structured command format with optional custom error messages
# Each command can have its own error message, and control output display
commands: []
# Examples:
Expand Down
7 changes: 4 additions & 3 deletions .config/hypr/hyprland.conf
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ env = DEFAULT_BROWSER,zen
env = GBM_BACKEND,nvidia-drm
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
# env = SDL_VIDEODRIVER,wayland
# env = GDK_BACKEND,wayland,x11,*
# env = GTK_THEME,Adwaita:dark
env = GDK_BACKEND,wayland,x11,*
env = GTK_THEME,Adwaita:dark
env = CLUTTER_BACKEND,wayland
env = XCURSOR_SIZE,24

Expand Down Expand Up @@ -103,7 +103,7 @@ windowrulev2 = center, class:Xdg-desktop-portal-gtk, focus:0, tile:1
windowrulev2 = tile, class:^(Spotify)$
windowrulev2 = workspace 9, class:^(Spotify)$
windowrulev2 = workspace 10, class:^(Chromium-browser), focus:0$
windowrulev2 = stayfocused, class:^gcr-prompter-
windowrule = stayfocused, class:(gcr-prompter-)(.*), focus:1

# Key bindings https://wiki.hyprland.org/Configuring/Binds/
bind = $mainMod, B,exec, $browser
Expand All @@ -118,6 +118,7 @@ bind = $mainMod, F, fullscreen,0
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, T, togglesplit, # dwindle
bind = $mainMod SHIFT, C, exec, $color_picker
bind = , mouse:274, exec, ;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

bind = , mouse:274, exec, ; runs a broken shell command on every click.

With no modifier, every press of mouse button 274 will try to execute the command ;, which most shells treat as a syntax error and just log noise. If this is a placeholder, it’s safer to remove or comment it until you have a real command:

-bind = , mouse:274, exec, ;
+# bind = , mouse:274, exec, <command>

🏁 Script executed:

#!/bin/bash
# Inspect the .config/hypr/hyprland.conf file around line 121
echo "=== Context around line 121 ==="
sed -n '110,130p' .config/hypr/hyprland.conf

echo ""
echo "=== All bind statements with mouse buttons ==="
grep -n 'bind.*mouse:' .config/hypr/hyprland.conf || echo "No other mouse bindings found"

echo ""
echo "=== All bind statements with empty or single-char exec commands ==="
grep -n 'bind.*exec.*[;]' .config/hypr/hyprland.conf || echo "No similar patterns found"

echo ""
echo "=== File statistics ==="
wc -l .config/hypr/hyprland.conf

Length of output: 1119



---

🌐 Web query:

```web
Hyprland mouse button 274 bind syntax documentation

💡 Result:

Use the normal bind syntax with the mouse: prefix (button code 274 = middle mouse button). Examples:

  • Regular keybind (exec on Super + MMB):
    bind = SUPER, mouse:274, exec, your-command. [1][2]

  • Mouse-movement bind (move/resize windows):
    bindm = ALT, mouse:274, movewindow
    bindm = ALT, mouse:274, resizewindow, 1. [1][3]

Notes: you can also use bind flags (r/e/l/n/etc.) like bindr/binde/bindl and test button codes with wev. [3][1]

Sources: Hyprland binds documentation. [1] https://wiki.hypr.land/Configuring/Binds/ [2] https://wiki.hypr.land/hyprland-wiki/pages/Configuring/Binds/ [3] https://wiki.hypr.land/0.41.2/Configuring/Binds/


Comment out or replace the placeholder command on line 121.

The binding bind = , mouse:274, exec, ; attempts to execute ; (a shell statement separator without a statement), which is invalid. Per Hyprland documentation, proper syntax is bind = SUPER, mouse:274, exec, your-command. The line should either be removed or replaced with a valid command.

🤖 Prompt for AI Agents
.config/hypr/hyprland.conf around line 121: the binding currently reads "bind =
, mouse:274, exec, ;" which tries to execute an empty command delimiter; replace
or comment out this placeholder. Either remove the line or change it to a valid
binding such as "bind = SUPER, mouse:274, exec, <your-command>" (substitute your
desired command), or prefix the line with "#" to comment it out.


# Move focus with mainMod + arrow keys
bind = $mainMod, H, movefocus, l
Expand Down
16 changes: 16 additions & 0 deletions .config/kitty/kitty.conf
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,19 @@ cursor_trail_decay 0.03 0.1
editor nvim
allow_hyperlinks yes
linux_display_server auto

map ctrl+shift+e launch --type=overlay --stdin-source=@screen_scrollback nvim -

tab_separator " "
tab_bar_style separator
tab_title_max_length 0
tab_powerline_style slanted
tab_title_template " {f'{title[:4]}' if title.rindex(title[-1]) + 1 > 30 else (title.center(6) if (title.rindex(title[-1]) + 1) % 2 == 0 else title.center(5))}"

active_tab_font_style bold
inactive_tab_font_style bold

active_tab_foreground #6c6c6c
active_tab_background #000000
inactive_tab_foreground #303030
inactive_tab_background #000000
2 changes: 1 addition & 1 deletion .config/nvim
Submodule nvim updated from e7af98 to 6d064f
43 changes: 43 additions & 0 deletions .config/wezterm/wezterm.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
local wezterm = require 'wezterm'
local io = require 'io'
local os = require 'os'
local act = wezterm.action

wezterm.on('trigger-vim-with-scrollback', function(window, pane)
-- Retrieve the text from the pane
local text = pane:get_lines_as_text(pane:get_dimensions().scrollback_rows)

-- Create a temporary file to pass to vim
local name = os.tmpname()
local f = io.open(name, 'w+')
f:write(text)
f:flush()
f:close()

-- Open a new window running vim and tell it to open the file
window:perform_action(
act.SpawnCOmmandInPane {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Critical: Fix typo in action name.

Line 19 contains a typo: SpawnCOmmandInPane should be SpawnCommandInNewPane (or the correct WezTerm API method). This typo will cause a runtime error when the keybinding is triggered.


🌐 Web query:

What is the correct WezTerm API method for spawning a command in a pane?

💡 Result:

Use the multiplexer API: wezterm.mux.spawn_window (to spawn into a new window) or window:spawn_tab (to spawn into a new tab). To create a new pane running a command, use pane:split with args (or the CLI equivalent wezterm cli split-pane). [1][2][3]

Sources:
[1] wezterm.mux.spawn_window docs.
[2] MuxWindow: window:spawn_tab docs.
[3] CLI split-pane / pane:split usage.


I need to clarify the correct WezTerm action name. The web results show API methods, but the code uses the act. prefix (action system). Let me verify what the correct action name should be:

The web search has definitively shown that WezTerm supports SpawnCommandInNewWindow and SpawnCommandInNewTab, and the SplitPane action accepts a command parameter to specify what program to launch into the new pane. However, there is no WezTerm action called SpawnCommandInNewPane or SpawnCOmmandInPane.

The review comment contains a critical flaw: while it correctly identifies a typo in the code, the suggested fix is itself incorrect. I need to examine the actual configuration file to determine the developer's intended action.

[/run_scripts]


🏁 Script executed:

#!/bin/bash
# Examine the wezterm.lua file around line 19 to understand the context
if [ -f ".config/wezterm/wezterm.lua" ]; then
  sed -n '1,30p' ".config/wezterm/wezterm.lua"
else
  echo "File not found"
fi

Length of output: 915


Fix incorrect action name: use SpawnCommandInNewWindow instead of SpawnCOmmandInPane.

Line 19 contains a typo and an invalid action name. SpawnCOmmandInPane does not exist in WezTerm. Based on the comment above the code ("Open a new window running vim"), the correct action is act.SpawnCommandInNewWindow. Replace line 19 with:

act.SpawnCommandInNewWindow {

This will fix both the typo and the runtime error.

🤖 Prompt for AI Agents
In .config/wezterm/wezterm.lua around line 19 the action name is misspelled as
"SpawnCOmmandInPane" which is invalid; replace that token with the correct
action name "SpawnCommandInNewWindow" so the keybinding opens a new window
running vim as intended, ensuring the capitalization matches exactly and no
other parameters are changed.

args = { 'nvim', name },
},
pane
)

-- Wait "enough" time for vim to read the file before we remove it.
-- The window creation and process spawn are asynchronous wrt. running
-- this script and are not awaitable, so we just pick a number.
--
-- Note: We don't strictly need to remove this file, but it is nice
-- to avoid cluttering up the temporary directory.
wezterm.sleep_ms(1000)
os.remove(name)
end)

return {
keys = {
{
key = 'E',
mods = 'SHIFT|CTRL',
action = act.EmitEvent 'trigger-vim-with-scrollback',
},
},
}
Loading
Loading