@olegkoval/agent-skills 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/.claude-plugin/plugin.json +4 -2
  2. package/.cursor-plugin/index.json +10 -0
  3. package/.kiro/steering/obsidian-pr-sync.md +137 -0
  4. package/.kiro/steering/obsidian-task-rollover.md +180 -0
  5. package/.windsurf/rules/obsidian-pr-sync.md +136 -0
  6. package/.windsurf/rules/obsidian-task-rollover.md +179 -0
  7. package/README.md +4 -2
  8. package/catalog/skills.json +44 -0
  9. package/package.json +1 -1
  10. package/packages/software-development/obsidian-pr-sync/SKILL.md +152 -0
  11. package/packages/software-development/obsidian-pr-sync/adapters/claude/plugin.json +5 -0
  12. package/packages/software-development/obsidian-pr-sync/adapters/claude/skills/obsidian-pr-sync/SKILL.md +154 -0
  13. package/packages/software-development/obsidian-pr-sync/adapters/cursor/plugin.json +6 -0
  14. package/packages/software-development/obsidian-pr-sync/adapters/cursor/skills/obsidian-pr-sync/SKILL.md +154 -0
  15. package/packages/software-development/obsidian-pr-sync/adapters/kiro/steering/obsidian-pr-sync.md +137 -0
  16. package/packages/software-development/obsidian-pr-sync/adapters/windsurf/rules/obsidian-pr-sync.md +136 -0
  17. package/packages/software-development/obsidian-task-rollover/SKILL.md +196 -0
  18. package/packages/software-development/obsidian-task-rollover/adapters/claude/plugin.json +5 -0
  19. package/packages/software-development/obsidian-task-rollover/adapters/claude/skills/obsidian-task-rollover/SKILL.md +198 -0
  20. package/packages/software-development/obsidian-task-rollover/adapters/cursor/plugin.json +6 -0
  21. package/packages/software-development/obsidian-task-rollover/adapters/cursor/skills/obsidian-task-rollover/SKILL.md +198 -0
  22. package/packages/software-development/obsidian-task-rollover/adapters/kiro/steering/obsidian-task-rollover.md +180 -0
  23. package/packages/software-development/obsidian-task-rollover/adapters/windsurf/rules/obsidian-task-rollover.md +179 -0
@@ -0,0 +1,136 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Fetch open GitHub PRs assigned to you or requesting your review, and write a grouped, age-sorted '## PRs to review' section into today's Obsidian daily note. Idempotent — re-running replaces the section."
5
+ ---
6
+
7
+
8
+ # Obsidian PR Sync
9
+
10
+ Fetch all open PRs where the user is assigned or requested as reviewer, filter out
11
+ noise (bots, drafts, self-authored), and write a clean grouped section into today's
12
+ daily note.
13
+
14
+ ## Configuration
15
+
16
+ Before running, confirm:
17
+ - `VAULT_DAILY` — absolute path to the daily notes folder (e.g. `/Users/you/obsidian/vault/Lead/Daily`)
18
+ - `GH_USERNAME` — GitHub login to exclude self-authored PRs (e.g. `oleg-koval`)
19
+ - `ORG_PREFIX` — org name to group as "Work" (e.g. `Teifi-Digital`); everything else goes to "Personal"
20
+
21
+ If not specified by the user, infer from context (git config, existing vault files).
22
+
23
+ ## Step 1 — Fetch PRs
24
+
25
+ Run two `gh` queries and merge results, deduplicating by URL:
26
+
27
+ ```bash
28
+ # Review-requested
29
+ gh search prs --review-requested=@me --state=open \
30
+ --json title,url,repository,author,createdAt,isDraft --limit 50
31
+
32
+ # Assigned
33
+ gh search prs --assignee=@me --state=open \
34
+ --json title,url,repository,author,createdAt,isDraft --limit 50
35
+ ```
36
+
37
+ Merge both lists, deduplicate by `url`. The union is what needs attention.
38
+
39
+ ## Step 2 — Filter
40
+
41
+ Discard entries where:
42
+ - `isDraft` is `true`
43
+ - `author.login` matches any bot pattern: `dependabot`, `copilot`, `renovate`, `github-actions`, or `author.is_bot` is `true`
44
+ - `author.login` equals `GH_USERNAME` — self-authored PRs are not reviews; they're your own work
45
+
46
+ ## Step 3 — Enrich authors
47
+
48
+ For each unique author login, resolve a display name for the Obsidian wiki-link:
49
+
50
+ ```bash
51
+ gh api /users/<login> --jq '.name // .login'
52
+ ```
53
+
54
+ If the API returns a name, use it (e.g. `Rutger Klaassen`). If it returns null, fall
55
+ back to the login with first letter uppercased. This gives `[[Rutger Klaassen]]` or
56
+ `[[Merlijnmacgillavry]]`.
57
+
58
+ Batch these lookups — run them in parallel if possible to keep the sync fast.
59
+
60
+ ## Step 4 — Calculate age
61
+
62
+ For each PR: `days_old = (today - createdAt).days`. Use today's date in local time.
63
+
64
+ ## Step 5 — Build the section
65
+
66
+ Format the section exactly as:
67
+
68
+ ```markdown
69
+ ## PRs to review
70
+
71
+ ### Work (<ORG_PREFIX>)
72
+ - [ ] [TITLE](url) by [[Author Name]] (N days old)
73
+
74
+ ### Personal
75
+ - [ ] [TITLE](url) by [[Author Name]] (N days old)
76
+ ```
77
+
78
+ Rules:
79
+ - **Work**: `repository.nameWithOwner` starts with `<ORG_PREFIX>/`
80
+ - **Personal**: everything else
81
+ - Within each group, sort by `createdAt` ascending (oldest first — most overdue at top)
82
+ - If a group has no PRs, omit that subsection entirely (don't render an empty `### Work` header)
83
+ - If there are zero PRs total, write: `## PRs to review\n\n_No open PRs — clear queue! 🎉_`
84
+ - Add `⚠️` after the age if `days_old >= 7`
85
+
86
+ **Example line:**
87
+ ```
88
+ - [ ] [RSL-108] Image sync from InRiver by [[Merlijn Mac Gillavry]] (12 days old ⚠️)
89
+ ```
90
+
91
+ ## Step 6 — Write to today's daily note
92
+
93
+ **Find today's note:**
94
+ ```bash
95
+ TODAY=$(date +%Y-%m-%d)
96
+ NOTE="${VAULT_DAILY}/${TODAY}.md"
97
+ ```
98
+
99
+ If the file doesn't exist, create it with standard daily template frontmatter first,
100
+ then append the section. If the file exists:
101
+
102
+ **Replacement logic (idempotent):**
103
+ - If `## PRs to review` already exists: replace everything from that line up to (but not
104
+ including) the next `## ` heading or end-of-file with the newly built section.
105
+ - If it doesn't exist: append the section at the end of the file (before the nav footer
106
+ line `*← [[...` if present, otherwise at the very end).
107
+
108
+ This ensures re-running the skill produces the same result, not a growing list.
109
+
110
+ ## Invocation patterns
111
+
112
+ **Manual (user-triggered):**
113
+ The user says something like "sync my PRs to today's note" or "update obsidian with my reviews".
114
+ Run the full flow and confirm how many PRs were written.
115
+
116
+ **Scheduled morning routine:**
117
+ Same flow. No user prompt needed — just run, update the note, and report a one-line
118
+ summary: `"PR sync: 3 work PRs, 2 personal PRs written to 2026-05-11.md"`.
119
+
120
+ **In a remote CCR agent:**
121
+ Clone the vault repo, run the sync, commit and push. The local Obsidian Git plugin
122
+ pulls the changes automatically.
123
+
124
+ ## Output to user
125
+
126
+ After writing the file, show a brief confirmation:
127
+
128
+ ```
129
+ Synced N PRs to Lead/Daily/YYYY-MM-DD.md
130
+ Work (<ORG_PREFIX>): X PRs
131
+ Personal: Y PRs
132
+ Skipped: Z bots/drafts
133
+ ```
134
+
135
+ If any `gh` call fails (e.g. auth expired), surface the error clearly rather than
136
+ writing a partial/corrupt section.
@@ -0,0 +1,196 @@
1
+ ---
2
+ name: obsidian-task-rollover
3
+ description: >
4
+ Migrate unfinished tasks from a daily Obsidian note to the next workday's note,
5
+ bullet-journal style. Marks migrated tasks in the source note with [>] (the BJ
6
+ migration symbol) and copies them to the target note under "## Carried over".
7
+ Use this skill whenever the user says "roll over today's tasks", "migrate unfinished
8
+ tasks to tomorrow", "end of day task sync", "move open tasks to next workday",
9
+ or when a scheduled end-of-day / start-of-day routine fires. Fully idempotent —
10
+ safe to re-run; already-migrated tasks ([>]) are not touched again.
11
+ license: MIT
12
+ allowed-tools: Bash, Read, Write, Edit
13
+ compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires daily notes at a configurable vault path.
14
+ metadata:
15
+ author: Oleg Koval
16
+ tags:
17
+ - obsidian
18
+ - daily-note
19
+ - bullet-journal
20
+ - productivity
21
+ - task-rollover
22
+ - end-of-day
23
+ ---
24
+
25
+ # Obsidian Task Rollover
26
+
27
+ Bullet-journal–style end-of-day task migration. Unfinished tasks (`- [ ]`) from
28
+ today's note get copied forward to the next workday, and marked as migrated in
29
+ today's note.
30
+
31
+ ## Configuration
32
+
33
+ - `VAULT_DAILY` — absolute path to the daily notes folder (e.g. `/Users/you/obsidian/vault/Lead/Daily`)
34
+
35
+ If not specified, infer from context or ask.
36
+
37
+ ## Step 1 — Identify source note
38
+
39
+ Default source = **today's note**. If the user specifies a date ("roll over Monday's
40
+ tasks"), resolve that date instead.
41
+
42
+ ```bash
43
+ SOURCE_DATE=$(date +%Y-%m-%d)
44
+ SOURCE="${VAULT_DAILY}/${SOURCE_DATE}.md"
45
+ ```
46
+
47
+ If the source note doesn't exist, report and stop — nothing to migrate.
48
+
49
+ ## Step 2 — Find next workday
50
+
51
+ ```bash
52
+ TARGET_DATE=$(python3 -c "
53
+ from datetime import date, timedelta
54
+ d = date.fromisoformat('${SOURCE_DATE}') + timedelta(days=1)
55
+ while d.weekday() >= 5: # 5=Sat, 6=Sun
56
+ d += timedelta(days=1)
57
+ print(d)
58
+ ")
59
+ TARGET="${VAULT_DAILY}/${TARGET_DATE}.md"
60
+ ```
61
+
62
+ Skips weekends. If today is Friday, tasks roll to Monday.
63
+
64
+ ## Step 3 — Extract incomplete tasks
65
+
66
+ Read the source note and collect all lines matching `- [ ] ` that are:
67
+ - **Not** inside the `## PRs to review` section (that section is auto-managed by
68
+ the `obsidian-pr-sync` skill — don't touch it)
69
+ - **Not** already migrated (`- [>]` lines — idempotency guard)
70
+
71
+ Sections to skip entirely: `## PRs to review`. Stop collecting at the nav footer
72
+ (`*← [[...`).
73
+
74
+ Collect both the task lines and which section (h2 heading) they belong to, so the
75
+ target note can group them the same way.
76
+
77
+ ## Step 4 — Mark tasks as migrated in source note
78
+
79
+ For each collected task line in the source note, replace:
80
+ ```
81
+ - [ ] some task
82
+ ```
83
+ with:
84
+ ```
85
+ - [>] some task → [[Lead/Daily/TARGET_DATE|TARGET_DATE]]
86
+ ```
87
+
88
+ The `[>]` is the bullet journal migration arrow — "moved forward". The link lets you
89
+ jump to where the task landed.
90
+
91
+ **Do not** replace tasks that are already checked (`- [x]`) or already migrated
92
+ (`- [>`). Only unticked `- [ ]` tasks.
93
+
94
+ ## Step 5 — Write to target note
95
+
96
+ ### If the target note exists
97
+
98
+ Check whether a `## Carried over` section already exists:
99
+ - If yes: **replace** its content (idempotent — re-running a migration is safe)
100
+ - If no: **insert** it before the nav footer line (`*← [[...`) or at end of file
101
+
102
+ ### If the target note doesn't exist
103
+
104
+ Create it using the standard daily note template:
105
+ ```markdown
106
+ ---
107
+ type: daily
108
+ date: TARGET_DATE
109
+ tags: [lead/daily]
110
+ ---
111
+
112
+ # WEEKDAY, D MMM YYYY
113
+
114
+ ## Top 3 for today
115
+ 1.
116
+ 2.
117
+ 3.
118
+
119
+ ## People check-in
120
+ > Who needs something from me today?
121
+
122
+ - [[]]
123
+
124
+ ## Notes / journal
125
+
126
+
127
+ ## Open loops
128
+ > Things I started but didn't finish
129
+
130
+ -
131
+
132
+ ## Actions
133
+ - [ ]
134
+
135
+ ---
136
+ *← [[Lead/Daily/SOURCE_DATE|Yesterday]] | [[Lead/Daily/NEXT_NEXT_DATE|Tomorrow]] →*
137
+ ```
138
+ Then append the `## Carried over` section.
139
+
140
+ ### Carried over section format
141
+
142
+ ```markdown
143
+ ## Carried over
144
+
145
+ > Migrated from [[Lead/Daily/SOURCE_DATE|SOURCE_DATE]]
146
+
147
+ ### SECTION_NAME (if tasks came from a named section)
148
+ - [ ] task text ↩ [[Lead/Daily/SOURCE_DATE|SOURCE_DATE]]
149
+
150
+ ### Actions (if tasks came from ## Actions)
151
+ - [ ] another task ↩ [[Lead/Daily/SOURCE_DATE|SOURCE_DATE]]
152
+ ```
153
+
154
+ Rules:
155
+ - Group tasks by the section they came from in the source note
156
+ - If all tasks are from `## Actions`, omit the subsection header (keep it flat)
157
+ - The `↩` link back to the source date lets you trace where the task originated
158
+
159
+ ## Step 6 — Report
160
+
161
+ ```
162
+ Rolled over N tasks from SOURCE_DATE → TARGET_DATE
163
+ From ## Actions: X tasks
164
+ From ## Open loops: Y tasks
165
+ Marked [>] in: Lead/Daily/SOURCE_DATE.md
166
+ Written to: Lead/Daily/TARGET_DATE.md
167
+ ```
168
+
169
+ If there are zero incomplete tasks, report:
170
+ ```
171
+ No incomplete tasks in SOURCE_DATE — nothing to roll over ✓
172
+ ```
173
+
174
+ ## Invocation patterns
175
+
176
+ **Manual:**
177
+ - "roll over today's tasks to tomorrow"
178
+ - "migrate my open tasks, it's end of day"
179
+ - "carry forward unfinished items from today"
180
+
181
+ **Scheduled (end-of-day or start-of-morning):**
182
+ Runs silently. Picks up today's note automatically.
183
+
184
+ **In a remote CCR agent:**
185
+ Clone the vault repo, run the rollover, commit and push. The local Obsidian Git
186
+ plugin pulls the changes automatically.
187
+
188
+ ## Edge cases
189
+
190
+ - **Tasks with sub-bullets**: Copy the full block (task + its indented children)
191
+ - **Duplicate migration**: Re-running replaces the `## Carried over` section — never
192
+ duplicates. Tasks already marked `[>]` in source are not re-processed.
193
+ - **Friday → Monday**: The weekend-skip logic handles this. The Monday note is created
194
+ if it doesn't exist.
195
+ - **Task already in target**: No dedup check — if you manually added the same task to
196
+ tomorrow and then run migration, it'll appear twice. Acceptable — easy to clean up.
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "olko-obsidian-task-rollover",
3
+ "description": "Bullet-journal end-of-day task migration: copy unchecked tasks from today's Obsidian daily note to the next workday's note under '## Carried over', and mark them [>] in the source. Skips weekends, idempotent.",
4
+ "skills": "./skills"
5
+ }
@@ -0,0 +1,198 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ name: obsidian-task-rollover
5
+ description: >
6
+ Migrate unfinished tasks from a daily Obsidian note to the next workday's note,
7
+ bullet-journal style. Marks migrated tasks in the source note with [>] (the BJ
8
+ migration symbol) and copies them to the target note under "## Carried over".
9
+ Use this skill whenever the user says "roll over today's tasks", "migrate unfinished
10
+ tasks to tomorrow", "end of day task sync", "move open tasks to next workday",
11
+ or when a scheduled end-of-day / start-of-day routine fires. Fully idempotent —
12
+ safe to re-run; already-migrated tasks ([>]) are not touched again.
13
+ license: MIT
14
+ allowed-tools: Bash, Read, Write, Edit
15
+ compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires daily notes at a configurable vault path.
16
+ metadata:
17
+ author: Oleg Koval
18
+ tags:
19
+ - obsidian
20
+ - daily-note
21
+ - bullet-journal
22
+ - productivity
23
+ - task-rollover
24
+ - end-of-day
25
+ ---
26
+
27
+ # Obsidian Task Rollover
28
+
29
+ Bullet-journal–style end-of-day task migration. Unfinished tasks (`- [ ]`) from
30
+ today's note get copied forward to the next workday, and marked as migrated in
31
+ today's note.
32
+
33
+ ## Configuration
34
+
35
+ - `VAULT_DAILY` — absolute path to the daily notes folder (e.g. `/Users/you/obsidian/vault/Lead/Daily`)
36
+
37
+ If not specified, infer from context or ask.
38
+
39
+ ## Step 1 — Identify source note
40
+
41
+ Default source = **today's note**. If the user specifies a date ("roll over Monday's
42
+ tasks"), resolve that date instead.
43
+
44
+ ```bash
45
+ SOURCE_DATE=$(date +%Y-%m-%d)
46
+ SOURCE="${VAULT_DAILY}/${SOURCE_DATE}.md"
47
+ ```
48
+
49
+ If the source note doesn't exist, report and stop — nothing to migrate.
50
+
51
+ ## Step 2 — Find next workday
52
+
53
+ ```bash
54
+ TARGET_DATE=$(python3 -c "
55
+ from datetime import date, timedelta
56
+ d = date.fromisoformat('${SOURCE_DATE}') + timedelta(days=1)
57
+ while d.weekday() >= 5: # 5=Sat, 6=Sun
58
+ d += timedelta(days=1)
59
+ print(d)
60
+ ")
61
+ TARGET="${VAULT_DAILY}/${TARGET_DATE}.md"
62
+ ```
63
+
64
+ Skips weekends. If today is Friday, tasks roll to Monday.
65
+
66
+ ## Step 3 — Extract incomplete tasks
67
+
68
+ Read the source note and collect all lines matching `- [ ] ` that are:
69
+ - **Not** inside the `## PRs to review` section (that section is auto-managed by
70
+ the `obsidian-pr-sync` skill — don't touch it)
71
+ - **Not** already migrated (`- [>]` lines — idempotency guard)
72
+
73
+ Sections to skip entirely: `## PRs to review`. Stop collecting at the nav footer
74
+ (`*← [[...`).
75
+
76
+ Collect both the task lines and which section (h2 heading) they belong to, so the
77
+ target note can group them the same way.
78
+
79
+ ## Step 4 — Mark tasks as migrated in source note
80
+
81
+ For each collected task line in the source note, replace:
82
+ ```
83
+ - [ ] some task
84
+ ```
85
+ with:
86
+ ```
87
+ - [>] some task → [[Lead/Daily/TARGET_DATE|TARGET_DATE]]
88
+ ```
89
+
90
+ The `[>]` is the bullet journal migration arrow — "moved forward". The link lets you
91
+ jump to where the task landed.
92
+
93
+ **Do not** replace tasks that are already checked (`- [x]`) or already migrated
94
+ (`- [>`). Only unticked `- [ ]` tasks.
95
+
96
+ ## Step 5 — Write to target note
97
+
98
+ ### If the target note exists
99
+
100
+ Check whether a `## Carried over` section already exists:
101
+ - If yes: **replace** its content (idempotent — re-running a migration is safe)
102
+ - If no: **insert** it before the nav footer line (`*← [[...`) or at end of file
103
+
104
+ ### If the target note doesn't exist
105
+
106
+ Create it using the standard daily note template:
107
+ ```markdown
108
+ ---
109
+ type: daily
110
+ date: TARGET_DATE
111
+ tags: [lead/daily]
112
+ ---
113
+
114
+ # WEEKDAY, D MMM YYYY
115
+
116
+ ## Top 3 for today
117
+ 1.
118
+ 2.
119
+ 3.
120
+
121
+ ## People check-in
122
+ > Who needs something from me today?
123
+
124
+ - [[]]
125
+
126
+ ## Notes / journal
127
+
128
+
129
+ ## Open loops
130
+ > Things I started but didn't finish
131
+
132
+ -
133
+
134
+ ## Actions
135
+ - [ ]
136
+
137
+ ---
138
+ *← [[Lead/Daily/SOURCE_DATE|Yesterday]] | [[Lead/Daily/NEXT_NEXT_DATE|Tomorrow]] →*
139
+ ```
140
+ Then append the `## Carried over` section.
141
+
142
+ ### Carried over section format
143
+
144
+ ```markdown
145
+ ## Carried over
146
+
147
+ > Migrated from [[Lead/Daily/SOURCE_DATE|SOURCE_DATE]]
148
+
149
+ ### SECTION_NAME (if tasks came from a named section)
150
+ - [ ] task text ↩ [[Lead/Daily/SOURCE_DATE|SOURCE_DATE]]
151
+
152
+ ### Actions (if tasks came from ## Actions)
153
+ - [ ] another task ↩ [[Lead/Daily/SOURCE_DATE|SOURCE_DATE]]
154
+ ```
155
+
156
+ Rules:
157
+ - Group tasks by the section they came from in the source note
158
+ - If all tasks are from `## Actions`, omit the subsection header (keep it flat)
159
+ - The `↩` link back to the source date lets you trace where the task originated
160
+
161
+ ## Step 6 — Report
162
+
163
+ ```
164
+ Rolled over N tasks from SOURCE_DATE → TARGET_DATE
165
+ From ## Actions: X tasks
166
+ From ## Open loops: Y tasks
167
+ Marked [>] in: Lead/Daily/SOURCE_DATE.md
168
+ Written to: Lead/Daily/TARGET_DATE.md
169
+ ```
170
+
171
+ If there are zero incomplete tasks, report:
172
+ ```
173
+ No incomplete tasks in SOURCE_DATE — nothing to roll over ✓
174
+ ```
175
+
176
+ ## Invocation patterns
177
+
178
+ **Manual:**
179
+ - "roll over today's tasks to tomorrow"
180
+ - "migrate my open tasks, it's end of day"
181
+ - "carry forward unfinished items from today"
182
+
183
+ **Scheduled (end-of-day or start-of-morning):**
184
+ Runs silently. Picks up today's note automatically.
185
+
186
+ **In a remote CCR agent:**
187
+ Clone the vault repo, run the rollover, commit and push. The local Obsidian Git
188
+ plugin pulls the changes automatically.
189
+
190
+ ## Edge cases
191
+
192
+ - **Tasks with sub-bullets**: Copy the full block (task + its indented children)
193
+ - **Duplicate migration**: Re-running replaces the `## Carried over` section — never
194
+ duplicates. Tasks already marked `[>]` in source are not re-processed.
195
+ - **Friday → Monday**: The weekend-skip logic handles this. The Monday note is created
196
+ if it doesn't exist.
197
+ - **Task already in target**: No dedup check — if you manually added the same task to
198
+ tomorrow and then run migration, it'll appear twice. Acceptable — easy to clean up.
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "olko:obsidian-task-rollover",
3
+ "version": "0.1.0",
4
+ "description": "Bullet-journal end-of-day task migration: copy unchecked tasks from today's Obsidian daily note to the next workday's note under '## Carried over', and mark them [>] in the source. Skips weekends, idempotent.",
5
+ "skills": "skills/"
6
+ }