opencode-skills-collection 3.1.23 → 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.
- package/bundled-skills/.antigravity-install-manifest.json +24 -1
- package/bundled-skills/007/SKILL.md +2 -2
- package/bundled-skills/10-andruia-skill-smith/SKILL.md +1 -1
- package/bundled-skills/agent-squad/SKILL.md +5 -0
- package/bundled-skills/agent-squad/alex/SKILL.md +3 -0
- package/bundled-skills/agent-squad/aria/SKILL.md +3 -0
- package/bundled-skills/agent-squad/dep/SKILL.md +3 -0
- package/bundled-skills/agent-squad/luna/SKILL.md +4 -1
- package/bundled-skills/agent-squad/mason/SKILL.md +3 -0
- package/bundled-skills/agent-squad/max/SKILL.md +3 -0
- package/bundled-skills/agent-squad/quinn/SKILL.md +3 -0
- package/bundled-skills/agent-squad/rex/SKILL.md +3 -0
- package/bundled-skills/angular/metadata.json +1 -1
- package/bundled-skills/angular-best-practices/metadata.json +1 -1
- package/bundled-skills/angular-state-management/metadata.json +1 -1
- package/bundled-skills/angular-ui-patterns/metadata.json +1 -1
- package/bundled-skills/antigravity-skill-orchestrator/SKILL.md +2 -2
- package/bundled-skills/apify-actor-development/SKILL.md +2 -2
- package/bundled-skills/apple-container/SKILL.md +165 -0
- package/bundled-skills/apple-container/references/commands.md +1593 -0
- package/bundled-skills/apple-container/references/concepts.md +294 -0
- package/bundled-skills/apple-container/references/configuration.md +499 -0
- package/bundled-skills/apple-container/references/workflows.md +498 -0
- package/bundled-skills/ask-copilot/SKILL.md +112 -0
- package/bundled-skills/auto-research/SKILL.md +126 -0
- package/bundled-skills/brooks-lint/SKILL.md +1 -1
- package/bundled-skills/browser-harness/references/install.md +3 -1
- package/bundled-skills/chrome-extension-developer/SKILL.md +1 -1
- package/bundled-skills/clean-code-guard/SKILL.md +184 -0
- package/bundled-skills/clean-code-guard/references/ai-failure-modes.md +345 -0
- package/bundled-skills/clean-code-guard/references/comments-and-formatting.md +115 -0
- package/bundled-skills/clean-code-guard/references/dry-kiss-yagni.md +133 -0
- package/bundled-skills/clean-code-guard/references/naming-and-functions.md +187 -0
- package/bundled-skills/clean-code-guard/references/review-checklist.md +150 -0
- package/bundled-skills/clean-code-guard/references/solid.md +280 -0
- package/bundled-skills/clean-code-guard/references/sources.md +47 -0
- package/bundled-skills/cloudflare-security-audit/SKILL.md +137 -0
- package/bundled-skills/cloudflare-security-audit/references/AI-AND-LLM.md +67 -0
- package/bundled-skills/cloudflare-security-audit/references/ATTACK-CLASSES.md +116 -0
- package/bundled-skills/cloudflare-security-audit/references/CLIENT-SIDE.md +67 -0
- package/bundled-skills/cloudflare-security-audit/references/HUNTING.md +110 -0
- package/bundled-skills/cloudflare-security-audit/references/MEMORY-SAFETY-AND-BINARY.md +58 -0
- package/bundled-skills/cloudflare-security-audit/references/RECONNAISSANCE.md +46 -0
- package/bundled-skills/cloudflare-security-audit/references/VALIDATION-AND-REPORTING.md +109 -0
- package/bundled-skills/cloudflare-security-audit/references/WEB-PROTOCOL-AND-AUTH.md +85 -0
- package/bundled-skills/cloudflare-security-audit/resources/report-schema.json +210 -0
- package/bundled-skills/comfyui-gateway/references/troubleshooting.md +1 -1
- package/bundled-skills/commit/SKILL.md +2 -1
- package/bundled-skills/deepapi/SKILL.md +6 -6
- package/bundled-skills/docs/README.md +1 -1
- package/bundled-skills/docs/contributors/quality-bar.md +1 -1
- package/bundled-skills/docs/contributors/security-guardrails.md +1 -1
- package/bundled-skills/docs/integrations/jetski-cortex.md +5 -5
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +3 -3
- package/bundled-skills/docs/maintainers/ci-drift-fix.md +7 -5
- package/bundled-skills/docs/maintainers/merge-batch.md +24 -7
- package/bundled-skills/docs/maintainers/pr-autonomy.md +89 -0
- package/bundled-skills/docs/maintainers/release-notes-7.2.0.md +1 -1
- package/bundled-skills/docs/maintainers/release-process.md +9 -9
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +5 -5
- package/bundled-skills/docs/maintainers/skills-date-tracking.md +1 -1
- package/bundled-skills/docs/maintainers/skills-update-guide.md +2 -2
- package/bundled-skills/docs/users/{antigravity-awesome-skills-vs-awesome-claude-skills.md → agentic-awesome-skills-vs-awesome-claude-skills.md} +5 -5
- package/bundled-skills/docs/users/ai-agent-skills.md +4 -4
- package/bundled-skills/docs/users/best-claude-code-skills-github.md +3 -3
- package/bundled-skills/docs/users/best-cursor-skills-github.md +3 -3
- package/bundled-skills/docs/users/bundles.md +56 -57
- package/bundled-skills/docs/users/claude-code-skills.md +6 -6
- package/bundled-skills/docs/users/codex-cli-skills.md +5 -5
- package/bundled-skills/docs/users/cursor-skills.md +3 -3
- package/bundled-skills/docs/users/faq.md +27 -15
- package/bundled-skills/docs/users/gemini-cli-skills.md +4 -4
- package/bundled-skills/docs/users/getting-started.md +22 -12
- package/bundled-skills/docs/users/kiro-integration.md +7 -7
- package/bundled-skills/docs/users/plugins.md +8 -9
- package/bundled-skills/docs/users/security-skills.md +1 -1
- package/bundled-skills/docs/users/skills-vs-mcp-tools.md +1 -1
- package/bundled-skills/docs/users/specialized-plugin-roadmap.md +3 -4
- package/bundled-skills/docs/users/usage.md +9 -9
- package/bundled-skills/docs/users/visual-guide.md +7 -7
- package/bundled-skills/docs/users/windows-truncation-recovery.md +1 -1
- package/bundled-skills/docs/users/workflows.md +1 -1
- package/bundled-skills/docs/vietnamese/BUNDLES.vi.md +1 -1
- package/bundled-skills/docs/vietnamese/FAQ.vi.md +15 -8
- package/bundled-skills/docs/vietnamese/GETTING_STARTED.vi.md +12 -5
- package/bundled-skills/docs/vietnamese/QUALITY_BAR.vi.md +1 -1
- package/bundled-skills/docs/vietnamese/README.vi.md +21 -17
- package/bundled-skills/docs/vietnamese/SECURITY_GUARDRAILS.vi.md +1 -1
- package/bundled-skills/docs/vietnamese/SKILLS_README.vi.md +2 -2
- package/bundled-skills/docs/vietnamese/TRANSLATION_PLAN.vi.md +1 -1
- package/bundled-skills/docs/vietnamese/VISUAL_GUIDE.vi.md +8 -8
- package/bundled-skills/docs-guard/SKILL.md +109 -0
- package/bundled-skills/docs-guard/references/code-samples.md +46 -0
- package/bundled-skills/docs-guard/references/docstrings.md +60 -0
- package/bundled-skills/docs-guard/references/review-checklist.md +45 -0
- package/bundled-skills/docs-guard/references/sources.md +22 -0
- package/bundled-skills/docs-guard/references/verification.md +51 -0
- package/bundled-skills/efficient-web-research/SKILL.md +4 -0
- package/bundled-skills/electron-development/SKILL.md +1 -1
- package/bundled-skills/event-staffing-compliance/SKILL.md +3 -0
- package/bundled-skills/event-staffing-ordering/SKILL.md +3 -0
- package/bundled-skills/feature-tracking/SKILL.md +222 -0
- package/bundled-skills/flutter-expert/SKILL.md +6 -1
- package/bundled-skills/flutter-expert/resources/implementation-playbook.md +214 -0
- package/bundled-skills/gemini-deep-research/README.md +246 -0
- package/bundled-skills/gemini-deep-research/SKILL.md +136 -0
- package/bundled-skills/gemini-deep-research/requirements.txt +2 -0
- package/bundled-skills/gemini-deep-research/scripts/research.py +692 -0
- package/bundled-skills/git-pushing/SKILL.md +21 -4
- package/bundled-skills/git-pushing/scripts/smart_commit.sh +206 -11
- package/bundled-skills/go-in-depth/scripts/workflow-script.js +4 -1
- package/bundled-skills/grok-build/SKILL.md +167 -0
- package/bundled-skills/grok-build/references/cli.md +99 -0
- package/bundled-skills/huggingface-tool-builder/references/find_models_by_paper.sh +1 -1
- package/bundled-skills/idea-autopsy/SKILL.md +147 -0
- package/bundled-skills/it-manager-hospital/README.md +1 -1
- package/bundled-skills/it-manager-pro/README.md +1 -1
- package/bundled-skills/itil-expert/README.md +1 -1
- package/bundled-skills/langgraph/SKILL.md +1 -1
- package/bundled-skills/linkedin-content-generator/SKILL.md +1 -1
- package/bundled-skills/lint-and-validate/scripts/lint_runner.py +23 -23
- package/bundled-skills/lint-and-validate/scripts/type_coverage.py +30 -30
- package/bundled-skills/logic-lens/SKILL.md +1 -1
- package/bundled-skills/lore/LICENSE +21 -0
- package/bundled-skills/lore/README.md +386 -0
- package/bundled-skills/lore/README.zh-CN.md +386 -0
- package/bundled-skills/lore/SKILL.md +453 -0
- package/bundled-skills/lore/WORKFLOWS.md +216 -0
- package/bundled-skills/lore/WORKFLOWS.zh-CN.md +216 -0
- package/bundled-skills/lore/references/audit-template.md +60 -0
- package/bundled-skills/lore/references/compatibility.md +228 -0
- package/bundled-skills/lore/references/config.md +125 -0
- package/bundled-skills/lore/references/entry-format.md +70 -0
- package/bundled-skills/lore/references/history-command.md +106 -0
- package/bundled-skills/lore/references/monorepo-detection.md +78 -0
- package/bundled-skills/lore/references/platform-mirrors.md +377 -0
- package/bundled-skills/lore/references/stale-new-markers.md +62 -0
- package/bundled-skills/lore/references/summary-template.md +98 -0
- package/bundled-skills/lore/scripts/README.md +54 -0
- package/bundled-skills/lore/scripts/README.zh-CN.md +54 -0
- package/bundled-skills/lore/scripts/find_duplicates.py +211 -0
- package/bundled-skills/lore/scripts/find_stale.py +116 -0
- package/bundled-skills/lore/scripts/history.py +527 -0
- package/bundled-skills/lore/scripts/id_hash.py +32 -0
- package/bundled-skills/lore/scripts/list_entries.py +183 -0
- package/bundled-skills/lovable-cleanup/SKILL.md +3 -3
- package/bundled-skills/makepad-splash/SKILL.md +1 -1
- package/bundled-skills/mmx-cli/SKILL.md +14 -1
- package/bundled-skills/monopoly/SKILL.md +5 -0
- package/bundled-skills/monopoly/patterns/SKILL.md +4 -0
- package/bundled-skills/monopoly/scale-benchmarks/SKILL.md +4 -0
- package/bundled-skills/monopoly/security-checklist/SKILL.md +4 -0
- package/bundled-skills/monopoly/tech-matrix/SKILL.md +4 -0
- package/bundled-skills/mtls-configuration/SKILL.md +1 -1
- package/bundled-skills/network-101/SKILL.md +4 -5
- package/bundled-skills/nika/SKILL.md +270 -0
- package/bundled-skills/not-a-vibe-coder/SKILL.md +4 -0
- package/bundled-skills/ontoly-software-graph/SKILL.md +160 -0
- package/bundled-skills/openclaw-github-repo-commander/SKILL.md +1 -1
- package/bundled-skills/pilot-protocol/SKILL.md +6 -3
- package/bundled-skills/postgres-readonly-queries/README.md +77 -0
- package/bundled-skills/postgres-readonly-queries/SKILL.md +152 -0
- package/bundled-skills/postgres-readonly-queries/connections.example.json +34 -0
- package/bundled-skills/postgres-readonly-queries/requirements.txt +1 -0
- package/bundled-skills/postgres-readonly-queries/scripts/query.py +262 -0
- package/bundled-skills/pptx-deck-creation/SKILL.md +275 -0
- package/bundled-skills/pptx-deck-creation/references/audit-checklist.md +156 -0
- package/bundled-skills/pptx-deck-creation/references/design-profiles.md +96 -0
- package/bundled-skills/pptx-deck-creation/references/python-snippets.md +150 -0
- package/bundled-skills/pptx-deck-creation/references/reference-deck-analysis.md +91 -0
- package/bundled-skills/pptx-deck-creation/references/visual-asset-adapters.md +158 -0
- package/bundled-skills/privilege-escalation-methods/SKILL.md +1 -1
- package/bundled-skills/product-decision-agent/SKILL.md +94 -0
- package/bundled-skills/product-decision-agent/agents/openai.yaml +7 -0
- package/bundled-skills/product-decision-agent/references/methodology-basis.md +232 -0
- package/bundled-skills/product-decision-agent/references/product-playbooks.md +813 -0
- package/bundled-skills/product-decision-agent/references/reasoning-engine.md +289 -0
- package/bundled-skills/product-decision-agent/references/response-examples.md +279 -0
- package/bundled-skills/product-decision-agent/scripts/quality_gate.py +221 -0
- package/bundled-skills/product-decision-agent/scripts/test_quality_gate.py +94 -0
- package/bundled-skills/pytest-skill/reference/playbook.md +358 -0
- package/bundled-skills/quit-sponsor/SKILL.md +96 -0
- package/bundled-skills/rclone-cli/references/providers/s3.md +1 -1
- package/bundled-skills/security-and-hardening/SKILL.md +1 -1
- package/bundled-skills/semgrep-rule-creator/SKILL.md +6 -6
- package/bundled-skills/skill-creator/README.md +3 -3
- package/bundled-skills/skill-creator/SKILL.md +8 -4
- package/bundled-skills/skill-creator/scripts/quick_validate.py +1 -1
- package/bundled-skills/sql-injection-testing/SKILL.md +4 -4
- package/bundled-skills/subagent-orchestrator/README.md +1 -1
- package/bundled-skills/super-code/bash/SKILL.md +3 -0
- package/bundled-skills/super-code/c/SKILL.md +3 -0
- package/bundled-skills/super-code/cpp/SKILL.md +3 -0
- package/bundled-skills/super-code/csharp/SKILL.md +3 -0
- package/bundled-skills/super-code/dart/SKILL.md +3 -0
- package/bundled-skills/super-code/elixir/SKILL.md +3 -0
- package/bundled-skills/super-code/go/SKILL.md +3 -0
- package/bundled-skills/super-code/java/SKILL.md +3 -0
- package/bundled-skills/super-code/kotlin/SKILL.md +3 -0
- package/bundled-skills/super-code/php/SKILL.md +3 -0
- package/bundled-skills/super-code/python/SKILL.md +3 -0
- package/bundled-skills/super-code/ruby/SKILL.md +3 -0
- package/bundled-skills/super-code/rust/SKILL.md +3 -0
- package/bundled-skills/super-code/scala/SKILL.md +3 -0
- package/bundled-skills/super-code/swift/SKILL.md +3 -0
- package/bundled-skills/super-code/typescript/SKILL.md +3 -0
- package/bundled-skills/telegram-bot-messaging/README.md +185 -0
- package/bundled-skills/telegram-bot-messaging/SKILL.md +101 -0
- package/bundled-skills/telegram-bot-messaging/scripts/telegram.sh +420 -0
- package/bundled-skills/test-guard/SKILL.md +132 -0
- package/bundled-skills/test-guard/references/jest.md +50 -0
- package/bundled-skills/test-guard/references/llm-app-testing.md +40 -0
- package/bundled-skills/test-guard/references/phpunit.md +56 -0
- package/bundled-skills/test-guard/references/pytest.md +65 -0
- package/bundled-skills/trading-ledger/SKILL.md +11 -3
- package/bundled-skills/uizze-ui-research/SKILL.md +93 -0
- package/bundled-skills/vibe-code-auditor/SKILL.md +1 -1
- package/bundled-skills/vibecode-production-qa-validator/SKILL.md +1 -1
- package/bundled-skills/videodb/scripts/ws_listener.py +29 -15
- package/bundled-skills/voice-ai-engine-development/README.md +1 -1
- package/bundled-skills/vulnerability-scanner/SKILL.md +1 -1
- package/bundled-skills/warehouse/SKILL.md +154 -0
- package/bundled-skills/woo-guard/SKILL.md +113 -0
- package/bundled-skills/woo-guard/references/checkout-and-money.md +64 -0
- package/bundled-skills/woo-guard/references/hpos-and-crud.md +87 -0
- package/bundled-skills/woo-guard/references/review-checklist.md +44 -0
- package/bundled-skills/woo-guard/references/sources.md +17 -0
- package/bundled-skills/wp-guard/SKILL.md +119 -0
- package/bundled-skills/wp-guard/references/i18n.md +88 -0
- package/bundled-skills/wp-guard/references/performance.md +70 -0
- package/bundled-skills/wp-guard/references/review-checklist.md +57 -0
- package/bundled-skills/wp-guard/references/security.md +100 -0
- package/bundled-skills/wp-guard/references/sources.md +27 -0
- package/bundled-skills/writing-skills/gotchas.md +1 -1
- package/bundled-skills/writing-skills/references/standards/metadata-standard.md +1 -1
- package/bundled-skills/x-twitter-scraper/SKILL.md +14 -32
- package/bundled-skills/xss-html-injection/SKILL.md +3 -3
- package/bundled-skills/youtube-seo-optimizer/SKILL.md +1 -1
- package/bundled-skills/youtube-summarizer/CHANGELOG.md +2 -2
- package/package.json +1 -1
- 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).
|