chore: sync agent tooling and shell/editor theme setup#5
Conversation
📝 WalkthroughWalkthroughThe PR introduces comprehensive agent workflow documentation and skills, replaces Kiro CLI integration with Pure shell prompt framework for Fish, adds a Cursor Dark color scheme for Neovim and other tools, and refactors the formatting/linting build system with modular formatter scripts. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 11
Note
Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.
🟡 Minor comments (22)
.config/ghostty/config-25-25 (1)
25-25:⚠️ Potential issue | 🟡 MinorRemove leading whitespace for consistency.
Line 25 has a leading space before
bell-features, which is inconsistent with the rest of the configuration file where all keys start at column 1. This could potentially cause parsing issues.Proposed fix
- bell-features = title,attention,system +bell-features = title,attention,system🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/ghostty/config at line 25, Remove the leading space before the configuration key by updating the line that defines "bell-features" so the key starts at column 1 (i.e., change the line " bell-features = title,attention,system" to have no leading whitespace); ensure the "bell-features" key is aligned with other top-level keys to maintain consistent parsing and formatting..config/fish/functions/_pure_prompt_beginning.fish-4-6 (1)
4-6:⚠️ Potential issue | 🟡 MinorUse
echo -norprintfto prevent trailing newline that breaks prompt rendering.The plain
echocommand appends a newline, which becomes embedded in the prompt output when_pure_prompt_beginningis invoked as a command substitution in_pure_prompt_new_line.fish. This causes the ANSI clear-line escape sequence (\r\033[K) to be followed by a newline, breaking the intended line-clearing behavior.Suggested fix
- set --local clear_line "\r\033[K" - - echo $clear_line + echo -n "\r\033[K"Or using
printf(more portable):- set --local clear_line "\r\033[K" - - echo $clear_line + printf '\r\033[K'🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_prompt_beginning.fish around lines 4 - 6, The function _pure_prompt_beginning currently uses echo $clear_line which appends a trailing newline and breaks prompt rendering; change the output to avoid the newline by emitting the clear_line variable with either echo -n $clear_line or preferably use printf '%s' "$clear_line" so the \r\033[K sequence is written without a trailing newline (refer to the _pure_prompt_beginning function and the clear_line variable)..config/fish/functions/_pure_prompt_aws_profile.fish-15-17 (1)
15-17:⚠️ Potential issue | 🟡 MinorMissing quotes around variable in
test -n.Same issue as in
_pure_prompt_virtualenv.fish— without quotes,test -n $aws_profilewill return true when the variable is empty.🐛 Proposed fix
- if test -n $aws_profile + if test -n "$aws_profile" echo "$pure_symbol_aws_profile_prefix$aws_profile_color$aws_profile" end🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_prompt_aws_profile.fish around lines 15 - 17, Quote the aws_profile variable in the conditional to avoid false positives when it's empty: update the if test in the _pure_prompt_aws_profile.fish function to use test -n "$aws_profile" (and similarly ensure other variable checks like in _pure_prompt_virtualenv.fish use quoted expansions) so the condition reliably checks emptiness; keep the rest of the echo logic intact..config/fish/functions/_pure_prompt_virtualenv.fish-16-18 (1)
16-18:⚠️ Potential issue | 🟡 MinorMissing quotes around variable in
test -nwill cause incorrect behavior.On line 16,
test -n $virtualenvwithout quotes means when$virtualenvis empty,test -nreceives no argument and returns true (exit code 0). This causes the prompt to always output even when no virtualenv is active.🐛 Proposed fix
- if test -n $virtualenv + if test -n "$virtualenv" echo "$pure_symbol_virtualenv_prefix$virtualenv_color$virtualenv" end🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_prompt_virtualenv.fish around lines 16 - 18, The condition uses an unquoted variable in test -n which causes it to evaluate true when $virtualenv is empty; update the if condition that checks virtualenv (the test -n usage) to quote the variable (e.g., test -n "$virtualenv") so the block that echoes pure_symbol_virtualenv_prefix, virtualenv_color and virtualenv only runs when a virtualenv is actually set..config/fish/functions/_pure_k8s_namespace.fish-2-6 (1)
2-6:⚠️ Potential issue | 🟡 MinorMissing
--localscope fornamespacevariable.The
namespacevariable is set without a scope flag, creating a global variable that persists beyond this function call. Use--localto properly scope it.🐛 Proposed fix
function _pure_k8s_namespace - set namespace (kubectl config view --minify --output 'jsonpath={..namespace}' 2>/dev/null) + set --local namespace (kubectl config view --minify --output 'jsonpath={..namespace}' 2>/dev/null) if test -z "$namespace" set namespace default🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_k8s_namespace.fish around lines 2 - 6, The function creates a global variable named namespace; change both assignments to use a local-scoped variable by calling set --local namespace when assigning the kubectl output and when falling back to default. Update the occurrences in _pure_k8s_namespace.fish where you call set namespace (kubectl ...) and set namespace default to set --local namespace ... so the variable does not leak outside the function..config/fish/functions/_pure_check_availability.fish-7-7 (1)
7-7:⚠️ Potential issue | 🟡 MinorMissing
--localscope forFAILUREvariable.
set FAILURE 1without a scope flag creates a global variable, which persists and could cause unintended side effects. Use--localto scope it to this function.🐛 Proposed fix
- set FAILURE 1 + set --local FAILURE 1🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_check_availability.fish at line 7, The FAILURE variable in _pure_check_availability.fish is being set globally with "set FAILURE 1"; change this to a local-scoped variable by using the fish local scope flag so FAILURE is only visible inside the _pure_check_availability.fish function (update the "set FAILURE" invocation accordingly)..config/fish/functions/fish_prompt.fish-1-1 (1)
1-1:⚠️ Potential issue | 🟡 MinorMinor typo in comment.
"a called to" should be "a call to".
-# a called to `_pure_prompt_new_line` is triggered by an event +# a call to `_pure_prompt_new_line` is triggered by an event🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/fish_prompt.fish at line 1, Fix the typo in the comment at the top of fish_prompt.fish: change "a called to `_pure_prompt_new_line` is triggered by an event" to "a call to `_pure_prompt_new_line` is triggered by an event" so the comment correctly references the `_pure_prompt_new_line` function and reads clearly..config/fish/functions/_pure_format_time.fish-29-29 (1)
29-29:⚠️ Potential issue | 🟡 MinorPotential edge case: durations near threshold may produce empty output.
The
-gt(greater than) comparison means that whensecondsequalsthreshold, seconds are not displayed. Combined with the early return at line 13, this creates an edge case:For
threshold=5andmilliseconds=5500(5.5 seconds):
- Line 13:
5500 < 5000? No → continueseconds = 5- Line 29:
5 > 5? False → seconds not appended- Result: empty
$timearray, empty outputIf this is intentional, please disregard. Otherwise, consider using
-ge:🔧 Proposed fix
- test "$seconds" -gt $threshold; and set --append time (printf "%ss" $seconds) + test "$seconds" -ge $threshold; and set --append time (printf "%ss" $seconds)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_format_time.fish at line 29, The current comparison in _pure_format_time.fish uses "test \"$seconds\" -gt $threshold" which skips appending seconds when seconds == threshold and can yield empty output for values like milliseconds=5500; change the comparison to use "-ge" (greater than or equal) or otherwise adjust the conditional in the block handling variable seconds (and consider the early return logic earlier in the function) so that when seconds equals threshold the seconds unit is appended to the time array instead of being omitted..agents/commands/understand.md-6-6 (1)
6-6:⚠️ Potential issue | 🟡 MinorFix spacing typo in Step 2.
Line 6 has an extra full-width space (
コード、 情報) that makes formatting inconsistent.Proposed change
-2. コンテキストを理解した後、開発者のinstructionに必要なコード、 情報を整理してください。 +2. コンテキストを理解した後、開発者のinstructionに必要なコード、情報を整理してください。🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/commands/understand.md at line 6, In the .agents/commands/understand.md Step 2 text fix the spacing typo by replacing the full-width space between "コード、 情報" with a normal (single) space so it reads "コード、情報"; locate the Step 2 sentence and remove the extra full-width whitespace character to normalize formatting..agents/rules/coderabbit.mdc-7-7 (1)
7-7:⚠️ Potential issue | 🟡 MinorFix typo in CLI help sentence.
Line 7 has
comands→commands.Proposed change
-CodeRabbit is already installed in the terminal. Run it as a way to review your code. Run the command: cr -h for details on comands available. +CodeRabbit is already installed in the terminal. Run it as a way to review your code. Run the command: cr -h for details on commands available.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/rules/coderabbit.mdc at line 7, Fix the typo in the CLI help sentence: replace "comands" with "commands" in the line that reads "Run the command: cr -h for details on comands available." Update the text that mentions running coderabbit (e.g., the string containing "cr -h" and "coderabbit --prompt-only -t uncommitted") so it reads "commands" to correct the spelling..agents/rules/proactive-subagent-and-skills.mdc-10-10 (1)
10-10:⚠️ Potential issue | 🟡 MinorTypo:
http://SKILL.mdshould beSKILL.md.The reference appears to have been accidentally formatted as a URL. This should likely be a plain filename reference.
✏️ Proposed fix
-- **Skill**: 専門知識が必要なタスク → 作業開始前に `http://SKILL.md` を読み、手順/制約をそのまま適用する。宣言だけで終わらせない。 +- **Skill**: 専門知識が必要なタスク → 作業開始前に `SKILL.md` を読み、手順/制約をそのまま適用する。宣言だけで終わらせない。🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/rules/proactive-subagent-and-skills.mdc at line 10, Replace the mistaken URL reference "http://SKILL.md" with the plain filename "SKILL.md" in the rule line starting with "**Skill**: 専門知識が必要なタスク" so the text reads that the agent should read SKILL.md (not a URL) before starting work; update only that token and preserve the surrounding instruction wording and formatting..agents/skills/create-pr/scripts/pr-body-update.sh-93-96 (1)
93-96:⚠️ Potential issue | 🟡 MinorVerification may produce false negatives due to whitespace normalization.
GitHub may normalize whitespace (e.g., trailing newlines, CRLF) in PR bodies. A byte-for-byte comparison could fail even when the update succeeded semantically.
Consider normalizing both strings before comparison, or accepting minor whitespace differences:
🛠️ Proposed fix
-if [[ "$updated_body" != "$(cat "$body_file")" ]]; then +# Normalize trailing whitespace for comparison +expected_body="$(cat "$body_file" | sed 's/[[:space:]]*$//')" +actual_body="$(echo "$updated_body" | sed 's/[[:space:]]*$//')" +if [[ "$actual_body" != "$expected_body" ]]; then echo "PR body mismatch after update." >&2 exit 1 fi🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/skills/create-pr/scripts/pr-body-update.sh around lines 93 - 96, The byte-for-byte comparison between updated_body and the contents of body_file can false-negative due to whitespace/line-ending normalization; modify the verification in pr-body-update.sh to normalize both sides (e.g., convert CRLF to LF, strip trailing spaces, and collapse/ensure a single trailing newline) before comparing, using the existing variables updated_body and body_file so the check compares canonicalized strings rather than raw bytes..agents/skills/find-skills/SKILL.md-60-65 (1)
60-65:⚠️ Potential issue | 🟡 MinorAdd language identifiers to fenced code blocks.
These blocks currently violate MD040 and will keep markdown lint noisy.
🧹 Suggested fix
-``` +```text Install with npx skills add <owner/repo@skill> vercel-labs/agent-skills@vercel-react-best-practices └ https://skills.sh/vercel-labs/agent-skills/vercel-react-best-practices-
+text
I found a skill that might help! The "vercel-react-best-practices" skill provides
React and Next.js performance optimization guidelines from Vercel Engineering.To install it:
npx skills add vercel-labs/agent-skills@vercel-react-best-practicesLearn more: https://skills.sh/vercel-labs/agent-skills/vercel-react-best-practices
-``` +```text I searched for skills related to "xyz" but didn't find any matches. I can still help you with this task directly! Would you like me to proceed? If this is something you do often, you could create your own skill: npx skills init my-xyz-skill</details> Also applies to: 77-85, 127-133 <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In @.agents/skills/find-skills/SKILL.md around lines 60 - 65, The MD040 lint
errors are caused by unlabeled fenced code blocks in SKILL.md; update each
triple-backtick block shown (the installation snippet and the two subsequent
example blocks in the diff) to include a language identifier such as text
(changetotext) and apply the same fix to the other unlabeled blocks
referenced (lines 77-85 and 127-133) so all fenced code blocks have language
identifiers for proper markdown linting.</details> </blockquote></details> <details> <summary>.agents/commands/check-simirality.md-11-13 (1)</summary><blockquote> `11-13`: _⚠️ Potential issue_ | _🟡 Minor_ **Add language tags to fenced blocks.** These blocks should use `text` (or another explicit language) to satisfy MD040. Also applies to: 17-19, 67-71 <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In @.agents/commands/check-simirality.md around lines 11 - 13, Update the fenced
code blocks that currently use triple backticks without a language tag (the
blocks shown around the similarity-ts usage and the other occurrences at the
ranges mentioned) to include an explicit language token (e.g., use "text" or
another appropriate language) so they satisfy MD040; locate the three fenced
blocks (around thesimilarity-ts .example and the other blocks at the other
noted ranges) and change their opening fences fromtotext (or another
explicit language).</details> </blockquote></details> <details> <summary>.agents/skills/mermaid-er-diagram/SKILL.md-43-45 (1)</summary><blockquote> `43-45`: _⚠️ Potential issue_ | _🟡 Minor_ **Specify fence language for the attribute-format snippet.** The block should declare a language (`text`) to satisfy markdownlint MD040. <details> <summary>🧩 Suggested patch</summary> ```diff -``` +```text type column_name [PK|FK|UK] ["comment"] ``` ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In @.agents/skills/mermaid-er-diagram/SKILL.md around lines 43 - 45, Update the
fenced code block that contains the attribute format snippettype column_name [PK|FK|UK] ["comment"]to declare a fence language (use "text") so the block
becomestext ..., addressing markdownlint MD040; modify the block in
SKILL.md where that snippet appears (the attribute-format example) to include
the language label.</details> </blockquote></details> <details> <summary>.agents/commands/bug-fix.md-5-6 (1)</summary><blockquote> `5-6`: _⚠️ Potential issue_ | _🟡 Minor_ **Fix ambiguous phrasing in the first two steps.** Line 5 wording (`errorをstackを`) is hard to parse and may confuse execution. <details> <summary>✍️ Suggested wording update</summary> ```diff -1. まず以下のerrorをstackをよく確認し、問題となるfile, codeを直接読み込める場合はコンテキストとして読み込み具体的な原因を特定してください。 -2. どうしても原因特定ができない場合、もし原因特定に必要な情報が不足している場合は、開発者に伝えてください。 +1. まず、エラー内容とスタックトレースを確認し、問題となるファイル・コードを直接読んで具体的な原因を特定してください。 +2. 原因特定に必要な情報が不足している場合は、不足している情報を具体的に開発者へ伝えてください。 ``` </details> <details> <summary>🤖 Prompt for AI Agents</summary> ``` Verify each finding against the current code and only fix it if needed. In @.agents/commands/bug-fix.md around lines 5 - 6, Rewrite the ambiguous Japanese in steps 1 and 2 to be clear and unambiguous: replace the phrase "errorをstackを" and the existing wording in step 1 with a single clear instruction like "まず、エラーのスタックトレースを注意深く確認し、問題の発生したファイルや該当コードが参照できる場合はその箇所を読み込んで具体的な原因を特定してください。", and update step 2 to a concise fallback such as "原因が特定できない場合は、原因特定に必要な追加情報が不足している旨を開発者に伝えてください。" Target the text in steps 1 and 2 of .agents/commands/bug-fix.md and ensure grammar and clarity are improved without changing the intended meaning. ``` </details> </blockquote></details> <details> <summary>.agents/skills/test-driven-development/testing-anti-patterns.md-15-19 (1)</summary><blockquote> `15-19`: _⚠️ Potential issue_ | _🟡 Minor_ **Add language identifiers to fenced code blocks (MD040).** Several fences are missing a language tag (for example Line 15-Line 19 and other plain-text pseudo-code blocks), which will keep markdownlint failing. Also applies to: 56-64, 111-123, 163-185, 225-239, 245-249, 259-265 <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In @.agents/skills/test-driven-development/testing-anti-patterns.md around lines
15 - 19, The fenced code blocks containing plain-text pseudo-code (for example
the block with "1. NEVER test mock behavior\n2. NEVER add test-only methods to
production classes\n3. NEVER mock without understanding dependencies") are
missing language identifiers; add an appropriate language tag (e.g., ```text orother ranges noted: 56-64, 111-123, 163-185, 225-239, 245-249, 259-265) so markdownlint MD040 is satisfied and the fences are explicitly tagged..agents/rules/mermaid.mdc-36-36 (1)
36-36:⚠️ Potential issue | 🟡 MinorFix malformed Mermaid reference links.
The URLs in Line 36 and Line 39 use
mdc:https:/...(single slash), which is likely broken in standard Markdown renderers. Use directhttps://...links unlessmdc:is intentionally required and validated.Also applies to: 39-39
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/rules/mermaid.mdc at line 36, Replace the malformed `mdc:https:/...` reference links with standard `https://...` URLs in the Mermaid rules file: locate the `**Mermaid Live Editor:** [https://mermaid.live](mdc:https:/mermaid.live)` occurrence and the similar link at line 39, and update both link targets to use `https://` (e.g., change `mdc:https:/mermaid.live` -> `https://mermaid.live`) so Markdown renderers resolve them correctly..agents/skills/create-pr/scripts/poll-pr.sh-23-37 (1)
23-37:⚠️ Potential issue | 🟡 MinorAdd missing-value guards for options using
$2.
--pr,--repo,--interval, and--minutesread$2without checking argument count, which can fail abruptly underset -u.#!/usr/bin/env bash set -euo pipefail rg -n '^\s*--(pr|repo|interval|minutes)\)' .agents/skills/create-pr/scripts/poll-pr.sh -A4🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/skills/create-pr/scripts/poll-pr.sh around lines 23 - 37, Guard each case that reads "$2" (--pr, --repo, --interval, --minutes) by verifying a second positional argument exists before assigning and shifting; for example, test that $# -ge 2 or that "${2-}" is non-empty and emit a clear error and exit if the value is missing, then proceed to set the variable (pr, repo, interval, minutes) and shift 2. Ensure the checks are placed inside the same case arms that reference "$2" so you don't attempt to read an unset parameter under set -u..agents/skills/create-pr/scripts/triage-pr.sh-17-24 (1)
17-24:⚠️ Potential issue | 🟡 MinorGuard option values before reading
$2.At lines 17-24, passing
--pror--repowithout a value will crash underset -u(enabled on line 2) with an unbound variable error instead of a controlled usage error.💡 Proposed fix
--pr) + [[ $# -ge 2 ]] || { echo "--pr requires a value" >&2; usage >&2; exit 1; } pr="$2" shift 2 ;; --repo) + [[ $# -ge 2 ]] || { echo "--repo requires a value" >&2; usage >&2; exit 1; } repo="$2" shift 2 ;;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/skills/create-pr/scripts/triage-pr.sh around lines 17 - 24, Guard access to the next positional parameter before assigning pr or repo: in the triage-pr.sh case arms handling --pr and --repo (the option parsing block using --pr) check that "$2" is present and is not another option (e.g., not empty/unset under set -u and not starting with '-') and if the check fails print the usage/error and exit; otherwise assign pr="$2" (or repo="$2") and shift 2. Ensure the guard uses a safe expansion (like checking "${2-}" or testing for emptiness/leading '-' ) so the script no longer triggers an unbound variable error under set -u..agents/commands/commit.md-5-6 (1)
5-6:⚠️ Potential issue | 🟡 MinorClarify the "except this file" reference.
The ignore rule mentions
.cursor/**except "this file," but this document is located at.agents/commands/commit.md, not within.cursor/. This may be a copy-paste error or outdated reference that could confuse agents following this workflow.Consider clarifying what file should be excepted, or if the exception is no longer relevant given the new
.agents/structure.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/commands/commit.md around lines 5 - 6, The note in .agents/commands/commit.md references ignoring ".cursor/** (except this file)" which is misleading because this document lives in .agents/, not .cursor/; update the line that mentions ".cursor/** (except this file)" to either remove the exception or explicitly name the intended exception file (e.g., ".cursor/KEEP_ME" or the actual filename to be preserved), and ensure the instruction mentions .gitignore adherence and the new .agents/ layout so readers understand whether any .cursor files should be preserved or if the exception is obsolete..agents/rules/commit-style.mdc-51-54 (1)
51-54:⚠️ Potential issue | 🟡 MinorNewline escape won't work as shown in bash.
The command template uses
\nwithin double quotes, which bash interprets literally as backslash-n, not as a newline. To produce actual newlines in commit messages:Option 1: Use
$'...'quoting:git commit -m "emoji type(scope): summary" -m $'- detail1\n- detail2'Option 2: Use multiple
-mflags (cleaner):git commit -m "emoji type(scope): summary" -m "- detail1" -m "- detail2"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/rules/commit-style.mdc around lines 51 - 54, The commit template uses literal "\n" inside a double-quoted second -m which will not create newlines; update the git commit invocation that currently uses -m "${emoji} ${type}(${scope}): ${summary}" -m "- ${detail1}\n- ${detail2}" so the message body produces real newlines—either switch the second message argument to ANSI-C quoting (use $'...' style for the second -m) or supply each bullet as its own -m flag (e.g., separate -m "- ${detail1}" and -m "- ${detail2}"), leaving the summary arg intact.
🧹 Nitpick comments (25)
.config/fish/fish_plugins (1)
1-1: Plugin migration to pure-fish/pure looks correct.The switch to
pure-fish/purealigns with the PR objectives. A few notes on the removed plugins:
- fisher self-management: Consider adding
jorgebucaran/fisherto enable fisher to self-update viafisher update. Without it, you'll need to reinstall fisher manually to update it.- Removed functionality: The removal of
jethrokuan/z(directory jumping) andPatrickF1/fzf.fish(fuzzy finder) means those features will no longer be available. If these were intentional removals, this is fine; otherwise, you may want to retain them.💡 Optional: Add fisher for self-management
+jorgebucaran/fisher pure-fish/pureIf you still want z and fzf integration:
+jorgebucaran/fisher +jethrokuan/z +PatrickF1/fzf.fish pure-fish/pureBased on learnings: "Configure Fish plugins via
fish_pluginsfile using the fisher plugin manager".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/fish_plugins at line 1, The change replaces the previous plugins with pure-fish/pure but removed fisher self-management and utilities; update the fish_plugins file to re-add jorgebucaran/fisher if you want fisher to self-update (so fisher can run `fisher update`), and optionally re-add jethrokuan/z and PatrickF1/fzf.fish if you still need directory jumping and fzf integration; locate the entry that now contains "pure-fish/pure" and insert the additional plugin identifiers ("jorgebucaran/fisher", "jethrokuan/z", "PatrickF1/fzf.fish") as separate lines in the same fish_plugins list according to the fisher format..config/fish/functions/_pure_set_default.fish (1)
8-8: Inconsistent variable quoting.
$is_available_universallyis quoted but$is_available_globallyis not. While this works since values are only ever "0" or "1", consistent quoting improves defensiveness.Since this appears to be migrated from the upstream
pure-fish/pureproject, you may prefer to keep it aligned with upstream.🔧 Suggested fix for consistency
- if test "$is_available_universally" -eq 0 -a $is_available_globally -eq 0 + if test "$is_available_universally" -eq 0 -a "$is_available_globally" -eq 0🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_set_default.fish at line 8, In the _pure_set_default.fish function the if test uses inconsistent variable quoting — "$is_available_universally" is quoted but $is_available_globally is not; update the condition to consistently quote the variable references (e.g., use "$is_available_universally" and "$is_available_globally" in the same test expression) so the conditional is defensive and aligned with upstream..config/fish/functions/_pure_check_for_new_release.fish (1)
20-23: Add timeout and basic error handling to the curl call.The curl request has no timeout, so it can hang indefinitely on network issues. Additionally, if the GitHub API returns an error (rate limiting, 404), the function silently returns nothing.
♻️ Proposed improvement
curl \ --silent \ + --connect-timeout 5 \ + --max-time 10 \ "https://api.github.com/repos/$user_repo/releases/latest" \ | string match --regex '"tag_name": "\K.*?(?=")'🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_check_for_new_release.fish around lines 20 - 23, The curl call in _pure_check_for_new_release.fish should include a timeout and basic error handling: update the curl invocation (the command that calls "https://api.github.com/repos/$user_repo/releases/latest") to add options like --max-time (e.g. 10) and --fail/--show-error, capture its output into a variable, test whether curl succeeded and that the response is non-empty, and only then pipe that variable to string match --regex '"tag_name": "\K.*?(?=")'; if curl fails or the response is empty/contains an API error, print a short error message to stderr and return a non-zero status instead of silently returning nothing..config/fish/functions/_pure_parse_directory.fish (1)
9-11: Minor typo in comment: "formating" → "formatting".📝 Fix typo
- # If path exceeds maximum symbol limit, force fish path formating function to use 1 character + # If path exceeds maximum symbol limit, force fish path formatting function to use 1 character set folder (fish_prompt_pwd_dir_length=1 prompt_pwd)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_parse_directory.fish around lines 9 - 11, The comment above the block that sets folder using fish_prompt_pwd_dir_length and prompt_pwd has a typo: change "formating" to "formatting" in the comment that reads "If path exceeds maximum symbol limit, force fish path formating function to use 1 character" so it instead reads "formatting"; locate the comment near the set folder (fish_prompt_pwd_dir_length=1 prompt_pwd) line in the _pure_parse_directory.fish function and update the single-word misspelling only..config/fish/functions/_pure_user_at_host.fish (1)
1-13: Reliance on Fish's built-in$hostnameis implicit and inconsistent with$username.The function explicitly retrieves
$usernameviaid -u -non line 2, but$hostnameon line 12 relies on Fish's built-in variable without any comment or explicit assignment. While this works, it creates an inconsistency that may confuse future readers.Consider adding a comment or explicitly setting
$hostnamefor consistency:✨ Suggested improvement for consistency
function _pure_user_at_host set --local username (id -u -n) # current user name + set --local host $hostname # Fish built-in variable set --local at_sign "@" set --local at_sign_color (_pure_set_color $pure_color_at_sign) set --local hostname_color (_pure_set_color $pure_color_hostname) set --local username_color (_pure_set_color $pure_color_username_normal) # default color if test "$username" = root set username_color (_pure_set_color $pure_color_username_root) # different color for root end - echo "$username_color$username$at_sign_color$at_sign$hostname_color$hostname" + echo "$username_color$username$at_sign_color$at_sign$hostname_color$host" end🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_user_at_host.fish around lines 1 - 13, In _pure_user_at_host, the code retrieves username explicitly but uses Fish's built-in $hostname implicitly; make this consistent by explicitly setting a local hostname variable (e.g., using the hostname command) with set --local hostname (...) near the top of the function (or add a clear comment above the echo explaining intentional reliance on the built-in), so that _pure_user_at_host always defines its hostname locally and avoids implicit globals..config/fish/conf.d/_pure_init.fish (2)
1-10: Consider adding a numeric prefix to control load order.Similar to
pure.fish, this file lacks a numeric prefix. Given it initializes state and registers event handlers that other Pure components depend on, explicit load ordering via a numeric prefix (e.g.,00_pure_init.fish) would be clearer.As per coding guidelines: "Create new Fish configuration files as
.fishfiles in.config/fish/conf.d/with numeric prefix for controlling load order"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/conf.d/_pure_init.fish around lines 1 - 10, Rename this conf.d script to include a numeric prefix to control load order (for example rename to 00_pure_init.fish) so it runs before other Pure components that depend on the state it sets; ensure the file still registers the `_pure_prompt_new_line` handler and exports `VIRTUAL_ENV_DISABLE_PROMPT` and `_pure_fresh_session` unchanged, and verify any packaging/install scripts or documentation that reference the old filename are updated to the new prefixed name.
51-52: Backup file extension may cause confusion.The backup creates
fish_prompt.pure-backup.fishwhich is still a.fishfile and could potentially be sourced by Fish if it matches any glob patterns. Consider using a non-.fishextension like.pure-backupor.bakto prevent accidental sourcing.🔧 Suggested alternative backup naming
# backup fish_prompt and fish_title to default - cp $__fish_config_dir/functions/fish_prompt{,.pure-backup}.fish - cp $__fish_config_dir/functions/fish_title{,.pure-backup}.fish + cp $__fish_config_dir/functions/fish_prompt.fish $__fish_config_dir/functions/fish_prompt.fish.pure-backup + cp $__fish_config_dir/functions/fish_title.fish $__fish_config_dir/functions/fish_title.fish.pure-backup🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/conf.d/_pure_init.fish around lines 51 - 52, The backup commands create files ending with .fish (cp $__fish_config_dir/functions/fish_prompt{,.pure-backup}.fish and cp $__fish_config_dir/functions/fish_title{,.pure-backup}.fish), which can be accidentally sourced; update those cp invocations to use a non-.fish backup extension (for example .pure-backup or .bak without the trailing .fish) so the backups are not valid Fish scripts and cannot be sourced by glob patterns..config/fish/functions/_pure_get_prompt_symbol.fish (1)
1-12: Unusedexit_codeargument declared.The function declares
exit_codeas an argument (line 3) but never references it in the function body. Either remove the unused argument or document why it's accepted (e.g., for API consistency with other prompt functions).🔧 Proposed fix to remove unused argument
function _pure_get_prompt_symbol \ - --description 'Print prompt symbol' \ - --argument-names exit_code + --description 'Print prompt symbol' set --local prompt_symbol $pure_symbol_prompt🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_get_prompt_symbol.fish around lines 1 - 12, The function _pure_get_prompt_symbol declares an unused argument exit_code; remove exit_code from the function's argument list to avoid misleading API surface, or if it's kept for consistency, add a short comment inside _pure_get_prompt_symbol documenting that exit_code is intentionally unused for API compatibility with other prompt functions; update the function signature accordingly and ensure no other callers rely on passing that parameter..config/fish/conf.d/pure.fish (1)
1-1: Consider adding a numeric prefix for load order control.Per coding guidelines, conf.d files should have a numeric prefix for controlling load order. This file is named
pure.fishwithout a prefix. Since_pure_init.fishexplicitly sources this file, the current setup may work, but a numeric prefix (e.g.,00_pure.fish) would make the intended load order explicit and self-documenting.As per coding guidelines: "Create new Fish configuration files as
.fishfiles in.config/fish/conf.d/with numeric prefix for controlling load order"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/conf.d/pure.fish at line 1, Rename the conf.d file to include a numeric prefix (for example change pure.fish to 00_pure.fish) so load order is explicit; update any explicit references in the `_pure_init.fish` initializer that currently sources `pure.fish` to the new filename (or use a glob that matches the prefixed name) and keep the existing `set --global pure_version 4.15.1-docs-fossdem-review` line unchanged; ensure sourcing still succeeds and tests/startup confirm the variable is still set at shell initialization..config/fish/functions/_pure_prompt_k8s.fish (1)
5-9: Redundant_pure_k8s_contextcalls and potentially ineffective check.
_pure_k8s_contextis called twice: once on line 5 to check if non-empty, and again on line 7 to capture the value. This is inefficient and introduces a potential race if the context changes between calls.The check on line 9 (
test -n "$context") will always pass if_pure_set_coloroutputs anything, since$contextincludes color escape codes concatenated with the actual context value.♻️ Proposed fix to consolidate context retrieval
function _pure_prompt_k8s if set --query pure_enable_k8s; and test "$pure_enable_k8s" = true; and _pure_check_availability pure_enable_k8s kubectl - and test -n (_pure_k8s_context) # todo: use $(cmd) syntax when Fish 3.3.1 is dropped - set --local context (_pure_set_color $pure_color_k8s_context)(_pure_k8s_context) + set --local k8s_context (_pure_k8s_context) + if test -n "$k8s_context" + set --local context (_pure_set_color $pure_color_k8s_context)$k8s_context - if test -n "$context" set --local symbol (_pure_set_color $pure_color_k8s_prefix)$pure_symbol_k8s_prefix set --local namespace (_pure_set_color $pure_color_k8s_namespace)(_pure_k8s_namespace) echo "$symbol $context/$namespace" end end end🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_prompt_k8s.fish around lines 5 - 9, Call _pure_k8s_context only once and check the raw value before adding color: capture the plain context into a local variable (e.g., raw_context) by calling _pure_k8s_context once, test -n "$raw_context" to decide whether to proceed, and only then set the colored context (e.g., set --local context (_pure_set_color $pure_color_k8s_context)$raw_context) so you avoid double invocation and the boolean check being influenced by color escape codes..config/fish/functions/_pure_prompt_first_line.fish (1)
1-1: Unused global variable pollutes namespace.
FAILUREis declared at file scope but never used within this function. This variable is set every time the file is sourced, which adds unnecessary global state. Consider removing it, or if it's needed elsewhere, define it in a shared configuration file.🧹 Proposed fix
-set --global FAILURE 1 - function _pure_prompt_first_line \🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_prompt_first_line.fish at line 1, The global variable FAILURE is declared but never used; remove the line that sets it (the set --global FAILURE 1 statement) from _pure_prompt_first_line.fish to avoid polluting the global namespace, or if this variable is genuinely required elsewhere, move its declaration into a shared configuration file and reference it there instead of defining it in this function..config/fish/functions/_pure_prompt_current_folder.fish (1)
1-5: Use a literal return value or local constant instead of file-scoped global.
FAILUREis set at file scope without an explicit scope modifier (defaults to global in Fish at top level). While it's used in this function, setting a global constant each time the file is sourced is unnecessary. Consider using the literal value directly or defining it as a local within the function.🧹 Proposed fix
-set FAILURE 1 - function _pure_prompt_current_folder --argument-names current_prompt_width - if test -z "$current_prompt_width"; return $FAILURE; end + if test -z "$current_prompt_width"; return 1; end set --local current_folder (_pure_parse_directory (math $COLUMNS - $current_prompt_width - 1)) set --local current_folder_color (_pure_set_color $pure_color_current_directory) echo "$current_folder_color$current_folder" end🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_prompt_current_folder.fish around lines 1 - 5, The file defines a file-scoped global variable FAILURE and the function _pure_prompt_current_folder uses it for return; remove the top-level "set FAILURE 1" and change the function to either return the literal value (return 1) when current_prompt_width is empty or declare a local constant inside the function (e.g., set -l FAILURE 1) and use that; update references to FAILURE only within _pure_prompt_current_folder so no global variables are created..config/fish/functions/_pure_prompt_command_duration.fish (1)
1-11: Consider returning early when no duration to display.When
CMD_DURATIONis unset or below threshold, the function echoes a color escape sequence with no content. While not harmful, it's cleaner to return early to avoid injecting empty escape sequences into the prompt.🧹 Proposed fix
function _pure_prompt_command_duration set --local command_duration # Get command execution duration if test -n "$CMD_DURATION" set command_duration (_pure_format_time $CMD_DURATION $pure_threshold_command_duration $pure_show_subsecond_command_duration) end + + if test -z "$command_duration" + return + end + set --local command_duration_color (_pure_set_color $pure_color_command_duration) echo "$command_duration_color$command_duration" end🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_prompt_command_duration.fish around lines 1 - 11, In _pure_prompt_command_duration, avoid emitting an empty color escape when there's no duration: check if CMD_DURATION is unset/empty (or after calling _pure_format_time if you prefer) and return immediately with no output; only call _pure_set_color and echo the color+duration when command_duration is non-empty. Reference symbols: function _pure_prompt_command_duration, variable CMD_DURATION, _pure_format_time, pure_threshold_command_duration, pure_show_subsecond_command_duration, _pure_set_color, and pure_color_command_duration..config/fish/functions/_pure_prompt_symbol.fish (1)
14-19: This dual-symbol effect is intentional design from the upstream pure-fish/pure project.When
pure_separate_prompt_on_erroris true and the command failed, the prompt symbol appears twice: first in error color (embedded insymbol_colorat line 15), then again in success color (appended at line 19). This creates a visual separation between error and success states.The variable naming could be improved for clarity—consider adding a comment at line 15 to document this behavior, since
symbol_coloractually contains both ANSI color codes and the prompt symbol, which may confuse future readers.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_prompt_symbol.fish around lines 14 - 19, The logic in the prompt rendering (check the pure_separate_prompt_on_error conditional and the variables symbol_color and prompt_symbol) intentionally produces a dual-symbol effect by embedding the error-colored symbol into symbol_color and then echoing symbol_color plus prompt_symbol; add a concise inline comment near the pure_separate_prompt_on_error branch (adjacent to where symbol_color is set) explaining that symbol_color intentionally includes the prompt symbol in error color and that the final echo appends the symbol in the success color to create the visual separation, and optionally rename or document symbol_color to indicate it contains both ANSI color codes and the embedded symbol for future maintainers..config/fish/functions/_pure_format_time.fish (1)
1-2: Global variablesSUCCESSandFAILUREshould be scoped.These variables are set at file scope without a scope flag, creating global variables that pollute the namespace. Consider using
set -gexplicitly if intentional, or define them as local constants within the function.🔧 Option 1: Make explicitly global (if shared across functions)
-set SUCCESS 0 -set FAILURE 1 +set -g SUCCESS 0 +set -g FAILURE 1🔧 Option 2: Move inside function as local constants
-set SUCCESS 0 -set FAILURE 1 - function _pure_format_time \ --description="Format milliseconds to a human readable format" \ --argument-names \ milliseconds \ threshold \ show_subsecond + set --local SUCCESS 0 + set --local FAILURE 1 set --query show_subsecond[1]; or set show_subsecond false🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_format_time.fish around lines 1 - 2, The top-level assignments to SUCCESS and FAILURE create unintended global variables; update the definitions in _pure_format_time.fish by either making them explicit globals with set -g SUCCESS 0 and set -g FAILURE 1 if they must be shared, or (preferred) remove the file-scope sets and define them as local constants inside the function that uses them (e.g., use set -l SUCCESS 0 and set -l FAILURE 1 at the start of the function that references SUCCESS/FAILURE) so the namespace is not polluted..config/fish/functions/_pure_prompt_git.fish (1)
4-4: VariableABORT_FEATUREshould be locally scoped.This
setcommand without a scope flag creates/overwrites a global variable. SinceABORT_FEATUREis only used within this function, it should be declared with--local.🔧 Proposed fix
- set ABORT_FEATURE 2 + set --local ABORT_FEATURE 2🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_prompt_git.fish at line 4, The variable ABORT_FEATURE is being created as a global due to a plain set command in the _pure_prompt_git.fish function; change the set invocation that defines ABORT_FEATURE to use a local scope (e.g., add the --local flag) so the variable is only visible inside the _pure_prompt_git.fish function and does not overwrite a global variable..config/mise/config.toml (1)
104-107: Consider movingusageto a more appropriate section.The
usagetool (a CLI builder tool) is placed under the# [Bun / Deno]comment section, which is misleading. Consider moving it to a more relevant section like# [CLI Tools - Development]or# [CLI Tools - Other]for better organization.📁 Suggested reorganization
# [Bun / Deno] bun = "latest" deno = "latest" -usage = "latest"Add under
# [CLI Tools - Development](around line 46-53):# [CLI Tools - Development] neovim = "latest" # modern vim tmux = "latest" # terminal multiplexer zellij = "latest" # tmux alternative just = "latest" # command runner watchexec = "latest" # file watcher dotenvx = "latest" # .env file runner +usage = "latest" # CLI builder tool🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/mise/config.toml around lines 104 - 107, The `usage` entry is misplaced under the `# [Bun / Deno]` section alongside `bun` and `deno`; move the `usage = "latest"` line into a more appropriate CLI tools section (for example under a `# [CLI Tools - Development]` or `# [CLI Tools - Other]` header) so it's grouped with other CLI tools, leaving `bun = "latest"` and `deno = "latest"` in the Bun/Deno block; update the surrounding comments to reflect the new grouping and ensure there are no duplicate `usage` entries elsewhere..zprofile (1)
71-72: Usepath_appendfor consistency with the rest of this file.Line 72 uses raw
export PATH="$PATH:...", which is inconsistent with thepath_appendhelper used on lines 29 and 40 for PATH management elsewhere in this file. Using the helper function also prevents duplicates when the file is re-sourced.Proposed change
-# Added by Obsidian -export PATH="$PATH:/Applications/Obsidian.app/Contents/MacOS" +# Added by Obsidian +path_append "/Applications/Obsidian.app/Contents/MacOS"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.zprofile around lines 71 - 72, Replace the raw export PATH="$PATH:/Applications/Obsidian.app/Contents/MacOS" with the existing helper to keep consistency and avoid duplicates: locate the current export line and call the path_append helper (same helper used on lines where path_append is defined/used) to add /Applications/Obsidian.app/Contents/MacOS to PATH instead of directly exporting; ensure you pass the full directory string to path_append so re-sourcing won't create duplicate entries..vscode/settings.json (1)
70-73: Intentional change? Terminal bell sound is now enabled.The
accessibility.signals.terminalBell.soundchanged from"off"to"on". Confirm this is intentional, as audible terminal bells can be disruptive in some environments.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.vscode/settings.json around lines 70 - 73, The terminal bell setting was changed to enable sound; confirm whether the change to accessibility.signals.terminalBell.sound from "off" to "on" is intentional and, if not, revert it to "off"; if intentional, add a brief comment or commit message documenting the rationale and any environment considerations (e.g., CI, shared workstations) so reviewers know the audible bell was deliberate..agents/skills/create-pr/scripts/pr-body-update.sh (1)
81-85: GraphQL mutation error not captured.If the GraphQL mutation fails (e.g., insufficient permissions, network error), the script redirects output to
/dev/nullbut doesn't check the exit status before proceeding. Withset -e, a non-zero exit would terminate, but a 200 response with GraphQL errors in the body would pass silently.Consider checking for GraphQL errors in the response:
🛠️ Proposed fix
-gh api graphql \ +response=$(gh api graphql \ -f query='mutation($id:ID!,$body:String!){updatePullRequest(input:{pullRequestId:$id, body:$body}){pullRequest{id}}}' \ -f id="$pr_id" \ - -f body="$(cat "$body_file")" \ - >/dev/null + -f body="$(cat "$body_file")") + +if echo "$response" | jq -e '.errors' >/dev/null 2>&1; then + echo "GraphQL mutation failed: $(echo "$response" | jq -r '.errors[0].message')" >&2 + exit 1 +fi🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/skills/create-pr/scripts/pr-body-update.sh around lines 81 - 85, The GraphQL mutation call using gh api graphql in pr-body-update.sh currently discards the response (>/dev/null) and won't detect GraphQL errors returned with HTTP 200; change it to capture the command output into a variable, check the gh exit status and then parse the JSON response for an "errors" field (or non-empty .data.updatePullRequest) after running gh api graphql -f query=... -f id="$pr_id" -f body="$(cat "$body_file")"; if gh fails or the response contains errors, log the error details and exit non‑zero so failures are visible (use the same pr_id and body_file variables and the existing mutation string when locating the call to updatePullRequest)..agents/commands/refactor.md (1)
75-83: Split the implementation cycle into a proper numbered list.The current inline formatting at Line 75-Line 83 mixes step labels and body text, which makes the procedure easy to misread. Converting to explicit numbered subsections will improve execution reliability.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/commands/refactor.md around lines 75 - 83, The procedure block starting with "重複グループ = 1 サイクル" mixes labels and bodies on the same lines; refactor it into a proper numbered list with explicit subsections 1. 探索, 2. 設計(明文化), 3. 編集(最小差分), 4. 検証(即時), 5. サマリ, placing each step label on its own line followed by its full explanatory lines (including the serena search instructions, design items like 抽出先モジュール/関数名 and 移行シム, the editing guidance about co-location, and the verification command bun run typecheck && bun run lint && bun run test --coverage) so the flow is clearly separated and easy to read..config/nvim/colors/cursor_dark.lua (2)
78-78: Consider using palette variable for consistency.Line 78 uses hardcoded
#ebc88dwhile the palette definesc.yellow = "#ebcb8b"(slightly different). This appears intentional for "Number" highlights but differs from Line 111 which uses the same hardcoded value for@number.If these should match, consider adding a dedicated
numberentry to the palette for consistency and easier maintenance.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/nvim/colors/cursor_dark.lua at line 78, The "Number" highlight uses a hardcoded color "#ebc88d" (hl("Number", ...)) which differs from palette.c.yellow ("#ebcb8b") and the hardcoded value used for "@number"; add a dedicated palette entry (e.g., c.number = "#ebc88d" or align it with c.yellow) and update the hl("Number", { fg = ... }) and any "@number" usage to reference that palette entry instead of hardcoding the hex value to ensure consistency and easier maintenance.
136-151: Terminal colors include values not defined in palette.Several terminal colors use hardcoded hex values (
#81a1c1,#88c0d0,#ffffff,#505050) that aren't part of thecpalette table. While functional, adding these to the palette would improve maintainability if the theme needs adjustment later.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/nvim/colors/cursor_dark.lua around lines 136 - 151, Terminal terminal_color entries use hardcoded hex strings instead of the shared palette table `c`; add palette entries (e.g., add keys like c.sky_blue = "#81a1c1", c.cyan = "#88c0d0", c.white = "#ffffff", c.gray_dark = "#505050" or other descriptive names) to the `c` table and replace usages of vim.g.terminal_color_4, _6, _7, _8, _12, _14, _15 assignments to reference those new `c` keys (keep other mappings like vim.g.terminal_color_1/2/3/5/9/10/11/13 pointing to existing c.red/c.green/etc.). Ensure the new palette names are consistently used anywhere else the same hex values appear..agents/commands/commit.md (2)
26-26: Remove redundant--separator.The command
git add -A -- -- ${file1}has a double--separator. While harmless, standard usage is a single--to separate options from pathspecs.Suggested fix
- - git add -A -- -- ${file1} ${file2} ${fileN} + - git add -A -- ${file1} ${file2} ${fileN}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/commands/commit.md at line 26, The git add command string contains a redundant double "--" separator ("git add -A -- -- ${file1} ${file2} ${fileN}"); update the command to use a single separator by replacing the double "--" with a single "--" so it becomes "git add -A -- ${file1} ${file2} ${fileN}" wherever that command appears.
38-40: Example also contains double--separator.The example mirrors the redundant double
--from the command template.Suggested fix
-git add -A -- -- routes/admin.php app/Http/Controllers/Admin/UserController.php +git add -A -- routes/admin.php app/Http/Controllers/Admin/UserController.php🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/commands/commit.md around lines 38 - 40, The example contains a redundant double "--" in the git add command ("git add -A -- -- routes/admin.php ..."); update that line to use a single separator ("git add -A -- routes/admin.php app/Http/Controllers/Admin/UserController.php") and scan the surrounding template for any other duplicated "--" tokens to remove.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable autofix in the Cursor dashboard.
| [[ -f "${HOME}/Library/Application Support/kiro-cli/shell/zprofile.post.zsh" ]] && builtin source "${HOME}/Library/Application Support/kiro-cli/shell/zprofile.post.zsh" | ||
|
|
||
| # Added by Obsidian | ||
| path_append "/Applications/Obsidian.app/Contents/MacOS" |
There was a problem hiding this comment.
Machine-specific Obsidian path accidentally committed
Medium Severity
A machine-specific path_append "/Applications/Obsidian.app/Contents/MacOS" with a # Added by Obsidian comment was committed to the shared dotfiles repo. This was auto-generated by the Obsidian app and is not portable. It also appears after the Kiro CLI post block, which explicitly states "Keep at the bottom of this file," breaking the expected file structure.
| - ${summary} = 1-line imperative (<=72 chars) | ||
| - ${body} = 1–3 bullets (optional) | ||
| - Commands: | ||
| - git add -A -- -- ${file1} ${file2} ${fileN} |
There was a problem hiding this comment.
Double -- in git add causes pathspec error
Medium Severity
The git add template uses git add -A -- -- ${files} with a double --. After the first -- ends option parsing, the second -- becomes a literal pathspec. Since no file named -- exists, git will error with fatal: pathspec '--' did not match any files, breaking the agent commit workflow. The correct form (single --) is already used in commit-style.mdc.
Additional Locations (1)
There was a problem hiding this comment.
Actionable comments posted: 9
♻️ Duplicate comments (1)
.config/fish/functions/_pure_check_for_new_release.fish (1)
10-10:⚠️ Potential issue | 🟠 MajorKeep the printed Fisher command plain-text for copy/paste.
Line 10 still injects ANSI escapes into the command itself (
$latestis wrapped in color codes), so copied commands can be unreliable in some terminals.💡 Proposed fix
- echo -e (_pure_set_color $pure_color_success)"fisher install pure-fish/pure@"(_pure_set_color $pure_color_info)$latest(_pure_set_color $pure_color_normal)"\n" + echo -e (_pure_set_color $pure_color_success)"fisher install pure-fish/pure@$latest"(_pure_set_color $pure_color_normal)"\n"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/fish/functions/_pure_check_for_new_release.fish at line 10, The echoed Fisher install command in _pure_check_for_new_release.fish incorrectly injects ANSI color escapes into the command by wrapping $latest with _pure_set_color calls; change the echo so the actual command text (fisher install pure-fish/pure@$latest) is emitted as plain text without color wrappers around $latest while you may still color surrounding labels using _pure_set_color and the pure_color_success/info/normal variables so copied commands are clean for copy/paste.
🧹 Nitpick comments (1)
.config/karabiner/karabiner.json (1)
137-158: Redundantcaps_lockmapping in device-specific section.The
caps_lock -> left_controlmapping (lines 138-147) is already defined at the profile level (lines 163-173), which applies to all keyboards. The device-specific entry is redundant and can be removed to reduce maintenance overhead.♻️ Suggested simplification
"simple_modifications": [ - { - "from": { - "key_code": "caps_lock" - }, - "to": [ - { - "key_code": "left_control" - } - ] - }, { "from": { "key_code": "right_control"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.config/karabiner/karabiner.json around lines 137 - 158, Remove the redundant device-specific simple_modifications entry that maps "caps_lock" to "left_control" in the device rule: locate the device's "simple_modifications" array and delete the object whose "from" has "key_code": "caps_lock" (the mapping that duplicates the profile-level caps_lock -> left_control); keep the other device-specific mapping (right_control -> apple_vendor_top_case_key_code: keyboard_fn) intact so only the duplicate mapping is removed.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.agents/commands/check-similarity.md:
- Around line 11-13: Several fenced code blocks in the Markdown are missing
language specifiers which triggers markdownlint warnings; update each opening
triple-backtick for the blocks containing the command example starting with
"`similarity-ts .`", the English translation block that begins with "Run
`similarity-ts .`...", and the result/example block that starts with "Function:
functionName (file.ts:startLine-endLine) ..." to include a language tag
(preferably text) so they read ```text; ensure any other similar unlabeled
fenced blocks are also updated to include an appropriate language identifier.
In @.agents/skills/create-pr/scripts/poll-pr.sh:
- Around line 23-37: In the flag parsing switch cases for --pr, --repo,
--interval, and --minutes in poll-pr.sh (the case branches currently using
pr="$2", repo="$2", interval="$2", minutes="$2"), guard against set -u
unbound-variable errors by first checking that a non-empty next argument exists
and does not start with a hyphen; if the check fails, print a usage/error and
exit. Replace direct uses of "$2" with a guarded test (e.g., test for "${2:-}"
presence and that it doesn't match /^-/) before assigning to pr, repo, interval,
or minutes so missing values produce a friendly error instead of crashing.
In @.agents/skills/create-pr/SKILL.md:
- Line 83: Update the guidance for cleaning up a worktree: when using the ask
user tool (`request_user_input`) to confirm cleanup, run `git worktree remove
<worktree_path> --force` (include the worktree path) to remove only the worktree
checkout, and if you also want to delete the local branch run a separate `git
branch -D <branch>` command; clarify the text so it no longer implies `git
worktree remove --force` deletes branches and explicitly shows both commands and
their distinct effects.
In @.config/fish/functions/_pure_check_for_new_release.fish:
- Around line 6-9: Guard against empty output from
pure_get_latest_release_version and quote operands before comparing: ensure you
check that the variable latest (set by pure_get_latest_release_version
"pure-fish/pure") is non-empty (e.g., test -n "$latest") and then perform the
version comparison with both sides quoted (compare "v$pure_version" to
"$latest") so the test in _pure_check_for_new_release.fish never receives
malformed/missing operands.
In @.config/fish/functions/_pure_prompt_git_pending_commits.fish:
- Around line 8-13: The parsing of `git rev-list --left-right --count
'HEAD...@{upstream}'` into the `git_status` array (used to set `commit_to_push`
and `commit_to_pull`) must be validated before doing numeric `-gt` tests; modify
the block that runs `command git rev-list ... | read --local --array git_status`
to capture its output into a local variable, split/assign into `git_status`,
check that `count $git_status` equals 2 and both elements are non-empty and
numeric, and return early (or skip the push/pull checks) if this validation
fails so the subsequent `if test "$commit_to_push" -gt 0` and the corresponding
pull check cannot error. Ensure you reference the existing variables
`git_status`, `commit_to_push`, and `commit_to_pull` and the numeric tests when
implementing the guard.
In @.config/fish/functions/pure_get_latest_release_version.fish:
- Around line 4-7: The current pure_get_latest_release_version function silently
returns empty output on curl HTTP errors or when the regex fails; modify the
curl invocation to use --fail --show-error (or --silent --show-error --fail) so
curl returns non-zero on HTTP 4xx/5xx and emits errors, capture curl's exit
status and fail fast if non-zero, and after piping to string match --regex
verify the captured tag_name is non-empty and exit non-zero with an explanatory
error message if the regex fails; update any callers to expect non-zero exit on
failure or propagate the error from pure_get_latest_release_version.
In @.github/workflows/stylua.yml:
- Around line 25-27: Replace the mutable action tag "taiki-e/install-action@v2"
with the action's immutable commit SHA in both places where it's used (the
"uses: taiki-e/install-action@v2" entries shown in the diff), e.g., change to
the full commit SHA that corresponds to v2 and add an inline comment like "# v2"
for readability; update both occurrences so the workflow is pinned to a specific
commit SHA rather than a floating tag.
In `@Makefile`:
- Around line 29-30: The Makefile currently runs "@shellcheck -S error -s sh
install.sh" which only lints install.sh and misses other tracked .sh scripts,
and it runs "@shellcheck -S error -s bash .zshenv .zprofile .zshrc" which
incorrectly treats Zsh startup files as Bash; update the Makefile so shellcheck
runs over all tracked shell scripts (e.g., replace the single filename with a
generated list like the output of "git ls-files '*.sh'" or a glob such as
"*.sh") and remove Zsh files from shellcheck invocation; for Zsh files either
omit them from ShellCheck or handle them with a Zsh-specific linter, and ensure
the Makefile entries referencing "@shellcheck -S error -s sh install.sh" and
"@shellcheck -S error -s bash .zshenv .zprofile .zshrc" are replaced
accordingly.
In `@scripts/format/json.sh`:
- Around line 52-55: The script currently creates TMP_JSON with mktemp in TMPDIR
and then writes back using cat "$TMP_JSON" > "$f", which can truncate the target
and is not atomic; change TMP_JSON creation to create the temporary file in the
same directory as the target (e.g., use mktemp "${f%/*}/dotfiles-jsonfmt.XXXXXX"
or create "$f".tmp) so mv can atomically replace the original, run jq to write
into that local temp, then use mv "$TMP_JSON" "$f" to perform an atomic rename
and ensure you remove the temp on failure; update references to TMP_JSON, the
mktemp invocation, and the write-back step (where cat > "$f" is used)
accordingly.
---
Duplicate comments:
In @.config/fish/functions/_pure_check_for_new_release.fish:
- Line 10: The echoed Fisher install command in _pure_check_for_new_release.fish
incorrectly injects ANSI color escapes into the command by wrapping $latest with
_pure_set_color calls; change the echo so the actual command text (fisher
install pure-fish/pure@$latest) is emitted as plain text without color wrappers
around $latest while you may still color surrounding labels using
_pure_set_color and the pure_color_success/info/normal variables so copied
commands are clean for copy/paste.
---
Nitpick comments:
In @.config/karabiner/karabiner.json:
- Around line 137-158: Remove the redundant device-specific simple_modifications
entry that maps "caps_lock" to "left_control" in the device rule: locate the
device's "simple_modifications" array and delete the object whose "from" has
"key_code": "caps_lock" (the mapping that duplicates the profile-level caps_lock
-> left_control); keep the other device-specific mapping (right_control ->
apple_vendor_top_case_key_code: keyboard_fn) intact so only the duplicate
mapping is removed.
ℹ️ Review info
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (37)
.agents/commands/check-similarity.md.agents/commands/worktree-pr.md.agents/skills/create-pr/SKILL.md.agents/skills/create-pr/scripts/poll-pr.sh.agents/skills/create-pr/scripts/triage-pr.sh.config/fish/completions/bun.fish.config/fish/conf.d/_pure_init.fish.config/fish/conf.d/pure.fish.config/fish/functions/_pure_check_for_new_release.fish.config/fish/functions/_pure_format_time.fish.config/fish/functions/_pure_parse_git_branch.fish.config/fish/functions/_pure_prefix_root_prompt.fish.config/fish/functions/_pure_prompt_aws_profile.fish.config/fish/functions/_pure_prompt_current_folder.fish.config/fish/functions/_pure_prompt_git.fish.config/fish/functions/_pure_prompt_git_dirty.fish.config/fish/functions/_pure_prompt_git_pending_commits.fish.config/fish/functions/_pure_prompt_transient.fish.config/fish/functions/_pure_set_color.fish.config/fish/functions/pure_get_latest_release_version.fish.config/ghostty/config.config/karabiner/karabiner.json.config/mise/config.toml.config/nvim/lazy-lock.json.config/nvim/lazyvim.json.github/workflows/stylua.yml.zprofile.zshrcMakefiledocs/tasks/lessons.mddocs/tasks/todo.mdscripts/format.shscripts/format/fish.shscripts/format/json.shscripts/format/lua.shscripts/format/shell.shscripts/format/toml.sh
✅ Files skipped from review due to trivial changes (2)
- .config/fish/completions/bun.fish
- .config/nvim/lazy-lock.json
🚧 Files skipped from review as they are similar to previous changes (17)
- .config/fish/functions/_pure_parse_git_branch.fish
- .config/fish/functions/_pure_prompt_git_dirty.fish
- .agents/skills/create-pr/scripts/triage-pr.sh
- .config/fish/functions/_pure_prompt_git.fish
- .config/ghostty/config
- docs/tasks/todo.md
- docs/tasks/lessons.md
- .config/fish/functions/_pure_prompt_current_folder.fish
- .config/fish/functions/_pure_prompt_transient.fish
- .config/fish/conf.d/_pure_init.fish
- .config/fish/conf.d/pure.fish
- .config/fish/functions/_pure_format_time.fish
- .zprofile
- .config/fish/functions/_pure_set_color.fish
- .agents/commands/worktree-pr.md
- .config/mise/config.toml
- .config/fish/functions/_pure_prompt_aws_profile.fish
| --pr) | ||
| pr="$2" | ||
| shift 2 | ||
| ;; | ||
| --repo) | ||
| repo="$2" | ||
| shift 2 | ||
| ;; | ||
| --interval) | ||
| interval="$2" | ||
| shift 2 | ||
| ;; | ||
| --minutes) | ||
| minutes="$2" | ||
| shift 2 |
There was a problem hiding this comment.
Guard value-taking flags to prevent unbound-variable exits.
With set -u, passing --pr, --repo, --interval, or --minutes without a value crashes on $2 expansion instead of returning a friendly usage error.
Proposed fix
while [[ $# -gt 0 ]]; do
case "$1" in
--pr)
+ if [[ $# -lt 2 || "$2" == --* ]]; then
+ echo "Missing value for --pr" >&2
+ usage >&2
+ exit 1
+ fi
pr="$2"
shift 2
;;
--repo)
+ if [[ $# -lt 2 || "$2" == --* ]]; then
+ echo "Missing value for --repo" >&2
+ usage >&2
+ exit 1
+ fi
repo="$2"
shift 2
;;
--interval)
+ if [[ $# -lt 2 || "$2" == --* ]]; then
+ echo "Missing value for --interval" >&2
+ usage >&2
+ exit 1
+ fi
interval="$2"
shift 2
;;
--minutes)
+ if [[ $# -lt 2 || "$2" == --* ]]; then
+ echo "Missing value for --minutes" >&2
+ usage >&2
+ exit 1
+ fi
minutes="$2"
shift 2
;;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.agents/skills/create-pr/scripts/poll-pr.sh around lines 23 - 37, In the
flag parsing switch cases for --pr, --repo, --interval, and --minutes in
poll-pr.sh (the case branches currently using pr="$2", repo="$2", interval="$2",
minutes="$2"), guard against set -u unbound-variable errors by first checking
that a non-empty next argument exists and does not start with a hyphen; if the
check fails, print a usage/error and exit. Replace direct uses of "$2" with a
guarded test (e.g., test for "${2:-}" presence and that it doesn't match /^-/)
before assigning to pr, repo, interval, or minutes so missing values produce a
friendly error instead of crashing.
|
|
||
| 16. After successful merge, check if we're in a git worktree: | ||
| - Run: `[ "$(git rev-parse --git-common-dir)" != "$(git rev-parse --git-dir)" ]` | ||
| - **If in a worktree**: Use the ask user question tool (`request_user_input`) to ask if they want to clean up the worktree. If yes, run `git worktree remove --force` to remove the worktree and local branch, then switch back to the main worktree. |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
cat -n .agents/skills/create-pr/SKILL.md | sed -n '75,90p'Repository: posaune0423/dotfiles
Length of output: 966
🌐 Web query:
git worktree remove command documentation path argument branch deletion
💡 Result:
- Documentation path/argument:
git worktree remove [-f|--force] <worktree>where<worktree>is a worktree identifier, usually its path (relative or absolute). If the last path component is unique among your worktrees, you can use that shorter suffix (e.g.,ghiordef/ghi).[1] - What it removes: it removes the worktree checkout (and its administrative link). It refuses if the worktree is “unclean” unless you pass
--force(and requires--forcetwice for locked worktrees).[1] - Does it delete the branch? No—branch deletion is separate. After removing the worktree (so the branch is no longer checked out anywhere), delete the branch with
git branch -d <branch>(or-D).[2] - If the worktree directory is already gone: use
git worktree pruneto clean up stale worktree metadata, then delete the branch.[1][3]
Sources
[1] Git official docs: git-worktree manual (remove, force behavior, and <worktree> identification rules). (git-scm.com)
[2] Stack Overflow: git worktree remove does not delete the branch; use git branch -d/-D. (stackoverflow.com)
[3] Stack Overflow: if the directory was removed manually, run git worktree prune. (stackoverflow.com)
Citations:
- 1: https://git-scm.com/docs/git-worktree.html?utm_source=openai
- 2: https://stackoverflow.com/questions/39707402/why-does-git-worktree-add-create-a-branch-and-can-i-delete-it?utm_source=openai
- 3: https://stackoverflow.com/questions/44109234/how-to-delete-a-git-working-tree-branch-when-its-working-directory-has-been-remo?utm_source=openai
git worktree remove --force on line 83 is incomplete and misleading.
The command is missing the worktree path argument and incorrectly implies it deletes the local branch. Per git documentation, git worktree remove <worktree_path> removes only the worktree checkout; branch deletion requires a separate git branch -D <branch> command.
Update line 83 to include the path argument and clarify that branch cleanup is separate:
Proposed fix
- - **If in a worktree**: Use the ask user question tool (`request_user_input`) to ask if they want to clean up the worktree. If yes, run `git worktree remove --force` to remove the worktree and local branch, then switch back to the main worktree.
+ - **If in a worktree**: Use the ask user question tool (`request_user_input`) to ask if they want to clean up the worktree. If yes, run `git worktree remove --force <worktree_path>` to remove the worktree, then optionally delete the branch with `git branch -D <branch_name>`, and switch back to the main worktree.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.agents/skills/create-pr/SKILL.md at line 83, Update the guidance for
cleaning up a worktree: when using the ask user tool (`request_user_input`) to
confirm cleanup, run `git worktree remove <worktree_path> --force` (include the
worktree path) to remove only the worktree checkout, and if you also want to
delete the local branch run a separate `git branch -D <branch>` command; clarify
the text so it no longer implies `git worktree remove --force` deletes branches
and explicitly shows both commands and their distinct effects.
| set latest (pure_get_latest_release_version "pure-fish/pure") | ||
|
|
||
| if test "v"$pure_version != $latest | ||
| echo -e "🔔 New version available!\n" |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
cat -n ".config/fish/functions/_pure_check_for_new_release.fish"Repository: posaune0423/dotfiles
Length of output: 717
🏁 Script executed:
# Check if pure_get_latest_release_version exists and what it does
rg "function pure_get_latest_release_version" -A 10Repository: posaune0423/dotfiles
Length of output: 46
🏁 Script executed:
# Also check what version of Fish shell is expected/used
fd "fish_version\|version\|\.fishrc\|config.fish" ".config"Repository: posaune0423/dotfiles
Length of output: 46
🏁 Script executed:
# Search in all Fish function files
rg "pure_get_latest_release_version" ".config/fish/"Repository: posaune0423/dotfiles
Length of output: 292
🏁 Script executed:
# Check if it's a plugin function by looking at other functions
ls -la ".config/fish/functions/" | head -20Repository: posaune0423/dotfiles
Length of output: 1488
🏁 Script executed:
# Let me verify Fish shell test behavior with empty variables by checking Fish documentation patterns
rg "test.*!=" ".config/fish/functions/" -A 2 -B 2 | head -50Repository: posaune0423/dotfiles
Length of output: 3445
🏁 Script executed:
cat -n ".config/fish/functions/pure_get_latest_release_version.fish"Repository: posaune0423/dotfiles
Length of output: 353
🏁 Script executed:
# Check for similar patterns with empty variable guards in the codebase
rg "set.*or return" ".config/fish/functions/" -A 2 | head -30Repository: posaune0423/dotfiles
Length of output: 46
Guard and quote latest before comparison.
If pure_get_latest_release_version returns empty (due to network failure, API error, or rate limiting), the test at line 8 receives malformed operands. Add a non-empty guard and quote both sides to handle this safely.
💡 Proposed fix
- set latest (pure_get_latest_release_version "pure-fish/pure")
+ set --local latest (pure_get_latest_release_version "pure-fish/pure")
+ or return
- if test "v"$pure_version != $latest
+ if test -n "$latest"; and test "v$pure_version" != "$latest"
echo -e "🔔 New version available!\n"
echo -e (_pure_set_color $pure_color_success)"fisher install pure-fish/pure@"(_pure_set_color $pure_color_info)$latest(_pure_set_color $pure_color_normal)"\n"
end📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| set latest (pure_get_latest_release_version "pure-fish/pure") | |
| if test "v"$pure_version != $latest | |
| echo -e "🔔 New version available!\n" | |
| set --local latest (pure_get_latest_release_version "pure-fish/pure") | |
| or return | |
| if test -n "$latest"; and test "v$pure_version" != "$latest" | |
| echo -e "🔔 New version available!\n" |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.config/fish/functions/_pure_check_for_new_release.fish around lines 6 - 9,
Guard against empty output from pure_get_latest_release_version and quote
operands before comparing: ensure you check that the variable latest (set by
pure_get_latest_release_version "pure-fish/pure") is non-empty (e.g., test -n
"$latest") and then perform the version comparison with both sides quoted
(compare "v$pure_version" to "$latest") so the test in
_pure_check_for_new_release.fish never receives malformed/missing operands.
| command git rev-list --left-right --count 'HEAD...@{upstream}' \ | ||
| | read --local --array git_status | ||
| set --local commit_to_push $git_status[1] | ||
| set --local commit_to_pull $git_status[2] | ||
|
|
||
| if test "$commit_to_push" -gt 0 # upstream is behind local repo |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, check if the file exists and read its content
if [ -f ".config/fish/functions/_pure_prompt_git_pending_commits.fish" ]; then
echo "=== File exists, reading full content with line numbers ==="
cat -n ".config/fish/functions/_pure_prompt_git_pending_commits.fish"
else
echo "=== File not found ==="
git ls-files ".config/fish/functions/_pure_prompt_git_pending_commits.fish" || echo "File not in git index"
fiRepository: posaune0423/dotfiles
Length of output: 1945
🏁 Script executed:
# Also check the surrounding context to understand the full function
if [ -f ".config/fish/functions/_pure_prompt_git_pending_commits.fish" ]; then
echo "=== Lines 1-30 with context ==="
head -30 ".config/fish/functions/_pure_prompt_git_pending_commits.fish" | cat -n
fiRepository: posaune0423/dotfiles
Length of output: 1837
🏁 Script executed:
# Check if there are any error handlers or guards around the git commands
rg -A 5 -B 5 'git rev-list' ".config/fish/functions/_pure_prompt_git_pending_commits.fish" || echo "Pattern not found"Repository: posaune0423/dotfiles
Length of output: 651
🏁 Script executed:
# Check lines around line 22 mentioned in the review
if [ -f ".config/fish/functions/_pure_prompt_git_pending_commits.fish" ]; then
echo "=== Lines 15-30 (around line 22) ==="
sed -n '15,30p' ".config/fish/functions/_pure_prompt_git_pending_commits.fish" | cat -n
fiRepository: posaune0423/dotfiles
Length of output: 1024
Guard git rev-list parsing before numeric comparisons.
If git rev-list fails or produces empty output, $git_status[1] and $git_status[2] will be empty, causing the -gt test on lines 13 and 22 to error. Capture the output, validate the array contains exactly 2 elements, and return early on failure.
Suggested fix
- command git rev-list --left-right --count 'HEAD...@{upstream}' \
- | read --local --array git_status
- set --local commit_to_push $git_status[1]
- set --local commit_to_pull $git_status[2]
+ set --local git_status (command git rev-list --left-right --count 'HEAD...@{upstream}' 2>/dev/null)
+ if test (count $git_status) -ne 2
+ return
+ end
+ set --local commit_to_push $git_status[1]
+ set --local commit_to_pull $git_status[2]Applies to lines 8–11 and 22.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| command git rev-list --left-right --count 'HEAD...@{upstream}' \ | |
| | read --local --array git_status | |
| set --local commit_to_push $git_status[1] | |
| set --local commit_to_pull $git_status[2] | |
| if test "$commit_to_push" -gt 0 # upstream is behind local repo | |
| set --local git_status (command git rev-list --left-right --count 'HEAD...@{upstream}' 2>/dev/null) | |
| if test (count $git_status) -ne 2 | |
| return | |
| end | |
| set --local commit_to_push $git_status[1] | |
| set --local commit_to_pull $git_status[2] | |
| if test "$commit_to_push" -gt 0 # upstream is behind local repo |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.config/fish/functions/_pure_prompt_git_pending_commits.fish around lines 8
- 13, The parsing of `git rev-list --left-right --count 'HEAD...@{upstream}'`
into the `git_status` array (used to set `commit_to_push` and `commit_to_pull`)
must be validated before doing numeric `-gt` tests; modify the block that runs
`command git rev-list ... | read --local --array git_status` to capture its
output into a local variable, split/assign into `git_status`, check that `count
$git_status` equals 2 and both elements are non-empty and numeric, and return
early (or skip the push/pull checks) if this validation fails so the subsequent
`if test "$commit_to_push" -gt 0` and the corresponding pull check cannot error.
Ensure you reference the existing variables `git_status`, `commit_to_push`, and
`commit_to_pull` and the numeric tests when implementing the guard.
| curl \ | ||
| --silent \ | ||
| "https://api.github.com/repos/$user_repo/releases/latest" \ | ||
| | string match --regex '"tag_name": "\K.*?(?=")' |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# Check if the file exists and examine its contents
cat -n .config/fish/functions/pure_get_latest_release_version.fishRepository: posaune0423/dotfiles
Length of output: 353
🏁 Script executed:
# Verify the file structure and any related files
fd "pure_get_latest_release_version" --type fRepository: posaune0423/dotfiles
Length of output: 46
Add error handling to fail fast on API and parse failures.
The function silently returns empty output when curl encounters HTTP errors (4xx/5xx), rate limits, network failures, or when the regex fails to extract a version. Because curl --silent suppresses error messages and curl defaults to returning exit code 0 on HTTP errors without --fail, the updater flow receives an empty string with no indication of failure.
Proposed fix
function pure_get_latest_release_version \
--argument-names user_repo
- curl \
- --silent \
- "https://api.github.com/repos/$user_repo/releases/latest" \
- | string match --regex '"tag_name": "\K.*?(?=")'
+ set --local latest (
+ curl \
+ --silent \
+ --show-error \
+ --fail \
+ "https://api.github.com/repos/$user_repo/releases/latest" \
+ | string match --regex --groups-only '"tag_name"\s*:\s*"([^"]+)"'
+ )
+ or return 1
+
+ echo $latest
end🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.config/fish/functions/pure_get_latest_release_version.fish around lines 4 -
7, The current pure_get_latest_release_version function silently returns empty
output on curl HTTP errors or when the regex fails; modify the curl invocation
to use --fail --show-error (or --silent --show-error --fail) so curl returns
non-zero on HTTP 4xx/5xx and emits errors, capture curl's exit status and fail
fast if non-zero, and after piping to string match --regex verify the captured
tag_name is non-empty and exit non-zero with an explanatory error message if the
regex fails; update any callers to expect non-zero exit on failure or propagate
the error from pure_get_latest_release_version.
| @shellcheck -S error -s sh install.sh | ||
| @shellcheck -S error -s bash .zshenv .zprofile .zshrc |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Configured shellcheck commands:"
rg -n 'shellcheck' Makefile .github/workflows/stylua.yml 2>/dev/null || echo "No shellcheck configs found in those files"
echo
echo "Tracked shell scripts in repo:"
git ls-files '*.sh' | head -20
echo
echo "All zsh-related files:"
git ls-files | grep -E '\.(zsh|zshrc|zshenv|zprofile)$' || echo "No explicit zsh files found"
echo
echo "Contents of Makefile (around lint target):"
sed -n '25,35p' MakefileRepository: posaune0423/dotfiles
Length of output: 1462
Shell lint misses multiple .sh files and incorrectly validates Zsh startup files.
Line 29 only checks install.sh, missing 9 other tracked shell scripts (including agent skills and formatters). Line 30 runs ShellCheck in Bash mode on Zsh files, which produces incorrect diagnostics since Zsh syntax differs from POSIX/Bash.
🔧 Proposed fix
lint: format
`@echo` "Running shellcheck..."
- `@shellcheck` -S error -s sh install.sh
- `@shellcheck` -S error -s bash .zshenv .zprofile .zshrc
+ `@shellcheck` -S error $$(git ls-files '*.sh')
+ `@zsh` -n .zshenv .zprofile .zshrc
`@echo` "Done."📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| @shellcheck -S error -s sh install.sh | |
| @shellcheck -S error -s bash .zshenv .zprofile .zshrc | |
| lint: format | |
| `@echo` "Running shellcheck..." | |
| `@shellcheck` -S error $$(git ls-files '*.sh') | |
| `@zsh` -n .zshenv .zprofile .zshrc | |
| `@echo` "Done." |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@Makefile` around lines 29 - 30, The Makefile currently runs "@shellcheck -S
error -s sh install.sh" which only lints install.sh and misses other tracked .sh
scripts, and it runs "@shellcheck -S error -s bash .zshenv .zprofile .zshrc"
which incorrectly treats Zsh startup files as Bash; update the Makefile so
shellcheck runs over all tracked shell scripts (e.g., replace the single
filename with a generated list like the output of "git ls-files '*.sh'" or a
glob such as "*.sh") and remove Zsh files from shellcheck invocation; for Zsh
files either omit them from ShellCheck or handle them with a Zsh-specific
linter, and ensure the Makefile entries referencing "@shellcheck -S error -s sh
install.sh" and "@shellcheck -S error -s bash .zshenv .zprofile .zshrc" are
replaced accordingly.
| TMP_JSON="$(mktemp "${TMPDIR:-/tmp}/dotfiles-jsonfmt.XXXXXX")" | ||
| if jq --indent 2 . "$f" > "$TMP_JSON" 2> /dev/null; then | ||
| if ! cat "$TMP_JSON" > "$f" 2> /dev/null; then | ||
| echo "[json] skip write failed: $f" |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
cat -n scripts/format/json.sh | sed -n '45,60p'Repository: posaune0423/dotfiles
Length of output: 680
🏁 Script executed:
# Verify the exact pattern and check if there are any mitigations in place
rg -n "cat.*TMP_JSON.*>.*\$f" scripts/format/json.sh
rg -n "mktemp" scripts/format/json.shRepository: posaune0423/dotfiles
Length of output: 197
🏁 Script executed:
# Double-check the cat pattern more directly
sed -n '54p' scripts/format/json.sh
# Also verify the error handling after the write attempt
sed -n '54,57p' scripts/format/json.shRepository: posaune0423/dotfiles
Length of output: 255
Use atomic replacement for formatted JSON writes.
Line 54 overwrites the target via redirection, which truncates first and can leave a partial or corrupt file on write failure. Additionally, the temp file in /tmp (line 52) is not guaranteed to be on the same filesystem as the target, preventing atomic moves. Use a same-directory temp file with mv for atomic replacement.
🔧 Proposed fix
- TMP_JSON="$(mktemp "${TMPDIR:-/tmp}/dotfiles-jsonfmt.XXXXXX")"
+ TMP_DIR="$(dirname "$f")"
+ TMP_JSON="$(mktemp "$TMP_DIR/.dotfiles-jsonfmt.XXXXXX")"
if jq --indent 2 . "$f" > "$TMP_JSON" 2> /dev/null; then
- if ! cat "$TMP_JSON" > "$f" 2> /dev/null; then
+ if ! mv "$TMP_JSON" "$f" 2> /dev/null; then
echo "[json] skip write failed: $f"
SKIPPED=$((SKIPPED + 1))
+ rm -f "$TMP_JSON"
fi🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@scripts/format/json.sh` around lines 52 - 55, The script currently creates
TMP_JSON with mktemp in TMPDIR and then writes back using cat "$TMP_JSON" >
"$f", which can truncate the target and is not atomic; change TMP_JSON creation
to create the temporary file in the same directory as the target (e.g., use
mktemp "${f%/*}/dotfiles-jsonfmt.XXXXXX" or create "$f".tmp) so mv can
atomically replace the original, run jq to write into that local temp, then use
mv "$TMP_JSON" "$f" to perform an atomic rename and ensure you remove the temp
on failure; update references to TMP_JSON, the mktemp invocation, and the
write-back step (where cat > "$f" is used) accordingly.
…clear job names for formatting and linting checks
…pt, check-similarity, and understand


Summary
This PR syncs the new agent command/rule/skill structure under
.agentsand links it into.claude,.codex, and.cursor.It migrates fish prompt setup to
pure-fish/pure, removes old Kiro hook fragments, and adds the generated pure fish functions.It adds a local Neovim
cursor_darkcolorscheme and switches LazyVim defaults to use it, while updating editor and shell config files.It also updates repository guidance docs (
AGENTS.md,CLAUDE.mdsymlink, and docs/tasks notes).Note
Medium Risk
Broad repo-wide dotfile and CI workflow changes (shell prompt swap, editor theme defaults, and new formatting/lint gates) could break developer environments or CI if any config/tooling assumptions differ across machines.
Overview
Adds a new
.agents/command/rule/skill hierarchy (with supporting PR/CI helper scripts) and wires it into.claude/,.codex/, and.cursor/via link files, plus replacesCLAUDE.mdcontent with anAGENTS.md-based pointer.Updates dotfiles to a unified “Cursor Dark” look-and-feel: switches Fish to the
pure-fish/pureprompt (removing old Kiro hook fragments and adding the generated pure functions), introduces a local Neovimcursor_darkcolorscheme and makes it the LazyVim default, and updates Ghostty/VS Code theme settings accordingly.Build hygiene is expanded:
Makefiletargets are reworked intoformat/format:fix/lint/lint:fix, the formatter now covers sh/zsh/fish/lua/toml/json, and a unified GitHub ActionsCIworkflow replaces the standalonestyluacheck to runmake formatandmake lint(with explicit tool installation).Written by Cursor Bugbot for commit de9e9dd. This will update automatically on new commits. Configure here.
Summary by CodeRabbit
New Features
Documentation
Chores