mindforge-cc 11.5.1 → 11.6.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 (170) hide show
  1. package/.agent/mindforge/skill-tdd.md +53 -0
  2. package/.agent/mindforge/skills-index.md +118 -0
  3. package/.agent/mindforge/systematic-debug.md +60 -0
  4. package/.agent/skills/1password-skill/SKILL.md +156 -0
  5. package/.agent/skills/1password-skill/references/cli-examples.md +31 -0
  6. package/.agent/skills/1password-skill/references/get-started.md +21 -0
  7. package/.agent/skills/article-illustrator/SKILL.md +199 -0
  8. package/.agent/skills/article-illustrator/references/prompt-construction.md +426 -0
  9. package/.agent/skills/article-illustrator/references/style-presets.md +80 -0
  10. package/.agent/skills/article-illustrator/references/styles.md +224 -0
  11. package/.agent/skills/article-illustrator/references/usage.md +50 -0
  12. package/.agent/skills/article-illustrator/references/workflow.md +332 -0
  13. package/.agent/skills/arxiv/SKILL.md +275 -0
  14. package/.agent/skills/blogwatcher/SKILL.md +130 -0
  15. package/.agent/skills/code-wiki/SKILL.md +438 -0
  16. package/.agent/skills/code-wiki/templates/README.md +31 -0
  17. package/.agent/skills/code-wiki/templates/architecture.md +30 -0
  18. package/.agent/skills/code-wiki/templates/getting-started.md +47 -0
  19. package/.agent/skills/code-wiki/templates/module.md +38 -0
  20. package/.agent/skills/codebase-inspection/SKILL.md +109 -0
  21. package/.agent/skills/comic-creator/SKILL.md +240 -0
  22. package/.agent/skills/comic-creator/references/analysis-framework.md +176 -0
  23. package/.agent/skills/comic-creator/references/auto-selection.md +71 -0
  24. package/.agent/skills/comic-creator/references/base-prompt.md +98 -0
  25. package/.agent/skills/comic-creator/references/character-template.md +180 -0
  26. package/.agent/skills/comic-creator/references/ohmsha-guide.md +85 -0
  27. package/.agent/skills/comic-creator/references/partial-workflows.md +106 -0
  28. package/.agent/skills/comic-creator/references/storyboard-template.md +143 -0
  29. package/.agent/skills/comic-creator/references/workflow.md +401 -0
  30. package/.agent/skills/concept-diagrams/SKILL.md +355 -0
  31. package/.agent/skills/concept-diagrams/references/dashboard-patterns.md +43 -0
  32. package/.agent/skills/concept-diagrams/references/infrastructure-patterns.md +144 -0
  33. package/.agent/skills/concept-diagrams/references/physical-shape-cookbook.md +42 -0
  34. package/.agent/skills/creative-ideation/SKILL.md +144 -0
  35. package/.agent/skills/creative-ideation/references/full-prompt-library.md +110 -0
  36. package/.agent/skills/devops-cli/SKILL.md +149 -0
  37. package/.agent/skills/devops-cli/references/app-discovery.md +112 -0
  38. package/.agent/skills/devops-cli/references/authentication.md +59 -0
  39. package/.agent/skills/devops-cli/references/cli-reference.md +104 -0
  40. package/.agent/skills/devops-cli/references/running-apps.md +171 -0
  41. package/.agent/skills/devops-watchers/SKILL.md +103 -0
  42. package/.agent/skills/docker-management/SKILL.md +273 -0
  43. package/.agent/skills/domain-intel/SKILL.md +96 -0
  44. package/.agent/skills/duckduckgo-search/SKILL.md +230 -0
  45. package/.agent/skills/github-auth/SKILL.md +240 -0
  46. package/.agent/skills/github-code-review/SKILL.md +474 -0
  47. package/.agent/skills/github-code-review/references/review-output-template.md +74 -0
  48. package/.agent/skills/github-issues/SKILL.md +363 -0
  49. package/.agent/skills/github-issues/templates/bug-report.md +35 -0
  50. package/.agent/skills/github-issues/templates/feature-request.md +31 -0
  51. package/.agent/skills/github-pr-workflow/SKILL.md +360 -0
  52. package/.agent/skills/github-pr-workflow/references/ci-troubleshooting.md +183 -0
  53. package/.agent/skills/github-pr-workflow/references/conventional-commits.md +71 -0
  54. package/.agent/skills/github-pr-workflow/templates/pr-body-bugfix.md +35 -0
  55. package/.agent/skills/github-pr-workflow/templates/pr-body-feature.md +33 -0
  56. package/.agent/skills/github-repo-management/SKILL.md +509 -0
  57. package/.agent/skills/github-repo-management/references/github-api-cheatsheet.md +161 -0
  58. package/.agent/skills/godmode/SKILL.md +396 -0
  59. package/.agent/skills/godmode/references/jailbreak-templates.md +128 -0
  60. package/.agent/skills/godmode/references/refusal-detection.md +142 -0
  61. package/.agent/skills/hyperframes/SKILL.md +182 -0
  62. package/.agent/skills/hyperframes/references/cli.md +185 -0
  63. package/.agent/skills/hyperframes/references/composition.md +129 -0
  64. package/.agent/skills/hyperframes/references/features.md +289 -0
  65. package/.agent/skills/hyperframes/references/gsap.md +136 -0
  66. package/.agent/skills/hyperframes/references/troubleshooting.md +137 -0
  67. package/.agent/skills/hyperframes/references/website-to-video.md +145 -0
  68. package/.agent/skills/jupyter-live-kernel/SKILL.md +160 -0
  69. package/.agent/skills/kanban-orchestrator/SKILL.md +209 -0
  70. package/.agent/skills/kanban-worker/SKILL.md +188 -0
  71. package/.agent/skills/llm-wiki/SKILL.md +499 -0
  72. package/.agent/skills/meme-generation/SKILL.md +122 -0
  73. package/.agent/skills/node-inspect-debugger/SKILL.md +312 -0
  74. package/.agent/skills/obsidian/SKILL.md +60 -0
  75. package/.agent/skills/osint-investigation/SKILL.md +269 -0
  76. package/.agent/skills/osint-investigation/templates/source-template.md +59 -0
  77. package/.agent/skills/oss-forensics/SKILL.md +422 -0
  78. package/.agent/skills/oss-forensics/references/evidence-types.md +89 -0
  79. package/.agent/skills/oss-forensics/references/github-archive-guide.md +184 -0
  80. package/.agent/skills/oss-forensics/references/investigation-templates.md +131 -0
  81. package/.agent/skills/oss-forensics/references/recovery-techniques.md +164 -0
  82. package/.agent/skills/oss-forensics/templates/forensic-report.md +151 -0
  83. package/.agent/skills/oss-forensics/templates/malicious-package-report.md +43 -0
  84. package/.agent/skills/parallel-cli/SKILL.md +384 -0
  85. package/.agent/skills/pinggy-tunnel/SKILL.md +302 -0
  86. package/.agent/skills/pixel-art/SKILL.md +209 -0
  87. package/.agent/skills/pixel-art/references/palettes.md +49 -0
  88. package/.agent/skills/plan/SKILL.md +331 -0
  89. package/.agent/skills/polymarket/SKILL.md +75 -0
  90. package/.agent/skills/polymarket/references/api-endpoints.md +220 -0
  91. package/.agent/skills/python-debugpy/SKILL.md +368 -0
  92. package/.agent/skills/requesting-code-review/SKILL.md +273 -0
  93. package/.agent/skills/research-paper-writing/SKILL.md +2367 -0
  94. package/.agent/skills/research-paper-writing/references/autoreason-methodology.md +394 -0
  95. package/.agent/skills/research-paper-writing/references/checklists.md +434 -0
  96. package/.agent/skills/research-paper-writing/references/citation-workflow.md +563 -0
  97. package/.agent/skills/research-paper-writing/references/experiment-patterns.md +728 -0
  98. package/.agent/skills/research-paper-writing/references/human-evaluation.md +476 -0
  99. package/.agent/skills/research-paper-writing/references/paper-types.md +481 -0
  100. package/.agent/skills/research-paper-writing/references/reviewer-guidelines.md +433 -0
  101. package/.agent/skills/research-paper-writing/references/sources.md +191 -0
  102. package/.agent/skills/research-paper-writing/references/writing-guide.md +474 -0
  103. package/.agent/skills/research-paper-writing/templates/README.md +251 -0
  104. package/.agent/skills/rest-graphql-debug/SKILL.md +507 -0
  105. package/.agent/skills/s6-container-supervision/SKILL.md +171 -0
  106. package/.agent/skills/scrapling/SKILL.md +328 -0
  107. package/.agent/skills/sherlock/SKILL.md +186 -0
  108. package/.agent/skills/simplify-code/SKILL.md +168 -0
  109. package/.agent/skills/skill-authoring/SKILL.md +158 -0
  110. package/.agent/skills/spike/SKILL.md +190 -0
  111. package/.agent/skills/subagent-driven-development/SKILL.md +345 -0
  112. package/.agent/skills/subagent-driven-development/references/context-budget-discipline.md +53 -0
  113. package/.agent/skills/subagent-driven-development/references/gates-taxonomy.md +93 -0
  114. package/.agent/skills/systematic-debugging/SKILL.md +360 -0
  115. package/.agent/skills/test-driven-development/SKILL.md +336 -0
  116. package/.agent/skills/video-orchestrator/SKILL.md +194 -0
  117. package/.agent/skills/video-orchestrator/references/examples.md +227 -0
  118. package/.agent/skills/video-orchestrator/references/intake.md +166 -0
  119. package/.agent/skills/video-orchestrator/references/kanban-setup.md +278 -0
  120. package/.agent/skills/video-orchestrator/references/monitoring.md +180 -0
  121. package/.agent/skills/video-orchestrator/references/role-archetypes.md +298 -0
  122. package/.agent/skills/video-orchestrator/references/tool-matrix.md +317 -0
  123. package/.agent/skills/web-pentest/SKILL.md +332 -0
  124. package/.agent/skills/web-pentest/references/bypass-techniques.md +133 -0
  125. package/.agent/skills/web-pentest/references/exploitation-techniques.md +204 -0
  126. package/.agent/skills/web-pentest/references/scope-enforcement.md +110 -0
  127. package/.agent/skills/web-pentest/references/vuln-taxonomy.md +81 -0
  128. package/.agent/skills/web-pentest/templates/authorization.md +69 -0
  129. package/.agent/skills/web-pentest/templates/pentest-report.md +178 -0
  130. package/.claude/commands/mindforge/skill-tdd.md +53 -0
  131. package/.claude/commands/mindforge/skills-index.md +118 -0
  132. package/.claude/commands/mindforge/systematic-debug.md +60 -0
  133. package/.mindforge/config.json +2 -2
  134. package/.mindforge/memory/sync-manifest.json +1 -1
  135. package/.mindforge/skills/arxiv/SKILL.md +294 -0
  136. package/.mindforge/skills/blogwatcher/SKILL.md +147 -0
  137. package/.mindforge/skills/code-wiki/SKILL.md +457 -0
  138. package/.mindforge/skills/codebase-inspection/SKILL.md +126 -0
  139. package/.mindforge/skills/concept-diagrams/SKILL.md +373 -0
  140. package/.mindforge/skills/creative-ideation/SKILL.md +162 -0
  141. package/.mindforge/skills/domain-intel/SKILL.md +116 -0
  142. package/.mindforge/skills/duckduckgo-search/SKILL.md +249 -0
  143. package/.mindforge/skills/github-code-review/SKILL.md +493 -0
  144. package/.mindforge/skills/github-issues/SKILL.md +382 -0
  145. package/.mindforge/skills/github-pr-workflow/SKILL.md +379 -0
  146. package/.mindforge/skills/jupyter-live-kernel/SKILL.md +179 -0
  147. package/.mindforge/skills/kanban-orchestrator/SKILL.md +227 -0
  148. package/.mindforge/skills/kanban-worker/SKILL.md +206 -0
  149. package/.mindforge/skills/meme-generation/SKILL.md +141 -0
  150. package/.mindforge/skills/obsidian/SKILL.md +80 -0
  151. package/.mindforge/skills/osint-investigation/SKILL.md +288 -0
  152. package/.mindforge/skills/oss-forensics/SKILL.md +421 -0
  153. package/.mindforge/skills/pixel-art/SKILL.md +228 -0
  154. package/.mindforge/skills/plan/SKILL.md +350 -0
  155. package/.mindforge/skills/requesting-code-review/SKILL.md +292 -0
  156. package/.mindforge/skills/research-paper-writing/SKILL.md +2384 -0
  157. package/.mindforge/skills/scrapling/SKILL.md +345 -0
  158. package/.mindforge/skills/sherlock/SKILL.md +203 -0
  159. package/.mindforge/skills/simplify-code/SKILL.md +187 -0
  160. package/.mindforge/skills/spike/SKILL.md +209 -0
  161. package/.mindforge/skills/subagent-driven-development/SKILL.md +364 -0
  162. package/.mindforge/skills/systematic-debugging/SKILL.md +379 -0
  163. package/.mindforge/skills/test-driven-development/SKILL.md +355 -0
  164. package/.mindforge/skills/web-pentest/SKILL.md +327 -0
  165. package/CHANGELOG.md +43 -0
  166. package/MINDFORGE.md +2 -2
  167. package/README.md +39 -3
  168. package/RELEASENOTES.md +55 -0
  169. package/docs/getting-started.md +42 -5
  170. package/package.json +1 -1
@@ -0,0 +1,227 @@
1
+ ---
2
+ name: kanban-orchestrator
3
+ description: 'Decomposition playbook + anti-temptation rules for an orchestrator profile routing work through Kanban. The "don't do the work yourself" rule and the basic lifecycle are auto-injected into every kanban worker's system prompt; this skill is the deeper playbook when you're specifically playing the orchestrator role.'
4
+ version: 3.0.0
5
+ status: stable
6
+ min_mindforge_version: 11.5.1
7
+ triggers: kanban orchestrator, multi-agent kanban, decompose and route, orchestrate tasks, task routing, kanban decomposition, fan out tasks, route work, orchestrate workflow, kanban multi-agent, kanban task decomposition, orchestrate kanban
8
+ ---
9
+
10
+ # Kanban Orchestrator — Decomposition Playbook
11
+
12
+ > The **core worker lifecycle** (including the `kanban_create` fan-out pattern and the "decompose, don't execute" rule) is auto-injected into every kanban process via the `KANBAN_GUIDANCE` system-prompt block. This skill is the deeper playbook when you're an orchestrator profile whose whole job is routing.
13
+
14
+ ## Profiles are user-configured — not a fixed roster
15
+
16
+ agent setups vary widely. Some users run a single profile that does everything; some run a small fleet (`docker-worker`, `cron-worker`); some run a curated specialist team they've named themselves. There is **no default specialist roster** — the orchestrator skill does not know what profiles exist on this machine.
17
+
18
+ Before fanning out, you must ground the decomposition in the profiles that actually exist. The dispatcher silently fails to spawn unknown assignee names — it doesn't autocorrect, doesn't suggest, doesn't fall back. So a card assigned to `researcher` on a setup that only has `docker-worker` just sits in `ready` forever.
19
+
20
+ **Step 0: discover available profiles before planning.**
21
+
22
+ Use one of these:
23
+
24
+ - `hermes profile list` — prints the table of profiles configured on this machine. Run it through your terminal tool if you have one; otherwise ask the user.
25
+ - `kanban_list(assignee="<some-name>")` — sanity-check a single name. Returns an empty list (rather than an error) for an unknown assignee, so this only confirms a name you're already considering.
26
+ - **Just ask the user.** "What profiles do you have set up?" is a fine first turn when the goal needs more than one specialist.
27
+
28
+ Cache the result in your working memory for the rest of the conversation. Re-asking every turn wastes a tool call.
29
+
30
+ ## When to use the board (vs. just doing the work)
31
+
32
+ Create Kanban tasks when any of these are true:
33
+
34
+ 1. **Multiple specialists are needed.** Research + analysis + writing is three profiles.
35
+ 2. **The work should survive a crash or restart.** Long-running, recurring, or important.
36
+ 3. **The user might want to interject.** Human-in-the-loop at any step.
37
+ 4. **Multiple subtasks can run in parallel.** Fan-out for speed.
38
+ 5. **Review / iteration is expected.** A reviewer profile loops on drafter output.
39
+ 6. **The audit trail matters.** Board rows persist in SQLite forever.
40
+
41
+ If *none* of those apply — it's a small one-shot reasoning task — use `delegate_task` instead or answer the user directly.
42
+
43
+ ## The anti-temptation rules
44
+
45
+ Your job description says "route, don't execute." The rules that enforce that:
46
+
47
+ - **Do not execute the work yourself.** Your restricted toolset usually doesn't even include terminal/file/code/web for implementation. If you find yourself "just fixing this quickly" — stop and create a task for the right specialist.
48
+ - **For any concrete task, create a Kanban task and assign it.** Every single time.
49
+ - **Split multi-lane requests before creating cards.** A user prompt can contain several independent workstreams. Extract those lanes first, then create one card per lane instead of bundling unrelated work into a single implementer card.
50
+ - **Run independent lanes in parallel.** If two cards do not need each other's output, leave them unlinked so the dispatcher can fan them out. Link only true data dependencies.
51
+ - **Never create dependent work as independent ready cards.** If a card must wait for another card, pass `parents=[...]` in the original `kanban_create` call. Do not create it first and link it later, and do not rely on prose like "wait for T1" inside the body.
52
+ - **If no specialist fits the available profiles, ask the user which profile to create or which existing profile to use.** Do not invent profile names; the dispatcher will silently drop unknown assignees.
53
+ - **Decompose, route, and summarize — that's the whole job.**
54
+
55
+ ## Decomposition playbook
56
+
57
+ ### Step 1 — Understand the goal
58
+
59
+ Ask clarifying questions if the goal is ambiguous. Cheap to ask; expensive to spawn the wrong fleet.
60
+
61
+ ### Step 2 — Sketch the task graph
62
+
63
+ Before creating anything, draft the graph out loud (in your response to the user). Treat every concrete workstream as a candidate card:
64
+
65
+ 1. Extract the lanes from the request.
66
+ 2. Map each lane to one of the profiles you discovered in Step 0. If a lane doesn't fit any existing profile, ask the user which to use or create.
67
+ 3. Decide whether each lane is independent or gated by another lane.
68
+ 4. Create independent lanes as parallel cards with no parent links.
69
+ 5. Create synthesis/review/integration cards with parent links to the lanes they depend on. A child created with unfinished parents starts in `todo`; the dispatcher promotes it to `ready` only after every parent is done.
70
+
71
+ Examples of prompts that should fan out (using placeholder profile names — substitute whatever exists on the user's setup):
72
+
73
+ - "Build an app" → one card to a design-oriented profile for product/UI direction, one or two cards to engineering profiles for implementation, plus a later integration/review card if the user has a reviewer profile.
74
+ - "Fix blockers and check model variants" → one implementation card for the blocker fixes plus one discovery/research card for config/source verification. A final reviewer card can depend on both.
75
+ - "Research docs and implement" → a docs-research card can run in parallel with a codebase-discovery card; implementation waits only if it truly needs those findings.
76
+ - "Analyze this screenshot and find the related code" → one card to a vision-capable profile for the visual analysis while another searches the codebase.
77
+
78
+ Words like "also," "finally," or "and" do not automatically imply a dependency. They often mean "make sure this is covered before reporting back." Only link tasks when one card cannot start until another card's output exists.
79
+
80
+ Show the graph to the user before creating cards. Let them correct it — including which actual profile name should own each lane.
81
+
82
+ ### Step 3 — Create tasks and link
83
+
84
+ Use the profile names from Step 0. The example below uses placeholders `<profile-A>`, `<profile-B>`, `<profile-C>` — replace them with what the user actually has.
85
+
86
+ ```python
87
+ t1 = kanban_create(
88
+ title="research: Postgres cost vs current",
89
+ assignee="<profile-A>", # whichever profile handles research on this setup
90
+ body="Compare estimated infrastructure costs, migration costs, and ongoing ops costs over a 3-year window. Sources: AWS/GCP pricing, team time estimates, current Postgres bills from peers.",
91
+ tenant=os.environ.get("HERMES_TENANT"),
92
+ )["task_id"]
93
+
94
+ t2 = kanban_create(
95
+ title="research: Postgres performance vs current",
96
+ assignee="<profile-A>", # same profile, run in parallel
97
+ body="Compare query latency, throughput, and scaling characteristics at our expected data volume (~500GB, 10k QPS peak). Sources: benchmark papers, public case studies, pgbench results if easy.",
98
+ )["task_id"]
99
+
100
+ t3 = kanban_create(
101
+ title="synthesize migration recommendation",
102
+ assignee="<profile-B>", # whichever profile does synthesis/analysis
103
+ body="Read the findings from T1 (cost) and T2 (performance). Produce a 1-page recommendation with explicit trade-offs and a go/no-go call.",
104
+ parents=[t1, t2],
105
+ )["task_id"]
106
+
107
+ t4 = kanban_create(
108
+ title="draft decision memo",
109
+ assignee="<profile-C>", # whichever profile drafts user-facing prose
110
+ body="Turn the analyst's recommendation into a 2-page memo for the CTO. Match the tone of previous decision memos in the team's knowledge base.",
111
+ parents=[t3],
112
+ )["task_id"]
113
+ ```
114
+
115
+ `parents=[...]` gates promotion — children stay in `todo` until every parent reaches `done`, then auto-promote to `ready`. No manual coordination needed; the dispatcher and dependency engine handle it.
116
+
117
+ If the task graph has dependencies, create the parent cards first, capture their returned ids, and include those ids in the child card's `parents` list during the child `kanban_create` call. Avoid creating all cards in parallel and linking them afterward; that creates a window where the dispatcher can claim a child before its inputs exist.
118
+
119
+ ### Step 4 — Complete your own task
120
+
121
+ If you were spawned as a task yourself (e.g. a planner profile was assigned `T0: "investigate Postgres migration"`), mark it done with a summary of what you created:
122
+
123
+ ```python
124
+ kanban_complete(
125
+ summary="decomposed into T1-T4: 2 research lanes in parallel, 1 synthesis on their outputs, 1 prose draft on the recommendation",
126
+ metadata={
127
+ "task_graph": {
128
+ "T1": {"assignee": "<profile-A>", "parents": []},
129
+ "T2": {"assignee": "<profile-A>", "parents": []},
130
+ "T3": {"assignee": "<profile-B>", "parents": ["T1", "T2"]},
131
+ "T4": {"assignee": "<profile-C>", "parents": ["T3"]},
132
+ },
133
+ },
134
+ )
135
+ ```
136
+
137
+ ### Step 5 — Report back to the user
138
+
139
+ Tell them what you created in plain prose, naming the actual profiles you used:
140
+
141
+ > I've queued 4 tasks:
142
+ > - **T1** (`<profile-A>`): cost comparison
143
+ > - **T2** (`<profile-A>`): performance comparison, in parallel with T1
144
+ > - **T3** (`<profile-B>`): synthesizes T1 + T2 into a recommendation
145
+ > - **T4** (`<profile-C>`): turns T3 into a CTO memo
146
+ >
147
+ > The dispatcher will pick up T1 and T2 now. T3 starts when both finish. You'll get a gateway ping when T4 completes. Use the dashboard or `hermes kanban tail <id>` to follow along.
148
+
149
+ ## Common patterns
150
+
151
+ **Fan-out + fan-in (research → synthesize):** N research-style cards with no parents, one synthesis card with all of them as parents.
152
+
153
+ **Parallel implementation + validation:** one implementer card makes the change while one explorer/researcher card verifies config, docs, or source mapping. A reviewer card can depend on both. Do not make the implementer own unrelated verification just because the user mentioned both in one sentence.
154
+
155
+ **Pipeline with gates:** `planner → implementer → reviewer`. Each stage's `parents=[previous_task]`. Reviewer blocks or completes; if reviewer blocks, the operator unblocks with feedback and respawns.
156
+
157
+ **Same-profile queue:** N tasks, all assigned to the same profile, no dependencies between them. Dispatcher serializes — that profile processes them in priority order, accumulating experience in its own memory.
158
+
159
+ **Human-in-the-loop:** Any task can `kanban_block()` to wait for input. Dispatcher respawns after `/unblock`. The comment thread carries the full context.
160
+
161
+ ## Pitfalls
162
+
163
+ **Inventing profile names that don't exist.** The dispatcher silently fails to spawn unknown assignees — the card just sits in `ready` forever. Always assign to a profile from your Step 0 discovery; ask the user if you're unsure.
164
+
165
+ **Bundling independent lanes into one card.** If the user asks for two independent outcomes, create two cards. Example: "fix blockers and check model variants" is not one fixer task; create a fixer/engineer card for the fixes and an explorer/researcher card for the variant check, then optionally gate review on both.
166
+
167
+ **Over-linking because of wording.** "Finally check X" may still be parallel with implementation if X is static config, docs, or source discovery. Link it after implementation only when the check depends on the implementation result.
168
+
169
+ **Forgetting dependency links.** If the task graph says `research -> implement -> review`, do not create all tasks as independent ready cards. Use parent links so implement/review cannot run before their inputs exist.
170
+
171
+ **Reassignment vs. new task.** If a reviewer blocks with "needs changes," create a NEW task linked from the reviewer's task — don't re-run the same task with a stern look. The new task is assigned to the original implementer profile.
172
+
173
+ **Argument order for links.** `kanban_link(parent_id=..., child_id=...)` — parent first. Mixing them up demotes the wrong task to `todo`.
174
+
175
+ **Don't pre-create the whole graph if the shape depends on intermediate findings.** If T3's structure depends on what T1 and T2 find, let T3 exist as a "synthesize findings" task whose own first step is to read parent handoffs and plan the rest. Orchestrators can spawn orchestrators.
176
+
177
+ **Tenant inheritance.** If `HERMES_TENANT` is set in your env, pass `tenant=os.environ.get("HERMES_TENANT")` on every `kanban_create` call so child tasks stay in the same namespace.
178
+
179
+ ## Goal-mode cards (persistent workers)
180
+
181
+ By default a dispatched worker gets **one shot** at its card: it does its work, calls `kanban_complete`/`kanban_block`, and exits. For open-ended cards where one turn rarely finishes the job, pass `goal_mode=True` to wrap that worker in a Ralph-style goal loop — the same engine behind the `/goal` slash command:
182
+
183
+ ```python
184
+ kanban_create(
185
+ title="Translate the full docs site to French",
186
+ body="Acceptance: every page translated, no English left, links intact.",
187
+ assignee="<translator-profile>",
188
+ goal_mode=True, # judge re-checks the card after each turn
189
+ goal_max_turns=15, # optional budget (default 20)
190
+ )["task_id"]
191
+ ```
192
+
193
+ How it behaves:
194
+ - After each worker turn, an auxiliary judge evaluates the worker's response against the card's **title + body** (treated as the acceptance criteria).
195
+ - Not done + budget remains → the worker keeps going **in the same session** (full context retained — not a fresh respawn).
196
+ - Worker calls `kanban_complete`/`kanban_block` itself → loop stops, normal lifecycle.
197
+ - Budget exhausted without completion → the card is **blocked** for human review (sticky), never a silent exit.
198
+
199
+ When to use it: long, multi-step, or "keep going until X is true" cards. When NOT to: cheap one-shot cards (translation of a single string, a quick lookup) — the judge overhead isn't worth it, and the dispatcher's existing retry/circuit-breaker already handles transient worker failures.
200
+
201
+ Write the body as **explicit acceptance criteria** — the judge is only as good as the goal text. "Translate the README" is weaker than "Translate every section of the README to French; no English sentences remain."
202
+
203
+ ## Recovering stuck workers
204
+
205
+ When a worker profile keeps crashing, hallucinating, or getting blocked by its own mistakes (usually: wrong model, missing skill, broken credential), the kanban dashboard flags the task with a ⚠ badge and opens a **Recovery** section in the drawer. Three primary actions:
206
+
207
+ 1. **Reclaim** (or `hermes kanban reclaim <task_id>`) — abort the running worker immediately and reset the task to `ready`. The existing claim TTL is ~15 min; this is the fast path out.
208
+ 2. **Reassign** (or `hermes kanban reassign <task_id> <new-profile> --reclaim`) — switch the task to a different profile (one that exists on this setup) and let the dispatcher pick it up with a fresh worker.
209
+ 3. **Change profile model** — the dashboard prints a copy-paste hint for `hermes -p <profile> model` since profile config lives on disk; edit it in a terminal, then Reclaim to retry with the new model.
210
+
211
+ Hallucination warnings appear on tasks where a worker's `kanban_complete(created_cards=[...])` claim included card ids that don't exist or weren't created by the worker's profile (the gate blocks the completion), or where the free-form summary references `t_<hex>` ids that don't resolve (advisory prose scan, non-blocking). Both produce audit events that persist even after recovery actions — the trail stays for debugging.
212
+
213
+ ## Mandatory actions when this skill is active
214
+
215
+ Before applying this skill:
216
+ - [ ] Read the task requirements fully before acting
217
+ - [ ] Confirm you understand the goal and constraints
218
+ - [ ] Check for existing work or prior context in the codebase
219
+
220
+ While working:
221
+ - [ ] Follow the methodology described above step by step
222
+ - [ ] Document any decisions or findings as you go
223
+
224
+ After completing:
225
+ - [ ] Self-check: does the output satisfy the original requirement?
226
+ - [ ] Verify no regressions or unintended side effects
227
+
@@ -0,0 +1,206 @@
1
+ ---
2
+ name: kanban-worker
3
+ description: "Pitfalls, examples, and edge cases for Kanban workers. Covers the worker lifecycle, good handoff shapes, retry diagnostics, and edge cases."
4
+ version: 2.0.0
5
+ status: stable
6
+ min_mindforge_version: 11.5.1
7
+ triggers: kanban worker, pick up kanban task, complete kanban card, worker lifecycle, kanban task execution, claim kanban task, execute kanban work, worker role, kanban agent worker, complete task card, kanban execution, task worker
8
+ ---
9
+
10
+ # Kanban Worker — Pitfalls and Examples
11
+
12
+ > You're seeing this skill because the Kanban dispatcher spawned you as a worker with `--skills kanban-worker` — it's loaded automatically for every dispatched worker. The **lifecycle** (6 steps: orient → work → heartbeat → block/complete) also lives in the `KANBAN_GUIDANCE` block that's auto-injected into your system prompt. This skill is the deeper detail: good handoff shapes, retry diagnostics, edge cases.
13
+
14
+ ## Workspace handling
15
+
16
+ Your workspace kind determines how you should behave inside `$HERMES_KANBAN_WORKSPACE`:
17
+
18
+ | Kind | What it is | How to work |
19
+ |---|---|---|
20
+ | `scratch` | Fresh tmp dir, yours alone | Read/write freely; it gets GC'd when the task is archived. |
21
+ | `dir:<path>` | Shared persistent directory | Other runs will read what you write. Treat it like long-lived state. Path is guaranteed absolute (the kernel rejects relative paths). |
22
+ | `worktree` | Git worktree at the resolved path | If `.git` doesn't exist, run `git worktree add <path> ${HERMES_KANBAN_BRANCH:-wt/$HERMES_KANBAN_TASK}` from the main repo first, then cd and work normally. Commit work here. |
23
+
24
+ ## Tenant isolation
25
+
26
+ If `$HERMES_TENANT` is set, the task belongs to a tenant namespace. When reading or writing persistent memory, prefix memory entries with the tenant so context doesn't leak across tenants:
27
+
28
+ - Good: `business-a: Acme is our biggest customer`
29
+ - Bad (leaks): `Acme is our biggest customer`
30
+
31
+ ## Good summary + metadata shapes
32
+
33
+ The `kanban_complete(summary=..., metadata=...)` handoff is how downstream workers read what you did. Patterns that work:
34
+
35
+ **Coding task:**
36
+ ```python
37
+ kanban_complete(
38
+ summary="shipped rate limiter — token bucket, keys on user_id with IP fallback, 14 tests pass",
39
+ metadata={
40
+ "changed_files": ["rate_limiter.py", "tests/test_rate_limiter.py"],
41
+ "tests_run": 14,
42
+ "tests_passed": 14,
43
+ "decisions": ["user_id primary, IP fallback for unauthenticated requests"],
44
+ },
45
+ )
46
+ ```
47
+
48
+ **Coding task that needs human review (review-required):**
49
+
50
+ For most code-changing tasks, the work isn't truly *done* until a human reviewer has eyes on it. Block instead of complete, with `reason` prefixed `review-required: ` so the dashboard surfaces the row as needing review. Drop the structured metadata (changed files, test counts, diff/PR url) into a comment first, since `kanban_block` only carries the human-readable reason — comments are the durable annotation channel. Reviewer either approves and runs `hermes kanban unblock <id>` (which re-spawns you with the comment thread for any follow-ups) or asks for changes via another comment.
51
+
52
+ ```python
53
+ import json
54
+
55
+ kanban_comment(
56
+ body="review-required handoff:\n" + json.dumps({
57
+ "changed_files": ["rate_limiter.py", "tests/test_rate_limiter.py"],
58
+ "tests_run": 14,
59
+ "tests_passed": 14,
60
+ "diff_path": "/path/to/worktree", # or PR url if pushed
61
+ "decisions": ["user_id primary, IP fallback for unauthenticated requests"],
62
+ }, indent=2),
63
+ )
64
+ kanban_block(
65
+ reason="review-required: rate limiter shipped, 14/14 tests pass — needs eyes on the user_id/IP fallback choice before merging",
66
+ )
67
+ ```
68
+
69
+ Use `kanban_complete` only when the task is genuinely terminal — e.g. a one-line typo fix, a docs change with no functional consequences, or a research task where the artifact IS the writeup itself.
70
+
71
+ **Research task:**
72
+ ```python
73
+ kanban_complete(
74
+ summary="3 competing libraries reviewed; vLLM wins on throughput, SGLang on latency, Tensorrt-LLM on memory efficiency",
75
+ metadata={
76
+ "sources_read": 12,
77
+ "recommendation": "vLLM",
78
+ "benchmarks": {"vllm": 1.0, "sglang": 0.87, "trtllm": 0.72},
79
+ },
80
+ )
81
+ ```
82
+
83
+ **Review task:**
84
+ ```python
85
+ kanban_complete(
86
+ summary="reviewed PR #123; 2 blocking issues found (SQL injection in /search, missing CSRF on /settings)",
87
+ metadata={
88
+ "pr_number": 123,
89
+ "findings": [
90
+ {"severity": "critical", "file": "api/search.py", "line": 42, "issue": "raw SQL concat"},
91
+ {"severity": "high", "file": "api/settings.py", "issue": "missing CSRF middleware"},
92
+ ],
93
+ "approved": False,
94
+ },
95
+ )
96
+ ```
97
+
98
+ Shape `metadata` so downstream parsers (reviewers, aggregators, schedulers) can use it without re-reading your prose.
99
+
100
+ ## Claiming cards you actually created
101
+
102
+ If your run produced new kanban tasks (via `kanban_create`), pass the ids in `created_cards` on `kanban_complete`. The kernel verifies each id exists and was created by your profile; any phantom id blocks the completion with an error listing what went wrong, and the rejected attempt is permanently recorded on the task's event log. **Only list ids you captured from a successful `kanban_create` return value — never invent ids from prose, never paste ids from earlier runs, never claim cards another worker created.**
103
+
104
+ ```python
105
+ # GOOD — capture return values, then claim them.
106
+ c1 = kanban_create(title="remediate SQL injection", assignee="security-worker")
107
+ c2 = kanban_create(title="fix CSRF middleware", assignee="web-worker")
108
+
109
+ kanban_complete(
110
+ summary="Review done; spawned remediations for both findings.",
111
+ metadata={"pr_number": 123, "approved": False},
112
+ created_cards=[c1["task_id"], c2["task_id"]],
113
+ )
114
+ ```
115
+
116
+ ```python
117
+ # BAD — claiming ids you don't have captured return values for.
118
+ kanban_complete(
119
+ summary="Created remediation cards t_a1b2c3d4, t_deadbeef", # hallucinated
120
+ created_cards=["t_a1b2c3d4", "t_deadbeef"], # → gate rejects
121
+ )
122
+ ```
123
+
124
+ If a `kanban_create` call fails (exception, tool_error), the card was NOT created — do not include a phantom id for it. Retry the create, or omit the id and mention the failure in your summary. The prose-scan pass also catches `t_<hex>` references in your free-form summary that don't resolve; these don't block the completion but show up as advisory warnings on the task in the dashboard.
125
+
126
+ ## Block reasons that get answered fast
127
+
128
+ Bad: `"stuck"` — the human has no context.
129
+
130
+ Good: one sentence naming the specific decision you need. Leave longer context as a comment instead.
131
+
132
+ ```python
133
+ kanban_comment(
134
+ task_id=os.environ["HERMES_KANBAN_TASK"],
135
+ body="Full context: I have user IPs from Cloudflare headers but some users are behind NATs with thousands of peers. Keying on IP alone causes false positives.",
136
+ )
137
+ kanban_block(reason="Rate limit key choice: IP (simple, NAT-unsafe) or user_id (requires auth, skips anonymous endpoints)?")
138
+ ```
139
+
140
+ The block message is what appears in the dashboard / gateway notifier. The comment is the deeper context a human reads when they open the task.
141
+
142
+ ## Heartbeats worth sending
143
+
144
+ Good heartbeats name progress: `"epoch 12/50, loss 0.31"`, `"scanned 1.2M/2.4M rows"`, `"uploaded 47/120 videos"`.
145
+
146
+ Bad heartbeats: `"still working"`, empty notes, sub-second intervals. Every few minutes max; skip entirely for tasks under ~2 minutes.
147
+
148
+ ## Retry scenarios
149
+
150
+ If you open the task and `kanban_show` returns `runs: [...]` with one or more closed runs, you're a retry. The prior runs' `outcome` / `summary` / `error` tell you what didn't work. Don't repeat that path. Typical retry diagnostics:
151
+
152
+ - `outcome: "timed_out"` — the previous attempt hit `max_runtime_seconds`. You may need to chunk the work or shorten it.
153
+ - `outcome: "crashed"` — OOM or segfault. Reduce memory footprint.
154
+ - `outcome: "spawn_failed"` + `error: "..."` — usually a profile config issue (missing credential, bad PATH). Ask the human via `kanban_block` instead of retrying blindly.
155
+ - `outcome: "reclaimed"` + `summary: "task archived..."` — operator archived the task out from under the previous run; you probably shouldn't be running at all, check status carefully.
156
+ - `outcome: "blocked"` — a previous attempt blocked; the unblock comment should be in the thread by now.
157
+
158
+ ## Notification routing
159
+
160
+ You can configure the gateway to receive cross-profile Kanban task notifications by adding `notification_sources` to `~/.agent/config.yaml`.
161
+ - `notification_sources: ['*']` accepts subscriptions from all profiles.
162
+ - `notification_sources: ['default', 'zilor-ppt']` or `"default,zilor-ppt"` restricts subscriptions to specified profiles.
163
+ - Omitting the key keeps the default behavior (profile isolation).
164
+
165
+ ## Do NOT
166
+
167
+ - Call `delegate_task` as a substitute for `kanban_create`. `delegate_task` is for short reasoning subtasks inside YOUR run; `kanban_create` is for cross-agent handoffs that outlive one API loop.
168
+ - Call `clarify` to ask the human a question. You are running headless — there is no live user to answer. The call will time out (default ~120s) and the task will sit silently in `running` with no signal that it needs input. Use `kanban_comment` (context) + `kanban_block(reason=...)` (decision needed) instead — the task surfaces on the board as blocked, the operator sees it, unblocks with their answer in a comment, and you respawn with the thread.
169
+ - Modify files outside `$HERMES_KANBAN_WORKSPACE` unless the task body says to.
170
+ - Create follow-up tasks assigned to yourself — assign to the right specialist.
171
+ - Complete a task you didn't actually finish. Block it instead.
172
+
173
+ ## Pitfalls
174
+
175
+ **Task state can change between dispatch and your startup.** Between when the dispatcher claimed and when your process actually booted, the task may have been blocked, reassigned, or archived. Always `kanban_show` first. If it reports `blocked` or `archived`, stop — you shouldn't be running.
176
+
177
+ **Workspace may have stale artifacts.** Especially `dir:` and `worktree` workspaces can have files from previous runs. Read the comment thread — it usually explains why you're running again and what state the workspace is in.
178
+
179
+ **Don't rely on the CLI when the guidance is available.** The `kanban_*` tools work across all terminal backends (Docker, Modal, SSH). `hermes kanban <verb>` from your terminal tool will fail in containerized backends because the CLI isn't installed there. When in doubt, use the tool.
180
+
181
+ ## CLI fallback (for scripting)
182
+
183
+ Every tool has a CLI equivalent for human operators and scripts:
184
+ - `kanban_show` ↔ `hermes kanban show <id> --json`
185
+ - `kanban_complete` ↔ `hermes kanban complete <id> --summary "..." --metadata '{...}'`
186
+ - `kanban_block` ↔ `hermes kanban block <id> "reason"`
187
+ - `kanban_create` ↔ `hermes kanban create "title" --assignee <profile> [--parent <id>]`
188
+ - etc.
189
+
190
+ Use the tools from inside an agent; the CLI exists for the human at the terminal.
191
+
192
+ ## Mandatory actions when this skill is active
193
+
194
+ Before applying this skill:
195
+ - [ ] Read the task requirements fully before acting
196
+ - [ ] Confirm you understand the goal and constraints
197
+ - [ ] Check for existing work or prior context in the codebase
198
+
199
+ While working:
200
+ - [ ] Follow the methodology described above step by step
201
+ - [ ] Document any decisions or findings as you go
202
+
203
+ After completing:
204
+ - [ ] Self-check: does the output satisfy the original requirement?
205
+ - [ ] Verify no regressions or unintended side effects
206
+
@@ -0,0 +1,141 @@
1
+ ---
2
+ name: meme-generation
3
+ description: "Generate real meme images by picking a template and overlaying text with Pillow. Produces actual .png meme files."
4
+ version: 2.0.0
5
+ status: stable
6
+ min_mindforge_version: 11.5.1
7
+ triggers: meme generation, create meme, generate meme, make a meme, meme creator, meme design, create a meme, meme template, generate meme image, meme maker, make meme, meme creation
8
+ ---
9
+
10
+ # Meme Generation
11
+
12
+ Generate actual meme images from a topic. Picks a template, writes captions, and renders a real .png file with text overlay.
13
+
14
+ ## When to Use
15
+
16
+ - User asks you to make or generate a meme
17
+ - User wants a meme about a specific topic, situation, or frustration
18
+ - User says "meme this" or similar
19
+
20
+ ## Available Templates
21
+
22
+ The script supports **any of the ~100 popular imgflip templates** by name or ID, plus 10 curated templates with hand-tuned text positioning.
23
+
24
+ ### Curated Templates (custom text placement)
25
+
26
+ | ID | Name | Fields | Best for |
27
+ |----|------|--------|----------|
28
+ | `this-is-fine` | This is Fine | top, bottom | chaos, denial |
29
+ | `drake` | Drake Hotline Bling | reject, approve | rejecting/preferring |
30
+ | `distracted-boyfriend` | Distracted Boyfriend | distraction, current, person | temptation, shifting priorities |
31
+ | `two-buttons` | Two Buttons | left, right, person | impossible choice |
32
+ | `expanding-brain` | Expanding Brain | 4 levels | escalating irony |
33
+ | `change-my-mind` | Change My Mind | statement | hot takes |
34
+ | `woman-yelling-at-cat` | Woman Yelling at Cat | woman, cat | arguments |
35
+ | `one-does-not-simply` | One Does Not Simply | top, bottom | deceptively hard things |
36
+ | `grus-plan` | Gru's Plan | step1-3, realization | plans that backfire |
37
+ | `batman-slapping-robin` | Batman Slapping Robin | robin, batman | shutting down bad ideas |
38
+
39
+ ### Dynamic Templates (from imgflip API)
40
+
41
+ Any template not in the curated list can be used by name or imgflip ID. These get smart default text positioning (top/bottom for 2-field, evenly spaced for 3+). Search with:
42
+ ```bash
43
+ python "$SKILL_DIR/scripts/generate_meme.py" --search "disaster"
44
+ ```
45
+
46
+ ## Procedure
47
+
48
+ ### Mode 1: Classic Template (default)
49
+
50
+ 1. Read the user's topic and identify the core dynamic (chaos, dilemma, preference, irony, etc.)
51
+ 2. Pick the template that best matches. Use the "Best for" column, or search with `--search`.
52
+ 3. Write short captions for each field (8-12 words max per field, shorter is better).
53
+ 4. Find the skill's script directory:
54
+ ```
55
+ SKILL_DIR=$(dirname "$(find ~/.hermes/skills -path '*/meme-generation/SKILL.md' 2>/dev/null | head -1)")
56
+ ```
57
+ 5. Run the generator:
58
+ ```bash
59
+ python "$SKILL_DIR/scripts/generate_meme.py" <template_id> /tmp/meme.png "caption 1" "caption 2" ...
60
+ ```
61
+ 6. Return the image with `MEDIA:/tmp/meme.png`
62
+
63
+ ### Mode 2: Custom AI Image (when image_generate is available)
64
+
65
+ Use this when no classic template fits, or when the user wants something original.
66
+
67
+ 1. Write the captions first.
68
+ 2. Use `image_generate` to create a scene that matches the meme concept. Do NOT include any text in the image prompt — text will be added by the script. Describe only the visual scene.
69
+ 3. Find the generated image path from the image_generate result URL. Download it to a local path if needed.
70
+ 4. Run the script with `--image` to overlay text, choosing a mode:
71
+ - **Overlay** (text directly on image, white with black outline):
72
+ ```bash
73
+ python "$SKILL_DIR/scripts/generate_meme.py" --image /path/to/scene.png /tmp/meme.png "top text" "bottom text"
74
+ ```
75
+ - **Bars** (black bars above/below with white text — cleaner, always readable):
76
+ ```bash
77
+ python "$SKILL_DIR/scripts/generate_meme.py" --image /path/to/scene.png --bars /tmp/meme.png "top text" "bottom text"
78
+ ```
79
+ Use `--bars` when the image is busy/detailed and text would be hard to read on top of it.
80
+ 5. **Verify with vision** (if `vision_analyze` is available): Check the result looks good:
81
+ ```
82
+ vision_analyze(image_url="/tmp/meme.png", question="Is the text legible and well-positioned? Does the meme work visually?")
83
+ ```
84
+ If the vision model flags issues (text hard to read, bad placement, etc.), try the other mode (switch between overlay and bars) or regenerate the scene.
85
+ 6. Return the image with `MEDIA:/tmp/meme.png`
86
+
87
+ ## Examples
88
+
89
+ **"debugging production at 2 AM":**
90
+ ```bash
91
+ python generate_meme.py this-is-fine /tmp/meme.png "SERVERS ARE ON FIRE" "This is fine"
92
+ ```
93
+
94
+ **"choosing between sleep and one more episode":**
95
+ ```bash
96
+ python generate_meme.py drake /tmp/meme.png "Getting 8 hours of sleep" "One more episode at 3 AM"
97
+ ```
98
+
99
+ **"the stages of a Monday morning":**
100
+ ```bash
101
+ python generate_meme.py expanding-brain /tmp/meme.png "Setting an alarm" "Setting 5 alarms" "Sleeping through all alarms" "Working from bed"
102
+ ```
103
+
104
+ ## Listing Templates
105
+
106
+ To see all available templates:
107
+ ```bash
108
+ python generate_meme.py --list
109
+ ```
110
+
111
+ ## Pitfalls
112
+
113
+ - Keep captions SHORT. Memes with long text look terrible.
114
+ - Match the number of text arguments to the template's field count.
115
+ - Pick the template that fits the joke structure, not just the topic.
116
+ - Do not generate hateful, abusive, or personally targeted content.
117
+ - The script caches template images in `scripts/.cache/` after first download.
118
+
119
+ ## Verification
120
+
121
+ The output is correct if:
122
+ - A .png file was created at the output path
123
+ - Text is legible (white with black outline) on the template
124
+ - The joke lands — caption matches the template's intended structure
125
+ - File can be delivered via MEDIA: path
126
+
127
+ ## Mandatory actions when this skill is active
128
+
129
+ Before applying this skill:
130
+ - [ ] Read the task requirements fully before acting
131
+ - [ ] Confirm you understand the goal and constraints
132
+ - [ ] Check for existing work or prior context in the codebase
133
+
134
+ While working:
135
+ - [ ] Follow the methodology described above step by step
136
+ - [ ] Document any decisions or findings as you go
137
+
138
+ After completing:
139
+ - [ ] Self-check: does the output satisfy the original requirement?
140
+ - [ ] Verify no regressions or unintended side effects
141
+
@@ -0,0 +1,80 @@
1
+ ---
2
+ name: obsidian
3
+ description: "Read, search, create, and edit notes in the Obsidian vault."
4
+ version: 1.0.0
5
+ status: stable
6
+ min_mindforge_version: 11.5.1
7
+ triggers: obsidian notes, obsidian vault, obsidian workflow, obsidian knowledge base, obsidian note, use obsidian, obsidian app, obsidian plugin, obsidian graph, knowledge management obsidian, obsidian md, obsidian notes workflow
8
+ ---
9
+
10
+ # Obsidian Vault
11
+
12
+ Use this skill for filesystem-first Obsidian vault work: reading notes, listing notes, searching note files, creating notes, appending content, and adding wikilinks.
13
+
14
+ ## Vault path
15
+
16
+ Use a known or resolved vault path before calling file tools.
17
+
18
+ The documented vault-path convention is the `OBSIDIAN_VAULT_PATH` environment variable, for example from `${HERMES_HOME:-~/.hermes}/.env`. If it is unset, use `~/Documents/Obsidian Vault`.
19
+
20
+ File tools do not expand shell variables. Do not pass paths containing `$OBSIDIAN_VAULT_PATH` to `read_file`, `write_file`, `patch`, or `search_files`; resolve the vault path first and pass a concrete absolute path. Vault paths may contain spaces, which is another reason to prefer file tools over shell commands.
21
+
22
+ If the vault path is unknown, `terminal` is acceptable for resolving `OBSIDIAN_VAULT_PATH` or checking whether the fallback path exists. Once the path is known, switch back to file tools.
23
+
24
+ ## Read a note
25
+
26
+ Use `read_file` with the resolved absolute path to the note. Prefer this over `cat` because it provides line numbers and pagination.
27
+
28
+ ## List notes
29
+
30
+ Use `search_files` with `target: "files"` and the resolved vault path. Prefer this over `find` or `ls`.
31
+
32
+ - To list all markdown notes, use `pattern: "*.md"` under the vault path.
33
+ - To list a subfolder, search under that subfolder's absolute path.
34
+
35
+ ## Search
36
+
37
+ Use `search_files` for both filename and content searches. Prefer this over `grep`, `find`, or `ls`.
38
+
39
+ - For filenames, use `search_files` with `target: "files"` and a filename `pattern`.
40
+ - For note contents, use `search_files` with `target: "content"`, the content regex as `pattern`, and `file_glob: "*.md"` when you want to restrict matches to markdown notes.
41
+
42
+ ## Create a note
43
+
44
+ Use `write_file` with the resolved absolute path and the full markdown content. Prefer this over shell heredocs or `echo` because it avoids shell quoting issues and returns structured results.
45
+
46
+ ## Append to a note
47
+
48
+ Prefer a native file-tool workflow when it is not awkward:
49
+
50
+ - Read the target note with `read_file`.
51
+ - Use `patch` for an anchored append when there is stable context, such as adding a section after an existing heading or appending before a known trailing block.
52
+ - Use `write_file` when rewriting the whole note is clearer than constructing a fragile patch.
53
+
54
+ For an anchored append with `patch`, replace the anchor with the anchor plus the new content.
55
+
56
+ For a simple append with no stable context, `terminal` is acceptable if it is the clearest safe option.
57
+
58
+ ## Targeted edits
59
+
60
+ Use `patch` for focused note changes when the current content gives you stable context. Prefer this over shell text rewriting.
61
+
62
+ ## Wikilinks
63
+
64
+ Obsidian links notes with `[[Note Name]]` syntax. When creating notes, use these to link related content.
65
+
66
+ ## Mandatory actions when this skill is active
67
+
68
+ Before applying this skill:
69
+ - [ ] Read the task requirements fully before acting
70
+ - [ ] Confirm you understand the goal and constraints
71
+ - [ ] Check for existing work or prior context in the codebase
72
+
73
+ While working:
74
+ - [ ] Follow the methodology described above step by step
75
+ - [ ] Document any decisions or findings as you go
76
+
77
+ After completing:
78
+ - [ ] Self-check: does the output satisfy the original requirement?
79
+ - [ ] Verify no regressions or unintended side effects
80
+