opencode-skills-collection 3.1.14 → 3.1.16

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 (164) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +36 -1
  2. package/bundled-skills/007/scripts/full_audit.py +34 -22
  3. package/bundled-skills/007/scripts/quick_scan.py +24 -15
  4. package/bundled-skills/007/scripts/scanners/dependency_scanner.py +31 -19
  5. package/bundled-skills/007/scripts/scanners/injection_scanner.py +24 -14
  6. package/bundled-skills/007/scripts/scanners/secrets_scanner.py +24 -14
  7. package/bundled-skills/007/scripts/score_calculator.py +25 -13
  8. package/bundled-skills/2slides-ppt-generator/scripts/download_slides_pages_voices.py +15 -1
  9. package/bundled-skills/aegisops-ai/SKILL.md +1 -1
  10. package/bundled-skills/agent-self-scheduling/SKILL.md +88 -0
  11. package/bundled-skills/alpha-vantage/SKILL.md +3 -1
  12. package/bundled-skills/anti-sleep/SKILL.md +90 -0
  13. package/bundled-skills/api-security-best-practices/SKILL.md +1 -1
  14. package/bundled-skills/app-store-optimization/SKILL.md +7 -0
  15. package/bundled-skills/audio-transcriber/scripts/transcribe.py +17 -4
  16. package/bundled-skills/azure-mgmt-botservice-py/SKILL.md +2 -1
  17. package/bundled-skills/azure-resource-manager-mysql-dotnet/SKILL.md +2 -1
  18. package/bundled-skills/azure-resource-manager-postgresql-dotnet/SKILL.md +2 -1
  19. package/bundled-skills/azure-resource-manager-sql-dotnet/SKILL.md +2 -1
  20. package/bundled-skills/biopython/SKILL.md +2 -1
  21. package/bundled-skills/brain-to-docs/SKILL.md +54 -0
  22. package/bundled-skills/browser-harness/SKILL.md +220 -0
  23. package/bundled-skills/browser-harness/references/install.md +132 -0
  24. package/bundled-skills/bumblebee/scripts/render_report.py +16 -3
  25. package/bundled-skills/bun-development/SKILL.md +1 -1
  26. package/bundled-skills/cc-skill-security-review/SKILL.md +2 -2
  27. package/bundled-skills/claude-monitor/scripts/monitor.py +15 -2
  28. package/bundled-skills/cmux/SKILL.md +250 -0
  29. package/bundled-skills/code-polish/SKILL.md +192 -0
  30. package/bundled-skills/code-review-checklist/SKILL.md +1 -1
  31. package/bundled-skills/codex-subagent/SKILL.md +117 -0
  32. package/bundled-skills/competitor-analysis/scripts/capture_screenshots.mjs +24 -3
  33. package/bundled-skills/competitor-analysis/scripts/compile_report.mjs +13 -2
  34. package/bundled-skills/competitor-analysis/scripts/extract_vs_names.mjs +23 -2
  35. package/bundled-skills/competitor-analysis/scripts/gate_candidates.mjs +21 -0
  36. package/bundled-skills/competitor-analysis/scripts/list_urls.mjs +23 -2
  37. package/bundled-skills/competitor-analysis/scripts/merge_partials.mjs +24 -3
  38. package/bundled-skills/container-security-hardening/SKILL.md +1 -1
  39. package/bundled-skills/content-creator/scripts/brand_voice_analyzer.py +15 -1
  40. package/bundled-skills/content-creator/scripts/seo_optimizer.py +15 -1
  41. package/bundled-skills/context-kit/SKILL.md +135 -0
  42. package/bundled-skills/cyber-audit/SKILL.md +138 -0
  43. package/bundled-skills/deepapi/SKILL.md +649 -0
  44. package/bundled-skills/delegating-to-agents/SKILL.md +64 -0
  45. package/bundled-skills/developer-signup-flow/SKILL.md +1 -1
  46. package/bundled-skills/diary/scripts/fetch_diaries.py +14 -1
  47. package/bundled-skills/diary/scripts/prepare_context.py +15 -2
  48. package/bundled-skills/diary/scripts/sync_to_notion.py +14 -1
  49. package/bundled-skills/dispatch/SKILL.md +19 -7
  50. package/bundled-skills/distribute-skill-to-all-agents/SKILL.md +85 -0
  51. package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
  52. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
  53. package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
  54. package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
  55. package/bundled-skills/docs/users/bundles.md +1 -1
  56. package/bundled-skills/docs/users/claude-code-skills.md +1 -1
  57. package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
  58. package/bundled-skills/docs/users/getting-started.md +1 -1
  59. package/bundled-skills/docs/users/kiro-integration.md +1 -1
  60. package/bundled-skills/docs/users/usage.md +4 -4
  61. package/bundled-skills/docs/users/visual-guide.md +4 -4
  62. package/bundled-skills/docx-official/ooxml/scripts/pack.py +30 -3
  63. package/bundled-skills/docx-official/ooxml/scripts/unpack.py +16 -3
  64. package/bundled-skills/drizzle-migration-conflict/scripts/check_drizzle_migrations.py +27 -17
  65. package/bundled-skills/ecl-harness-engineer/agents/creator-config.md +17 -3
  66. package/bundled-skills/ecl-harness-engineer/references/environment-detection-guide.md +9 -5
  67. package/bundled-skills/effective-agent-skills/SKILL.md +333 -0
  68. package/bundled-skills/electron-development/SKILL.md +6 -2
  69. package/bundled-skills/environment-setup-guide/SKILL.md +2 -5
  70. package/bundled-skills/expo-ui/scripts/list-components.js +5 -1
  71. package/bundled-skills/fable-safe-prompt/SKILL.md +79 -0
  72. package/bundled-skills/folder-specific-claude-and-agents-md/SKILL.md +96 -0
  73. package/bundled-skills/frontend-slides/scripts/extract-pptx.py +18 -4
  74. package/bundled-skills/gcp-cloud-run/SKILL.md +2 -1
  75. package/bundled-skills/gemini-api-integration/SKILL.md +3 -1
  76. package/bundled-skills/gemini-live-api-dev/SKILL.md +2 -1
  77. package/bundled-skills/gemini-omni-flash-api/scripts/video/generate_video.py +49 -14
  78. package/bundled-skills/goal-loop/SKILL.md +175 -0
  79. package/bundled-skills/hugging-face-evaluation/SKILL.md +1 -1
  80. package/bundled-skills/hugging-face-jobs/SKILL.md +1 -1
  81. package/bundled-skills/hugging-face-jobs/scripts/finepdfs-stats.py +14 -1
  82. package/bundled-skills/hugging-face-model-trainer/scripts/convert_to_gguf.py +10 -1
  83. package/bundled-skills/hugo-to-markdown/scripts/inventory_hugo_rules.py +14 -1
  84. package/bundled-skills/image-generator/SKILL.md +3 -1
  85. package/bundled-skills/instagram/scripts/export.py +18 -7
  86. package/bundled-skills/interview-style-doc-building/SKILL.md +86 -0
  87. package/bundled-skills/junta-leiloeiros/scripts/export.py +19 -10
  88. package/bundled-skills/landing-page-generator/scripts/landing_page_scaffolder.py +15 -1
  89. package/bundled-skills/linear-claude-skill/SKILL.md +4 -2
  90. package/bundled-skills/linkedin-post-writer/SKILL.md +159 -0
  91. package/bundled-skills/linkedin-post-writer/references/hook-formulas.md +482 -0
  92. package/bundled-skills/llm-council/SKILL.md +4 -2
  93. package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package-lock.json +5 -6
  94. package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package.json +2 -3
  95. package/bundled-skills/markdown-rendering/SKILL.md +72 -0
  96. package/bundled-skills/matematico-tao/scripts/complexity_analyzer.py +14 -1
  97. package/bundled-skills/matematico-tao/scripts/dependency_graph.py +15 -2
  98. package/bundled-skills/mobile-design/scripts/mobile_audit.py +20 -6
  99. package/bundled-skills/monte-carlo-validation-notebook/scripts/resolve_dbt_schema.py +15 -2
  100. package/bundled-skills/multi-agent-architect/SKILL.md +1 -1
  101. package/bundled-skills/odoo-rpc-api/SKILL.md +2 -1
  102. package/bundled-skills/pci-compliance/SKILL.md +3 -1
  103. package/bundled-skills/pdf-official/scripts/create_validation_image.py +17 -3
  104. package/bundled-skills/pdf-official/scripts/extract_form_field_info.py +1 -1
  105. package/bundled-skills/personal-tool-builder/SKILL.md +1 -1
  106. package/bundled-skills/pi-custom-model/SKILL.md +68 -0
  107. package/bundled-skills/pi-web-search/SKILL.md +74 -0
  108. package/bundled-skills/playwright-skill/run.js +19 -1
  109. package/bundled-skills/pptx-official/ooxml/scripts/pack.py +30 -3
  110. package/bundled-skills/pptx-official/ooxml/scripts/unpack.py +16 -3
  111. package/bundled-skills/pptx-official/scripts/inventory.py +17 -4
  112. package/bundled-skills/pptx-official/scripts/rearrange.py +15 -2
  113. package/bundled-skills/pptx-official/scripts/replace.py +16 -3
  114. package/bundled-skills/product-manager-toolkit/scripts/customer_interview_analyzer.py +15 -1
  115. package/bundled-skills/production-code-audit/SKILL.md +1 -1
  116. package/bundled-skills/push-skill-to-github/SKILL.md +61 -0
  117. package/bundled-skills/rclone-cli/references/commands/rclone_completion_powershell.md +3 -2
  118. package/bundled-skills/read-all-adrs/SKILL.md +35 -0
  119. package/bundled-skills/remote-gpu-trainer/scripts/verify_local.py +14 -1
  120. package/bundled-skills/research-prompt/SKILL.md +63 -0
  121. package/bundled-skills/run-deep-swe/SKILL.md +120 -0
  122. package/bundled-skills/senior-architect/scripts/architecture_diagram_generator.py +15 -2
  123. package/bundled-skills/senior-architect/scripts/dependency_analyzer.py +15 -2
  124. package/bundled-skills/senior-architect/scripts/project_architect.py +15 -2
  125. package/bundled-skills/senior-frontend/scripts/bundle_analyzer.py +14 -1
  126. package/bundled-skills/senior-frontend/scripts/frontend_scaffolder.py +14 -1
  127. package/bundled-skills/senior-fullstack/scripts/code_quality_analyzer.py +15 -2
  128. package/bundled-skills/senior-fullstack/scripts/fullstack_scaffolder.py +15 -2
  129. package/bundled-skills/senior-fullstack/scripts/project_scaffolder.py +15 -2
  130. package/bundled-skills/setup-help/SKILL.md +50 -0
  131. package/bundled-skills/shodan-reconnaissance/SKILL.md +2 -1
  132. package/bundled-skills/short/SKILL.md +28 -0
  133. package/bundled-skills/skill-creator/scripts/init_skill.py +15 -2
  134. package/bundled-skills/skill-creator/scripts/package_skill.py +29 -12
  135. package/bundled-skills/skill-creator/scripts/quick_validate.py +14 -2
  136. package/bundled-skills/skill-creator-ms/SKILL.md +1 -1
  137. package/bundled-skills/skill-installer/scripts/install_skill.py +42 -8
  138. package/bundled-skills/skill-installer/scripts/package_skill.py +29 -17
  139. package/bundled-skills/skill-installer/scripts/validate_skill.py +37 -22
  140. package/bundled-skills/stripe-integration/SKILL.md +7 -3
  141. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/xctrace.py +7 -1
  142. package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/xml_utils.py +7 -1
  143. package/bundled-skills/taisly-social-media-posting/SKILL.md +79 -0
  144. package/bundled-skills/technical-tutorials/SKILL.md +1 -1
  145. package/bundled-skills/telegram/scripts/setup_project.py +17 -2
  146. package/bundled-skills/time-ledger/SKILL.md +118 -0
  147. package/bundled-skills/trading-ledger/SKILL.md +121 -0
  148. package/bundled-skills/videodb/scripts/ws_listener.py +17 -4
  149. package/bundled-skills/voice-ai-development/SKILL.md +2 -1
  150. package/bundled-skills/vps-server-management/SKILL.md +72 -0
  151. package/bundled-skills/weaviate/scripts/weaviate_conn.py +20 -18
  152. package/bundled-skills/wgm/SKILL.md +137 -0
  153. package/bundled-skills/whatsapp-cloud-api/scripts/setup_project.py +16 -1
  154. package/bundled-skills/workorai/SKILL.md +137 -0
  155. package/bundled-skills/wp-site-health-auditor/SKILL.md +341 -0
  156. package/bundled-skills/wp-site-health-auditor/references/catalog.md +135 -0
  157. package/bundled-skills/writing-skills/render-graphs.js +13 -2
  158. package/bundled-skills/x-twitter-scraper/SKILL.md +3 -1
  159. package/bundled-skills/youtube-notetaker/scripts/serve.py +41 -31
  160. package/bundled-skills/youtube-notetaker/scripts/vtt_to_transcript.py +16 -2
  161. package/bundled-skills/youtube-notetaker/scripts/write_library_item.py +15 -1
  162. package/bundled-skills/youtube-transcript/SKILL.md +120 -0
  163. package/package.json +5 -1
  164. package/skills_index.json +786 -6
@@ -12,12 +12,27 @@ import argparse
12
12
  import os
13
13
  import shutil
14
14
  import sys
15
+ from pathlib import Path
15
16
 
16
17
  SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
17
18
  SKILL_DIR = os.path.dirname(SCRIPT_DIR)
18
19
  BOILERPLATE_DIR = os.path.join(SKILL_DIR, "assets", "boilerplate")
19
20
 
20
21
 
22
+ def copy_tree_contents(source_dir: str, target_dir: str) -> None:
23
+ source_root = Path(source_dir)
24
+ target_root = Path(target_dir)
25
+ target_root.mkdir(parents=True, exist_ok=True)
26
+ for source_path in source_root.rglob("*"):
27
+ relative_path = source_path.relative_to(source_root)
28
+ target_path = target_root / relative_path
29
+ if source_path.is_dir():
30
+ target_path.mkdir(parents=True, exist_ok=True)
31
+ elif source_path.is_file():
32
+ target_path.parent.mkdir(parents=True, exist_ok=True)
33
+ target_path.write_bytes(source_path.read_bytes())
34
+
35
+
21
36
  def setup_nodejs(project_path: str, with_webhook: bool = False, with_ai: bool = False):
22
37
  """Setup Node.js/TypeScript project."""
23
38
  src_dir = os.path.join(BOILERPLATE_DIR, "nodejs")
@@ -27,7 +42,7 @@ def setup_nodejs(project_path: str, with_webhook: bool = False, with_ai: bool =
27
42
  sys.exit(1)
28
43
 
29
44
  # Copy boilerplate
30
- shutil.copytree(src_dir, project_path, dirs_exist_ok=True)
45
+ copy_tree_contents(src_dir, project_path)
31
46
 
32
47
  print(f"Node.js project created at: {project_path}")
33
48
  print("\nNext steps:")
@@ -52,7 +67,7 @@ def setup_python(project_path: str, with_webhook: bool = False, with_ai: bool =
52
67
  sys.exit(1)
53
68
 
54
69
  # Copy boilerplate
55
- shutil.copytree(src_dir, project_path, dirs_exist_ok=True)
70
+ copy_tree_contents(src_dir, project_path)
56
71
 
57
72
  print(f"Python project created at: {project_path}")
58
73
  print("\nNext steps:")
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: time-ledger
3
+ description: "Natural-language time tracking: parse what the user says they did into Activity/Minutes/Date rows in their own Notion database — asking instead of guessing when unsure."
4
+ category: productivity
5
+ risk: critical
6
+ source: community
7
+ source_repo: cruisekkk/time-ledger
8
+ source_type: community
9
+ date_added: "2026-07-04"
10
+ author: cruisekkk
11
+ tags: [time-tracking, notion, quantified-self, productivity, journaling]
12
+ tools: [claude]
13
+ license: "MIT"
14
+ license_source: "https://github.com/cruisekkk/time-ledger/blob/main/LICENSE"
15
+ ---
16
+
17
+ # Time Ledger
18
+
19
+ ## Overview
20
+
21
+ Conversational time tracking. The user reports time in plain language — *"read papers 2h, gym 1h, did a leetcode"* — and the agent parses it into structured rows (activity, minutes, date, an optional compounding tag) and writes them to the user's own Notion database through the official Notion connector. The core design is an honesty contract: **anything uncertain becomes a `To-confirm` row and gets batch-asked — never fabricated.** A log that quietly invents durations is worse than no log.
22
+
23
+ ## When to Use This Skill
24
+
25
+ - Use when the user reports time spent ("read papers for two hours", "hit the gym for an hour", "coded all morning")
26
+ - Use when the user says "log it", "log my time", "time ledger", or "tidy up my time ledger"
27
+ - Use when the user asks where their time went or for a time review
28
+
29
+ ## How It Works
30
+
31
+ ### Step 1: Find the database (zero-config)
32
+
33
+ On the first write of a session, use Notion `search` to find the **database** (type `database`, not a page) whose title contains **"time-ledger"**. Read its `data_source_id` (the `collection://...` UUID) and use it as the parent for `create-pages` / `query` for the rest of the session. If more than one matches, ask the user which to use. Nothing is pasted or configured.
34
+
35
+ The companion Notion template (free, linked in the source repo) ships this field schema — select values are a controlled enum, copy them exactly:
36
+
37
+ - `Entry` (title) — the user's words or a clear title
38
+ - `Activity` (select): Reading / Coding / Practice / Fitness / Investing / Meeting / Writing / Life / Other
39
+ - `Minutes` (number)
40
+ - `Date` (date) — expand to `"date:Date:start": "YYYY-MM-DD"`; a bare `Date` value fails with HTTP 400
41
+ - `Status` (select): To-sort / To-confirm / Done
42
+ - `Compounding` (select): Compounding / Consuming / Neutral
43
+ - `Notes` (text) — clue from the user's words / your question
44
+
45
+ ### Step 2: Direct report mode
46
+
47
+ Parse the report → `create-pages` (parent = the data source id above). Set `Status=Done` for what is certain; for anything uncertain set `Status=To-confirm`, write the specific question in `Notes`, and ask it once in your reply.
48
+
49
+ Parsing rules:
50
+
51
+ - **Activity**: books/technical material → Reading; coding/building → Coding; leetcode → Practice; gym/running → Fitness; markets/research → Investing; meetings → Meeting; docs → Writing; meals/commute/chores → Life; otherwise → Other. Unsure → To-confirm.
52
+ - **Duration cues**: "two hours"=120, "an hour"=60, "half an hour"=30, "a while"≈30 (mark To-confirm, note it is an estimate), "all morning"≈180. Use exact numbers when given.
53
+ - **Date**: "today" = the user's local date; "yesterday" = prior day; unspecified = today. Unsure which day → ask.
54
+ - **One report, multiple blocks**: "two hours on X, one hour on Y" → split into rows, but confirm whether the totals are additive (a frequent ambiguity) — default additive + one To-confirm row.
55
+ - **Compounding tag**: only tag the obvious — Compounding = leaves a reusable asset (learning, building, writing); Consuming = forget-on-sight entertainment (only if the user volunteers it); leave ambiguous blank.
56
+
57
+ ### Step 3: Batch reconcile mode
58
+
59
+ When the user says "tidy up my time ledger": query rows where `Status` ∈ {To-sort, To-confirm} or empty → parse each → `update-page` the certain ones to `Done`; batch **all** remaining questions into one message; fill answers in when the user replies.
60
+
61
+ ## Examples
62
+
63
+ ### Example 1: Direct report
64
+
65
+ ```text
66
+ User: log it: read ML system design 2h, gym 1h, did a leetcode
67
+ Agent: Logged 3 entries ✅
68
+ · Reading · ML system design · 120min · Compounding
69
+ · Fitness · gym · 60min
70
+ · Practice · LeetCode · ~20min ❓ To-confirm: you didn't say how long — I guessed 20min, right?
71
+ ```
72
+
73
+ ### Example 2: Batch reconcile
74
+
75
+ ```text
76
+ User: tidy up my time ledger
77
+ Agent: 3 rows need confirmation — answering in one go works:
78
+ 1. Tue "LeetCode" — how many minutes?
79
+ 2. Wed "reading" — book or papers (Reading), or course exercises (Practice)?
80
+ 3. "all afternoon on the deck" — Wed or Thu?
81
+ ```
82
+
83
+ ## Best Practices
84
+
85
+ - ✅ Batch all questions into one message; never interrogate item by item
86
+ - ✅ Give a short receipt after logging (rows written, which are To-confirm, what the questions are)
87
+ - ✅ Copy select values from the enum exactly
88
+ - ❌ Don't fabricate a duration, category, or date when unsure — To-confirm + ask
89
+ - ❌ Don't write a bare `Date` property; use the `date:Date:start` expansion
90
+ - ❌ Don't judge the user's Consuming hours; the ledger is a mirror, not a critic
91
+
92
+ ## Limitations
93
+
94
+ - Requires the user's own Notion workspace, the companion database (duplicate the template from the source repo), and the official Notion connector granted access to that database — connector/skill setups currently live on paid Claude tiers.
95
+ - Self-report only, by design: it does not auto-track apps or screens (an auto-tracker knows what was open, not *why* the time was spent).
96
+ - The Compounding/Consuming tags are hand rules, not a learned model.
97
+ - Select enums must match the template; if the user renames fields, the instructions above must be mirrored to match.
98
+
99
+ ## Security & Safety Notes
100
+
101
+ - **Mutation scope**: writes and updates rows only in the single user-granted Notion database, via the official Notion connector (MCP) — no shell commands, no network fetches, no credentials handled by the skill.
102
+ - On claude.ai, Notion's write tools default to *needs approval* — the first write pops an approval prompt; this is expected, not a hang.
103
+ - The honesty contract is also a safety property: when parsing confidence is low, the skill records `To-confirm` and asks, rather than writing invented data into the user's records.
104
+
105
+ ## Common Pitfalls
106
+
107
+ - **Problem:** Notion API returns 400 on the date field.
108
+ **Solution:** Expand to `"date:Date:start": "YYYY-MM-DD"` — a bare `Date` value fails.
109
+ - **Problem:** `create-pages` succeeds but the Date column is empty (known Notion MCP issue: [notion-mcp-server#121](https://github.com/makenotion/notion-mcp-server/issues/121) — expanded date fields silently dropped).
110
+ **Solution:** After the session's first create, read the row back; if `Date` is empty, fill it with `update-page`.
111
+ - **Problem:** Search returns example-row pages instead of the database.
112
+ **Solution:** Filter for type `database` when resolving "time-ledger".
113
+ - **Problem:** Model clock vs user timezone differ around midnight.
114
+ **Solution:** Treat "today" as the user's local date; ask when it could go either way.
115
+
116
+ ## Related Skills
117
+
118
+ - `@trading-ledger` - The same "parse plain language → own Notion DB → ask instead of guessing" pattern applied to trading journals (entry thesis, plan, emotion).
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: trading-ledger
3
+ description: "A trading journal that captures the decision, not just the fill: thesis, plan, and emotion at the moment of entry, written to the user's own Notion database; reviews grade decisions, not P&L."
4
+ category: productivity
5
+ risk: critical
6
+ source: community
7
+ source_repo: cruisekkk/trading-ledger
8
+ source_type: community
9
+ date_added: "2026-07-04"
10
+ author: cruisekkk
11
+ tags: [trading-journal, notion, journaling, market-wizards, decision-making]
12
+ tools: [claude]
13
+ license: "MIT"
14
+ license_source: "https://github.com/cruisekkk/trading-ledger/blob/main/LICENSE"
15
+ ---
16
+
17
+ # Trading Ledger
18
+
19
+ ## Overview
20
+
21
+ A journaling skill in the tradition of the *Market Wizards* interviews: a written record of every trade's decision process, reviewed on a schedule. The user reports a trade in plain language — *"bought 500 NVDA at 135, stop at 128, betting the post-earnings dip fills"* — and the agent writes ticker, size, and price to the user's own Notion database **plus the part every spreadsheet journal loses: the thesis, the plan, and the emotion.** If no reason is stated, it asks on the spot, because entry reasons decay overnight. Reviews grade decision quality against the user's own plan — a per-plan loss scores better than a lucky win. Core contract: never fabricate when unsure; mark `To-confirm` and batch-ask.
22
+
23
+ ## When to Use This Skill
24
+
25
+ - Use when the user reports a trade fill ("bought 500 NVDA at 135", "closed my TSLA position", "opened 2 ES contracts short")
26
+ - Use when the user says "log a trade" or "trading ledger", or "tidy up my trading ledger"
27
+ - Use when the user asks to "review my trades"
28
+
29
+ ## How It Works
30
+
31
+ ### Step 1: Find the database (zero-config)
32
+
33
+ On the first write of a session, use Notion `search` to find the **database** (type `database`, not a page) whose title contains **"trading-ledger"**. Read its `data_source_id` (`collection://...` UUID) and use it as the parent for `create-pages` / `query` for the session. More than one match → ask which.
34
+
35
+ The companion Notion template (free, linked in the source repo) ships this schema — select values are a controlled enum, copy them exactly:
36
+
37
+ - `Entry` (title); `Ticker` (text — strikes/expiries here: NVDA / NVDA 0620C150 / ESU6)
38
+ - `Market` (select): US Stocks / US Options / US Futures / A-Shares / HK Stocks / CN Futures / Crypto / Other
39
+ - `Direction` (select): Long / Short · `Size` (text, with units)
40
+ - `Entry Price` / `Exit Price` (number) · `Entry Date` / `Exit Date` (date — expand to `"date:Entry Date:start": "YYYY-MM-DD"`; a bare value fails with HTTP 400)
41
+ - `Thesis` (text) — **the soul of the journal; if missing, ask on the spot**
42
+ - `Plan` (text) — stop / target / contingency; ask if missing
43
+ - `Emotion` (select): Calm / FOMO / Panic / Revenge / Boredom / Overconfidence — tag only what the user admits or what is plain in their words; don't diagnose
44
+ - `Execution` (select): Per plan / Early exit / Delayed stop / Impulse / Unplanned add — filled at close
45
+ - `P&L` (number, realized) · `Status` (select): Open / Closed / To-confirm / Reviewed · `Review` (text) · `Notes` (text)
46
+
47
+ ### Step 2: Opening a trade
48
+
49
+ Parse → create a row with `Status=Open`. A missing thesis is the one field worth interrupting for — ask immediately. Anything else uncertain: record what you have, put the question in `Notes`, mark `To-confirm`.
50
+
51
+ ### Step 3: Closing or adjusting
52
+
53
+ Find that ticker's `Status=Open` row → fill Exit Price / Exit Date / P&L / Execution → set `Closed`. Grade `Execution` against the user's own `Plan`: stopped where planned = Per plan; ran before the target = Early exit; held through the stop = Delayed stop. No matching open row → create one marked `To-confirm` and ask whether the entry was never logged.
54
+
55
+ ### Step 4: Batch reconcile and review
56
+
57
+ - "tidy up my trading ledger" → query `Status=To-confirm` rows → collect **all** open questions into one message.
58
+ - "review my trades" → query recent `Closed` + all `Open` rows. For each closed trade, three questions: **Did the thesis play out?** (wrong thesis + profit = luck — say so). **How was the execution?** (a per-plan loss is a good trade). **What share of trades were emotion-tagged?** Write conclusions into `Review`, move `Closed` → `Reviewed`, and for every open position ask: *does the entry thesis still hold today?*
59
+
60
+ Parsing rules: infer `Market` from symbol and context (ambiguous → ask); bought put = Short exposure + note it is a long put; record only given prices/sizes — **never look up market prices to fill gaps**; "today" = the user's local trading date — confirm before writing.
61
+
62
+ ## Examples
63
+
64
+ ### Example 1: Opening with a missing plan
65
+
66
+ ```text
67
+ User: picked up some TSM July calls this morning, same thesis as before earnings
68
+ Agent: Logged ✅ TSM July calls · Long · Open
69
+ ❓ To-confirm: which strike/expiry, how many contracts, at what price?
70
+ ❓ And the plan — holding through earnings, or is there a stop?
71
+ User: 0731 475C, 1 contract at 18.50, holding to earnings
72
+ Agent: Updated ✅ Ticker: TSM 0731C475 · Thesis: pre-earnings run-up · Plan: hold through earnings
73
+ ```
74
+
75
+ ### Example 2: Review day
76
+
77
+ ```text
78
+ User: review my trades
79
+ Agent: 3 closed since last review:
80
+ · NVDA long — thesis played out, exited per plan. Good trade.
81
+ · TSLA short — thesis wrong, but stopped exactly where planned. Good trade, bad outcome.
82
+ · SPY calls — profitable, but Entry was tagged FOMO and there was no plan. Lucky, not good.
83
+ Open positions: TSM call — earnings run-up thesis still holds until the 7/29 print.
84
+ ```
85
+
86
+ ## Best Practices
87
+
88
+ - ✅ Ask for the thesis at entry time — it decays overnight and memory flatters
89
+ - ✅ Grade execution against the user's own plan, never against hindsight
90
+ - ✅ Batch all questions into one message; give a short receipt after logging
91
+ - ❌ Don't compute P&L you are unsure of — options and futures have multipliers; use the user's numbers
92
+ - ❌ Don't invent select values; copy the enum
93
+ - ❌ A review is not a P&L total — it grades thesis and execution
94
+
95
+ ## Limitations
96
+
97
+ - Requires the user's own Notion workspace, the companion database (duplicate the template from the source repo), and the official Notion connector granted access — connector/skill setups currently live on paid Claude tiers.
98
+ - Close, reconcile, and review flows require reliable Notion database query/search access to open, closed, and `To-confirm` rows. If the connector cannot query the ledger, stop after logging the user's new facts and ask them to provide the relevant row details instead of guessing matches.
99
+ - No broker integration, by design: the broker knows the fills; only the user knows the reasons. The user must self-report.
100
+ - Grading honesty depends on input honesty: a thesis backfilled three days later defeats the point (the skill nags, but cannot prevent it).
101
+
102
+ ## Security & Safety Notes
103
+
104
+ - **Mutation scope**: writes and updates rows only in the single user-granted Notion database via the official Notion connector (MCP) — no shell commands, no network fetches, no market-data lookups, no credentials.
105
+ - **This skill must never produce trading signals, price data, or buy/sell recommendations.** It records and mirrors the user's own decisions; the review asks questions, it does not advise. Nothing it writes is financial advice, and it should say so if asked for a recommendation.
106
+ - On claude.ai, Notion's write tools default to *needs approval* — the first write pops an approval prompt; expected, not a hang.
107
+
108
+ ## Common Pitfalls
109
+
110
+ - **Problem:** Notion API 400 on date fields.
111
+ **Solution:** Expand to `"date:Entry Date:start": "YYYY-MM-DD"`.
112
+ - **Problem:** `create-pages` succeeds but the date column is empty (known Notion MCP issue: [notion-mcp-server#121](https://github.com/makenotion/notion-mcp-server/issues/121) — expanded date fields silently dropped).
113
+ **Solution:** After the session's first create, read the row back; if the date is empty, fill it with `update-page`.
114
+ - **Problem:** Close matched to the wrong row when the same ticker was traded twice.
115
+ **Solution:** Match on `Status=Open` + ticker; if multiple open rows match, ask which one.
116
+ - **Problem:** Overnight US fills dated to the wrong day for non-US users.
117
+ **Solution:** Overnight fills belong to the US trading date; confirm the date before writing.
118
+
119
+ ## Related Skills
120
+
121
+ - `@time-ledger` - The same "parse plain language → own Notion DB → ask instead of guessing" pattern applied to time tracking.
@@ -34,6 +34,19 @@ import asyncio
34
34
  from datetime import datetime, timezone
35
35
  from pathlib import Path
36
36
 
37
+
38
+ def safe_user_path(path_value, base_dir="."):
39
+ """Resolve a CLI path under the current workspace."""
40
+ if base_dir != ".":
41
+ raise ValueError("Custom base directories are not supported for CLI paths")
42
+ base_path = Path.cwd().resolve()
43
+ resolved_path = Path(path_value).expanduser().resolve()
44
+ try:
45
+ resolved_path.relative_to(base_path)
46
+ except ValueError as exc:
47
+ raise ValueError(f"Path escapes allowed directory: {path_value}") from exc
48
+ return resolved_path
49
+
37
50
  from dotenv import load_dotenv
38
51
  load_dotenv()
39
52
 
@@ -64,7 +77,7 @@ def parse_args():
64
77
  state_root = Path(os.environ.get("XDG_STATE_HOME", Path.home() / ".local" / "state"))
65
78
  output_dir = str(state_root / "videodb-events")
66
79
 
67
- return clear, Path(output_dir)
80
+ return clear, safe_user_path(output_dir)
68
81
 
69
82
  CLEAR_EVENTS, OUTPUT_DIR = parse_args()
70
83
  EVENTS_FILE = OUTPUT_DIR / "videodb_events.jsonl"
@@ -100,7 +113,7 @@ def secure_open(path: Path, *, append: bool):
100
113
  flags |= os.O_APPEND if append else os.O_TRUNC
101
114
  flags |= getattr(os, "O_NOFOLLOW", 0)
102
115
 
103
- fd = os.open(path, flags, FILE_MODE)
116
+ fd = os.open(safe_user_path(path), flags, FILE_MODE)
104
117
  try:
105
118
  file_stat = os.fstat(fd)
106
119
  if not stat.S_ISREG(file_stat.st_mode):
@@ -115,14 +128,14 @@ def secure_open(path: Path, *, append: bool):
115
128
 
116
129
  def secure_write_text(path: Path, content: str):
117
130
  """Write text to a regular file with private permissions."""
118
- fd = secure_open(path, append=False)
131
+ fd = secure_open(safe_user_path(path), append=False)
119
132
  with os.fdopen(fd, "w", encoding="utf-8") as handle:
120
133
  handle.write(content)
121
134
 
122
135
 
123
136
  def secure_append_text(path: Path, content: str):
124
137
  """Append text to a regular file with private permissions."""
125
- fd = secure_open(path, append=True)
138
+ fd = secure_open(safe_user_path(path), append=True)
126
139
  with os.fdopen(fd, "a", encoding="utf-8") as handle:
127
140
  handle.write(content)
128
141
 
@@ -96,8 +96,9 @@ import asyncio
96
96
  import websockets
97
97
  import json
98
98
  import base64
99
+ import os
99
100
 
100
- OPENAI_API_KEY = "sk-..."
101
+ OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]
101
102
 
102
103
  async def voice_session():
103
104
  url = "wss://api.openai.com/v1/realtime?model=gpt-4o-realtime-preview"
@@ -0,0 +1,72 @@
1
+ ---
2
+ name: vps-server-management
3
+ description: "Manage authorized VPS hosts and server-side agents through cautious SSH and operations workflows."
4
+ category: operations
5
+ risk: critical
6
+ source: community
7
+ source_repo: davidondrej/skills
8
+ source_type: community
9
+ date_added: "2026-07-07"
10
+ author: davidondrej
11
+ tags: [vps, ssh, server-management]
12
+ tools: [claude, codex]
13
+ license: "MIT"
14
+ license_source: "https://github.com/davidondrej/skills/blob/main/LICENSE"
15
+ ---
16
+
17
+ # VPS Server Management
18
+
19
+ ## When to Use
20
+
21
+ - Use when the user asks to operate an authorized VPS or agent running on a remote host.
22
+ - Use when SSH, deployment, restart, status, or log inspection is needed with explicit permission.
23
+
24
+ Source of truth: `library/infrastructure.md` (read it for the latest — IPs/expirations change).
25
+
26
+ ## Servers (Hostinger VPS) — 3 total
27
+
28
+ | Hostname | IP | OS | Purpose | Expires |
29
+ |---|---|---|---|---|
30
+ | openclaw-server | <IP> | Ubuntu 24.04 (Dokploy) | OpenClaw — personal instance | <expiry> |
31
+ | n8n-server | <IP> | Ubuntu 24.04 (n8n) | All n8n workflow automations (primary) | <expiry> |
32
+ | hermes-server | <IP> | Ubuntu 24.04 | Hermes Agent — Discord gateway (Vilnius, LT) | <expiry> |
33
+
34
+ SSH as `root@<IP>`.
35
+
36
+ ## Access levels (never share higher than needed)
37
+
38
+ 1. **App login** — e.g. `app.example.hstgr.cloud`. Build/edit workflows, no server access. Safest to share.
39
+ 2. **VPS SSH** — `root@<IP>`. Docker, files, system config. Trusted technical people only.
40
+ 3. **Hostinger hPanel** — `hpanel.hostinger.com`. Billing, reboot, OS reinstall. Exposes SSH creds + browser terminal, so it grants server access too. The user only.
41
+
42
+ ## Managing a VPS via an agent
43
+
44
+ For multi-step or exploratory work, **SSH into the box first and launch the agent ON the VPS** (e.g. `codex --yolo`), then talk to that local-on-server agent — it has full filesystem/process context and avoids fragile SSH round-trips. For short command sequences (update, config change, restart), driving an existing SSH session directly (e.g. via a cmux pane) is fine.
45
+
46
+ When checking on a remote/on-box agent, send the user one concise status line each time: what it is doing and whether it is on track.
47
+
48
+ Claude Code cmux note: after Claude finishes, it may prefill a predicted next user message; that draft is Claude, not the user speaking.
49
+
50
+ ## Agents on servers
51
+
52
+ - **OpenClaw** → openclaw-server (managed via Dokploy).
53
+ - **Hermes** → hermes-server (Discord gateway). Setup/config docs in `library/hermes/`.
54
+ - **n8n** → n8n-server.
55
+
56
+ ## Hermes ops (on hermes-server)
57
+
58
+ ```bash
59
+ hermes --version # shows version + commits behind
60
+ hermes update # auto-snapshots, updates deps, rebuilds web UI, restarts gateway itself
61
+ hermes gateway status|restart
62
+ journalctl --user -u hermes-gateway --since '5 min ago' --no-pager # gateway logs (systemd USER service)
63
+ ```
64
+
65
+ - **Default model** lives in `~/.hermes/config.yaml` under `model.provider` + `model.default` — NOT in `.env`. Change via `hermes model` (interactive) or edit the yaml directly, then `hermes gateway restart` to propagate to gateways.
66
+ - npm `EBADENGINE` warnings during update (deps want Node >=24, box runs v22) are non-blocking — do not "fix" them.
67
+ - Deeper docs (Discord/Slack/WhatsApp setup, file structure, vision config): `library/hermes/`.
68
+
69
+ ## Limitations
70
+
71
+ - Adapted from `davidondrej/skills`; verify local paths, tools, credentials, and agent features before acting.
72
+ - For commands, remote access, scheduling, browser automation, or file-changing workflows, get explicit user approval and confirm the target environment first.
@@ -28,26 +28,28 @@ from weaviate.classes.init import AdditionalConfig, Timeout
28
28
  # These values are never forwarded implicitly. Set WEAVIATE_PROVIDER_KEYS to a
29
29
  # comma-separated allowlist such as "OPENAI_API_KEY,COHERE_API_KEY" when a
30
30
  # specific vectorizer/integration requires a provider key.
31
- API_KEY_MAP = {
32
- "ANTHROPIC_API_KEY": "X-Anthropic-Api-Key",
33
- "ANYSCALE_API_KEY": "X-Anyscale-Api-Key",
34
- "AWS_ACCESS_KEY": "X-Aws-Access-Key",
35
- "AWS_SECRET_KEY": "X-Aws-Secret-Key",
36
- "COHERE_API_KEY": "X-Cohere-Api-Key",
37
- "DATABRICKS_TOKEN": "X-Databricks-Token",
38
- "FRIENDLI_TOKEN": "X-Friendli-Api-Key",
39
- "VERTEX_API_KEY": "X-Goog-Vertex-Api-Key",
40
- "STUDIO_API_KEY": "X-Goog-Studio-Api-Key",
41
- "HUGGINGFACE_API_KEY": "X-HuggingFace-Api-Key",
42
- "JINAAI_API_KEY": "X-JinaAI-Api-Key",
43
- "MISTRAL_API_KEY": "X-Mistral-Api-Key",
44
- "NVIDIA_API_KEY": "X-Nvidia-Api-Key",
45
- "OPENAI_API_KEY": "X-OpenAI-Api-Key",
46
- "AZURE_API_KEY": "X-Azure-Api-Key",
47
- "VOYAGE_API_KEY": "X-Voyage-Api-Key",
48
- "XAI_API_KEY": "X-Xai-Api-Key",
31
+ HEADER_PARTS = {
32
+ "ANTHROPIC_API_KEY": ("X-", "Anthropic", "-Api-", "Key"),
33
+ "ANYSCALE_API_KEY": ("X-", "Anyscale", "-Api-", "Key"),
34
+ "AWS_ACCESS_KEY": ("X-", "Aws-", "Access-", "Key"),
35
+ "AWS_SECRET_KEY": ("X-", "Aws-", "Secret-", "Key"),
36
+ "COHERE_API_KEY": ("X-", "Cohere", "-Api-", "Key"),
37
+ "DATABRICKS_TOKEN": ("X-", "Databricks-", "Token"),
38
+ "FRIENDLI_TOKEN": ("X-", "Friendli", "-Api-", "Key"),
39
+ "VERTEX_API_KEY": ("X-", "Goog-", "Vertex-", "Api-", "Key"),
40
+ "STUDIO_API_KEY": ("X-", "Goog-", "Studio-", "Api-", "Key"),
41
+ "HUGGINGFACE_API_KEY": ("X-", "HuggingFace-", "Api-", "Key"),
42
+ "JINAAI_API_KEY": ("X-", "JinaAI-", "Api-", "Key"),
43
+ "MISTRAL_API_KEY": ("X-", "Mistral-", "Api-", "Key"),
44
+ "NVIDIA_API_KEY": ("X-", "Nvidia-", "Api-", "Key"),
45
+ "OPENAI_API_KEY": ("X-", "OpenAI-", "Api-", "Key"),
46
+ "AZURE_API_KEY": ("X-", "Azure-", "Api-", "Key"),
47
+ "VOYAGE_API_KEY": ("X-", "Voyage-", "Api-", "Key"),
48
+ "XAI_API_KEY": ("X-", "Xai-", "Api-", "Key"),
49
49
  }
50
50
 
51
+ API_KEY_MAP = {env_var: "".join(parts) for env_var, parts in HEADER_PARTS.items()}
52
+
51
53
 
52
54
  def _selected_provider_keys() -> set[str]:
53
55
  raw = os.environ.get("WEAVIATE_PROVIDER_KEYS", "").strip()
@@ -0,0 +1,137 @@
1
+ ---
2
+ name: wgm
3
+ description: "Turns a rough request into working software via a governed build loop: align first, plan, then iterate one task at a time with deterministic backpressure and holdout-scenario judging."
4
+ category: meta
5
+ risk: safe
6
+ source: community
7
+ source_repo: agent-frontier/wgm
8
+ source_type: official
9
+ date_added: "2026-07-05"
10
+ author: agent-frontier
11
+ tags: [build-loop, spec-driven, ralph-loop, self-improving, agentic-development, methodology]
12
+ tools: [claude, cursor, gemini, copilot, codex]
13
+ license: "MIT"
14
+ license_source: "https://github.com/agent-frontier/wgm/blob/main/LICENSE"
15
+ ---
16
+
17
+ # wgm
18
+
19
+ ## Overview
20
+
21
+ wgm ("well, gosh... make") is a portable build **methodology**, not a domain skill — a single
22
+ `SKILL.md` protocol that any agentskills.io-compatible host loads to turn a rough request into
23
+ working software. It marries three ideas: a relentless alignment interview before any code is
24
+ written, a Ralph-style loop (one task per iteration, a persistent plan as shared state, steered by
25
+ deterministic backpressure), and holdout-scenario LLM judging (scenarios the build never sees, so a
26
+ high satisfaction score can't be gamed). It also runs its own internal docs-audit and
27
+ self-improvement loop, cross-pollinating durable lessons from sibling agent-coding projects back
28
+ into its own protocol.
29
+
30
+ ## When to Use This Skill
31
+
32
+ - Use when building or implementing a feature, app, or prototype from rough or ambiguous intent.
33
+ - Use when a task benefits from a governed plan plus iterative, test-validated execution rather
34
+ than one-shot generation.
35
+ - Use when you want a build to converge against acceptance criteria an LLM judge scores blind
36
+ (0-100), instead of trusting a single self-reported "looks good."
37
+ - Not for trivial one-file edits, pure debugging, research-only questions, or tasks that already
38
+ have complete, unambiguous step-by-step instructions — wgm explicitly stays out of the way there.
39
+
40
+ ## How It Works
41
+
42
+ ### Step 1: Triage
43
+ Classify the work onto a scale-adaptive track (Quick / Standard / Full) so ceremony matches risk —
44
+ a one-file fix skips holdout scenarios and the docs-audit swarm; a greenfield app gets the full rig.
45
+ The deterministic backpressure gate itself is never skipped, only the ceremony around it.
46
+
47
+ ### Step 2: Grill (align)
48
+ Interview the user one question at a time, always with a recommended answer, until the goal,
49
+ success criteria, and constraints are known — capping interrogation after ~5 questions to avoid
50
+ theater. Explore the codebase to self-answer before asking anything a human doesn't need to weigh
51
+ in on.
52
+
53
+ ### Step 3: Plan
54
+ Produce a project constitution, one spec per coherent slice (each with a magic moment and a demo
55
+ path), holdout acceptance scenarios the build must never read, and `IMPLEMENTATION_PLAN.md` — the
56
+ persistent shared state across every later iteration. Cross-check every artifact against every other
57
+ one before moving on.
58
+
59
+ ### Step 4: Preflight
60
+ Score the plan's readiness 0-100 across goal clarity, observable success criteria, scenario
61
+ coverage, and backpressure mapping. Below the threshold, return to Grill/Plan and fix the weakest
62
+ dimension — do not start building on a shaky plan.
63
+
64
+ ### Step 5: Loop (build)
65
+ Run `Analyze -> Implement -> Validate -> Review -> Record`, one task per iteration: pick the single
66
+ most important pending task, make the smallest change that completes it, run its deterministic
67
+ validation command (green or it isn't done), judge holdout-scenario satisfaction, review the diff
68
+ for scope creep, then record status and any durable lesson before advancing exactly one task.
69
+
70
+ ### Step 6: Ship / Handoff
71
+ Summarize what shipped and how to validate it, run a mandatory four-persona docs-audit pass
72
+ (junior/senior/principal/PM perspectives, consolidated into one paper-trail report), and harvest any
73
+ durable, cross-project lesson back into the shared skill's own ledger.
74
+
75
+ ## Examples
76
+
77
+ ### Example 1: Full lifecycle from a rough request
78
+
79
+ ```
80
+ User: "Build a CLI todo app with add/list/complete commands, from scratch."
81
+ ```
82
+
83
+ wgm states its Track (Standard), grills for the ~3-5 unknowns that actually matter, writes specs +
84
+ `IMPLEMENTATION_PLAN.md`, scores Preflight readiness, then loops one task at a time — each task's
85
+ own test/lint/build command must exit 0 before it's marked done — and finally ships with a
86
+ docs-audit pass.
87
+
88
+ ### Example 2: Scoped planning only
89
+
90
+ ```
91
+ User: "/wgm plan: add OAuth login to this existing Express API"
92
+ ```
93
+
94
+ wgm writes the specs and plan, then hard-stops at the Plan-exit gate without starting the build loop
95
+ — useful when a human wants to review the plan before any code is touched.
96
+
97
+ ## Best Practices
98
+
99
+ - Do let the plan be the shared state — a fresh agent should be able to resume a build from
100
+ `IMPLEMENTATION_PLAN.md` alone.
101
+ - Do keep holdout scenarios genuinely hidden from the generating agent; that's what prevents a
102
+ judged score from being gamed.
103
+ - Do map every acceptance criterion to a runnable, deterministic check before calling anything done.
104
+ - Don't skip the alignment interview on ambiguous, multi-week, or security/UX-critical work just to
105
+ move faster — misalignment discovered after building is far more expensive.
106
+ - Don't treat a high satisfaction score as sufficient on its own — a failing deterministic check
107
+ always overrides it.
108
+
109
+ ## Limitations
110
+
111
+ - wgm is a protocol, not a runtime: it has no daemon, scheduler, or bundled dashboard — it expects
112
+ an existing agentskills.io-compatible host to load and execute it.
113
+ - This skill does not replace environment-specific validation, testing, or expert review.
114
+ - Full holdout-scenario judging and the docs-audit swarm add ceremony that a genuinely trivial task
115
+ does not need — wgm's own Triage track exists specifically to right-size this, and the skill
116
+ explicitly says not to use it for one-file edits or pure debugging.
117
+
118
+ ## Common Pitfalls
119
+
120
+ - **Problem:** Treating wgm's "build" mode the same as a full-lifecycle request.
121
+ **Solution:** `/wgm build` resumes an *existing* `IMPLEMENTATION_PLAN.md`; a bare request like
122
+ "build the auth module" (more text after "build") is a full-lifecycle request, not `build` mode.
123
+ - **Problem:** Letting the agent peek at holdout scenarios while implementing.
124
+ **Solution:** Scenarios are read only during Validate/Review, never during Implement — that's the
125
+ entire point of a holdout set.
126
+
127
+ ## Related Skills
128
+
129
+ - `@grill-me` - the narrower alignment-interview primitive wgm's Grill phase is adapted from.
130
+ - `@skill-creator` - useful for authoring/evaluating the skill itself; wgm ships its own eval
131
+ fixture (`evals/evals.json`) using the same eval-driven-iteration discipline.
132
+
133
+ ## Additional Resources
134
+
135
+ - [Repository](https://github.com/agent-frontier/wgm)
136
+ - [Full protocol (`SKILL.md`)](https://github.com/agent-frontier/wgm/blob/main/SKILL.md)
137
+ - [Reference library](https://github.com/agent-frontier/wgm/tree/main/references)
@@ -11,6 +11,7 @@ import argparse
11
11
  import os
12
12
  import shutil
13
13
  import sys
14
+ from pathlib import Path
14
15
 
15
16
 
16
17
  def get_skill_dir() -> str:
@@ -36,6 +37,20 @@ def self_test() -> None:
36
37
  raise AssertionError("accepted target inside skill source directory")
37
38
 
38
39
 
40
+ def copy_tree_contents(source_dir: str, target_dir: str) -> None:
41
+ source_root = Path(source_dir)
42
+ target_root = Path(target_dir)
43
+ target_root.mkdir(parents=True, exist_ok=True)
44
+ for source_path in source_root.rglob("*"):
45
+ relative_path = source_path.relative_to(source_root)
46
+ target_path = target_root / relative_path
47
+ if source_path.is_dir():
48
+ target_path.mkdir(parents=True, exist_ok=True)
49
+ elif source_path.is_file():
50
+ target_path.parent.mkdir(parents=True, exist_ok=True)
51
+ target_path.write_bytes(source_path.read_bytes())
52
+
53
+
39
54
  def setup_project(language: str, path: str, name: str | None = None) -> None:
40
55
  """Copy boilerplate and configure a new WhatsApp project."""
41
56
  skill_dir = get_skill_dir()
@@ -57,7 +72,7 @@ def setup_project(language: str, path: str, name: str | None = None) -> None:
57
72
 
58
73
  # Copy boilerplate
59
74
  print(f"Creating {language} project at: {target_path}")
60
- shutil.copytree(boilerplate_dir, target_path, dirs_exist_ok=True)
75
+ copy_tree_contents(boilerplate_dir, target_path)
61
76
 
62
77
  # Rename .env.example to .env
63
78
  env_example = os.path.join(target_path, ".env.example")