opencode-skills-collection 4.0.0 → 4.0.1

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 (241) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +24 -1
  2. package/bundled-skills/007/SKILL.md +2 -2
  3. package/bundled-skills/10-andruia-skill-smith/SKILL.md +1 -1
  4. package/bundled-skills/agent-squad/SKILL.md +5 -0
  5. package/bundled-skills/agent-squad/alex/SKILL.md +3 -0
  6. package/bundled-skills/agent-squad/aria/SKILL.md +3 -0
  7. package/bundled-skills/agent-squad/dep/SKILL.md +3 -0
  8. package/bundled-skills/agent-squad/luna/SKILL.md +4 -1
  9. package/bundled-skills/agent-squad/mason/SKILL.md +3 -0
  10. package/bundled-skills/agent-squad/max/SKILL.md +3 -0
  11. package/bundled-skills/agent-squad/quinn/SKILL.md +3 -0
  12. package/bundled-skills/agent-squad/rex/SKILL.md +3 -0
  13. package/bundled-skills/angular/metadata.json +1 -1
  14. package/bundled-skills/angular-best-practices/metadata.json +1 -1
  15. package/bundled-skills/angular-state-management/metadata.json +1 -1
  16. package/bundled-skills/angular-ui-patterns/metadata.json +1 -1
  17. package/bundled-skills/antigravity-skill-orchestrator/SKILL.md +2 -2
  18. package/bundled-skills/apify-actor-development/SKILL.md +2 -2
  19. package/bundled-skills/apple-container/SKILL.md +165 -0
  20. package/bundled-skills/apple-container/references/commands.md +1593 -0
  21. package/bundled-skills/apple-container/references/concepts.md +294 -0
  22. package/bundled-skills/apple-container/references/configuration.md +499 -0
  23. package/bundled-skills/apple-container/references/workflows.md +498 -0
  24. package/bundled-skills/ask-copilot/SKILL.md +112 -0
  25. package/bundled-skills/auto-research/SKILL.md +126 -0
  26. package/bundled-skills/brooks-lint/SKILL.md +1 -1
  27. package/bundled-skills/browser-harness/references/install.md +3 -1
  28. package/bundled-skills/chrome-extension-developer/SKILL.md +1 -1
  29. package/bundled-skills/clean-code-guard/SKILL.md +184 -0
  30. package/bundled-skills/clean-code-guard/references/ai-failure-modes.md +345 -0
  31. package/bundled-skills/clean-code-guard/references/comments-and-formatting.md +115 -0
  32. package/bundled-skills/clean-code-guard/references/dry-kiss-yagni.md +133 -0
  33. package/bundled-skills/clean-code-guard/references/naming-and-functions.md +187 -0
  34. package/bundled-skills/clean-code-guard/references/review-checklist.md +150 -0
  35. package/bundled-skills/clean-code-guard/references/solid.md +280 -0
  36. package/bundled-skills/clean-code-guard/references/sources.md +47 -0
  37. package/bundled-skills/cloudflare-security-audit/SKILL.md +137 -0
  38. package/bundled-skills/cloudflare-security-audit/references/AI-AND-LLM.md +67 -0
  39. package/bundled-skills/cloudflare-security-audit/references/ATTACK-CLASSES.md +116 -0
  40. package/bundled-skills/cloudflare-security-audit/references/CLIENT-SIDE.md +67 -0
  41. package/bundled-skills/cloudflare-security-audit/references/HUNTING.md +110 -0
  42. package/bundled-skills/cloudflare-security-audit/references/MEMORY-SAFETY-AND-BINARY.md +58 -0
  43. package/bundled-skills/cloudflare-security-audit/references/RECONNAISSANCE.md +46 -0
  44. package/bundled-skills/cloudflare-security-audit/references/VALIDATION-AND-REPORTING.md +109 -0
  45. package/bundled-skills/cloudflare-security-audit/references/WEB-PROTOCOL-AND-AUTH.md +85 -0
  46. package/bundled-skills/cloudflare-security-audit/resources/report-schema.json +210 -0
  47. package/bundled-skills/comfyui-gateway/references/troubleshooting.md +1 -1
  48. package/bundled-skills/commit/SKILL.md +2 -1
  49. package/bundled-skills/deepapi/SKILL.md +6 -6
  50. package/bundled-skills/docs/README.md +1 -1
  51. package/bundled-skills/docs/contributors/quality-bar.md +1 -1
  52. package/bundled-skills/docs/contributors/security-guardrails.md +1 -1
  53. package/bundled-skills/docs/integrations/jetski-cortex.md +5 -5
  54. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +3 -3
  55. package/bundled-skills/docs/maintainers/ci-drift-fix.md +7 -5
  56. package/bundled-skills/docs/maintainers/merge-batch.md +24 -7
  57. package/bundled-skills/docs/maintainers/pr-autonomy.md +89 -0
  58. package/bundled-skills/docs/maintainers/release-notes-7.2.0.md +1 -1
  59. package/bundled-skills/docs/maintainers/release-process.md +9 -9
  60. package/bundled-skills/docs/maintainers/repo-growth-seo.md +5 -5
  61. package/bundled-skills/docs/maintainers/skills-date-tracking.md +1 -1
  62. package/bundled-skills/docs/maintainers/skills-update-guide.md +2 -2
  63. package/bundled-skills/docs/users/{antigravity-awesome-skills-vs-awesome-claude-skills.md → agentic-awesome-skills-vs-awesome-claude-skills.md} +5 -5
  64. package/bundled-skills/docs/users/ai-agent-skills.md +4 -4
  65. package/bundled-skills/docs/users/best-claude-code-skills-github.md +3 -3
  66. package/bundled-skills/docs/users/best-cursor-skills-github.md +3 -3
  67. package/bundled-skills/docs/users/bundles.md +56 -57
  68. package/bundled-skills/docs/users/claude-code-skills.md +6 -6
  69. package/bundled-skills/docs/users/codex-cli-skills.md +5 -5
  70. package/bundled-skills/docs/users/cursor-skills.md +3 -3
  71. package/bundled-skills/docs/users/faq.md +27 -15
  72. package/bundled-skills/docs/users/gemini-cli-skills.md +4 -4
  73. package/bundled-skills/docs/users/getting-started.md +22 -12
  74. package/bundled-skills/docs/users/kiro-integration.md +7 -7
  75. package/bundled-skills/docs/users/plugins.md +8 -9
  76. package/bundled-skills/docs/users/security-skills.md +1 -1
  77. package/bundled-skills/docs/users/skills-vs-mcp-tools.md +1 -1
  78. package/bundled-skills/docs/users/specialized-plugin-roadmap.md +3 -4
  79. package/bundled-skills/docs/users/usage.md +9 -9
  80. package/bundled-skills/docs/users/visual-guide.md +7 -7
  81. package/bundled-skills/docs/users/windows-truncation-recovery.md +1 -1
  82. package/bundled-skills/docs/users/workflows.md +1 -1
  83. package/bundled-skills/docs/vietnamese/BUNDLES.vi.md +1 -1
  84. package/bundled-skills/docs/vietnamese/FAQ.vi.md +15 -8
  85. package/bundled-skills/docs/vietnamese/GETTING_STARTED.vi.md +12 -5
  86. package/bundled-skills/docs/vietnamese/QUALITY_BAR.vi.md +1 -1
  87. package/bundled-skills/docs/vietnamese/README.vi.md +21 -17
  88. package/bundled-skills/docs/vietnamese/SECURITY_GUARDRAILS.vi.md +1 -1
  89. package/bundled-skills/docs/vietnamese/SKILLS_README.vi.md +2 -2
  90. package/bundled-skills/docs/vietnamese/TRANSLATION_PLAN.vi.md +1 -1
  91. package/bundled-skills/docs/vietnamese/VISUAL_GUIDE.vi.md +8 -8
  92. package/bundled-skills/docs-guard/SKILL.md +109 -0
  93. package/bundled-skills/docs-guard/references/code-samples.md +46 -0
  94. package/bundled-skills/docs-guard/references/docstrings.md +60 -0
  95. package/bundled-skills/docs-guard/references/review-checklist.md +45 -0
  96. package/bundled-skills/docs-guard/references/sources.md +22 -0
  97. package/bundled-skills/docs-guard/references/verification.md +51 -0
  98. package/bundled-skills/efficient-web-research/SKILL.md +4 -0
  99. package/bundled-skills/electron-development/SKILL.md +1 -1
  100. package/bundled-skills/event-staffing-compliance/SKILL.md +3 -0
  101. package/bundled-skills/event-staffing-ordering/SKILL.md +3 -0
  102. package/bundled-skills/feature-tracking/SKILL.md +222 -0
  103. package/bundled-skills/flutter-expert/SKILL.md +6 -1
  104. package/bundled-skills/flutter-expert/resources/implementation-playbook.md +214 -0
  105. package/bundled-skills/gemini-deep-research/README.md +246 -0
  106. package/bundled-skills/gemini-deep-research/SKILL.md +136 -0
  107. package/bundled-skills/gemini-deep-research/requirements.txt +2 -0
  108. package/bundled-skills/gemini-deep-research/scripts/research.py +692 -0
  109. package/bundled-skills/git-pushing/SKILL.md +21 -4
  110. package/bundled-skills/git-pushing/scripts/smart_commit.sh +206 -11
  111. package/bundled-skills/go-in-depth/scripts/workflow-script.js +4 -1
  112. package/bundled-skills/grok-build/SKILL.md +167 -0
  113. package/bundled-skills/grok-build/references/cli.md +99 -0
  114. package/bundled-skills/huggingface-tool-builder/references/find_models_by_paper.sh +1 -1
  115. package/bundled-skills/idea-autopsy/SKILL.md +147 -0
  116. package/bundled-skills/it-manager-hospital/README.md +1 -1
  117. package/bundled-skills/it-manager-pro/README.md +1 -1
  118. package/bundled-skills/itil-expert/README.md +1 -1
  119. package/bundled-skills/langgraph/SKILL.md +1 -1
  120. package/bundled-skills/linkedin-content-generator/SKILL.md +1 -1
  121. package/bundled-skills/lint-and-validate/scripts/lint_runner.py +23 -23
  122. package/bundled-skills/lint-and-validate/scripts/type_coverage.py +30 -30
  123. package/bundled-skills/logic-lens/SKILL.md +1 -1
  124. package/bundled-skills/lore/LICENSE +21 -0
  125. package/bundled-skills/lore/README.md +386 -0
  126. package/bundled-skills/lore/README.zh-CN.md +386 -0
  127. package/bundled-skills/lore/SKILL.md +453 -0
  128. package/bundled-skills/lore/WORKFLOWS.md +216 -0
  129. package/bundled-skills/lore/WORKFLOWS.zh-CN.md +216 -0
  130. package/bundled-skills/lore/references/audit-template.md +60 -0
  131. package/bundled-skills/lore/references/compatibility.md +228 -0
  132. package/bundled-skills/lore/references/config.md +125 -0
  133. package/bundled-skills/lore/references/entry-format.md +70 -0
  134. package/bundled-skills/lore/references/history-command.md +106 -0
  135. package/bundled-skills/lore/references/monorepo-detection.md +78 -0
  136. package/bundled-skills/lore/references/platform-mirrors.md +377 -0
  137. package/bundled-skills/lore/references/stale-new-markers.md +62 -0
  138. package/bundled-skills/lore/references/summary-template.md +98 -0
  139. package/bundled-skills/lore/scripts/README.md +54 -0
  140. package/bundled-skills/lore/scripts/README.zh-CN.md +54 -0
  141. package/bundled-skills/lore/scripts/find_duplicates.py +211 -0
  142. package/bundled-skills/lore/scripts/find_stale.py +116 -0
  143. package/bundled-skills/lore/scripts/history.py +527 -0
  144. package/bundled-skills/lore/scripts/id_hash.py +32 -0
  145. package/bundled-skills/lore/scripts/list_entries.py +183 -0
  146. package/bundled-skills/lovable-cleanup/SKILL.md +3 -3
  147. package/bundled-skills/makepad-splash/SKILL.md +1 -1
  148. package/bundled-skills/mmx-cli/SKILL.md +14 -1
  149. package/bundled-skills/monopoly/SKILL.md +5 -0
  150. package/bundled-skills/monopoly/patterns/SKILL.md +4 -0
  151. package/bundled-skills/monopoly/scale-benchmarks/SKILL.md +4 -0
  152. package/bundled-skills/monopoly/security-checklist/SKILL.md +4 -0
  153. package/bundled-skills/monopoly/tech-matrix/SKILL.md +4 -0
  154. package/bundled-skills/mtls-configuration/SKILL.md +1 -1
  155. package/bundled-skills/network-101/SKILL.md +4 -5
  156. package/bundled-skills/nika/SKILL.md +270 -0
  157. package/bundled-skills/not-a-vibe-coder/SKILL.md +4 -0
  158. package/bundled-skills/ontoly-software-graph/SKILL.md +160 -0
  159. package/bundled-skills/openclaw-github-repo-commander/SKILL.md +1 -1
  160. package/bundled-skills/pilot-protocol/SKILL.md +6 -3
  161. package/bundled-skills/postgres-readonly-queries/README.md +77 -0
  162. package/bundled-skills/postgres-readonly-queries/SKILL.md +152 -0
  163. package/bundled-skills/postgres-readonly-queries/connections.example.json +34 -0
  164. package/bundled-skills/postgres-readonly-queries/requirements.txt +1 -0
  165. package/bundled-skills/postgres-readonly-queries/scripts/query.py +262 -0
  166. package/bundled-skills/pptx-deck-creation/SKILL.md +275 -0
  167. package/bundled-skills/pptx-deck-creation/references/audit-checklist.md +156 -0
  168. package/bundled-skills/pptx-deck-creation/references/design-profiles.md +96 -0
  169. package/bundled-skills/pptx-deck-creation/references/python-snippets.md +150 -0
  170. package/bundled-skills/pptx-deck-creation/references/reference-deck-analysis.md +91 -0
  171. package/bundled-skills/pptx-deck-creation/references/visual-asset-adapters.md +158 -0
  172. package/bundled-skills/privilege-escalation-methods/SKILL.md +1 -1
  173. package/bundled-skills/product-decision-agent/SKILL.md +94 -0
  174. package/bundled-skills/product-decision-agent/agents/openai.yaml +7 -0
  175. package/bundled-skills/product-decision-agent/references/methodology-basis.md +232 -0
  176. package/bundled-skills/product-decision-agent/references/product-playbooks.md +813 -0
  177. package/bundled-skills/product-decision-agent/references/reasoning-engine.md +289 -0
  178. package/bundled-skills/product-decision-agent/references/response-examples.md +279 -0
  179. package/bundled-skills/product-decision-agent/scripts/quality_gate.py +221 -0
  180. package/bundled-skills/product-decision-agent/scripts/test_quality_gate.py +94 -0
  181. package/bundled-skills/pytest-skill/reference/playbook.md +358 -0
  182. package/bundled-skills/quit-sponsor/SKILL.md +96 -0
  183. package/bundled-skills/rclone-cli/references/providers/s3.md +1 -1
  184. package/bundled-skills/security-and-hardening/SKILL.md +1 -1
  185. package/bundled-skills/semgrep-rule-creator/SKILL.md +6 -6
  186. package/bundled-skills/skill-creator/README.md +3 -3
  187. package/bundled-skills/skill-creator/SKILL.md +8 -4
  188. package/bundled-skills/skill-creator/scripts/quick_validate.py +1 -1
  189. package/bundled-skills/sql-injection-testing/SKILL.md +4 -4
  190. package/bundled-skills/subagent-orchestrator/README.md +1 -1
  191. package/bundled-skills/super-code/bash/SKILL.md +3 -0
  192. package/bundled-skills/super-code/c/SKILL.md +3 -0
  193. package/bundled-skills/super-code/cpp/SKILL.md +3 -0
  194. package/bundled-skills/super-code/csharp/SKILL.md +3 -0
  195. package/bundled-skills/super-code/dart/SKILL.md +3 -0
  196. package/bundled-skills/super-code/elixir/SKILL.md +3 -0
  197. package/bundled-skills/super-code/go/SKILL.md +3 -0
  198. package/bundled-skills/super-code/java/SKILL.md +3 -0
  199. package/bundled-skills/super-code/kotlin/SKILL.md +3 -0
  200. package/bundled-skills/super-code/php/SKILL.md +3 -0
  201. package/bundled-skills/super-code/python/SKILL.md +3 -0
  202. package/bundled-skills/super-code/ruby/SKILL.md +3 -0
  203. package/bundled-skills/super-code/rust/SKILL.md +3 -0
  204. package/bundled-skills/super-code/scala/SKILL.md +3 -0
  205. package/bundled-skills/super-code/swift/SKILL.md +3 -0
  206. package/bundled-skills/super-code/typescript/SKILL.md +3 -0
  207. package/bundled-skills/telegram-bot-messaging/README.md +185 -0
  208. package/bundled-skills/telegram-bot-messaging/SKILL.md +101 -0
  209. package/bundled-skills/telegram-bot-messaging/scripts/telegram.sh +420 -0
  210. package/bundled-skills/test-guard/SKILL.md +132 -0
  211. package/bundled-skills/test-guard/references/jest.md +50 -0
  212. package/bundled-skills/test-guard/references/llm-app-testing.md +40 -0
  213. package/bundled-skills/test-guard/references/phpunit.md +56 -0
  214. package/bundled-skills/test-guard/references/pytest.md +65 -0
  215. package/bundled-skills/trading-ledger/SKILL.md +11 -3
  216. package/bundled-skills/uizze-ui-research/SKILL.md +93 -0
  217. package/bundled-skills/vibe-code-auditor/SKILL.md +1 -1
  218. package/bundled-skills/vibecode-production-qa-validator/SKILL.md +1 -1
  219. package/bundled-skills/videodb/scripts/ws_listener.py +29 -15
  220. package/bundled-skills/voice-ai-engine-development/README.md +1 -1
  221. package/bundled-skills/vulnerability-scanner/SKILL.md +1 -1
  222. package/bundled-skills/warehouse/SKILL.md +154 -0
  223. package/bundled-skills/woo-guard/SKILL.md +113 -0
  224. package/bundled-skills/woo-guard/references/checkout-and-money.md +64 -0
  225. package/bundled-skills/woo-guard/references/hpos-and-crud.md +87 -0
  226. package/bundled-skills/woo-guard/references/review-checklist.md +44 -0
  227. package/bundled-skills/woo-guard/references/sources.md +17 -0
  228. package/bundled-skills/wp-guard/SKILL.md +119 -0
  229. package/bundled-skills/wp-guard/references/i18n.md +88 -0
  230. package/bundled-skills/wp-guard/references/performance.md +70 -0
  231. package/bundled-skills/wp-guard/references/review-checklist.md +57 -0
  232. package/bundled-skills/wp-guard/references/security.md +100 -0
  233. package/bundled-skills/wp-guard/references/sources.md +27 -0
  234. package/bundled-skills/writing-skills/gotchas.md +1 -1
  235. package/bundled-skills/writing-skills/references/standards/metadata-standard.md +1 -1
  236. package/bundled-skills/x-twitter-scraper/SKILL.md +14 -32
  237. package/bundled-skills/xss-html-injection/SKILL.md +3 -3
  238. package/bundled-skills/youtube-seo-optimizer/SKILL.md +1 -1
  239. package/bundled-skills/youtube-summarizer/CHANGELOG.md +2 -2
  240. package/package.json +1 -1
  241. package/skills_index.json +273 -0
@@ -0,0 +1,228 @@
1
+ # Compatibility policy
2
+
3
+ This document defines how `lore` evolves without breaking existing user projects. It is the contract between current users and future maintainers. Any change to `.lore/` structure, file formats, Python scripts, mirror templates, or this skill's reference docs must conform to these rules.
4
+
5
+ ## Three principles
6
+
7
+ 1. **Add, never subtract.** New fields, scripts, sections, and reference docs always use new names. Removal happens only after the deprecation cycle (below).
8
+ 2. **Readers are forward-compatible.** An older skill reading a newer `.lore/` ignores unknown fields, unknown files, and unknown tags. It never errors on unfamiliar content.
9
+ 3. **Writers are backward-compatible (during transition).** A newer skill detecting an older `.lore/` runs a migration step before writing. It never overwrites old data with new defaults.
10
+
11
+ ## Layer-specific rules
12
+
13
+ ### Layer 1: `.lore/.config.json` schema
14
+
15
+ - `schema_version` is **required** (integer). See `references/config.md` for handling missing/newer/older values.
16
+ - Adding a new field = bump `schema_version` to N+1; old fields stay; the field is added with its default value at first read.
17
+ - Removing a field requires the deprecation cycle (one schema version's worth of warnings before hard removal).
18
+ - Renaming a field: write the new field, copy the value, mark the old one with `_deprecated: "reason"`. The migration tool handles this in `migrate.py`.
19
+
20
+ ### Layer 2: Entry format
21
+
22
+ ```
23
+ - [ARCH-2026-07-10-a3f2] Entry text; reason. #added:2026-07-10 #verified:2026-07-15
24
+ ```
25
+
26
+ - IDs (`LAYER-DATE-HASH`) are stable as long as the entry text is unchanged. Editing an entry produces a new ID; old ID stays in history (via git) for `history` queries.
27
+ - Tag set is a closed set today: `#added`, `#verified`, `#stale`, `#archived`. Adding a new tag is allowed; old skills' tag parsers (which match `(added|verified|stale|archived)`) silently ignore unknown tags.
28
+ - **Never make a tag required.** Required tags break every old entry in every old `.lore/`.
29
+
30
+ ### Layer 3: `.lore/` directory structure
31
+
32
+ Current canonical layout:
33
+
34
+ ```
35
+ .lore/
36
+ ├── SUMMARY.md
37
+ ├── _global/
38
+ ├── scopes/
39
+ ├── draft/ (init only — temporary)
40
+ ├── audit/ (audit only)
41
+ └── archive/ (referenced in spec; reserved for future)
42
+ ```
43
+
44
+ Rules:
45
+
46
+ - Adding a new top-level directory (e.g., `rejected/` for rejected entries) is non-breaking.
47
+ - Renaming an existing directory is breaking — every reference in `references/*.md`, every script, and every user's project breaks.
48
+ - Removing a directory is breaking unless that directory was never actually written (e.g., removing `archive/` today is non-breaking because nothing writes there yet).
49
+
50
+ ### Layer 4: Python scripts
51
+
52
+ Current scripts: `id_hash.py`, `list_entries.py`, `find_stale.py`, `find_duplicates.py`, `history.py`, plus planned `migrate.py`.
53
+
54
+ Rules:
55
+
56
+ - **Renaming is breaking.** All names are part of the public surface; they're referenced from `SKILL.md`, `references/*.md`, and downstream tooling. Don't rename; deprecate and add a new one if needed.
57
+ - **Removing is breaking.** A deprecated script stays on disk with a clear "Deprecated: use `migrate.py` instead" header for one schema version.
58
+ - **Adding a new script is non-breaking.** Reference it from `SKILL.md` reference index on introduction.
59
+ - **Changing output format is breaking for `--json` consumers.** Add `--v2-output` or a new flag; old flag keeps old behavior forever.
60
+
61
+ ### Layer 5: Platform mirror files
62
+
63
+ Mirror files (`CLAUDE.md`, `.cursorrules`, `AGENTS.md`, etc.) follow this contract:
64
+
65
+ ```markdown
66
+ ## Lore (auto-managed)
67
+
68
+ ... lore content ...
69
+
70
+ ---
71
+ ## My notes (free edit)
72
+
73
+ ... user content (preserved verbatim) ...
74
+ ```
75
+
76
+ Rules:
77
+
78
+ - `## Lore (auto-managed)` is a **contract string**. Never rename; never remove. Mirror detection regexes depend on it.
79
+ - `## My notes (free edit)` is a **contract string**. Never rename; never remove. User-written content depends on it.
80
+ - The content between `## Lore` and `---` is lore's domain; content after `---` is the user's. Respect the boundary on every regeneration.
81
+ - Adding a new auto-managed section (e.g., `## Sync history (auto-managed)`) is allowed; insert before `---`. Old skills ignore it.
82
+ - Changing the index template body (e.g., adding a "Last mirror:" line) is non-breaking: content-based dedup means unchanged mirrors are not rewritten, so old mirrors stay valid.
83
+ - **Backward-write safety**: if the existing mirror has no `## My notes (free edit)` section (e.g., a legacy single-section mirror from a pre-v1 project), the first `lore mirror` run must **append** an empty My notes section rather than overwriting the file.
84
+
85
+ ### Layer 6: reference docs
86
+
87
+ Current docs: `entry-format.md`, `summary-template.md`, `audit-template.md`, `monorepo-detection.md`, `stale-new-markers.md`, `platform-mirrors.md`, `config.md`, `history-command.md`, `compatibility.md` (this file).
88
+
89
+ Rules:
90
+
91
+ - **Renaming a reference doc is breaking.** Every external link (issue trackers, blog posts, README badges) breaks. Add a redirect stub instead.
92
+ - **Splitting a doc** (e.g., `platform-mirrors.md` → `mirror-index.md` + `mirror-takeover.md`) requires a stub at the old path that points to the new location. Update `SKILL.md` reference index on the same commit.
93
+ - **Removing a doc** is breaking. Mark it `<!-- DEPRECATED: see new-location.md -->` for one schema version, then move to `archive/` (in `references/`, not in `.lore/`).
94
+ - **Adding a doc** is non-breaking. Add to `SKILL.md` reference index on introduction.
95
+
96
+ ## Migration tool
97
+
98
+ `scripts/migrate.py` does not exist in v1. It will be added on the first `schema_version` bump.
99
+
100
+ **Triggers that will ship the first migration:**
101
+
102
+ - A new required field is added to `.lore/.config.json`.
103
+ - A field is renamed or its accepted values are tightened.
104
+ - The entry ID algorithm changes.
105
+
106
+ Until any of these happen, `schema_version: 1` is the only version and no migration is possible or needed.
107
+
108
+ Until the script ships, `list_entries.py` emits a one-time warning to stderr if `.lore/.config.json` is missing the `schema_version` field. This nudges users to add the field manually before the first breaking change ships, so future upgrades can detect the version mismatch correctly.
109
+
110
+ **Template — to be implemented when the first migration is needed:**
111
+
112
+ ```python
113
+ #!/usr/bin/env python3
114
+ """Migrate .lore/.config.json from version N to N+1.
115
+
116
+ Idempotent: running twice produces no further changes.
117
+ Refuses to run if schema_version > EXPECTED_FROM.
118
+ """
119
+ import json, sys
120
+ from pathlib import Path
121
+
122
+ EXPECTED_FROM = 1 # versions this script can read
123
+ TARGET = 2 # current schema version after migration
124
+
125
+
126
+ def migrate(config: dict) -> tuple[dict, list[str]]:
127
+ msgs = []
128
+ # v1 → v2 transformations go here. Example:
129
+ # if config.get("mirror_mode") == "summary":
130
+ # config.pop("mirror_mode", None)
131
+ # msgs.append('removed deprecated "mirror_mode": "summary"')
132
+ config["schema_version"] = TARGET
133
+ return config, msgs
134
+
135
+
136
+ def main() -> int:
137
+ cfg_path = Path(".lore/.config.json")
138
+ if not cfg_path.exists():
139
+ print(f"error: {cfg_path} not found", file=sys.stderr)
140
+ return 1
141
+ cfg = json.loads(cfg_path.read_text(encoding="utf-8"))
142
+ current = cfg.get("schema_version", 1)
143
+ if current > EXPECTED_FROM:
144
+ print(
145
+ f"error: schema_version={current} is newer than this skill "
146
+ f"can read (max: {EXPECTED_FROM}). Pull latest lore.",
147
+ file=sys.stderr,
148
+ )
149
+ return 2
150
+ if current < TARGET:
151
+ print(f"migrating v{current} → v{TARGET}...")
152
+ cfg, msgs = migrate(cfg)
153
+ for m in msgs:
154
+ print(f" - {m}")
155
+ cfg_path.write_text(json.dumps(cfg, indent=2) + "\n", encoding="utf-8")
156
+ print("done.")
157
+ return 0
158
+
159
+
160
+ if __name__ == "__main__":
161
+ sys.exit(main())
162
+ ```
163
+
164
+ ## Deprecation workflow
165
+
166
+ Any capability slated for removal follows a three-stage cycle. The minimum cycle is **two schema versions** (typically 6–12 months).
167
+
168
+ | Stage | Schema version | Behavior |
169
+ |---|---|---|
170
+ | **Announce** | N | Add an entry to `references/deprecations.md` with the feature name, replacement, and removal target version. The skill prints a one-line notice when the feature is used. |
171
+ | **Warn** | N+1 | The skill prints a louder warning (with remediation steps) and writes a `_deprecation_warnings_shown` array to `.lore/.config.json` so the warning doesn't repeat. |
172
+ | **Remove** | N+2 | Hard delete. Old `.lore/` data is migrated by `migrate.py` to the new format. Users who skipped migrations will see explicit errors pointing at `migrate.py`. |
173
+
174
+ Skipping a stage is allowed only for security fixes or unreleased features that were never shipped.
175
+
176
+ ## CI enforcement
177
+
178
+ A compatibility CI job (planned for `.github/workflows/compat.yml`) verifies:
179
+
180
+ 1. **New skill reads old `.lore/`**: checkout a fixture project from `fixtures/v0-project/`, run `list_entries.py`, `history.py`, `find_stale.py` on it. Pass = no exceptions, correct counts.
181
+ 2. **Old skill reads new `.lore/`**: build a fixture with the latest schema, check out the previous release's scripts, run them. Pass = no exceptions on known fields; unknown fields silently ignored.
182
+ 3. **No rename or delete in `scripts/` or `references/`**: PR diff against `scripts/` and `references/` filenames; any removed file = failure.
183
+
184
+ At least one fixture project must be checked in at `fixtures/v0-project/` and re-pinned to a known old schema version after each major release.
185
+
186
+ ## Examples
187
+
188
+ ### Compatible change (additive)
189
+
190
+ Adding a new `compress_thresholds.max_entries_per_scope` field:
191
+
192
+ - Bump `schema_version` to 2.
193
+ - `migrate.py` v1 → v2: add the new field with default `100` if absent.
194
+ - Old skill reads v2 config: sees only the fields it knows; ignores `max_entries_per_scope`.
195
+ - New skill reads v1 config: detects `schema_version` mismatch, refuses to write until migration runs.
196
+
197
+ ### Incompatible change (avoid)
198
+
199
+ Renaming `mirror_mode` to `render_mode`:
200
+
201
+ - Every existing `.lore/.config.json` would silently lose its `mirror_mode: "index"` setting on next migration (old field dropped, new field absent → defaults kick in).
202
+ - Bad. Instead: add `render_mode` as the new canonical field; mark `mirror_mode` as `_deprecated`; keep both for one schema version; eventually remove `mirror_mode` via the deprecation cycle.
203
+
204
+ ### Breaking change (deprecation cycle required)
205
+
206
+ Removing support for `mirror_mode: "full"`:
207
+
208
+ - v1: ship `mirror_mode: "full"` as deprecated; full mode still works.
209
+ - v2: print warning when `"full"` is set; suggest migrating to `"index"`.
210
+ - v3: hard reject `"full"`; `migrate.py` auto-converts to `"index"`.
211
+ - Each version's release notes link to the deprecation entry in `references/deprecations.md`.
212
+
213
+ ## Decision checklist
214
+
215
+ Before merging any change to lore, answer these questions:
216
+
217
+ 1. Does this change add, modify, or remove anything in `.lore/`?
218
+ 2. Does this change add, modify, or remove any script in `scripts/`?
219
+ 3. Does this change add, modify, or remove any contract string (`## Lore (auto-managed)`, `## My notes (free edit)`, etc.)?
220
+ 4. Does this change add, modify, or remove any reference doc filename?
221
+ 5. Does this change add, modify, or remove any entry tag?
222
+
223
+ If any answer is "modify" or "remove", the change requires either:
224
+ - A migration step in `migrate.py` (for schema changes)
225
+ - A deprecation cycle (for removals)
226
+ - An entry in `references/deprecations.md`
227
+
228
+ If all answers are "add" or "no", the change is non-breaking and can ship as a minor or patch release.
@@ -0,0 +1,125 @@
1
+ # Configuration reference
2
+
3
+ `.lore/.config.json` holds user-tunable settings. The file is optional; without it, the skill uses sensible defaults.
4
+
5
+ ## Schema
6
+
7
+ ```json
8
+ {
9
+ "schema_version": 1,
10
+ "auto_mirror": true | false,
11
+ "sync_updates_mirror": true | false,
12
+ "sync_trust": "high" | "medium" | "low",
13
+ "mirror_targets": ["CLAUDE.md"], // optional — auto-detected if absent
14
+ "mirror_mode": "index",
15
+ "compress_thresholds": {
16
+ "max_entries": 500,
17
+ "max_days_since_compress": 30
18
+ },
19
+ "sync_thresholds": {
20
+ "min_lines_changed": 50,
21
+ "min_directories_changed": 2
22
+ }
23
+ }
24
+ ```
25
+
26
+ ## Schema version (`schema_version`)
27
+
28
+ **Required for new configs** (set automatically by `lore init`). Tracks the schema version of `.lore/.config.json` so future releases can detect old configs before writing.
29
+
30
+ - **Missing** → treated as `schema_version: 1`. A `[WARN]` notice is printed to stderr by `list_entries.py`; add the field manually to silence it.
31
+ - **Equal to skill's expected version** → use as-is.
32
+ - **Lower than expected** → refuse to write; ask the user to run the migration script shipped with that future release.
33
+ - **Higher than expected** → refuse to read with an error; the user's skill is older than their `.lore/`. They need to upgrade lore (pull latest from upstream) before continuing.
34
+
35
+ For the full compatibility policy (migration tools, deprecation cycle, reader/writer contracts), see `references/compatibility.md`.
36
+
37
+ ## Field semantics
38
+
39
+ ### `auto_mirror`
40
+
41
+ Default: `false`.
42
+
43
+ Controls whether `compress` and `lore mirror` regenerate platform mirrors automatically after the canonical change is accepted.
44
+
45
+ - `true` — regenerate mirrors automatically
46
+ - `false` — ask per target before writing
47
+
48
+ Note: this flag does **not** affect `sync`. By default `sync` does not touch mirrors at all (see `sync_updates_mirror`).
49
+
50
+ ### `sync_updates_mirror`
51
+
52
+ Default: `false`.
53
+
54
+ Controls whether `sync` regenerates platform mirrors as a side effect.
55
+
56
+ - `false` — `sync` only writes `.lore/*.md`. Mirrors are updated by `compress` or explicit `lore mirror`. This is the recommended setting to avoid cluttering `git log` of mirror files.
57
+ - `true` — `sync` regenerates mirrors (with content-based dedup) after the canonical change is accepted. Restore this setting if the old "update everything on every sync" behavior is preferred.
58
+
59
+ ### `sync_trust`
60
+
61
+ Default: `"medium"`.
62
+
63
+ Controls how much confirmation `sync` requires for individual change types.
64
+
65
+ - `"high"` — auto-apply everything, including `NEW` and `STALE`. Only `ALERT` blocks interrupt.
66
+ - `"medium"` — auto-apply low-risk changes (de-duplicate hits, equivalent REFINEDs). `NEW`, `STALE`, and `ALERT` require confirmation.
67
+ - `"low"` — every change requires confirmation, including de-duplicate hits and equivalent REFINEDs.
68
+
69
+ ### `mirror_targets`
70
+
71
+ Default: auto-detected at runtime (see "If absent" below).
72
+
73
+ Array of file paths (relative to project root) that should be kept in sync with `.lore/*`.
74
+ Every entry must pass the fail-closed allowlist and containment validation in
75
+ `references/platform-mirrors.md` before any target is read or written. Absolute paths,
76
+ `..` components, unsupported paths, and paths that escape the project root through symlinks
77
+ are errors, not warnings; abort the mirror operation without touching any target.
78
+
79
+ If absent: mirror targets are auto-detected at runtime by scanning the project root for existing platform files. If no platform files exist, the user is asked via a multi-select question during `init`, the first `mirror` call, or `compress` (when `auto_mirror: true`). See `references/platform-mirrors.md` for the resolution algorithm.
80
+
81
+ If present: validate the complete array, then use the validated targets. Empty array `[]` is
82
+ valid and disables mirror generation. Never partially process an array containing an invalid
83
+ target.
84
+
85
+ When auto-detection is in effect, `lore init` populates this field with the user's selections so subsequent runs are silent.
86
+
87
+ ### `mirror_mode`
88
+
89
+ Default: `"index"`.
90
+
91
+ Only `"index"` is accepted. The mirror renders a small index structure pointing into `.lore/` (see `references/platform-mirrors.md` for the template and adaptive rendering rules). Per-session token cost stays flat (~500 B) regardless of project size.
92
+
93
+ Any other value (e.g., the historical `"summary"` or `"full"`) is rejected at config-load time with an error. Remove the field, or set it to `"index"`.
94
+
95
+ ### `compress_thresholds`
96
+
97
+ Defaults: `{"max_entries": 500, "max_days_since_compress": 30}`.
98
+
99
+ `sync` checks these silently and emits a `[COMPRESS NOTICE]` when tripped. See `SKILL.md` sync procedure.
100
+
101
+ ### `sync_thresholds`
102
+
103
+ Defaults: `{"min_lines_changed": 50, "min_directories_changed": 2}`.
104
+
105
+ `sync` only proposes an update when at least one trigger threshold is met (see `SKILL.md` sync trigger threshold). Lowering these values means `sync` proposes updates more often.
106
+
107
+ ## Editing the config
108
+
109
+ Edit `.lore/.config.json` directly. After editing:
110
+
111
+ - `sync` and `compress` re-read the config on every run; no restart needed.
112
+ - Invalid JSON → fall back to defaults + warn the user.
113
+ - After editing, verify with `python scripts/list_entries.py --config-check` (added in a future migration).
114
+ - For schema version changes, see `references/compatibility.md`.
115
+
116
+ ## Upgrade path
117
+
118
+ When a future lore release introduces the first `schema_version` bump:
119
+
120
+ 1. That release ships `scripts/migrate.py` for the specific version bump.
121
+ 2. The skill prompts: "Your `.lore/.config.json` is v1; lore now expects v2. Run `python scripts/migrate.py` to upgrade."
122
+ 3. `migrate.py` is idempotent — running it twice is a no-op.
123
+ 4. After migration, the file is updated in place; no manual editing needed.
124
+
125
+ In v1, no migration has shipped and `scripts/migrate.py` does not exist. Add `"schema_version": 1` manually to old configs to silence the warning.
@@ -0,0 +1,70 @@
1
+ # Entry format reference
2
+
3
+ Detailed specification for `.lore/` entries. The main `SKILL.md` covers entry structure briefly; this file is the full spec.
4
+
5
+ ## Bullet structure
6
+
7
+ Each entry is a Markdown bullet (≤ 2 lines), containing:
8
+
9
+ - **Layer prefix**: `ARCH`, `DEC`, or `CONV`
10
+ - **ID**: `LAYER-YYYY-MM-DD-xxxx` where `xxxx` is a 4-char content hash
11
+ - **Inline status tags** (at the end of the entry)
12
+
13
+ ```markdown
14
+ - [ARCH-2026-07-09-a3f2] Use Next.js App Router; reason: streaming + RSC. #added:2026-07-09
15
+ - [DEC-2026-02-03-7c19] Chose Zustand over Redux; reason: 60% less boilerplate. Alternatives: Redux Toolkit, Jotai. #added:2026-02-03
16
+ - [CONV-2026-01-20-b1e8] Never commit secrets; use `dotenv` + `.env.local` (gitignored). #added:2026-01-20
17
+ - [ARCH-2026-03-10-a1b2] Use TanStack Query for all server state. #added:2026-03-10 #verified:2026-06-15
18
+ ```
19
+
20
+ ## ID generation
21
+
22
+ The 4-char `xxxx` is the first 4 hex chars of `sha256(entry text)`. This makes IDs:
23
+
24
+ - **Deterministic**: rewriting the same fact produces the same ID
25
+ - **Conflict-free** under concurrent writes by multiple agents
26
+ - **Reverse-lookup-able** by audit tools
27
+
28
+ If two entries have identical content (hash collision, statistically rare), add a distinguishing word to one and recompute.
29
+
30
+ ## Tag specification
31
+
32
+ | Tag | Meaning |
33
+ |---|---|
34
+ | `#added:YYYY-MM-DD` | When the entry was created |
35
+ | `#verified:YYYY-MM-DD` | Last time a human or audit confirmed the entry is still true |
36
+ | `#stale:YYYY-MM-DD` | Flagged by `sync` as superseded or contradicted; user decides keep/archive |
37
+ | `#archived:YYYY-MM-DD` | Moved to `archive/` |
38
+
39
+ Multiple tags can co-exist on one entry (e.g. `#added:2026-01-15 #verified:2026-06-01`).
40
+
41
+ ## Cross-file references
42
+
43
+ When `SUMMARY.md` or another file references an entry, qualify it with the file path to avoid ID collisions across scopes:
44
+
45
+ ```
46
+ [scopes/frontend/DECISIONS.md#DEC-2026-02-03-7c19]
47
+ [_global/CONVENTIONS.md#CONV-2026-01-20-b1e8]
48
+ ```
49
+
50
+ The path is relative to `.lore/`.
51
+
52
+ ## Splitting vs. single entries
53
+
54
+ If a fact can't fit in ≤ 2 lines, split into multiple entries and cross-reference them by ID:
55
+
56
+ ```markdown
57
+ - [ARCH-2026-07-09-a3f2] Use Next.js App Router. #added:2026-07-09
58
+ - [DEC-2026-07-09-b1e8] Reason: streaming + RSC, see [ARCH-2026-07-09-a3f2]. #added:2026-07-09
59
+ ```
60
+
61
+ Instead of stuffing them into a single overly long bullet.
62
+
63
+ ## What counts as "atomic"
64
+
65
+ A fact is atomic if it answers exactly one question:
66
+
67
+ - "What is the frontend framework?" → `ARCH` entry about Next.js
68
+ - "Why Next.js not Remix?" → `DEC` entry referencing the `ARCH` entry
69
+
70
+ If your entry answers two questions, split it.
@@ -0,0 +1,106 @@
1
+ # `lore history` — full specification
2
+
3
+ Read-only command. Lists git commits related to a memory entry, a file,
4
+ or a scope, since the entry's `#added` date. Output to stdout only;
5
+ never writes to `.lore/`.
6
+
7
+ ## Synopsis
8
+
9
+ ```
10
+ lore history <entry-id>
11
+ lore history <file-path>
12
+ lore history --scope=<name>
13
+ lore history --since=<YYYY-MM-DD>
14
+ lore history --json
15
+ ```
16
+
17
+ ## Forms
18
+
19
+ | Form | Argument shape | Example | Behavior |
20
+ |---|---|---|---|
21
+ | Entry | `[A-Z]+-\d{4}-\d{2}-\d{2}-[a-f0-9]{4}` | `lore history DEC-2026-02-03-7c19` | Locate entry in `.lore/`, derive its `#added` date and code file, then `git log` since that date. |
22
+ | File | contains `/` or starts with `.` | `lore history frontend/src/store/index.ts` | Run `git log --since=1970-01-01` on the given path. |
23
+ | Scope | `--scope=<name>` only | `lore history --scope=frontend` | For each `*.md` in `.lore/scopes/<name>/`, run file form on the lore file path itself. |
24
+
25
+ ## Code-file resolution (entry form)
26
+
27
+ Priority:
28
+
29
+ 1. First backtick-quoted path in entry.text that looks like a file
30
+ (e.g. `src/store/index.ts`).
31
+ 2. Scope directory at the project root (e.g. entry scope `frontend` →
32
+ `frontend/`).
33
+ 3. Project root `.` for entries in `_global/`.
34
+
35
+ If the regex finds no path, falls back to the scope directory.
36
+
37
+ ## Data source
38
+
39
+ `git` CLI only. No network calls. Requires:
40
+
41
+ - A git repository at or above the current working directory.
42
+ - The `git` executable on `PATH`.
43
+
44
+ ## Output
45
+
46
+ ### Markdown (default)
47
+
48
+ Header block: `Entry`, `Since`, `File`, `Commits`. One section per
49
+ commit with `## <short-hash> (<date>, <author>)`, subject, optional
50
+ `Body:` line, optional `Refs:` line. A "Suggested next step" footer
51
+ appears only when at least one commit is found.
52
+
53
+ ### JSON (`--json`)
54
+
55
+ ```json
56
+ {
57
+ "entry_id": "DEC-2026-02-03-7c19",
58
+ "lore_file": "scopes/frontend/DECISIONS.md",
59
+ "code_file": "frontend/src/store/index.ts",
60
+ "since": "2026-02-03",
61
+ "since_source": "entry_added",
62
+ "commits": [
63
+ {
64
+ "hash": "...",
65
+ "short": "abc1234",
66
+ "author": "alice",
67
+ "date": "2026-04-12",
68
+ "subject": "Use Zustand v4",
69
+ "body": "Migrate notes here.",
70
+ "refs": ["#234"]
71
+ }
72
+ ]
73
+ }
74
+ ```
75
+
76
+ ## Error handling
77
+
78
+ | Condition | Exit code | Message |
79
+ |---|---|---|
80
+ | No argument | 2 | `error: missing argument` |
81
+ | Unrecognized argument | 2 | `error: unrecognized argument: <arg>` |
82
+ | `.lore/` not found | 2 | `error: .lore/ not found. Run 'lore init' first.` |
83
+ | Entry not in index | 3 | `error: Entry <id> not found. Available: ...` |
84
+ | Not a git repo | 4 | `error: Not a git repository. ...` |
85
+ | `git` missing | 5 | `error: git executable not found on PATH.` |
86
+ | Bad scope name | 6 | `error: Scope '<name>' not found. Available: ...` |
87
+ | `git log` failure | 7 | `error: git log failed: <stderr>` |
88
+ | Entry missing `#added` | 0 (warning) | `warning: entry has no #added tag; using full history` |
89
+
90
+ ## Exit codes summary
91
+
92
+ - `0` — success (including "0 commits found" case)
93
+ - `2` — usage / configuration error
94
+ - `3` — entry lookup failure
95
+ - `4` — not a git repo
96
+ - `5` — git CLI missing
97
+ - `6` — invalid scope
98
+ - `7` — git command failed
99
+
100
+ ## Why this exists
101
+
102
+ `lore sync` reads `git diff` (working-tree deltas). It never reads
103
+ commit history. `lore history` fills that gap: given a memory entry,
104
+ it shows the commits that introduced or modified the underlying code,
105
+ letting the agent answer "why does this decision exist?" with a pointer
106
+ to the original commit instead of an LLM-generated guess.
@@ -0,0 +1,78 @@
1
+ # Monorepo detection rules
2
+
3
+ `init` needs to identify whether the project is a monorepo and how to split scopes. This file lists the detection rules per tool.
4
+
5
+ ## Detection order
6
+
7
+ Check markers in this order; the first match determines scope layout:
8
+
9
+ 1. pnpm workspaces
10
+ 2. Yarn workspaces
11
+ 3. npm workspaces
12
+ 4. Lerna
13
+ 5. Nx
14
+ 6. Rush
15
+ 7. Cargo workspaces
16
+ 8. Go workspaces
17
+ 9. Bazel
18
+
19
+ No monorepo marker → fall back to `_global/` only (single-scope project).
20
+
21
+ ## Per-tool rules
22
+
23
+ ### pnpm workspaces
24
+ - Marker: `pnpm-workspace.yaml` at repo root
25
+ - Read: `packages:` field, e.g. `packages: [frontend, backend, shared/*]`
26
+ - One scope per listed package directory
27
+
28
+ ### Yarn workspaces (classic / berry)
29
+ - Marker: `package.json` top-level `workspaces` field
30
+ - Example: `"workspaces": ["packages/*"]`
31
+ - One scope per glob-resolved directory
32
+
33
+ ### npm workspaces
34
+ - Same as Yarn (npm 7+ uses the same `package.json#workspaces` field)
35
+
36
+ ### Lerna
37
+ - Marker: `lerna.json`
38
+ - Read: `packages` field (array of paths)
39
+ - One scope per path
40
+
41
+ ### Nx
42
+ - Marker: `nx.json` or `workspace.json`
43
+ - Nx typically delegates package discovery to npm/yarn workspaces — read both
44
+ - One scope per resolved package
45
+
46
+ ### Rush
47
+ - Marker: `rush.json`
48
+ - Read: `projects` array (each entry has a `packageName` and directory)
49
+
50
+ ### Cargo workspaces
51
+ - Marker: `Cargo.toml` top-level `[workspace]` table
52
+ - Read: `members` array
53
+ - One scope per member crate
54
+
55
+ ### Go workspaces
56
+ - Marker: `go.work`
57
+ - Read: `use` directives (one per module)
58
+ - One scope per module
59
+
60
+ ### Bazel
61
+ - Marker: `MODULE.bazel` or `WORKSPACE`
62
+ - Bazel repos are deeply nested; precise extraction is fragile. Fallback: collapse to one scope per top-level directory and let the user override.
63
+
64
+ ## Scope naming
65
+
66
+ - Default: directory name (`frontend/` → scope `frontend`)
67
+ - If multiple directories belong to one logical scope (e.g. `packages/web` and `packages/mobile` are both "frontend"), agent should ask the user whether to merge
68
+ - Nested monorepos (`packages/web/components/`) are **not** supported as nested scopes. Flatten to `web`.
69
+
70
+ ## When detection fails
71
+
72
+ If detection succeeds but the resulting scopes don't match the user's mental model, agent should:
73
+
74
+ 1. Show the proposed scope list
75
+ 2. Let the user rename / merge / split scopes
76
+ 3. Proceed with the corrected list
77
+
78
+ This is part of the init confirmation step (see main `SKILL.md` init step 2).