feat(obsidian): add obsidian:cli skill - #586
Conversation
Adds a new skill for interacting with the Obsidian vault via the official Obsidian CLI. The skill guides Claude to use `obsidian` CLI commands instead of directly accessing vault files.
📝 WalkthroughWalkthroughAdded Obsidian plugin metadata and a new CLI skill doc; added an Obsidian entry to the marketplace; added a Jira daily-standup skill doc; and revised the Jira spec-to-backlog skill documentation. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 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 |
- Add daily-standup skill: fetches assignee's Jira issues and formats into standup template (어제 한 일 / 오늘 할 일 / blocker / insight) - Remove Confluence dependency from spec-to-backlog: accepts any input source (markdown, free text, conversation context)
There was a problem hiding this comment.
🧹 Nitpick comments (1)
plugins/obsidian/skills/cli/SKILL.md (1)
10-17: Add explicit fallback when prerequisites are missing.Consider adding one line to the workflow telling the model to report actionable remediation (start Obsidian, enable CLI, verify
obsidian help) before attempting commands.Proposed doc tweak
## Workflow 1. **Understand** what the user wants to do +2. **Check prerequisites**: if Obsidian/CLI is unavailable, tell the user exactly how to enable it -2. **Look up** the right command if unsure: `obsidian help <command>` -3. **Execute** with the Bash tool -4. **Present** results clearly — don't just dump raw output +3. **Look up** the right command if unsure: `obsidian help <command>` +4. **Execute** with the Bash tool +5. **Present** results clearly — don't just dump raw output🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@plugins/obsidian/skills/cli/SKILL.md` around lines 10 - 17, Update the Workflow section in SKILL.md to add an explicit fallback step before executing commands: detect missing prerequisites (Obsidian not running or `obsidian` CLI not on PATH) and instruct the model to report actionable remediation (how to start Obsidian, enable CLI in Obsidian Settings → CLI, and verify with `obsidian help`) before attempting to "Execute with the Bash tool"; place this as a new step between "Look up" and "Execute" so functions like the guidance for "Execute with the Bash tool" and "Present results" only run when prerequisites are satisfied.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@plugins/obsidian/skills/cli/SKILL.md`:
- Around line 10-17: Update the Workflow section in SKILL.md to add an explicit
fallback step before executing commands: detect missing prerequisites (Obsidian
not running or `obsidian` CLI not on PATH) and instruct the model to report
actionable remediation (how to start Obsidian, enable CLI in Obsidian Settings →
CLI, and verify with `obsidian help`) before attempting to "Execute with the
Bash tool"; place this as a new step between "Look up" and "Execute" so
functions like the guidance for "Execute with the Bash tool" and "Present
results" only run when prerequisites are satisfied.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 20d5bcdc-b464-4158-a074-8dc543ef1374
📒 Files selected for processing (1)
plugins/obsidian/skills/cli/SKILL.md
Repository rule violations found
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (1)
plugins/jira/skills/spec-to-backlog/SKILL.md (1)
41-44: Add guardrails before reading arbitrary file paths.This step should constrain file type/size (or ask user confirmation) before reading, to avoid token blowups and accidental non-text reads.
Suggested wording update
### If the user referenced a file path -Read the file directly if it is accessible. For a local markdown file, read its contents and -proceed to Step 3. +If the file is accessible, first validate it is a text/markdown file and reasonably sized. +If it is very large or non-text, ask the user to narrow the scope or provide excerpts. +Then read contents and proceed to Step 3.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@plugins/jira/skills/spec-to-backlog/SKILL.md` around lines 41 - 44, Update the "If the user referenced a file path" step so the skill applies guardrails before reading any file: validate the file extension against a whitelist of text types (e.g., .md, .txt, .json), check file size and refuse or ask for explicit user confirmation if the file exceeds a safe token/byte threshold, and skip non-text/binary files; change the sentence "Read the file directly..." in SKILL.md to first perform these checks and prompt the user when needed, then proceed to "read its contents and proceed to Step 3" only after validation/confirmation.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@plugins/jira/skills/daily-standup/SKILL.md`:
- Around line 56-110: Multiple fenced code blocks in SKILL.md lack language
identifiers (triggering markdownlint MD040); update every triple-backtick block
(notably the block containing "참고용 Backlog (최근 업데이트 순): ...", the Step 3 prompt
starting with "도움(Risk/Blocker)이 필요한 사항이 있나요?", and the final report template
beginning "어제 한 업무는 무엇인가요?") by adding a language tag such as text (e.g., change
``` to ```text) so all fenced code blocks include a language identifier and the
linter warning is resolved.
- Around line 114-115: Remove the inline code spans that contain
leading/trailing spaces (the span showing two spaces then a hyphen and the span
showing hyphen then space) to satisfy markdownlint MD038; instead, reword those
examples in plain text describing the indentation (e.g., "two spaces before a
hyphen for a nested list item" and "a hyphen followed by a space for a top-level
item") or use a fenced code block if showing literal whitespace is necessary,
and update the SKILL.md list descriptions accordingly.
- Around line 97-99: The "오늘 할 일" template's example mixes a top-level and a
nested bullet (shown as "- [ISSUE-KEY] [summary]" followed by " - [ISSUE-KEY]
[summary]"), causing one parent with one child; make all items peers by using
the same bullet depth for every line (i.e., remove the extra two-space indent so
every item is "- [ISSUE-KEY] [summary]") in the SKILL.md template example.
- Around line 28-44: Replace hardcoded status names in the three JQL queries
(Query A, Query B, Query C) with Jira universal statusCategory checks so the
queries work across workflows: in Query A replace status IN ("In Progress",
"Done") with statusCategory IN ("In Progress","Done"); in Query B replace status
= "In Progress" with statusCategory = "In Progress"; in Query C replace status =
"Backlog" with statusCategory = "To Do"; keep the rest of each JQL
(assignee/currentUser(), updated filters, ORDER BY) unchanged.
---
Nitpick comments:
In `@plugins/jira/skills/spec-to-backlog/SKILL.md`:
- Around line 41-44: Update the "If the user referenced a file path" step so the
skill applies guardrails before reading any file: validate the file extension
against a whitelist of text types (e.g., .md, .txt, .json), check file size and
refuse or ask for explicit user confirmation if the file exceeds a safe
token/byte threshold, and skip non-text/binary files; change the sentence "Read
the file directly..." in SKILL.md to first perform these checks and prompt the
user when needed, then proceed to "read its contents and proceed to Step 3" only
after validation/confirmation.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: a55f9e59-45c4-4120-b6ca-32ee68f8a701
📒 Files selected for processing (4)
.claude-plugin/marketplace.jsonplugins/jira/skills/daily-standup/SKILL.mdplugins/jira/skills/spec-to-backlog/SKILL.mdplugins/obsidian/.claude-plugin/plugin.json
✅ Files skipped from review due to trivial changes (2)
- plugins/obsidian/.claude-plugin/plugin.json
- .claude-plugin/marketplace.json
| **Query A — 어제 한 일** (assignee, recently updated, active statuses): | ||
|
|
||
| ```jql | ||
| assignee = currentUser() AND status IN ("In Progress", "Done") AND updated >= -1d ORDER BY updated DESC | ||
| ``` | ||
|
|
||
| **Query B — 오늘 할 일** (currently in progress): | ||
|
|
||
| ```jql | ||
| assignee = currentUser() AND status = "In Progress" ORDER BY updated DESC | ||
| ``` | ||
|
|
||
| **Query C — 참고용 Backlog** (upcoming work, top 10): | ||
|
|
||
| ```jql | ||
| assignee = currentUser() AND status = "Backlog" ORDER BY updated DESC | ||
| ``` |
There was a problem hiding this comment.
🧩 Analysis chain
🌐 Web query:
Jira JQL statusCategory vs status field hardcoded names
💡 Result:
In Jira JQL, the status field and statusCategory field differ significantly in their values and usage. statusCategory uses fixed, hardcoded category names that are consistent across all Jira instances and projects: "To Do", "In Progress", and "Done". These are case-sensitive and represent broad groupings of statuses (e.g., statusCategory = Done matches any status categorized as Done, like "Closed", "Resolved", etc.). This makes it reliable for cross-project queries without needing to know specific status names. The status field uses specific, customizable status names defined in workflows (e.g., "Open", "In Progress", "Done") or their numeric IDs (e.g., 10001). Status names vary by project/workflow and can change, so queries using names like status = "Done" may fail across projects or after renaming. Official docs note that operators like WAS, CHANGED match both historical names and associated IDs for resilience. In team-managed projects, using status IDs instead of names is often required for historical queries (e.g., status WAS 10103) due to bugs with names. Use statusCategory for portable, category-based searches; use status (preferably IDs for reliability) when targeting exact statuses.
Citations:
- 1: https://www.hean.tech/tech-blog/whats-better-than-status-in-jql-statuscategory
- 2: https://support.atlassian.com/jira/kb/how-to-search-using-statuscategory-statuscategorychangeddate-function-with-jql/
- 3: https://community.atlassian.com/forums/Jira-questions/What-is-the-difference-between-the-status-and-the-status/qaq-p/1681311
- 4: https://community.atlassian.com/forums/Jira-articles/Jira-Image-of-the-Day-Status-vs-Status-Category-Queries/ba-p/2804466
- 5: https://support.atlassian.com/jira/kb/in-a-team-managed-project-jql-is-not-working-if-it-contains-status-was-statusname/
- 6: https://support.atlassian.com/jira-software-cloud/docs/jql-operators
- 7: https://jira.atlassian.com/browse/JRACLOUD-78014
🌐 Web query:
Jira JQL status categories list standard available
💡 Result:
The standard available Jira status categories for use in JQL are "To Do", "In Progress", and "Done". These are the three fixed categories that all statuses belong to, as seen in the admin ViewStatuses.jspa page and used in queries like statusCategory in ("To Do", "In Progress"). They are represented by grey (To Do), blue (In Progress), and green (Done) colors. You cannot create new categories. Use in JQL: statusCategory = "To Do" or statusCategory in ("To Do", "Done").
Citations:
- 1: https://support.atlassian.com/jira/kb/how-to-search-using-statuscategory-statuscategorychangeddate-function-with-jql/
- 2: https://jira.atlassian.com/browse/JRACLOUD-78014
- 3: https://confluence.atlassian.com/jira064/defining-status-field-values-720412129.html
- 4: https://support.atlassian.com/jira-cloud-administration/docs/what-is-a-workflow-status
- 5: https://www.herocoders.com/blog/understanding-jira-issue-statuses
🌐 Web query:
Jira JQL statusCategory "In Progress" "Done" "To Do" documentation
💡 Result:
In Jira JQL, statusCategory is a field that groups statuses into three categories: "To Do" (grey), "In Progress" (blue), and "Done" (green). These categories are assigned when admins configure statuses in workflows. Syntax: statusCategory [operator] ("category") Supported operators: =, !=, IN, NOT IN Examples: - statusCategory = "To Do" - statusCategory IN ("To Do", "In Progress") - statusCategory != "Done" AND project = ABC Note: Values are case-sensitive ("To Do", not "todo"). This is more reliable than querying individual statuses, as it covers all statuses in a category regardless of custom names. Related function: statusCategoryChangedDate for timeline-based queries, e.g., statusCategoryChangedDate <= -7d.
Citations:
- 1: https://support.atlassian.com/jira/kb/how-to-search-using-statuscategory-statuscategorychangeddate-function-with-jql/
- 2: https://www.hean.tech/tech-blog/whats-better-than-status-in-jql-statuscategory
- 3: https://community.atlassian.com/t5/Jira-questions/How-to-search-for-status-types-e-g-yellow-blue-green-quot-To-Do/qaq-p/589411
Use statusCategory instead of hardcoded status names in JQL—this ensures portability across Jira workflows.
Status names like "Backlog", "In Progress", and "Done" are project/workflow-specific and will fail when statuses are renamed or when queries run against other projects. Jira provides three universal status categories: "To Do", "In Progress", and "Done". Use statusCategory instead of status to avoid empty or incorrect results.
Recommended fix
-assignee = currentUser() AND status IN ("In Progress", "Done") AND updated >= -1d ORDER BY updated DESC
+assignee = currentUser() AND statusCategory IN ("In Progress", "Done") AND updated >= -1d ORDER BY updated DESC
-assignee = currentUser() AND status = "In Progress" ORDER BY updated DESC
+assignee = currentUser() AND statusCategory = "In Progress" ORDER BY updated DESC
-assignee = currentUser() AND status = "Backlog" ORDER BY updated DESC
+assignee = currentUser() AND statusCategory = "To Do" ORDER BY updated DESC📝 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.
| **Query A — 어제 한 일** (assignee, recently updated, active statuses): | |
| ```jql | |
| assignee = currentUser() AND status IN ("In Progress", "Done") AND updated >= -1d ORDER BY updated DESC | |
| ``` | |
| **Query B — 오늘 할 일** (currently in progress): | |
| ```jql | |
| assignee = currentUser() AND status = "In Progress" ORDER BY updated DESC | |
| ``` | |
| **Query C — 참고용 Backlog** (upcoming work, top 10): | |
| ```jql | |
| assignee = currentUser() AND status = "Backlog" ORDER BY updated DESC | |
| ``` | |
| **Query A — 어제 한 일** (assignee, recently updated, active statuses): | |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@plugins/jira/skills/daily-standup/SKILL.md` around lines 28 - 44, Replace
hardcoded status names in the three JQL queries (Query A, Query B, Query C) with
Jira universal statusCategory checks so the queries work across workflows: in
Query A replace status IN ("In Progress", "Done") with statusCategory IN ("In
Progress","Done"); in Query B replace status = "In Progress" with statusCategory
= "In Progress"; in Query C replace status = "Backlog" with statusCategory = "To
Do"; keep the rest of each JQL (assignee/currentUser(), updated filters, ORDER
BY) unchanged.
| ``` | ||
| 참고용 Backlog (최근 업데이트 순): | ||
| 1. SEARCH-12563 Slow path signal 증분 처리 구조 전환 | ||
| 2. SEARCH-12255 기등록된 검매핑에 대해 모델 파라미터로 상쇄 처리 기능 필요 | ||
| ... | ||
|
|
||
| 오늘 할 일에 추가할 항목이 있나요? (번호로 답하거나 없으면 엔터) | ||
| ``` | ||
|
|
||
| Wait for user response. Add selected items to the "오늘 할 일" list. | ||
|
|
||
| --- | ||
|
|
||
| ### Step 3: Ask for Blocker and Insight | ||
|
|
||
| Ask in a single message: | ||
|
|
||
| ``` | ||
| 도움(Risk/Blocker)이 필요한 사항이 있나요? | ||
| 공유하고 싶은 인사이트가 있나요? | ||
| (없으면 엔터) | ||
| ``` | ||
|
|
||
| Wait for user response. | ||
|
|
||
| --- | ||
|
|
||
| ### Step 4: Output the Standup Report | ||
|
|
||
| Format and print the final report using this exact template: | ||
|
|
||
| ``` | ||
| 어제 한 업무는 무엇인가요? | ||
| 어제 한 업무 | ||
| - [ISSUE-KEY] [summary] | ||
| - [ISSUE-KEY] [summary] | ||
|
|
||
|
|
||
|
|
||
|
|
||
| 오늘 할 일을 적어보아요 | ||
| - [ISSUE-KEY] [summary] | ||
| - [ISSUE-KEY] [summary] | ||
|
|
||
|
|
||
|
|
||
|
|
||
| 도움(Risk/Blocker)이 필요해요. | ||
| [blocker content, or blank] | ||
|
|
||
|
|
||
|
|
||
| 공유하고 싶은 인사이트를 적어봐요. | ||
| [insight content, or blank] | ||
| ``` |
There was a problem hiding this comment.
Add language identifiers to fenced code blocks (markdownlint MD040).
Several fenced blocks omit a language tag, and lint is already flagging this.
Example fix
-```
+```text
참고용 Backlog (최근 업데이트 순):
...
-```
+```Also applies to: 127-139
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)
[warning] 56-56: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 73-73: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 87-87: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@plugins/jira/skills/daily-standup/SKILL.md` around lines 56 - 110, Multiple
fenced code blocks in SKILL.md lack language identifiers (triggering
markdownlint MD040); update every triple-backtick block (notably the block
containing "참고용 Backlog (최근 업데이트 순): ...", the Step 3 prompt starting with
"도움(Risk/Blocker)이 필요한 사항이 있나요?", and the final report template beginning "어제 한
업무는 무엇인가요?") by adding a language tag such as text (e.g., change ``` to ```text)
so all fenced code blocks include a language identifier and the linter warning
is resolved.
| - [ISSUE-KEY] [summary] | ||
| - [ISSUE-KEY] [summary] | ||
|
|
There was a problem hiding this comment.
Fix list hierarchy in “오늘 할 일” template.
The current example mixes top-level and nested bullets, which renders as one parent item with one child. If all items should be peers, use the same bullet depth.
Template adjustment
-- [ISSUE-KEY] [summary]
- - [ISSUE-KEY] [summary]
+- [ISSUE-KEY] [summary]
+- [ISSUE-KEY] [summary]📝 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.
| - [ISSUE-KEY] [summary] | |
| - [ISSUE-KEY] [summary] | |
| - [ISSUE-KEY] [summary] | |
| - [ISSUE-KEY] [summary] | |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@plugins/jira/skills/daily-standup/SKILL.md` around lines 97 - 99, The "오늘 할
일" template's example mixes a top-level and a nested bullet (shown as "-
[ISSUE-KEY] [summary]" followed by " - [ISSUE-KEY] [summary]"), causing one
parent with one child; make all items peers by using the same bullet depth for
every line (i.e., remove the extra two-space indent so every item is "-
[ISSUE-KEY] [summary]") in the SKILL.md template example.
| - 어제 한 일: Query A 결과. 들여쓰기 두 칸(` - `). | ||
| - 오늘 할 일: Query B 결과 + 사용자가 추가한 Backlog 항목. 첫 번째 레벨(`- `), 하위 항목은 들여쓰기(` - `). |
There was a problem hiding this comment.
Remove spaces inside inline code spans (markdownlint MD038).
Inline code like ` - ` and `- ` triggers lint warnings; describe indentation in text instead.
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)
[warning] 114-114: Spaces inside code span elements
(MD038, no-space-in-code)
[warning] 115-115: Spaces inside code span elements
(MD038, no-space-in-code)
[warning] 115-115: Spaces inside code span elements
(MD038, no-space-in-code)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@plugins/jira/skills/daily-standup/SKILL.md` around lines 114 - 115, Remove
the inline code spans that contain leading/trailing spaces (the span showing two
spaces then a hyphen and the span showing hyphen then space) to satisfy
markdownlint MD038; instead, reword those examples in plain text describing the
indentation (e.g., "two spaces before a hyphen for a nested list item" and "a
hyphen followed by a space for a top-level item") or use a fenced code block if
showing literal whitespace is necessary, and update the SKILL.md list
descriptions accordingly.
# [16.3.0](v16.2.1...v16.3.0) (2026-03-30) ### Features * **obsidian:** add obsidian:cli skill ([#586](#586)) ([71b786a](71b786a))
Summary
Adds
obsidian:cliskill that guides Claude to use the official Obsidian CLI instead of directly reading vault files.Changes
plugins/obsidian/skills/cli/SKILL.md— new skill for Obsidian vault interaction via CLITests
obsidian helpworks with Obsidian app runningobsidianCLI commandsSummary by CodeRabbit