From 1697abebf0fdf903bc09ad6bb9984bcd5a6a4741 Mon Sep 17 00:00:00 2001 From: tyler555g Date: Sun, 19 Apr 2026 12:02:11 -0400 Subject: [PATCH 1/9] feat: add GitHub Copilot CLI support + 12-factor improvements to all skills - Add package.json for npm install -g deployment to all agent skill dirs - Add scripts/postinstall.js to auto-install into ~/.copilot/skills, ~/.claude/skills - Add commitlint.config.js for Conventional Commits enforcement - Add .changeset/ for version tracking and changelog generation - Update README with Copilot CLI install steps and compatible agents table - Apply 12-factor agents improvements to all 10 SKILL.md files: - memory-tasks: F5 unified state, F6 pause/resume protocols, F12 stateless reducer - memory-notes: F3 context hygiene section, pre-fetch pattern - memory-reflect: F9 reframed as context compaction - memory-defrag: F9 resolved error traces as cleanup target - memory-ingest: F3 structure-for-retrieval guidance - memory-research: F3 context investment framing - memory-metadata-search: F3 precision context retrieval - memory-schema: F5 single source of truth clarification - memory-lifecycle: F5 folder-as-state, F6 archive/reactivate = pause/resume - memory-literary-analysis: F12 stateless reducer pipeline, F3 pre-fetch pattern Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8a719a9e-819f-4414-bedb-a9f1fdc85d32 --- .changeset/README.md | 8 + .changeset/add-copilot-cli-support.md | 15 ++ .changeset/config.json | 11 ++ .mcp.json | 13 +- README.md | 237 +++++++++++++++++++------- commitlint.config.js | 1 + memory-defrag/SKILL.md | 44 ++++- memory-ingest/SKILL.md | 24 ++- memory-lifecycle/SKILL.md | 26 ++- memory-literary-analysis/SKILL.md | 91 +++++++++- memory-metadata-search/SKILL.md | 42 ++++- memory-notes/SKILL.md | 45 ++++- memory-reflect/SKILL.md | 78 +++++++-- memory-research/SKILL.md | 50 ++++-- memory-schema/SKILL.md | 19 ++- memory-tasks/SKILL.md | 101 ++++++++--- package.json | 44 +++++ scripts/postinstall.js | 72 ++++++++ 18 files changed, 775 insertions(+), 146 deletions(-) create mode 100644 .changeset/README.md create mode 100644 .changeset/add-copilot-cli-support.md create mode 100644 .changeset/config.json create mode 100644 commitlint.config.js create mode 100644 package.json create mode 100644 scripts/postinstall.js diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..654c6d4 --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets). + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md). diff --git a/.changeset/add-copilot-cli-support.md b/.changeset/add-copilot-cli-support.md new file mode 100644 index 0000000..f48de06 --- /dev/null +++ b/.changeset/add-copilot-cli-support.md @@ -0,0 +1,15 @@ +--- +"copilot-memory-skills": minor +# NOTE for upstream (basicmachines-co/basic-memory-skills): +# Replace package name above with "basic-memory-skills" upon merge +--- + +feat: add GitHub Copilot CLI support and 12-factor agent improvements + +- Added GitHub Copilot CLI as a supported agent target (~/.copilot/skills) +- Applied 12-Factor Agents principles (https://github.com/humanlayer/12-factor-agents) to all 10 SKILL.md files +- Added npm postinstall script supporting Copilot CLI, Claude Code, and future agents +- Updated README with npm install instructions and compatible agents section + +Co-authored-by: GitHub Copilot CLI v1.0.32 (claude-sonnet-4.6) <223556219+Copilot@users.noreply.github.com> +Copilot-Session: 8a719a9e-819f-4414-bedb-a9f1fdc85d32 diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..fce1c26 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.mcp.json b/.mcp.json index 6d6cad6..b1055c1 100644 --- a/.mcp.json +++ b/.mcp.json @@ -1,14 +1,9 @@ { "mcpServers": { "basic-memory": { - "command": "uv", - "args": [ - "--directory", - "/Users/phernandez/dev/basicmachines/basic-memory", - "run", - "src/basic_memory/cli/main.py", - "mcp" - ] + "command": "uvx", + "args": ["basic-memory", "mcp"], + "env": {} } } -} \ No newline at end of file +} diff --git a/README.md b/README.md index 469791e..bdb1c7f 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,71 @@ -# basic-memory-skills +# copilot-memory-skills -Skills for [Basic Memory](https://github.com/basicmachines-co/basic-memory) — teach AI coding agents how to use Basic Memory's MCP tools effectively. +Skills for [GitHub Copilot CLI](https://docs.github.com/en/copilot/github-copilot-in-the-cli) that connect your agent to [Basic Memory](https://github.com/basicmachines-co/basic-memory) — a local knowledge graph that persists across sessions. -## What Are Skills? +Derived from [`basicmachines-co/basic-memory-skills`](https://github.com/basicmachines-co/basic-memory-skills) (MIT License). Improved with [12-factor-agents](https://github.com/humanlayer/12-factor-agents) principles for better context management, state handling, and session resilience. -Skills are markdown instruction files (`SKILL.md`) that AI agents load for domain-specific guidance. Each skill contains structured knowledge about *when* and *how* to use specific tools, with examples and best practices. +--- -Basic Memory provides the MCP server — tools like `write_note`, `search_notes`, and `build_context` for managing a local-first knowledge graph. These skills teach agents how to use those tools well: when to create tasks vs. notes, how to structure observations for searchability, when to run schema validation, and more. +## What This Gives You -## Skills +Without Basic Memory, your Copilot CLI agent starts fresh every session. With it, your agent remembers: +- Decisions made and why +- Active tasks and their state +- People, organizations, and concepts you've discussed +- Project context across weeks or months of work -| Skill | Description | When to use | -|-------|-------------|-------------| -| **memory-tasks** | Structured task tracking that survives context compaction. Creates typed `Task` notes with steps, status, and context. | Multi-step work (3+ steps), anything that might outlast a context window, or after compaction to resume. | -| **memory-schema** | Schema lifecycle management — discover unschemaed notes, infer schemas, create/edit definitions, validate, and detect drift. | When structured note types emerge (Task, Person, Meeting, etc.) and you want consistency. | -| **memory-reflect** | Sleep-time memory reflection. Reviews recent conversations and daily notes, extracts insights, consolidates into long-term memory. Inspired by [sleep-time compute](https://www.letta.com/blog/sleep-time-compute). | Schedule via cron (1-2x daily), trigger from heartbeat, or run on demand. | -| **memory-notes** | How to write well-structured notes — frontmatter, observations with semantic categories, relations with wiki-links, and best practices. | When creating or improving notes, or when you need a reference for the note format. | -| **memory-metadata-search** | Structured metadata search — query notes by custom frontmatter fields using equality, range, array, and nested filters. | When finding notes by status, priority, confidence, or any custom YAML field. | -| **memory-defrag** | Memory defragmentation — split bloated files, merge duplicates, remove stale information, restructure the hierarchy. | Run weekly/biweekly via cron, or on demand when memory feels messy. | -| **memory-lifecycle** | Entity lifecycle management — status transitions through folder-based organization, archiving completed work. Core principle: archive, never delete. | When marking items complete, archiving old entities, or managing folder-based status workflows. | -| **memory-ingest** | Process unstructured external input into structured entities. Parses meeting transcripts, conversation logs, and pasted documents. | When pasting a transcript, conversation log, or external document that should become structured knowledge. | -| **memory-research** | Web research synthesized into Basic Memory entities. Researches a subject, checks for existing knowledge, presents findings, and creates entity notes. | When asked to research a company, person, technology, or topic. | -| **memory-literary-analysis** | Analyze a complete literary work into a structured knowledge graph — characters, themes, chapters, locations, symbols, and literary devices. | Full-text literary analysis, book club companions, teaching resources, or research projects. | +These skills teach your agent *how to use* Basic Memory effectively — not just the API calls, but the patterns that make a knowledge graph actually useful. -## Basic Memory Cloud +--- -Everything works locally — cloud adds cross-device, team, and production capabilities: +## Prerequisites -- **Your agent's memory travels with you** — same knowledge graph on laptop, desktop, and hosted environments -- **Team knowledge sharing** — org workspaces let multiple agents and team members build on a shared knowledge base -- **Durable memory for production agents** — persistent memory that survives CI teardowns and container restarts -- **Multi-agent coordination** — multiple agents can read and write to the same graph +### 1. Install Basic Memory -Cloud extends local-first — still plain markdown, still yours. Start with a [7-day free trial](https://basicmemory.com) and use code `BMFOSS` for 20% off for 3 months. +```bash +pip install basic-memory +``` -## Installation +Or see the [full install guide](https://github.com/basicmachines-co/basic-memory#installation). -### Via npx skills (recommended) +### 2. Configure the MCP Server -Install or update skills using the [Skills CLI](https://github.com/vercel-labs/skills): +Copy `.mcp.json` from this repo into your project root (or `~/.copilot/`): ```bash -# Install all skills -npx skills add basicmachines-co/basic-memory-skills +cp .mcp.json /path/to/your/project/ +``` -# Install a specific skill -npx skills add basicmachines-co/basic-memory-skills --skill memory-tasks +Then connect in Copilot CLI: + +``` +/mcp +``` + +Verify the Basic Memory tools are available — you should see `write_note`, `read_note`, `search_notes`, etc. + +### 3. Install These Skills + +**Option A — npm (recommended):** + +```bash +npm install -g copilot-memory-skills +``` + +Skills are automatically copied to `~/.copilot/skills/` (and `~/.claude/skills/` if present). Then in Copilot CLI: + +``` +/skills reload +``` -# Install all skills for a specific agent -npx skills add basicmachines-co/basic-memory-skills --agent claude +**Option B — npx (other agents):** -# List available skills without installing -npx skills add basicmachines-co/basic-memory-skills --list +```bash +# Install all skills +npx skills add tyler555g/copilot-memory-skills + +# Install a specific skill +npx skills add tyler555g/copilot-memory-skills --skill memory-tasks # Check for updates npx skills check @@ -60,58 +74,155 @@ npx skills check npx skills update ``` -Skills are installed to your agent's skills directory (e.g., `~/.claude/skills/` for Claude Code global, or `.claude/skills/` for project-scoped). +**Option C — manual:** -### Claude Desktop (claude.ai) +Clone this repo and copy any skill folder into `~/.copilot/skills/`: -Claude Desktop loads skills through **Settings > Capabilities**: +```bash +git clone https://github.com/tyler555g/copilot-memory-skills +cp -r copilot-memory-skills/memory-* ~/.copilot/skills/ +``` + +Then in Copilot CLI: + +``` +/skills reload +``` -1. Clone or download this repository -2. In Claude, go to **Settings > Capabilities** and ensure both **Code execution** and **Skills** are enabled -3. Click **Upload skill** and upload the `SKILL.md` file (or ZIP the skill folder and upload that) -4. Toggle the skill on — Claude will use it automatically when relevant +--- -Repeat for each skill you want. Custom uploaded skills are private to your account. +## Skills -> **Tip:** Start with **memory-notes** (core note-writing patterns) and add others as needed. You don't need all 9 at once. +| Skill | Use When | Key 12-Factor Improvement | +|-------|----------|--------------------------| +| **memory-notes** | Creating or updating notes in your knowledge graph | F3: Context hygiene + pre-fetch pattern | +| **memory-tasks** | Tracking multi-step work across sessions | F12: Stateless reducer framing; F5: single source of truth; F6: explicit pause/resume protocols | +| **memory-reflect** | Consolidating recent activity into long-term memory | F9: Reflection = context compaction, not journaling | +| **memory-ingest** | Turning meeting notes, transcripts, or documents into structured entities | F3: Structure entities for retrieval, not storage | +| **memory-research** | Researching companies, people, technologies | F3: Capture why you searched, not just what you found | +| **memory-schema** | Defining and managing structured note types | F4: Schemas = typed agent outputs; F5: clarified dual-location rationale | +| **memory-defrag** | Cleaning up bloated or fragmented memory files | F9: Resolved error traces as explicit defrag target | +| **memory-lifecycle** | Archiving completed work, managing entity status | F5: Folder = canonical status; F6: archive=pause, reactivate=resume | +| **memory-metadata-search** | Finding notes by structured frontmatter fields | F3: Precision context retrieval pattern | +| **memory-literary-analysis** | Analyzing a book or literary work end-to-end | F12: Stateless reducer at scale; F3: seed entities = pre-fetch pattern | -See [Using Skills in Claude](https://support.claude.com/en/articles/12512180-using-skills-in-claude) for more details. +--- -### Manual install +## 12-Factor-Agents Principles Applied -Copy skill directories into your agent's skills folder: +These skills are improved versions of the originals. Each improvement applies a specific principle from [12-factor-agents](https://github.com/humanlayer/12-factor-agents): -```bash -# Claude Code — global -cp -r memory-tasks ~/.claude/skills/ -cp -r memory-notes ~/.claude/skills/ -# ... etc. +### Factor 3 — Own Your Context Window +Notes retrieved from Basic Memory enter your context window and cost tokens. These skills add explicit guidance on: +- **Context hygiene**: what NOT to put in notes (resolved errors, stale status, raw logs) +- **Pre-fetch pattern**: load relevant context at session start, not piecemeal mid-task +- **Structure for retrieval**: write notes so future agents get exactly what they need + +Applied to: `memory-notes`, `memory-ingest`, `memory-research`, `memory-metadata-search`, `memory-literary-analysis` + +### Factor 5 — Unified Execution State +Your knowledge graph is the state. These skills clarify: +- The task note IS the execution state — not a record of it +- Why fields appear in both frontmatter and observations (different consumers, not duplication) +- Folder location as canonical status (not frontmatter) -# Claude Code — project-scoped -cp -r memory-tasks .claude/skills/ +Applied to: `memory-tasks`, `memory-schema`, `memory-lifecycle` + +### Factor 6 — Launch/Pause/Resume +Context compaction ends sessions unexpectedly. These skills formalize: +- **Pause protocol**: what to flush before `/compact` or session end +- **Resume protocol**: search → read → validate step → continue +- Archive/reactivate as entity-level pause/resume + +Applied to: `memory-tasks`, `memory-lifecycle` + +### Factor 9 — Compact Errors Into Context +Stale information degrades your knowledge graph over time. These skills add: +- Reflection as context compaction, not journaling (strip resolved errors, superseded decisions) +- "Resolved error traces" as an explicit defrag target +- The fresh-agent test: "Would this note help or mislead a fresh agent?" + +Applied to: `memory-reflect`, `memory-defrag` + +### Factor 12 — Stateless Reducer +Each Copilot CLI session is stateless. The knowledge graph is the accumulated state. These skills frame Basic Memory as a stateless reducer: -# Any agent that reads SKILL.md files -cp -r memory-tasks / ``` +Each session: read state → process → write state → exit +``` + +Applied to: `memory-tasks`, `memory-literary-analysis`, and as framing in `memory-notes` + +--- + +## Basic Memory Cloud -### Bundled with OpenClaw plugin +Everything works locally — cloud adds cross-device, team, and production capabilities: + +- **Your agent's memory travels with you** — same knowledge graph on laptop, desktop, and hosted environments +- **Team knowledge sharing** — org workspaces let multiple agents and team members build on a shared knowledge base +- **Durable memory for production agents** — persistent memory that survives CI teardowns and container restarts +- **Multi-agent coordination** — multiple agents can read and write to the same graph + +Cloud extends local-first — still plain markdown, still yours. Start with a [7-day free trial](https://basicmemory.com) and use code `BMFOSS` for 20% off for 3 months. -All 9 skills are also bundled in the [`@basicmemory/openclaw-basic-memory`](https://github.com/basicmachines-co/openclaw-basic-memory) plugin — no extra install step needed if you use OpenClaw. +--- ## Compatible Agents These skills work with any AI coding agent that supports the SKILL.md format: -- **Claude Desktop** — upload skill ZIPs via Settings > Capabilities +- **GitHub Copilot CLI** — primary target; uses `~/.copilot/skills/` - **Claude Code** — loads skills from `~/.claude/skills/` or `.claude/skills/` +- **Claude Desktop** — upload skill ZIPs via Settings > Capabilities - **Cursor** — AI-powered coding with skill support - **Windsurf** — agent-based development with skill loading - **Any agent** supporting markdown-based skill files -## Development +--- + +## Workflow Examples + +### Start of any session + +``` +/skills memory-tasks +→ "Search for active tasks and resume" +``` + +The agent will search for active tasks, read the current one, validate the step, and continue. + +### After a meeting + +``` +/skills memory-ingest +→ [paste transcript] +``` + +The agent parses the content, searches for existing entities, proposes new ones for your approval, and creates structured notes. + +### Weekly maintenance + +``` +/skills memory-reflect +/skills memory-defrag +``` + +Consolidate insights into MEMORY.md, then clean up fragmented or stale content. + +--- + +## Attribution + +This repo is derived from [`basicmachines-co/basic-memory-skills`](https://github.com/basicmachines-co/basic-memory-skills), which is the original source of all 10 skill workflows. Licensed under MIT. + +Improvements applied in this fork: +- Copilot CLI compatibility framing +- 12-factor-agents principle integration (per-skill, not just as documentation) +- Enhanced protocols for context hygiene, pause/resume, error compaction -See [DEVELOPMENT.md](./DEVELOPMENT.md) for testing and contribution details. +--- ## License -MIT +MIT — see original source for full license text. diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..3f5e287 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1 @@ +export default { extends: ['@commitlint/config-conventional'] }; diff --git a/memory-defrag/SKILL.md b/memory-defrag/SKILL.md index e079a67..a1aa877 100644 --- a/memory-defrag/SKILL.md +++ b/memory-defrag/SKILL.md @@ -1,12 +1,17 @@ --- name: memory-defrag -description: "Defragment and reorganize agent memory files: split bloated files, merge duplicates, remove stale information, and restructure the memory hierarchy. Use when memory files have grown unwieldy, contain redundancies, or need reorganization. Run periodically (weekly) or on demand." +description: "Defragment and reorganize agent memory files: split bloated files, merge duplicates, remove stale information, and restructure the memory hierarchy. Applies Factor 9 (compact errors into context) — defrag strips resolved error traces, stale state, and noise that degrades context quality. Run weekly or on demand." --- # Memory Defrag Reorganize memory files for clarity, efficiency, and relevance. Like filesystem defragmentation but for knowledge. +> **Factor 9 — Compact Errors Into Context:** Defrag is the scheduled application of context compaction. The goal is not just reorganization — it's noise removal. Resolved error traces, failed-attempt histories, superseded workarounds, and stale status logs are all context pollution. A defragged knowledge base gives future agents better signal per token. +> +> **The fresh-agent test:** Before each note, ask: "If I gave this to a fresh agent with zero context about this project, would it help them make better decisions — or would it confuse or mislead them?" Remove what fails this test. + + ## When to Run - **Periodic**: Weekly or biweekly via cron (recommended) @@ -35,17 +40,47 @@ Look for these common issues: | **Bloated file** | >300 lines, covers many topics | Split into focused files | | **Duplicate info** | Same fact in multiple places | Consolidate to one location | | **Stale entries** | References to completed work, old dates, resolved issues | Remove or archive | +| **Resolved error traces** | Debugging logs, failed-attempt history, closed-issue workarounds | Remove — these are context noise once resolved | | **Orphan files** | Files in memory/ never referenced or updated | Review, merge, or remove | | **Inconsistencies** | Contradictory information across files | Resolve to ground truth | | **Poor organization** | Related info scattered across files | Restructure by topic | | **Recursive nesting** | `memory/memory/memory/...` directories | Delete nested dirs (indexer bug artifact) | +### Resolved Error Traces (Factor 9) + +Resolved error traces deserve special attention. These are: +- Debugging step-by-step logs from incidents that are now closed +- "Tried X, failed because Y" histories where the issue is resolved +- Workaround instructions for bugs that have been fixed +- Error symptoms and their old diagnoses when the root cause is gone + +**Why they're harmful:** When retrieved as context, they look like current problems. A fresh agent reading "reconnect loop crashes the server — workaround: restart manually" doesn't know it was fixed last week. This creates false alerts and wastes context budget on phantom issues. + +**The rule:** Once an issue is resolved and the fix is documented or deployed, remove the error trace. If there's a lesson worth preserving, distill it to a `[lesson]` observation — one line, not a log. + +```python +# Before: three lines of error context (stale) +# - [issue] MCP server crashes on reconnect — repro: disconnect and reconnect rapidly +# - [workaround] Restart the MCP server manually after each disconnect +# - [status] investigating + +# After: one line of distilled lesson (current) +edit_note( + identifier="MEMORY", + operation="find_replace", + find_text="- [issue] MCP server crashes on reconnect...\n- [workaround]...\n- [status] investigating", + content="- [lesson] MCP reconnect stability: fixed in v2.1.0 — upgrade if seeing crashes #mcp" +) +``` + + ### 3. Plan Changes Before making edits, write a brief plan: ```markdown ## Defrag Plan - [ ] Split MEMORY.md "Key People" section → memory/people.md +- [ ] Remove resolved error traces (3 entries) from MEMORY.md - [ ] Remove completed tasks older than 30 days from memory/tasks/ - [ ] Merge memory/bm-marketing-ideas.md into memory/competitive/ - [ ] Update stale project status entries in MEMORY.md @@ -59,11 +94,12 @@ Apply changes one at a time: - **Prune**: Remove information that is no longer relevant or accurate - **Restructure**: Move files to appropriate directories, rename for clarity - **Update**: Fix outdated facts, dates, statuses +- **Strip error traces**: Remove resolved debugging history — leave only lessons ### 5. Verify & Log After changes: -- Verify no information was lost (compare before/after) +- Verify no valuable information was lost (compare before/after signal, not just line count) - Update any cross-references between files - Log what was done in today's daily note: @@ -73,14 +109,16 @@ After changes: - Split: [list] - Merged: [list] - Pruned: [list] +- Error traces removed: [count] - Net result: X files, Y total lines (was Z lines) ``` ## Guidelines - **Preserve raw daily notes.** Don't delete or modify `memory/YYYY-MM-DD.md` files — they're the audit trail. -- **Target 15-25 focused files.** Too few means bloated files; too many means fragmentation. Aim for the sweet spot. +- **Target 15-25 focused files.** Too few means bloated files; too many means fragmentation. - **File names should be scannable.** Use descriptive names: `people.md`, `project-status.md`, `competitive-landscape.md` — not `notes-2.md`. - **Don't over-organize.** One level of directories is usually enough. `memory/tasks/` and `memory/competitive/` are fine; `memory/work/projects/active/basic-memory/notes/` is not. - **Completed tasks**: Tasks with `status: done` older than 14 days can be removed. Their insights should already be in MEMORY.md via reflection. - **Ask before destructive changes.** If uncertain whether information is still relevant, keep it with a `(review needed)` tag rather than deleting. +- **Distill, don't just remove.** When pruning error traces or stale observations, ask if there's a one-line lesson worth keeping before deleting entirely. diff --git a/memory-ingest/SKILL.md b/memory-ingest/SKILL.md index 438a3dd..92d8fa7 100644 --- a/memory-ingest/SKILL.md +++ b/memory-ingest/SKILL.md @@ -1,12 +1,15 @@ --- name: memory-ingest -description: "Process unstructured external input (meeting transcripts, conversation logs, pasted documents) into structured Basic Memory entities. Extracts entities, searches for existing matches, proposes new entities with approval, creates notes with observations and relations, and captures action items." +description: "Process unstructured external input (meeting transcripts, conversation logs, pasted documents) into structured Basic Memory entities. Applies Factor 3 (own your context window) — structure entities for retrieval, not storage. Extracts entities, searches for matches, proposes with approval, creates notes." --- # Memory Ingest Turn raw, unstructured input into structured Basic Memory entities. Meeting transcripts, conversation logs, pasted documents, email threads — anything with information worth preserving gets parsed, cross-referenced against existing knowledge, and written as proper notes. +> **Factor 3 — Own Your Context Window:** Every entity you create is a future context investment. Structure notes not just to store information, but so that a future agent can retrieve exactly what it needs to make the next decision. Ask: "Will this note give a future agent what it needs?" + + ## When to Use - User pastes a meeting transcript or conversation log @@ -25,6 +28,7 @@ Turn raw, unstructured input into structured Basic Memory entities. Meeting tran 6. Create source note → verbatim content + observations + relations 7. Create approved entities → structured notes for each new entity 8. Extract action items → follow-ups and commitments +9. Verify traversability → confirm the graph is connected ``` ## Step 1: Parse Raw Input @@ -113,6 +117,9 @@ Include enough context with each proposed entity for the user to make a quick de Create the primary note for the ingested content. This is the "record of what happened" — it preserves the raw material and adds structured metadata. +> **Factor 3 — Structure for retrieval:** When writing observations, ask: "Will this category help a future agent find this note when searching for related information?" Use categories that answer the *purpose* of the content, not just its format. + + ### Meeting / Conversation Note ```python @@ -281,6 +288,7 @@ write_note( Adapt templates to your domain. The key elements are: type and tags as parameters, an overview section, observations with categories, and relations linking back to the source. + ## Step 8: Extract Action Items Review the source content for commitments and follow-ups: @@ -297,6 +305,20 @@ Follow-Up Reminders: If using the **memory-tasks** skill, create Task notes for your action items. Otherwise, capture them as observations in the source note. +## Step 9: Verify Graph Traversability + +After creating all entities, verify the graph is properly connected: + +```python +# Build context starting from the source note — should traverse to all related entities +build_context(url="memory://meetings/2026/novatech-meeting-jordan-rivera-feb-22-2026") +``` + +If key entities don't appear in the traversal, check that relations were written correctly. A disconnected entity is harder for future sessions to find via `build_context`. + +> **Factor 3 — Context investment payoff:** The traversability check ensures your ingest work actually pays off in future sessions. An entity that can't be reached from its source note via `build_context` may as well not exist. + + ## Guidelines - **Preserve source content verbatim.** The original text is the ground truth. Structure and observations are your interpretation layered on top. diff --git a/memory-lifecycle/SKILL.md b/memory-lifecycle/SKILL.md index 588f5a0..6c6aad2 100644 --- a/memory-lifecycle/SKILL.md +++ b/memory-lifecycle/SKILL.md @@ -1,12 +1,19 @@ --- name: memory-lifecycle -description: "Manage entity status transitions in Basic Memory: archive completed work, move notes between status folders, update frontmatter, and handle edge cases. Use when marking items complete, archiving old entities, or managing any folder-based status workflow." +description: "Manage entity status transitions in Basic Memory: archive completed work, move notes between status folders, update frontmatter, and handle edge cases. Applies Factor 5 (folder IS the canonical status) and Factor 6 (archive=pause, reactivate=resume). Core principle: archive, never delete." --- # Memory Lifecycle Manage how entities move through status stages in Basic Memory. The core principle: **archive, never delete.** Completed work is valuable context — move it out of the active view, but keep it in the knowledge graph. +> **Factor 5 — Unified Execution State:** The folder location IS the canonical status. The system doesn't maintain a separate status registry — the path is the state. `tasks/active/my-task.md` is active. `tasks/completed/my-task.md` is done. You don't need to check a status field to know; the filesystem tells you. +> +> This also means: **move first, then update frontmatter.** The folder move is the authoritative state transition. The frontmatter update is a secondary synchronization step to keep metadata search consistent. + +> **Factor 6 — Launch/Pause/Resume:** The lifecycle pattern implements Factor 6 at the entity level. Archiving is pausing — the entity is preserved but removed from the active view. Reactivating is resuming — you restore it to the active path and pick up where you left off. The entity note is the state that makes resume possible. + + ## When to Use - User says something is "done", "finished", "completed", "submitted", "missed", or "cancelled" @@ -85,9 +92,9 @@ If multiple matches come back, present options and ask which one. If no match is found, ask for clarification — don't guess. -### 2. Move the File +### 2. Move the File (Factor 5 — Primary State Transition) -Use `move_note` to relocate the entity to the appropriate status folder: +Use `move_note` to relocate the entity to the appropriate status folder. This is the canonical state change: ```python move_note( @@ -98,9 +105,9 @@ move_note( The permalink stays the same, so all existing `[[wiki-links]]` and `memory://` URLs continue to resolve. -### 3. Update Frontmatter +### 3. Update Frontmatter (Secondary Synchronization) -After moving, update the status in frontmatter to match: +After moving, update the status in frontmatter to match — this keeps metadata search consistent: ```python edit_note( @@ -144,16 +151,18 @@ If the entity is already in an archive/completed folder, notify the user: Sometimes only part of an entity is done. Don't move it — instead, update observations or status notes within the entity to reflect partial progress. -### Revert / Reactivate +### Revert / Reactivate (Resume Protocol) -If something was archived by mistake, move it back: +If something was archived by mistake, or a paused item needs to resume: ```python +# Move back to active (primary state transition) move_note( identifier="tasks/completed/quarterly-report", destination_path="tasks/active/quarterly-report.md" ) +# Sync frontmatter (secondary synchronization) edit_note( identifier="quarterly-report", operation="find_replace", @@ -162,6 +171,9 @@ edit_note( ) ``` +> **Factor 6 — Resume:** The entity note contains everything needed to resume the work. Before reactivating, read the note to understand where the entity was when it was archived. The context in the note IS the resume state. + + ### Status Without Movement Some status changes don't require a folder move — "paused" or "blocked" items often stay in `active/` with just a frontmatter update. Reserve folder moves for terminal or major state transitions. diff --git a/memory-literary-analysis/SKILL.md b/memory-literary-analysis/SKILL.md index 26d2036..7f16011 100644 --- a/memory-literary-analysis/SKILL.md +++ b/memory-literary-analysis/SKILL.md @@ -1,12 +1,24 @@ --- name: memory-literary-analysis -description: "Analyze a complete literary work into a structured Basic Memory knowledge graph. Covers schema design, entity seeding, chapter-by-chapter processing, cross-referencing, validation, and visualization." +description: "Analyze a complete literary work into a structured Basic Memory knowledge graph. Covers schema design, entity seeding, chapter-by-chapter processing, cross-referencing, validation, and visualization. Applies Factor 12 (stateless reducer at scale) and Factor 3 (seed entities as pre-fetch targets)." --- # Memory Literary Analysis Transform a complete literary work into a structured knowledge graph. Characters, themes, chapters, locations, symbols, and literary devices become interconnected notes — searchable, validatable, and visualizable. +> **Factor 12 — Stateless Reducer at Scale:** This pipeline IS the stateless reducer pattern applied to literary analysis. Each chapter-processing session is a stateless reducer: +> +> 1. **Read state** — load the processing task note + any relevant entity stubs +> 2. **Process** — analyze the current chapter batch, create/enrich notes +> 3. **Write state** — update the task note (current batch, progress), write enriched entity notes +> 4. **Exit** — the knowledge graph accumulates state; each agent session is stateless +> +> The knowledge graph grows across sessions. The agent starts fresh every time. The task note is the checkpoint that makes this work. Use the **memory-tasks** skill to create it. + +> **Factor 3 — Phase 1 Seed = Pre-fetch Pattern:** Creating entity stubs before processing chapters is the pre-fetch pattern applied to literary analysis. You create `[[wiki-link]]` targets in advance so future agents can traverse the graph immediately, without needing to search for entities that should exist. Seed first; enrich later. + + ## When to Use - Analyzing a novel, play, poem, or non-fiction book end-to-end @@ -19,8 +31,8 @@ Transform a complete literary work into a structured knowledge graph. Characters ``` Phase 0: Setup → project, schemas, directory structure -Phase 1: Seed → stub notes for known major entities -Phase 2: Process → chapter-by-chapter notes in batches +Phase 1: Seed → stub notes for known major entities (pre-fetch pattern) +Phase 2: Process → chapter-by-chapter notes in batches (stateless reducer loop) Phase 3: Cross-ref → enrich arcs, add parallels, write analysis Phase 4: Validate → schema checks, drift detection, consistency Phase 5: Visualize → canvas files for character webs, timelines @@ -222,10 +234,12 @@ Schema for literary technique and device notes. symbols/ # symbolic elements literary-devices/ # techniques and devices analysis/ # cross-cutting synthesis - tasks/ # processing tracker + tasks/ # processing tracker (critical for stateless reducer) ``` -## Phase 1: Seed Entities +## Phase 1: Seed Entities (Pre-fetch Pattern) + +> **Factor 3 — Pre-fetch:** Seed entities before processing chapters. This creates `[[wiki-link]]` targets that resolve immediately during chapter processing, so each session can traverse the graph without needing to search for entities that should exist. Stubs are cheap to create; missing link targets break graph traversal. Before processing chapters, create stub notes for major entities so `[[wiki-links]]` resolve from the start. @@ -265,7 +279,54 @@ Identify the work's major entities before you start reading. A good starting inv Stubs don't need to be complete — they give `[[wiki-link]]` targets and will be enriched during chapter processing. -## Phase 2: Chapter Processing +### Create the Processing Task + +Before any chapter processing begins, create a Task note to track progress across sessions: + +```python +write_note( + title=" - Literary Analysis", + directory="tasks", + note_type="Task", + metadata={ + "status": "active", + "current_step": 1, + "steps": ["Phase 1: Seed entities", "Phase 2: Batch 1 (Ch 1-10)", "Phase 2: Batch 2 (Ch 11-20)", "..."] + }, + tags=["task", "literary-analysis"], + content="""# - Literary Analysis + +## Context +Processing into a Basic Memory knowledge graph. +Current phase: [update as you progress] +Last session: [update with what you did and where you stopped] + +## Steps +1. [ ] Phase 1: Seed entities (schemas + stubs) +2. [ ] Phase 2: Batch 1 (Ch 1-10) +... + +## Relations +- tracks [[]]""" +) +``` + +This task note is your checkpoint across sessions. Update it before every `/compact` event. + +## Phase 2: Chapter Processing (Stateless Reducer Loop) + +### Session Start Protocol + +Each chapter-processing session begins the same way: + +```python +# 1. Read state — find the processing task +search_notes(note_types=["task"], status="active") +read_note(identifier="tasks/work-name-literary-analysis") + +# 2. Validate step — confirm which batch to process next +# 3. Continue — process the next unchecked batch +``` ### Source Text Preparation @@ -285,6 +346,7 @@ Process ~10 chapters per batch to balance depth with progress. Group by narrativ Adjust batch size based on chapter length and density. Short, action-heavy chapters can be batched in larger groups; long, philosophically dense chapters may need smaller batches. + ### Per-Chapter Workflow For each chapter: @@ -339,7 +401,16 @@ edit_note( ) ``` -**4. Track progress** using the memory-tasks skill to create a processing task that survives context compaction. +**4. Update the processing task** before ending the session: + +```python +edit_note( + identifier="tasks/work-name-literary-analysis", + operation="find_replace", + find_text="- [ ] Phase 2: Batch 1 (Ch 1-10)", + content="- [x] Phase 2: Batch 1 (Ch 1-10)" +) +``` ### What to Capture Per Chapter @@ -371,8 +442,10 @@ After the structured observations are in place, consider adding interpretive pro - Include subjective opinions clearly marked as such ("In my reading...", "I find...") - Ground claims in textual evidence cited by chapter number + The prose adds the interpretive texture that structured observations alone cannot capture. + ## Phase 3: Cross-Referencing After all chapters are processed: @@ -405,7 +478,6 @@ Analysis of the work's narrative architecture. ... ## Relations -- analyzes [[]] - analyzes [[]] - explores [[]] ...""" @@ -426,6 +498,7 @@ During chapter processing, new minor characters, locations, and symbols will eme ```python # Validate each entity type + schema_validate(noteType="Character") schema_validate(noteType="Theme") schema_validate(noteType="Chapter") @@ -437,6 +510,7 @@ schema_validate(noteType="LiteraryDevice") ### Drift Detection ```python + schema_diff(noteType="Character") # ... for each type ``` @@ -461,6 +535,7 @@ canvas(query="type:Character AND role:protagonist OR role:antagonist OR role:sup canvas(query="type:Theme") # Chapter timeline with key events + canvas(query="type:Chapter", layout="timeline") ``` diff --git a/memory-metadata-search/SKILL.md b/memory-metadata-search/SKILL.md index f045600..7ede994 100644 --- a/memory-metadata-search/SKILL.md +++ b/memory-metadata-search/SKILL.md @@ -1,12 +1,27 @@ --- name: memory-metadata-search -description: "Structured metadata search for Basic Memory: query notes by custom frontmatter fields using equality, range, array, and nested filters. Use when finding notes by status, priority, confidence, or any custom YAML field rather than free-text content." +description: "Structured metadata search for Basic Memory: query notes by custom frontmatter fields using equality, range, array, and nested filters. Applies Factor 3 (precision context retrieval) and Factor 5 (consistent status fields). Use when finding notes by status, priority, confidence, or any custom YAML field." --- # Memory Metadata Search Find notes by their structured frontmatter fields instead of (or in addition to) free-text content. Any custom YAML key in a note's frontmatter beyond the standard set (`title`, `type`, `tags`, `permalink`, `schema`) is automatically indexed as `entity_metadata` and becomes queryable. +> **Factor 3 — Own Your Context Window:** Metadata search is precision context retrieval. Instead of loading all notes into context or running a broad text search that returns noise, use metadata filters to retrieve exactly the notes relevant to the current step. +> +> The pattern: **search precisely, load only what the next decision needs.** +> +> ```python +> # ❌ Broad — loads too much context +> search_notes("tasks") +> +> # ✅ Precise — loads exactly what's needed +> search_notes(note_types=["task"], status="active", metadata_filters={"assigned_to": "claude"}) +> ``` + +> **Factor 5 — Unified State:** Metadata filters work best when status fields are consistent across all notes of a type. If Task notes sometimes use `status: in-progress` and sometimes `status: active`, metadata filters become unreliable. Schemas enforce this consistency — use them. See the **memory-schema** skill. + + ## When to Use - **Filtering by status or priority** — find all notes with `status: draft` or `priority: high` @@ -173,6 +188,30 @@ search_notes("tag:security") search_notes("OAuth", metadata_filters={"status": "in-progress"}) ``` +## Context Retrieval Patterns (Factor 3) + +Metadata search is most powerful when used for session setup — retrieving precisely the right context before starting work: + +```python +# Session start: get your active work +search_notes(note_types=["task"], status="active") + +# Before a security review: get high-confidence security notes +search_notes(tags=["security"], metadata_filters={"confidence": {"$gte": 0.7}}) + +# Find everything that needs review +search_notes(metadata_filters={"status": {"$in": ["draft", "needs-review"]}}) + +# Scoped project context: only high-priority items in this project +search_notes( + metadata_filters={"priority": "high"}, + project="my-project" +) +``` + +The goal is always the same: load the minimum context that enables the next decision. Metadata filters are your precision instrument for achieving this. + + ## Guidelines - **Use metadata search for structured queries.** If you're looking for notes by a known field value (status, priority, type), metadata filters are more precise than text search. @@ -182,3 +221,4 @@ search_notes("OAuth", metadata_filters={"status": "in-progress"}) - **Omit `query` for filter-only searches.** `search_notes(metadata_filters={"status": "active"})` works without a text query. - **Dot notation for nesting.** Access nested YAML structures with dots: `{"schema.version": "2"}` queries the `version` key inside a `schema` object. - **Tags shortcut is convenient but limited.** `tags` and `status` are sugar for common fields. For anything else, use `metadata_filters` directly. +- **Consistency enables filtering.** Metadata filters require consistent values across notes. If you use `status: active` sometimes and `status: in-progress` other times for the same concept, filters break. Use schemas to enforce consistency. diff --git a/memory-notes/SKILL.md b/memory-notes/SKILL.md index 8c57cab..945b9e6 100644 --- a/memory-notes/SKILL.md +++ b/memory-notes/SKILL.md @@ -1,12 +1,15 @@ --- name: memory-notes -description: "How to write well-structured Basic Memory notes: frontmatter, observations with semantic categories, relations with wiki-links, and best practices for building a rich knowledge graph. Use when creating or improving notes." +description: "How to write well-structured Basic Memory notes: frontmatter, observations with semantic categories, relations with wiki-links, and best practices for building a rich knowledge graph. Includes context hygiene and pre-fetch patterns from 12-factor-agents (Factor 3). Use when creating or improving notes." --- # Memory Notes Write well-structured notes that Basic Memory can parse into a searchable knowledge graph. Every note is a markdown file with three key sections: frontmatter, observations, and relations. +> **Factor 12 — Stateless Reducer:** Your Copilot CLI session is stateless. Notes are the state. If it's not in a note, it doesn't exist in the next session. Write early and often. + + ## Note Anatomy ```markdown @@ -245,6 +248,43 @@ edit_note( This preserves existing content and keeps the edit history clean. +## Context Hygiene (Factor 3) + +> **Factor 3 — Own Your Context Window:** Notes that get returned to the LLM cost tokens. Every line in a note that enters context should earn its place. Structure notes for the agent that will read them, not for human completeness. + +### What NOT to Put in Notes (or to Remove Over Time) + +These patterns degrade context quality when a note is retrieved: + +| Anti-pattern | Why it hurts | Fix | +|---|---|---| +| Resolved error traces | Agent spends tokens on closed issues | Remove via `edit_note` after resolution | +| Stale `[status]` observations | "active" that's now done creates false state | Update in-place with `find_replace` | +| Raw log dumps | Noise — no decision-relevant signal | Summarize to `[insight]` / `[error]` observations | +| Superseded decisions | Contradicts current reality | Remove the old, keep the new with `replaces` relation | +| Meeting small talk / preamble | Zero knowledge graph value | Don't capture in the first place | +| "I tried X and it failed" logs | Once resolved, pure noise | Strip during reflection/defrag | + +**The test:** "If I gave this note to a fresh agent with no prior context, would every line help it make a better decision about this topic?" Remove what fails this test. + +### Pre-fetch Pattern (Front-load Relevant Context) + +Before starting any multi-step task, call `build_context` on related notes FIRST. This front-loads relevant knowledge into context before any tool calls that need it — rather than retrieving piecemeal as you go. + +```python +# ✅ Front-load at session start +build_context(url="memory://tasks/*") # active tasks +build_context(url="memory://architecture/api-design") # relevant domain notes +build_context(url="memory://project/current-sprint") # current work context + +# ❌ Piecemeal retrieval mid-task (forces round-trips) +# ... do some work ... +# search_notes("api design") # too late, context already fragmented +``` + +Build context early. Retrieve precisely. Every unnecessary search mid-task burns context budget. + + ## Writing Notes with Tools ### Creating a Note @@ -274,6 +314,7 @@ flexibility matters more. Basic Memory auto-generates frontmatter (including the permalink and memory URL) from the parameters. This note would get permalink `architecture/api-design-decisions` and be addressable at `memory://architecture/api-design-decisions`. + ### Editing an Existing Note Use `edit_note` to append, prepend, or find-and-replace within a note: @@ -313,7 +354,7 @@ The permalink stays the same after a move, so all `[[wiki-links]]` and `memory:/ 1. **Start with context.** Before listing observations, explain *why* this note exists. Future-you (or your AI collaborator) will thank you. -2. **Favor completeness.** Write rich, substantive notes. Basic Memory's search pulls relevant chunks from note bodies, so longer notes with more context are *more* discoverable, not less. Use prose in the body to tell the full story — the background, the reasoning, the nuance. Then distill key facts into `[category] content` observations for structured queries. Both matter: prose gives meaning, observations give precision. +2. **Favor completeness — but stay signal-dense.** Write rich, substantive notes. But every observation should earn its place. Prune stale entries; don't just append indefinitely. 3. **Build incrementally.** Add to existing notes rather than creating duplicates. Use `edit_note` to append new observations or relations as you learn more. diff --git a/memory-reflect/SKILL.md b/memory-reflect/SKILL.md index 5ef75d2..c733863 100644 --- a/memory-reflect/SKILL.md +++ b/memory-reflect/SKILL.md @@ -1,11 +1,13 @@ --- name: memory-reflect -description: "Sleep-time memory reflection: review recent conversations and daily notes, extract insights, and consolidate into long-term memory. Use when triggered by cron, heartbeat, or explicit request to reflect on recent activity. Runs as background processing to improve memory quality over time." +description: "Sleep-time memory reflection: review recent conversations and daily notes, extract insights, and consolidate into long-term memory. Applies 12-factor-agents Factor 9 (compact errors into context) — reflection is context compaction, not journaling. Use when triggered by cron, heartbeat, or explicit request." --- # Memory Reflect -Review recent activity and consolidate valuable insights into long-term memory. +Distill recent activity into durable long-term memory by compacting signal from noise. + +> **Factor 9 — Compact Errors Into Context:** Reflection is not archiving. It is *compaction*. The goal is not to preserve everything that happened — it is to distill what matters and discard what doesn't. MEMORY.md should shrink (or stay flat) as often as it grows. If it only ever grows, you're journaling, not reflecting. Inspired by sleep-time compute — the idea that memory formation happens best *between* active sessions, not during them. @@ -36,21 +38,55 @@ search_notes(note_types=["task"], status="active") ### 2. Evaluate What Matters -For each piece of information, ask: -- Is this a **decision** that affects future work? → Keep -- Is this a **lesson learned** or mistake to avoid? → Keep -- Is this a **preference** or working style insight? → Keep -- Is this a **relationship** detail (who does what, contact info)? → Keep -- Is this **transient** (weather checked, heartbeat ran, routine task)? → Skip -- Is this **already captured** in MEMORY.md or another long-term file? → Skip +For each piece of information, decide: **keep, strip, or defer?** + +**Keep** — distill this into MEMORY.md: +- A **decision** that affects future work +- A **lesson learned** or mistake to avoid +- A **preference** or working style insight +- A **relationship** detail (who does what, contact info) +- A **pattern** worth repeating or avoiding + +**Strip** — do not carry forward: +- Resolved error traces (debugging steps, failed attempts, workaround logs) +- Superseded decisions (the new decision supersedes the old — keep only the current one) +- Transient activity (weather checked, heartbeat ran, routine status polls) +- Content already captured in MEMORY.md — don't duplicate +- "I tried X and it failed" once the issue is resolved — this is noise, not lesson +- Session artifacts that had no lasting impact + +**Defer** — flag for later with `(needs confirmation)`: +- Seems important but you're not sure it's accurate +- Requires more data points before it becomes a pattern + +The compaction test: *If I removed this from MEMORY.md, would future sessions be worse off?* If no, remove it. ### 3. Update Long-Term Memory Write consolidated insights to `MEMORY.md` following its existing structure: -- Add new sections or update existing ones +- **Add new sections or update existing ones in-place** — merge, don't append - Use concise, factual language - Include dates for temporal context -- Remove or update outdated entries that the new information supersedes +- **Remove or update outdated entries** that the new information supersedes +- **Restructure over time** — if MEMORY.md is a chronological dump, reorganize it into topical sections. Curated knowledge > raw logs. + +```python +# Update an existing entry (don't append a duplicate) +edit_note( + identifier="MEMORY", + operation="find_replace", + find_text="- [preference] Use Node.js for scripts", + content="- [preference] Use Bun for scripts — faster startup, built-in TypeScript (updated 2026-02-27)" +) + +# Remove a resolved error note +edit_note( + identifier="MEMORY", + operation="find_replace", + find_text="- [issue] MCP server crashes on reconnect — workaround: restart manually", + content="" # removed: fixed in v2.1.0 +) +``` ### 4. Log the Reflection @@ -60,14 +96,26 @@ Append a brief entry to today's daily note: - Reviewed: [list of files reviewed] - Added to MEMORY.md: [brief summary of what was consolidated] - Removed/updated: [anything cleaned up] +- Net change: MEMORY.md [grew/shrank/unchanged] by ~N lines ``` +Tracking net change helps you notice if reflection is actually compacting or just appending. + +## Anti-patterns to Avoid + +| Anti-pattern | What it looks like | Fix | +|---|---|---| +| **Append-only reflection** | MEMORY.md grows every session, never shrinks | Actively remove entries that no longer add value | +| **Duplication** | Same fact in three places | One authoritative location; use `find_replace` to update, not append | +| **Log preservation** | Keeping failed-attempt logs "just in case" | Strip after resolution; the lesson stays, the log goes | +| **Stale status** | `[status] active` for a project that's done | Update in-place | +| **Over-capturing transients** | "Ran heartbeat at 14:30, all good" × 30 entries | Skip transient activity entirely | + ## Guidelines -- **Be selective.** The goal is distillation, not duplication. MEMORY.md should be curated wisdom, not a copy of daily notes. +- **Distill, don't duplicate.** MEMORY.md should be curated wisdom, not a copy of daily notes. - **Preserve voice.** If the agent has a personality/soul file, reflections should match that voice. - **Don't delete daily notes.** They're the raw record. Reflection extracts from them; it doesn't replace them. - **Merge, don't append.** If MEMORY.md already has a section about a topic, update it in place rather than adding a duplicate entry. -- **Flag uncertainty.** If something seems important but you're not sure, add it with a note like "(needs confirmation)" rather than skipping it entirely. -- **Restructure over time.** If MEMORY.md is a chronological dump, restructure it into topical sections during reflection. Curated knowledge > raw logs. -- **Check for filesystem issues.** Look for recursive nesting (memory/memory/memory/...), orphaned files, or bloat while gathering material. +- **Flag uncertainty.** If something seems important but you're not sure, add it with `(needs confirmation)` rather than skipping it entirely. +- **Check for filesystem issues.** Look for recursive nesting (`memory/memory/memory/...`), orphaned files, or bloat while gathering material. diff --git a/memory-research/SKILL.md b/memory-research/SKILL.md index cbd2abb..9a661f2 100644 --- a/memory-research/SKILL.md +++ b/memory-research/SKILL.md @@ -1,12 +1,17 @@ --- name: memory-research -description: "Research an external subject using web search, synthesize findings into a structured Basic Memory entity. Use when asked to research a company, person, technology, or topic — or when a bare name or URL is provided that implies a research request." +description: "Research an external subject using web search, synthesize findings into a structured Basic Memory entity. Applies Factor 3 (own your context window) — research notes are context investments; capture why you searched, not just what you found. Use when asked to research a company, person, technology, or topic." --- # Memory Research Research an external subject, synthesize what you find, and create a structured Basic Memory entity — with the user's approval. +> **Factor 3 — Own Your Context Window:** A research note is a context investment. Structure it so that `build_context(['research-topic'])` returns exactly what a future agent needs to continue this work — not just what you found, but **why you searched** and what decision it's meant to inform. +> +> The user's purpose is the most valuable retrieval signal. Capture it. + + ## When to Use **Explicit triggers:** @@ -22,7 +27,19 @@ Research an external subject, synthesize what you find, and create a structured ## Workflow -### Step 1: Web Research +### Step 1: Capture the Research Purpose + +Before searching, note *why* the user is asking. This context is the most durable part of the research note — web facts go stale, but the user's intent doesn't. + +``` +User said: "Acme Corp — saw them at the conference" +→ Purpose: evaluate as potential partner; first contact was at conference +→ Capture as: [context] Met at conference; evaluating for partnership +``` + +If the purpose is implicit (bare name or URL), note the apparent context based on what you know about the user's current work. + +### Step 2: Web Research Search for current information across multiple sources. Aim for 3-5 searches to build a well-rounded picture: @@ -42,7 +59,7 @@ Search for current information across multiple sources. Aim for 3-5 searches to | **Technology** | What it does, who maintains it, maturity, ecosystem, alternatives, adoption | | **Topic/Domain** | Definition, current state, key players, trends, relevance to user's context | -### Step 2: Check Existing Knowledge +### Step 3: Check Existing Knowledge Before proposing a new entity, search Basic Memory: @@ -60,7 +77,7 @@ If the entity already exists: If the entity doesn't exist, proceed to evaluation. -### Step 3: Evaluate and Summarize +### Step 4: Evaluate and Summarize Present your findings in a structured summary. Include all relevant information organized by section: @@ -77,6 +94,9 @@ Present your findings in a structured summary. Include all relevant information - [Role, expertise, affiliations for people] - [Maturity, ecosystem, alternatives for tech] +**Why You're Asking:** [User's stated or inferred purpose — what decision this research informs] + + **Relevance:** [Why this matters to the user — connection to their work, domain, or interests. If no obvious connection: "No specific connection identified."] @@ -97,7 +117,7 @@ If no obvious connection: "No specific connection identified."] **Let the user define relevance.** Don't impose a fixed evaluation framework. Instead, highlight facts and let the user draw conclusions. If the user has a specific evaluation rubric (strategic fit, buy/partner/compete, etc.), they'll tell you — apply it when asked. -### Step 4: Propose Entity Creation +### Step 5: Propose Entity Creation After presenting the summary, ask for approval: @@ -109,9 +129,9 @@ Create Basic Memory entity for [Subject]? [yes / no / modify] ``` -If the user provided context with their request ("saw them at the conference"), include that context in the proposed entity. +If the user provided context with their request ("saw them at the conference"), confirm it will be captured in the entity. -### Step 5: Create the Entity +### Step 6: Create the Entity After approval, create a structured note. Adapt the template to the entity type: @@ -140,6 +160,8 @@ write_note( ## Observations - [relevance] Why this entity matters in user's context +- [context] Why the user is researching this (their stated or inferred purpose) + - [source] Researched on YYYY-MM-DD - [additional observations from research findings] @@ -169,6 +191,8 @@ write_note( ## Observations - [role] Title at Organization - [expertise] Key technical or domain expertise +- [context] Why the user is researching this person + - [source] Researched on YYYY-MM-DD ## Relations @@ -198,6 +222,8 @@ write_note( ## Observations - [definition] What this technology does in one sentence - [maturity] Current state and adoption level +- [context] Why the user is evaluating this technology + - [source] Researched on YYYY-MM-DD ## Relations @@ -207,9 +233,9 @@ write_note( Adapt these templates freely. The key elements are: note_type/tags parameters, an overview, structured details, observations with categories, and relations. -### Step 6: Store Source Context +### Step 7: Store Source Context -If the user provided context with their request, capture it in the entity: +If the user provided context with their request, always capture it in the entity: ```python # User said: "Acme Corp — saw their demo at the conference last week" @@ -217,11 +243,11 @@ edit_note( identifier="Acme Corp", operation="append", section="Observations", - content="- [context] Saw their demo at conference, week of 2026-02-17" + content="- [context] Saw their demo at conference, week of 2026-02-17 — evaluating for partnership" ) ``` -This context is often the most valuable part — it's the user's relationship to the entity, which web research can't provide. +> **This is the most valuable part of research notes.** Web facts are re-searchable. The user's relationship to the entity — why they care, when they encountered it, what decision they're trying to make — is not. If you capture nothing else, capture this. ## Guidelines @@ -230,6 +256,6 @@ This context is often the most valuable part — it's the user's relationship to - **Hedge uncertain information.** Use qualifiers for estimates, unverified claims, and inferred details. - **Store source URLs.** Include the URLs you consulted, either in observations or a Sources section. This enables the user to verify and dig deeper. - **Get approval before creating.** Present your findings and let the user decide whether to create the entity and what to include. -- **Capture user context.** If the user told you *why* they're researching (met at a conference, evaluating as a vendor, etc.), that context belongs in the entity. +- **Capture user context.** If the user told you *why* they're researching, that context belongs in the entity — it's the part that ages best. - **Don't over-research.** 3-5 web searches is usually enough. The goal is a useful knowledge graph entry, not an exhaustive report. - **Link to existing knowledge.** Relate the new entity to things already in the knowledge graph. Connections compound value. diff --git a/memory-schema/SKILL.md b/memory-schema/SKILL.md index a47f326..5df6517 100644 --- a/memory-schema/SKILL.md +++ b/memory-schema/SKILL.md @@ -1,12 +1,17 @@ --- name: memory-schema -description: "Schema lifecycle management for Basic Memory: discover unschemaed notes, infer schemas, create and edit schema definitions, validate notes, and detect drift. Use when working with structured note types (Task, Person, Meeting, etc.) to maintain consistency across the knowledge graph." +description: "Schema lifecycle management for Basic Memory: discover unschemaed notes, infer schemas, create and edit schema definitions, validate notes, and detect drift. Applies Factor 4 (typed outputs) and Factor 5 (unified state). Use when working with structured note types (Task, Person, Meeting, etc.)." --- # Memory Schema Manage structured note types using Basic Memory's Picoschema system. Schemas define what fields a note type should have, making notes uniform, queryable, and validatable. +> **Factor 4 — Typed Outputs:** A schema-validated note is a reliable structured output from an agent session. The schema is the output type definition — just as a tool call has a typed return value, a note type has a schema. Schema validation is your CI check on note outputs. +> +> **Factor 5 — Unified State:** Schemas enforce consistency across all notes of a type. Every Task note that follows the schema can be queried the same way, by any agent, in any session. Schemas are the contract that makes the knowledge graph queryable — not just readable. + + ## When to Use - **New note type emerging** — you notice several notes share the same structure (meetings, people, decisions) @@ -172,7 +177,17 @@ schema_validate(noteType="Meeting") schema_validate(identifier="meetings/2026-02-10-standup") ``` -**Important:** `schema_validate` checks for schema fields as **observation categories** in the note body — e.g., a `status` field expects `- [status] active` as an observation. Fields stored only in frontmatter metadata won't satisfy validation. To pass cleanly, include schema fields as both frontmatter values (for metadata search) and observations (for schema validation). +### Why Notes Need Fields in Both Frontmatter and Observations + +> **Factor 5 — Unified State, two different access patterns:** +> +> Basic Memory has two querying modes that access notes differently: +> - **`search_notes` with `metadata_filters`** — reads frontmatter. This is how you find notes by status, priority, etc. +> - **`schema_validate`** — checks for fields as observation categories in the note body (e.g., `- [status] active`). +> +> These are the same state, served to different consumers. Frontmatter serves metadata search; observations serve schema validation. A field stored only in frontmatter fails schema validation. A field stored only in observations can't be metadata-filtered. +> +> **Guidance:** For fields you need both to query AND to validate (like `status`, `current_step`), keep them in both places and keep them in sync. For fields only needed for one purpose, one location is fine. Validation reports: - **Missing required fields** — the note lacks a field the schema requires (as an observation category) diff --git a/memory-tasks/SKILL.md b/memory-tasks/SKILL.md index 3f44ed9..3c13593 100644 --- a/memory-tasks/SKILL.md +++ b/memory-tasks/SKILL.md @@ -1,12 +1,27 @@ --- name: memory-tasks -description: "Task management via Basic Memory schemas: create, track, and resume structured tasks that survive context compaction. Uses BM's schema system for uniform notes queryable through the knowledge graph." +description: "Task management via Basic Memory schemas: create, track, and resume structured tasks that survive context compaction. Applies 12-factor-agents principles: stateless reducer framing (Factor 12), unified execution state (Factor 5), and explicit pause/resume protocols (Factor 6)." --- # Memory Tasks Manage work-in-progress using Basic Memory's schema system. Tasks are just notes with `type: Task` — they live in the knowledge graph, validate against a schema, and survive context compaction. +--- + +> **Factor 12 — Stateless Reducer:** Your Copilot CLI session is stateless. The Task note IS the execution state — not a record of it. +> +> **Each session follows this loop:** +> 1. **Read state** — `search_notes(note_types=["task"], status="active")` +> 2. **Process** — execute the `current_step` +> 3. **Write state** — update `current_step`, `context`, checkboxes +> 4. **Exit** — the note holds everything the next session needs +> +> If it's not in the task note, it doesn't exist after `/compact`. + +--- + + ## When to Use - **Starting multi-step work** (3+ steps, or anything that might outlast the context window) @@ -78,29 +93,79 @@ What future-you needs to pick up this work. Include: ) ``` -**Why both frontmatter and observations?** Fields in `metadata` (stored as frontmatter) power `search_notes` with `metadata_filters`. Fields as observations (`- [status] active`) power `schema_validate`. Include queryable fields in both places for full coverage. +### Why Both Frontmatter and Observations? (Factor 5) + +> **Factor 5 — Unified Execution State:** The task note is the single source of truth. Frontmatter and observations serve *different roles* — they are not redundant: +> +> - **Frontmatter** (`metadata`) → powers `search_notes` with `metadata_filters`. This is how agents *find* tasks by status, priority, etc. +> - **Observations** (`- [status] active`) → powers `schema_validate`. This is how the schema system checks conformance. +> +> Keep `status` and `current_step` in both. For all other fields, pick the location that makes semantic sense and be consistent. + +Don't let the two diverge — if frontmatter says `status: done` but observations say `[status] active`, you have a split-brain state. Keep them in sync. ### Key Principles - **Steps are concrete and checkable** — "Implement X in file Y", not "figure out stuff" - **Context is for post-amnesia resumption** — Write it as if explaining to a smart person who knows nothing about what you've been doing - **Relations link to other entities** — `parent_task [[Other Task]]`, `related_to [[Some Note]]` -- **`note_types` is case-sensitive** — `write_note(note_type="Task")` stores the type as lowercase `task` in frontmatter. Use `note_types=["task"]` (lowercase) in search queries. +- **`note_type` is case-sensitive** — `write_note(note_type="Task")` stores the type as lowercase `task` in frontmatter. Use `note_types=["task"]` (lowercase) in search queries. + +## Resume Protocol (Factor 6) + +On session start or after compaction, follow this sequence exactly: + +``` +1. SEARCH → search_notes(note_types=["task"], status="active") +2. READ → read_note(identifier="") +3. VALIDATE → confirm current_step matches the step checkboxes +4. CONTINUE → execute the next unchecked step +``` -## Resuming After Compaction +**Why validate step before continuing?** Context compaction can leave step counts stale. Cross-check `current_step` against the checkbox list — the checkboxes are the ground truth. -On session start or after compaction: +```python +# Step 1: Find active work +search_notes(note_types=["task"], status="active") -1. **Search for active tasks:** - ```python - search_notes(note_types=["task"], status="active") - ``` +# Step 2: Read the full task +read_note(identifier="tasks/my-active-task") -2. **Read the task note** to get full context +# Step 3: Validate — last checked box matches current_step +# If current_step=3 but steps 1, 2, 3 are all checked → someone forgot to update → fix it +# If steps 1, 2 are checked but current_step=3 → correct, continue with step 3 +``` -3. **Resume from `current_step`** using the `context` field +## Pause Protocol (Factor 6) -4. **Update as you progress** — increment `current_step`, update context, check off steps +Run this before any `/compact` event, end of session, or before any long-running tool call that might trigger compaction: + +``` +1. FIND ALL → search_notes(note_types=["task"], status="active") +2. FOR EACH → update current_step, context, and step checkboxes +3. VERIFY → read_note to confirm the update landed correctly +``` + +**What to write in `context` before pausing:** +- What you just completed (1 sentence) +- What the next step requires (key inputs, file paths, decisions) +- Any blockers discovered +- Anything that would be frustrating to re-discover + +```python +edit_note( + identifier="tasks/my-active-task", + operation="find_replace", + find_text="## Context\nWhat future-you needs...", + content="""## Context +Completed: Implemented the database migration script at db/migrate/001.py. +Next: Run migration against staging. Need DATABASE_URL env var (check .env.staging). +Blocker: None. +Note: The migration is idempotent — safe to re-run if interrupted.""" +) +``` + +Context not written before `/compact` is context permanently lost. ## Updating Tasks @@ -131,16 +196,6 @@ completed: YYYY-MM-DD Add a brief summary of what was accomplished and any follow-up needed. -## Pre-Compaction Flush - -When a compaction event is imminent: - -1. Find all active tasks: `search_notes(note_types=["task"], status="active")` -2. For each, update: - - `current_step` to reflect actual progress - - `context` with everything needed to resume - - Step checkboxes to show what's done -3. This is **critical** — context not written down is context lost ## Querying Tasks @@ -159,7 +214,7 @@ With BM's schema system, tasks are fully queryable: ## Guidelines - **One task per unit of work** — Don't cram multiple projects into one task -- **Externalize early** — If you think "I should remember this", write it down NOW +- **Externalize early** — If you think "I should remember this", write it down NOW — not after the next tool call - **Context > steps** — Steps tell you what to do; context tells you why and how - **Close finished tasks** — Don't leave completed work as `active` - **Link related tasks** — Use `parent_task [[X]]` or relations to connect related work diff --git a/package.json b/package.json new file mode 100644 index 0000000..b404159 --- /dev/null +++ b/package.json @@ -0,0 +1,44 @@ +{ + "name": "copilot-memory-skills", + "version": "1.0.0", + "description": "Basic Memory skills for GitHub Copilot CLI — persistent memory and knowledge management across sessions", + "keywords": [ + "github-copilot", + "copilot-cli", + "skills", + "memory", + "basic-memory", + "agent-skills" + ], + "homepage": "https://github.com/tyler555g/copilot-memory-skills", + "repository": { + "type": "git", + "url": "git+https://github.com/tyler555g/copilot-memory-skills.git" + }, + "license": "MIT", + "author": "tyler555g", + "scripts": { + "postinstall": "node scripts/postinstall.js" + }, + "files": [ + "memory-defrag/", + "memory-ingest/", + "memory-lifecycle/", + "memory-literary-analysis/", + "memory-metadata-search/", + "memory-notes/", + "memory-reflect/", + "memory-research/", + "memory-schema/", + "memory-tasks/", + "scripts/" + ], + "engines": { + "node": ">=16" + }, + "devDependencies": { + "@changesets/cli": "^2.31.0", + "@commitlint/cli": "^20.5.0", + "@commitlint/config-conventional": "^20.5.0" + } +} diff --git a/scripts/postinstall.js b/scripts/postinstall.js new file mode 100644 index 0000000..882bd81 --- /dev/null +++ b/scripts/postinstall.js @@ -0,0 +1,72 @@ +#!/usr/bin/env node +// Installs memory skills to the first available skills directory. +// Supports: ~/.copilot/skills, ~/.claude/skills, ~/.agents/skills + +const fs = require('fs'); +const path = require('path'); +const os = require('os'); + +const SKILL_DIRS = [ + path.join(os.homedir(), '.copilot', 'skills'), + path.join(os.homedir(), '.claude', 'skills'), + path.join(os.homedir(), '.agents', 'skills'), +]; + +const SKILLS = [ + 'memory-defrag', + 'memory-ingest', + 'memory-lifecycle', + 'memory-literary-analysis', + 'memory-metadata-search', + 'memory-notes', + 'memory-reflect', + 'memory-research', + 'memory-schema', + 'memory-tasks', +]; + +function copyDirSync(src, dest) { + fs.mkdirSync(dest, { recursive: true }); + for (const entry of fs.readdirSync(src, { withFileTypes: true })) { + const srcPath = path.join(src, entry.name); + const destPath = path.join(dest, entry.name); + if (entry.isDirectory()) { + copyDirSync(srcPath, destPath); + } else { + fs.copyFileSync(srcPath, destPath); + } + } +} + +// Find which skills dirs exist (at least one parent must exist) +const targets = SKILL_DIRS.filter(d => { + const parent = path.dirname(d); + return fs.existsSync(parent); +}); + +if (targets.length === 0) { + console.log('⚠️ No supported agent home directory found (~/.copilot, ~/.claude, ~/.agents).'); + console.log(' Install manually: copy skill folders to ~/.copilot/skills/'); + process.exit(0); +} + +const pkgRoot = path.join(__dirname, '..'); +let installed = 0; + +for (const skillsDir of targets) { + fs.mkdirSync(skillsDir, { recursive: true }); + for (const skill of SKILLS) { + const src = path.join(pkgRoot, skill); + const dest = path.join(skillsDir, skill); + if (fs.existsSync(src)) { + copyDirSync(src, dest); + installed++; + } + } + console.log(`✅ Installed ${SKILLS.length} memory skills → ${skillsDir}`); +} + +if (installed > 0) { + console.log('\nTo activate in GitHub Copilot CLI, run: /skills reload'); + console.log('To activate in Claude Code, restart your session.'); +} From 641b8d2167a5dd2f7846027f01811f347b7681a6 Mon Sep 17 00:00:00 2001 From: Tyler Raber Date: Sun, 19 Apr 2026 14:42:41 -0400 Subject: [PATCH 2/9] docs: update docs and fix naming for upstream merge - Rename package from copilot-memory-skills to basic-memory-skills - Update homepage/repo URLs to basicmachines-co org - Update author field to basicmachines-co - Fix all install commands and clone URLs in README.md - Rework attribution section: remove self-referential framing, keep methodology credits - Update DEVELOPMENT.md: new repo structure, npm install method, expanded new-skill checklist, commit conventions and changesets sections - Update CLAUDE.md: remove stale pure-markdown claim, add infrastructure files, expand new-skill steps - Fix changeset package name reference - Regenerate package-lock.json Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .changeset/add-copilot-cli-support.md | 4 +- CLAUDE.md | 39 +- DEVELOPMENT.md | 93 +- README.md | 23 +- package-lock.json | 2263 +++++++++++++++++++++++++ package.json | 8 +- 6 files changed, 2385 insertions(+), 45 deletions(-) create mode 100644 package-lock.json diff --git a/.changeset/add-copilot-cli-support.md b/.changeset/add-copilot-cli-support.md index f48de06..9b5e3f0 100644 --- a/.changeset/add-copilot-cli-support.md +++ b/.changeset/add-copilot-cli-support.md @@ -1,7 +1,5 @@ --- -"copilot-memory-skills": minor -# NOTE for upstream (basicmachines-co/basic-memory-skills): -# Replace package name above with "basic-memory-skills" upon merge +"basic-memory-skills": minor --- feat: add GitHub Copilot CLI support and 12-factor agent improvements diff --git a/CLAUDE.md b/CLAUDE.md index 446eafc..1478b08 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,25 +6,31 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co Skills collection for [Basic Memory](https://github.com/basicmachines-co/basic-memory) — a local-first knowledge graph built on markdown files and MCP. Each skill teaches AI assistants how to effectively use Basic Memory's MCP tools. -Skills can be installed via `npx skills add` or copied manually into any agent's skills directory. +Skills can be installed via `npm install -g basic-memory-skills`, `npx skills add`, or copied manually into any agent's skills directory. ## Repository Structure Each skill is a single `SKILL.md` file in its own directory: ``` -memory-tasks/SKILL.md # Task tracking across context compaction -memory-schema/SKILL.md # Schema lifecycle (discover, infer, validate, drift) -memory-reflect/SKILL.md # Sleep-time memory consolidation -memory-notes/SKILL.md # Note writing patterns and knowledge graph design -memory-defrag/SKILL.md # Memory reorganization and cleanup -memory-metadata-search/SKILL.md # Structured metadata filtering and queries -memory-lifecycle/SKILL.md # Entity status transitions and folder-based archival -memory-ingest/SKILL.md # Process external input into structured entities -memory-research/SKILL.md # Web research synthesized into Basic Memory entities +memory-tasks/SKILL.md # Task tracking across context compaction +memory-schema/SKILL.md # Schema lifecycle (discover, infer, validate, drift) +memory-reflect/SKILL.md # Sleep-time memory consolidation +memory-notes/SKILL.md # Note writing patterns and knowledge graph design +memory-defrag/SKILL.md # Memory reorganization and cleanup +memory-metadata-search/SKILL.md # Structured metadata filtering and queries +memory-lifecycle/SKILL.md # Entity status transitions and folder-based archival +memory-ingest/SKILL.md # Process external input into structured entities +memory-research/SKILL.md # Web research synthesized into Basic Memory entities +memory-literary-analysis/SKILL.md # Literary analysis into structured knowledge graph ``` -There is no code to build, lint, or test — this is a pure markdown project. +Infrastructure files: +- `package.json` — npm package definition with postinstall script +- `scripts/postinstall.js` — copies skills to agent directories on `npm install -g` +- `.changeset/` — changeset config and pending changesets +- `commitlint.config.js` — enforces [Conventional Commits](https://www.conventionalcommits.org) +- `skills-lock.json` — Skills CLI lock file (auto-generated) ## SKILL.md Format @@ -44,8 +50,15 @@ description: "What the skill does and when to use it." ## Adding a New Skill 1. Create `memory-/SKILL.md` with frontmatter and markdown instructions -2. Update `README.md` with the new skill's summary -3. Commit and push +2. Add the skill directory to the `files` array in `package.json` +3. Add the skill name to the `SKILLS` array in `scripts/postinstall.js` +4. Update `README.md` with the new skill's summary +5. Create a changeset: `npx changeset` +6. Commit using [Conventional Commits](https://www.conventionalcommits.org): `feat(memory-): add ` + +## Commit Conventions + +All commits follow [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/) enforced by commitlint. Common types: `feat:`, `fix:`, `docs:`, `chore:`. ## Key Concepts Referenced in Skills diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index b987210..53306de 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -4,15 +4,25 @@ ``` basic-memory-skills/ -├── memory-tasks/SKILL.md # Task tracking skill -├── memory-schema/SKILL.md # Schema lifecycle skill -├── memory-reflect/SKILL.md # Memory consolidation skill -├── memory-notes/SKILL.md # Note writing patterns skill -├── memory-defrag/SKILL.md # Memory cleanup skill -├── memory-metadata-search/SKILL.md # Metadata search skill -├── memory-lifecycle/SKILL.md # Entity lifecycle skill -├── memory-ingest/SKILL.md # External input processing skill -├── memory-research/SKILL.md # Web research skill +├── memory-tasks/SKILL.md # Task tracking skill +├── memory-schema/SKILL.md # Schema lifecycle skill +├── memory-reflect/SKILL.md # Memory consolidation skill +├── memory-notes/SKILL.md # Note writing patterns skill +├── memory-defrag/SKILL.md # Memory cleanup skill +├── memory-metadata-search/SKILL.md # Metadata search skill +├── memory-lifecycle/SKILL.md # Entity lifecycle skill +├── memory-ingest/SKILL.md # External input processing skill +├── memory-research/SKILL.md # Web research skill +├── memory-literary-analysis/SKILL.md # Literary analysis skill +├── scripts/postinstall.js # npm postinstall — copies skills to agent dirs +├── .changeset/ # Changeset config and pending changesets +├── package.json # npm package definition +├── commitlint.config.js # Conventional Commits enforcement +├── skills-lock.json # Skills CLI lock file (auto-generated) +├── CLAUDE.md # Claude Code agent guidance +├── AGENTS.md # Agent guidance pointer +├── .mcp.json # MCP server configuration +├── DEVELOPMENT.md # This file └── README.md ``` @@ -20,9 +30,31 @@ Each skill is a single `SKILL.md` file with YAML frontmatter (`name`, `descripti ## Testing Skills Locally +### Via npm (recommended) + +Install the package globally to auto-deploy skills to all supported agent directories: + +```bash +npm install -g basic-memory-skills +``` + +The postinstall script copies skills to `~/.copilot/skills/`, `~/.claude/skills/`, and `~/.agents/skills/` (whichever exist). Then reload in your agent: + +``` +# GitHub Copilot CLI +/skills reload + +# Claude Code — restart your session +``` + +### Manual copy + Copy a skill into your agent's skills directory and start a new session: ```bash +# GitHub Copilot CLI — global +cp -r memory-tasks ~/.copilot/skills/ + # Claude Code — global cp -r memory-tasks ~/.claude/skills/ @@ -55,8 +87,47 @@ npx skills add basicmachines-co/basic-memory-skills --agent claude 1. Create a new directory: `memory-/SKILL.md` 2. Add YAML frontmatter with `name` and `description` 3. Write skill instructions in markdown -4. Update `README.md` with the new skill's summary -5. Commit and push +4. Add the skill directory to the `files` array in `package.json` +5. Add the skill name to the `SKILLS` array in `scripts/postinstall.js` +6. Update `README.md` with the new skill's summary +7. Create a changeset: `npx changeset` (select `minor` for new skills) +8. Commit and push + +## Commit Conventions + +All commits follow [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/), enforced by [commitlint](https://github.com/conventional-changelog/commitlint). + +``` +[optional scope]: +``` + +Common types: +- `feat:` — new skill or feature (minor version bump) +- `fix:` — bug fix (patch version bump) +- `docs:` — documentation only +- `chore:` — build, tooling, maintenance + +Examples: +``` +feat(memory-tasks): add pause/resume protocol +fix(postinstall): handle missing ~/.copilot directory +docs: update DEVELOPMENT.md with commit conventions +``` + +## Changesets + +[Changesets](https://github.com/changesets/changesets) track what changed and at what version level for every PR: + +```bash +# After making changes, create a changeset +npx changeset + +# On release, bump versions and generate changelog +npx changeset version + +# Publish +npx changeset publish +``` ## OpenClaw Plugin Integration diff --git a/README.md b/README.md index bdb1c7f..7ed13a7 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ -# copilot-memory-skills +# basic-memory-skills -Skills for [GitHub Copilot CLI](https://docs.github.com/en/copilot/github-copilot-in-the-cli) that connect your agent to [Basic Memory](https://github.com/basicmachines-co/basic-memory) — a local knowledge graph that persists across sessions. - -Derived from [`basicmachines-co/basic-memory-skills`](https://github.com/basicmachines-co/basic-memory-skills) (MIT License). Improved with [12-factor-agents](https://github.com/humanlayer/12-factor-agents) principles for better context management, state handling, and session resilience. +Skills for [Basic Memory](https://github.com/basicmachines-co/basic-memory) — teach AI coding agents how to use Basic Memory's MCP tools effectively. Improved with [12-factor-agents](https://github.com/humanlayer/12-factor-agents) principles for better context management, state handling, and session resilience. --- @@ -49,7 +47,7 @@ Verify the Basic Memory tools are available — you should see `write_note`, `re **Option A — npm (recommended):** ```bash -npm install -g copilot-memory-skills +npm install -g basic-memory-skills ``` Skills are automatically copied to `~/.copilot/skills/` (and `~/.claude/skills/` if present). Then in Copilot CLI: @@ -62,10 +60,10 @@ Skills are automatically copied to `~/.copilot/skills/` (and `~/.claude/skills/` ```bash # Install all skills -npx skills add tyler555g/copilot-memory-skills +npx skills add basicmachines-co/basic-memory-skills # Install a specific skill -npx skills add tyler555g/copilot-memory-skills --skill memory-tasks +npx skills add basicmachines-co/basic-memory-skills --skill memory-tasks # Check for updates npx skills check @@ -79,8 +77,8 @@ npx skills update Clone this repo and copy any skill folder into `~/.copilot/skills/`: ```bash -git clone https://github.com/tyler555g/copilot-memory-skills -cp -r copilot-memory-skills/memory-* ~/.copilot/skills/ +git clone https://github.com/basicmachines-co/basic-memory-skills +cp -r basic-memory-skills/memory-* ~/.copilot/skills/ ``` Then in Copilot CLI: @@ -214,12 +212,9 @@ Consolidate insights into MEMORY.md, then clean up fragmented or stale content. ## Attribution -This repo is derived from [`basicmachines-co/basic-memory-skills`](https://github.com/basicmachines-co/basic-memory-skills), which is the original source of all 10 skill workflows. Licensed under MIT. +Skill content improvements apply principles from [12-factor-agents](https://github.com/humanlayer/12-factor-agents) (Dex Horthy / [HumanLayer](https://github.com/humanlayer)). Commit conventions follow [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/). Version tracking uses [Changesets](https://github.com/changesets/changesets). -Improvements applied in this fork: -- Copilot CLI compatibility framing -- 12-factor-agents principle integration (per-skill, not just as documentation) -- Enhanced protocols for context hygiene, pause/resume, error compaction +12-factor improvements developed with [GitHub Copilot CLI](https://docs.github.com/en/copilot/github-copilot-in-the-cli). --- diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7589a5f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2263 @@ +{ + "name": "basic-memory-skills", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "basic-memory-skills", + "version": "1.0.0", + "hasInstallScript": true, + "license": "MIT", + "devDependencies": { + "@changesets/cli": "^2.31.0", + "@commitlint/cli": "^20.5.0", + "@commitlint/config-conventional": "^20.5.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@changesets/apply-release-plan": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.1.1.tgz", + "integrity": "sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/config": "^3.1.4", + "@changesets/get-version-range-type": "^0.4.0", + "@changesets/git": "^3.0.4", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/assemble-release-plan": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.10.tgz", + "integrity": "sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/changelog-git": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", + "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0" + } + }, + "node_modules/@changesets/cli": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.31.0.tgz", + "integrity": "sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/apply-release-plan": "^7.1.1", + "@changesets/assemble-release-plan": "^6.0.10", + "@changesets/changelog-git": "^0.2.1", + "@changesets/config": "^3.1.4", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/get-release-plan": "^4.0.16", + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.7", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@changesets/write": "^0.4.0", + "@inquirer/external-editor": "^1.0.2", + "@manypkg/get-packages": "^1.1.3", + "ansi-colors": "^4.1.3", + "enquirer": "^2.4.1", + "fs-extra": "^7.0.1", + "mri": "^1.2.0", + "package-manager-detector": "^0.2.0", + "picocolors": "^1.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^3.0.1", + "term-size": "^2.1.0" + }, + "bin": { + "changeset": "bin.js" + } + }, + "node_modules/@changesets/config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.4.tgz", + "integrity": "sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/logger": "^0.1.1", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.8" + } + }, + "node_modules/@changesets/errors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", + "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", + "dev": true, + "license": "MIT", + "dependencies": { + "extendable-error": "^0.1.5" + } + }, + "node_modules/@changesets/get-dependents-graph": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.4.tgz", + "integrity": "sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "picocolors": "^1.1.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/get-release-plan": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.16.tgz", + "integrity": "sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/assemble-release-plan": "^6.0.10", + "@changesets/config": "^3.1.4", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.7", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/get-version-range-type": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", + "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/git": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz", + "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.8", + "spawndamnit": "^3.0.1" + } + }, + "node_modules/@changesets/logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", + "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/parse": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.3.tgz", + "integrity": "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "js-yaml": "^4.1.1" + } + }, + "node_modules/@changesets/pre": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", + "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" + } + }, + "node_modules/@changesets/read": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.7.tgz", + "integrity": "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/parse": "^0.4.3", + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0", + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/should-skip-package": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", + "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/write": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", + "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "human-id": "^4.1.1", + "prettier": "^2.7.1" + } + }, + "node_modules/@commitlint/cli": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.5.0.tgz", + "integrity": "sha512-yNkyN/tuKTJS3wdVfsZ2tXDM4G4Gi7z+jW54Cki8N8tZqwKBltbIvUUrSbT4hz1bhW/h0CdR+5sCSpXD+wMKaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/format": "^20.5.0", + "@commitlint/lint": "^20.5.0", + "@commitlint/load": "^20.5.0", + "@commitlint/read": "^20.5.0", + "@commitlint/types": "^20.5.0", + "tinyexec": "^1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-20.5.0.tgz", + "integrity": "sha512-t3Ni88rFw1XMa4nZHgOKJ8fIAT9M2j5TnKyTqJzsxea7FUetlNdYFus9dz+MhIRZmc16P0PPyEfh6X2d/qw8SA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.5.0", + "conventional-changelog-conventionalcommits": "^9.2.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-20.5.0.tgz", + "integrity": "sha512-T/Uh6iJUzyx7j35GmHWdIiGRQB+ouZDk0pwAaYq4SXgB54KZhFdJ0vYmxiW6AMYICTIWuyMxDBl1jK74oFp/Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.5.0", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/ensure": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-20.5.0.tgz", + "integrity": "sha512-IpHqAUesBeW1EDDdjzJeaOxU9tnogLAyXLRBn03SHlj1SGENn2JGZqSWGkFvBJkJzfXAuCNtsoYzax+ZPS+puw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.5.0", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-20.0.0.tgz", + "integrity": "sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-20.5.0.tgz", + "integrity": "sha512-TI9EwFU/qZWSK7a5qyXMpKPPv3qta7FO4tKW+Wt2al7sgMbLWTsAcDpX1cU8k16TRdsiiet9aOw0zpvRXNJu7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.5.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-20.5.0.tgz", + "integrity": "sha512-JWLarAsurHJhPozbuAH6GbP4p/hdOCoqS9zJMfqwswne+/GPs5V0+rrsfOkP68Y8PSLphwtFXV0EzJ+GTXTTGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.5.0", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/lint": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-20.5.0.tgz", + "integrity": "sha512-jiM3hNUdu04jFBf1VgPdjtIPvbuVfDTBAc6L98AWcoLjF5sYqkulBHBzlVWll4rMF1T5zeQFB6r//a+s+BBKlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/is-ignored": "^20.5.0", + "@commitlint/parse": "^20.5.0", + "@commitlint/rules": "^20.5.0", + "@commitlint/types": "^20.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.5.0.tgz", + "integrity": "sha512-sLhhYTL/KxeOTZjjabKDhwidGZan84XKK1+XFkwDYL/4883kIajcz/dZFAhBJmZPtL8+nBx6bnkzA95YxPeDPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^20.5.0", + "@commitlint/execute-rule": "^20.0.0", + "@commitlint/resolve-extends": "^20.5.0", + "@commitlint/types": "^20.5.0", + "cosmiconfig": "^9.0.1", + "cosmiconfig-typescript-loader": "^6.1.0", + "is-plain-obj": "^4.1.0", + "lodash.mergewith": "^4.6.2", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/message": { + "version": "20.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-20.4.3.tgz", + "integrity": "sha512-6akwCYrzcrFcTYz9GyUaWlhisY4lmQ3KvrnabmhoeAV8nRH4dXJAh4+EUQ3uArtxxKQkvxJS78hNX2EU3USgxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-20.5.0.tgz", + "integrity": "sha512-SeKWHBMk7YOTnnEWUhx+d1a9vHsjjuo6Uo1xRfPNfeY4bdYFasCH1dDpAv13Lyn+dDPOels+jP6D2GRZqzc5fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.5.0", + "conventional-changelog-angular": "^8.2.0", + "conventional-commits-parser": "^6.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-20.5.0.tgz", + "integrity": "sha512-JDEIJ2+GnWpK8QqwfmW7O42h0aycJEWNqcdkJnyzLD11nf9dW2dWLTVEa8Wtlo4IZFGLPATjR5neA5QlOvIH1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/top-level": "^20.4.3", + "@commitlint/types": "^20.5.0", + "git-raw-commits": "^5.0.0", + "minimist": "^1.2.8", + "tinyexec": "^1.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.5.0.tgz", + "integrity": "sha512-3SHPWUW2v0tyspCTcfSsYml0gses92l6TlogwzvM2cbxDgmhSRc+fldDjvGkCXJrjSM87BBaWYTPWwwyASZRrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^20.5.0", + "@commitlint/types": "^20.5.0", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.5.0.tgz", + "integrity": "sha512-5NdQXQEdnDPT5pK8O39ZA7HohzPRHEsDGU23cyVCNPQy4WegAbAwrQk3nIu7p2sl3dutPk8RZd91yKTrMTnRkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/ensure": "^20.5.0", + "@commitlint/message": "^20.4.3", + "@commitlint/to-lines": "^20.0.0", + "@commitlint/types": "^20.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-20.0.0.tgz", + "integrity": "sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "20.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-20.4.3.tgz", + "integrity": "sha512-qD9xfP6dFg5jQ3NMrOhG0/w5y3bBUsVGyJvXxdWEwBm8hyx4WOk3kKXw28T5czBYvyeCVJgJJ6aoJZUWDpaacQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.5.0.tgz", + "integrity": "sha512-ZJoS8oSq2CAZEpc/YI9SulLrdiIyXeHb/OGqGrkUP6Q7YV+0ouNAa7GjqRdXeQPncHQIDz/jbCTlHScvYvO/gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-parser": "^6.3.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@conventional-changelog/git-client": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.7.0.tgz", + "integrity": "sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.4.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + } + }, + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + } + }, + "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/get-packages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@simple-libs/child-process-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.2.tgz", + "integrity": "sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@types/node": { + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.19.0" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-windows": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", + "integrity": "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.3.1.tgz", + "integrity": "sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-commits-parser": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", + "integrity": "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0", + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.3.0.tgz", + "integrity": "sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jiti": "2.6.1" + }, + "engines": { + "node": ">=v18" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=9", + "typescript": ">=5" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/git-raw-commits": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.1.tgz", + "integrity": "sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^2.6.0", + "meow": "^13.0.0" + }, + "bin": { + "git-raw-commits": "src/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/human-id": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz", + "integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==", + "dev": true, + "license": "MIT", + "bin": { + "human-id": "dist/cli.js" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "better-path-resolve": "1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-manager-detector": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", + "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "quansync": "^0.2.7" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/read-yaml-file/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/spawndamnit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", + "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "cross-spawn": "^7.0.5", + "signal-exit": "^4.0.1" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tinyexec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", + "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json index b404159..140b4b3 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "copilot-memory-skills", + "name": "basic-memory-skills", "version": "1.0.0", "description": "Basic Memory skills for GitHub Copilot CLI — persistent memory and knowledge management across sessions", "keywords": [ @@ -10,13 +10,13 @@ "basic-memory", "agent-skills" ], - "homepage": "https://github.com/tyler555g/copilot-memory-skills", + "homepage": "https://github.com/basicmachines-co/basic-memory-skills", "repository": { "type": "git", - "url": "git+https://github.com/tyler555g/copilot-memory-skills.git" + "url": "git+https://github.com/basicmachines-co/basic-memory-skills.git" }, "license": "MIT", - "author": "tyler555g", + "author": "basicmachines-co", "scripts": { "postinstall": "node scripts/postinstall.js" }, From c3d782bb1670823136ce251df4c2c96cd7c581ba Mon Sep 17 00:00:00 2001 From: Tyler Raber Date: Sun, 19 Apr 2026 14:49:56 -0400 Subject: [PATCH 3/9] fix(postinstall): add error handling for filesystem operations Wrap skill installation loop in try-catch so permission denied, disk full, or readonly filesystem errors exit gracefully instead of crashing npm install. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- scripts/postinstall.js | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/scripts/postinstall.js b/scripts/postinstall.js index 882bd81..8e28699 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -53,17 +53,23 @@ if (targets.length === 0) { const pkgRoot = path.join(__dirname, '..'); let installed = 0; -for (const skillsDir of targets) { - fs.mkdirSync(skillsDir, { recursive: true }); - for (const skill of SKILLS) { - const src = path.join(pkgRoot, skill); - const dest = path.join(skillsDir, skill); - if (fs.existsSync(src)) { - copyDirSync(src, dest); - installed++; +try { + for (const skillsDir of targets) { + fs.mkdirSync(skillsDir, { recursive: true }); + for (const skill of SKILLS) { + const src = path.join(pkgRoot, skill); + const dest = path.join(skillsDir, skill); + if (fs.existsSync(src)) { + copyDirSync(src, dest); + installed++; + } } + console.log(`✅ Installed ${SKILLS.length} memory skills → ${skillsDir}`); } - console.log(`✅ Installed ${SKILLS.length} memory skills → ${skillsDir}`); +} catch (err) { + console.error(`⚠️ Failed to install skills: ${err.message}`); + console.error(' You can manually copy skill folders to ~/.copilot/skills/'); + process.exit(0); } if (installed > 0) { From 8fc4be31c7c47102b08b3e16da5a88fc47ca007d Mon Sep 17 00:00:00 2001 From: Tyler Raber Date: Sun, 19 Apr 2026 15:03:20 -0400 Subject: [PATCH 4/9] refactor(skills): remove 12-factor-agents Factor labels from SKILL.md files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Strip all 'Factor N' citations, bold labels, and heading annotations from descriptions, blockquotes, and section headings across all 10 skills. The underlying guidance is preserved — only the coupling to specific factor numbers/names is removed, reducing maintenance burden if the source framework evolves. Reference: 12-factor-agents by Durable Objects (https://github.com/humanlayer/12-factor-agents) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- memory-defrag/SKILL.md | 6 +++--- memory-ingest/SKILL.md | 8 ++++---- memory-lifecycle/SKILL.md | 10 +++++----- memory-literary-analysis/SKILL.md | 8 ++++---- memory-metadata-search/SKILL.md | 8 ++++---- memory-notes/SKILL.md | 8 ++++---- memory-reflect/SKILL.md | 4 ++-- memory-research/SKILL.md | 4 ++-- memory-schema/SKILL.md | 8 ++++---- memory-tasks/SKILL.md | 12 ++++++------ 10 files changed, 38 insertions(+), 38 deletions(-) diff --git a/memory-defrag/SKILL.md b/memory-defrag/SKILL.md index a1aa877..03bd6a3 100644 --- a/memory-defrag/SKILL.md +++ b/memory-defrag/SKILL.md @@ -1,13 +1,13 @@ --- name: memory-defrag -description: "Defragment and reorganize agent memory files: split bloated files, merge duplicates, remove stale information, and restructure the memory hierarchy. Applies Factor 9 (compact errors into context) — defrag strips resolved error traces, stale state, and noise that degrades context quality. Run weekly or on demand." +description: "Defragment and reorganize agent memory files: split bloated files, merge duplicates, remove stale information, and restructure the memory hierarchy. Run weekly or on demand." --- # Memory Defrag Reorganize memory files for clarity, efficiency, and relevance. Like filesystem defragmentation but for knowledge. -> **Factor 9 — Compact Errors Into Context:** Defrag is the scheduled application of context compaction. The goal is not just reorganization — it's noise removal. Resolved error traces, failed-attempt histories, superseded workarounds, and stale status logs are all context pollution. A defragged knowledge base gives future agents better signal per token. +> Defrag is the scheduled application of context compaction. The goal is not just reorganization — it's noise removal. Resolved error traces, failed-attempt histories, superseded workarounds, and stale status logs are all context pollution. A defragged knowledge base gives future agents better signal per token. > > **The fresh-agent test:** Before each note, ask: "If I gave this to a fresh agent with zero context about this project, would it help them make better decisions — or would it confuse or mislead them?" Remove what fails this test. @@ -46,7 +46,7 @@ Look for these common issues: | **Poor organization** | Related info scattered across files | Restructure by topic | | **Recursive nesting** | `memory/memory/memory/...` directories | Delete nested dirs (indexer bug artifact) | -### Resolved Error Traces (Factor 9) +### Resolved Error Traces Resolved error traces deserve special attention. These are: - Debugging step-by-step logs from incidents that are now closed diff --git a/memory-ingest/SKILL.md b/memory-ingest/SKILL.md index 92d8fa7..41ee27b 100644 --- a/memory-ingest/SKILL.md +++ b/memory-ingest/SKILL.md @@ -1,13 +1,13 @@ --- name: memory-ingest -description: "Process unstructured external input (meeting transcripts, conversation logs, pasted documents) into structured Basic Memory entities. Applies Factor 3 (own your context window) — structure entities for retrieval, not storage. Extracts entities, searches for matches, proposes with approval, creates notes." +description: "Process unstructured external input (meeting transcripts, conversation logs, pasted documents) into structured Basic Memory entities. Extracts entities, searches for matches, proposes with approval, creates notes." --- # Memory Ingest Turn raw, unstructured input into structured Basic Memory entities. Meeting transcripts, conversation logs, pasted documents, email threads — anything with information worth preserving gets parsed, cross-referenced against existing knowledge, and written as proper notes. -> **Factor 3 — Own Your Context Window:** Every entity you create is a future context investment. Structure notes not just to store information, but so that a future agent can retrieve exactly what it needs to make the next decision. Ask: "Will this note give a future agent what it needs?" +> Every entity you create is a future context investment. Structure notes not just to store information, but so that a future agent can retrieve exactly what it needs to make the next decision. Ask: "Will this note give a future agent what it needs?" ## When to Use @@ -117,7 +117,7 @@ Include enough context with each proposed entity for the user to make a quick de Create the primary note for the ingested content. This is the "record of what happened" — it preserves the raw material and adds structured metadata. -> **Factor 3 — Structure for retrieval:** When writing observations, ask: "Will this category help a future agent find this note when searching for related information?" Use categories that answer the *purpose* of the content, not just its format. +> Structure observations for retrieval: ask "Will this category help a future agent find this note when searching for related information?" Use categories that answer the *purpose* of the content, not just its format. ### Meeting / Conversation Note @@ -316,7 +316,7 @@ build_context(url="memory://meetings/2026/novatech-meeting-jordan-rivera-feb-22- If key entities don't appear in the traversal, check that relations were written correctly. A disconnected entity is harder for future sessions to find via `build_context`. -> **Factor 3 — Context investment payoff:** The traversability check ensures your ingest work actually pays off in future sessions. An entity that can't be reached from its source note via `build_context` may as well not exist. +> The traversability check ensures your ingest work actually pays off in future sessions. An entity that can't be reached from its source note via `build_context` may as well not exist. ## Guidelines diff --git a/memory-lifecycle/SKILL.md b/memory-lifecycle/SKILL.md index 6c6aad2..77b6e4a 100644 --- a/memory-lifecycle/SKILL.md +++ b/memory-lifecycle/SKILL.md @@ -1,17 +1,17 @@ --- name: memory-lifecycle -description: "Manage entity status transitions in Basic Memory: archive completed work, move notes between status folders, update frontmatter, and handle edge cases. Applies Factor 5 (folder IS the canonical status) and Factor 6 (archive=pause, reactivate=resume). Core principle: archive, never delete." +description: "Manage entity status transitions in Basic Memory: archive completed work, move notes between status folders, update frontmatter, and handle edge cases. Core principle: archive, never delete." --- # Memory Lifecycle Manage how entities move through status stages in Basic Memory. The core principle: **archive, never delete.** Completed work is valuable context — move it out of the active view, but keep it in the knowledge graph. -> **Factor 5 — Unified Execution State:** The folder location IS the canonical status. The system doesn't maintain a separate status registry — the path is the state. `tasks/active/my-task.md` is active. `tasks/completed/my-task.md` is done. You don't need to check a status field to know; the filesystem tells you. +> The folder location IS the canonical status. The system doesn't maintain a separate status registry — the path is the state. `tasks/active/my-task.md` is active. `tasks/completed/my-task.md` is done. You don't need to check a status field to know; the filesystem tells you. > > This also means: **move first, then update frontmatter.** The folder move is the authoritative state transition. The frontmatter update is a secondary synchronization step to keep metadata search consistent. -> **Factor 6 — Launch/Pause/Resume:** The lifecycle pattern implements Factor 6 at the entity level. Archiving is pausing — the entity is preserved but removed from the active view. Reactivating is resuming — you restore it to the active path and pick up where you left off. The entity note is the state that makes resume possible. +> Archiving is pausing — the entity is preserved but removed from the active view. Reactivating is resuming — you restore it to the active path and pick up where you left off. The entity note is the state that makes resume possible. ## When to Use @@ -92,7 +92,7 @@ If multiple matches come back, present options and ask which one. If no match is found, ask for clarification — don't guess. -### 2. Move the File (Factor 5 — Primary State Transition) +### 2. Move the File Use `move_note` to relocate the entity to the appropriate status folder. This is the canonical state change: @@ -171,7 +171,7 @@ edit_note( ) ``` -> **Factor 6 — Resume:** The entity note contains everything needed to resume the work. Before reactivating, read the note to understand where the entity was when it was archived. The context in the note IS the resume state. +> The entity note contains everything needed to resume the work. Before reactivating, read the note to understand where the entity was when it was archived. The context in the note IS the resume state. ### Status Without Movement diff --git a/memory-literary-analysis/SKILL.md b/memory-literary-analysis/SKILL.md index 7f16011..cd6d1cc 100644 --- a/memory-literary-analysis/SKILL.md +++ b/memory-literary-analysis/SKILL.md @@ -1,13 +1,13 @@ --- name: memory-literary-analysis -description: "Analyze a complete literary work into a structured Basic Memory knowledge graph. Covers schema design, entity seeding, chapter-by-chapter processing, cross-referencing, validation, and visualization. Applies Factor 12 (stateless reducer at scale) and Factor 3 (seed entities as pre-fetch targets)." +description: "Analyze a complete literary work into a structured Basic Memory knowledge graph. Covers schema design, entity seeding, chapter-by-chapter processing, cross-referencing, validation, and visualization." --- # Memory Literary Analysis Transform a complete literary work into a structured knowledge graph. Characters, themes, chapters, locations, symbols, and literary devices become interconnected notes — searchable, validatable, and visualizable. -> **Factor 12 — Stateless Reducer at Scale:** This pipeline IS the stateless reducer pattern applied to literary analysis. Each chapter-processing session is a stateless reducer: +> This pipeline applies the stateless reducer pattern to literary analysis. Each chapter-processing session is a stateless reducer: > > 1. **Read state** — load the processing task note + any relevant entity stubs > 2. **Process** — analyze the current chapter batch, create/enrich notes @@ -16,7 +16,7 @@ Transform a complete literary work into a structured knowledge graph. Characters > > The knowledge graph grows across sessions. The agent starts fresh every time. The task note is the checkpoint that makes this work. Use the **memory-tasks** skill to create it. -> **Factor 3 — Phase 1 Seed = Pre-fetch Pattern:** Creating entity stubs before processing chapters is the pre-fetch pattern applied to literary analysis. You create `[[wiki-link]]` targets in advance so future agents can traverse the graph immediately, without needing to search for entities that should exist. Seed first; enrich later. +> Creating entity stubs before processing chapters is a pre-fetch pattern. You create `[[wiki-link]]` targets in advance so future agents can traverse the graph immediately, without needing to search for entities that should exist. Seed first; enrich later. ## When to Use @@ -239,7 +239,7 @@ Schema for literary technique and device notes. ## Phase 1: Seed Entities (Pre-fetch Pattern) -> **Factor 3 — Pre-fetch:** Seed entities before processing chapters. This creates `[[wiki-link]]` targets that resolve immediately during chapter processing, so each session can traverse the graph without needing to search for entities that should exist. Stubs are cheap to create; missing link targets break graph traversal. +> Seed entities before processing chapters. This creates `[[wiki-link]]` targets that resolve immediately during chapter processing, so each session can traverse the graph without needing to search for entities that should exist. Stubs are cheap to create; missing link targets break graph traversal. Before processing chapters, create stub notes for major entities so `[[wiki-links]]` resolve from the start. diff --git a/memory-metadata-search/SKILL.md b/memory-metadata-search/SKILL.md index 7ede994..77691fe 100644 --- a/memory-metadata-search/SKILL.md +++ b/memory-metadata-search/SKILL.md @@ -1,13 +1,13 @@ --- name: memory-metadata-search -description: "Structured metadata search for Basic Memory: query notes by custom frontmatter fields using equality, range, array, and nested filters. Applies Factor 3 (precision context retrieval) and Factor 5 (consistent status fields). Use when finding notes by status, priority, confidence, or any custom YAML field." +description: "Structured metadata search for Basic Memory: query notes by custom frontmatter fields using equality, range, array, and nested filters. Use when finding notes by status, priority, confidence, or any custom YAML field." --- # Memory Metadata Search Find notes by their structured frontmatter fields instead of (or in addition to) free-text content. Any custom YAML key in a note's frontmatter beyond the standard set (`title`, `type`, `tags`, `permalink`, `schema`) is automatically indexed as `entity_metadata` and becomes queryable. -> **Factor 3 — Own Your Context Window:** Metadata search is precision context retrieval. Instead of loading all notes into context or running a broad text search that returns noise, use metadata filters to retrieve exactly the notes relevant to the current step. +> Metadata search is precision context retrieval. Instead of loading all notes into context or running a broad text search that returns noise, use metadata filters to retrieve exactly the notes relevant to the current step. > > The pattern: **search precisely, load only what the next decision needs.** > @@ -19,7 +19,7 @@ Find notes by their structured frontmatter fields instead of (or in addition to) > search_notes(note_types=["task"], status="active", metadata_filters={"assigned_to": "claude"}) > ``` -> **Factor 5 — Unified State:** Metadata filters work best when status fields are consistent across all notes of a type. If Task notes sometimes use `status: in-progress` and sometimes `status: active`, metadata filters become unreliable. Schemas enforce this consistency — use them. See the **memory-schema** skill. +> Metadata filters work best when status fields are consistent across all notes of a type. If Task notes sometimes use `status: in-progress` and sometimes `status: active`, metadata filters become unreliable. Schemas enforce this consistency — use them. See the **memory-schema** skill. ## When to Use @@ -188,7 +188,7 @@ search_notes("tag:security") search_notes("OAuth", metadata_filters={"status": "in-progress"}) ``` -## Context Retrieval Patterns (Factor 3) +## Context Retrieval Patterns Metadata search is most powerful when used for session setup — retrieving precisely the right context before starting work: diff --git a/memory-notes/SKILL.md b/memory-notes/SKILL.md index 945b9e6..1c101be 100644 --- a/memory-notes/SKILL.md +++ b/memory-notes/SKILL.md @@ -1,13 +1,13 @@ --- name: memory-notes -description: "How to write well-structured Basic Memory notes: frontmatter, observations with semantic categories, relations with wiki-links, and best practices for building a rich knowledge graph. Includes context hygiene and pre-fetch patterns from 12-factor-agents (Factor 3). Use when creating or improving notes." +description: "How to write well-structured Basic Memory notes: frontmatter, observations with semantic categories, relations with wiki-links, and best practices for building a rich knowledge graph. Use when creating or improving notes." --- # Memory Notes Write well-structured notes that Basic Memory can parse into a searchable knowledge graph. Every note is a markdown file with three key sections: frontmatter, observations, and relations. -> **Factor 12 — Stateless Reducer:** Your Copilot CLI session is stateless. Notes are the state. If it's not in a note, it doesn't exist in the next session. Write early and often. +> Your agent session is stateless. Notes are the state. If it's not in a note, it doesn't exist in the next session. Write early and often. ## Note Anatomy @@ -248,9 +248,9 @@ edit_note( This preserves existing content and keeps the edit history clean. -## Context Hygiene (Factor 3) +## Context Hygiene -> **Factor 3 — Own Your Context Window:** Notes that get returned to the LLM cost tokens. Every line in a note that enters context should earn its place. Structure notes for the agent that will read them, not for human completeness. +> Notes that get returned to the LLM cost tokens. Every line in a note that enters context should earn its place. Structure notes for the agent that will read them, not for human completeness. ### What NOT to Put in Notes (or to Remove Over Time) diff --git a/memory-reflect/SKILL.md b/memory-reflect/SKILL.md index c733863..0a75d9a 100644 --- a/memory-reflect/SKILL.md +++ b/memory-reflect/SKILL.md @@ -1,13 +1,13 @@ --- name: memory-reflect -description: "Sleep-time memory reflection: review recent conversations and daily notes, extract insights, and consolidate into long-term memory. Applies 12-factor-agents Factor 9 (compact errors into context) — reflection is context compaction, not journaling. Use when triggered by cron, heartbeat, or explicit request." +description: "Sleep-time memory reflection: review recent conversations and daily notes, extract insights, and consolidate into long-term memory. Use when triggered by cron, heartbeat, or explicit request." --- # Memory Reflect Distill recent activity into durable long-term memory by compacting signal from noise. -> **Factor 9 — Compact Errors Into Context:** Reflection is not archiving. It is *compaction*. The goal is not to preserve everything that happened — it is to distill what matters and discard what doesn't. MEMORY.md should shrink (or stay flat) as often as it grows. If it only ever grows, you're journaling, not reflecting. +> Reflection is not archiving. It is *compaction*. The goal is not to preserve everything that happened — it is to distill what matters and discard what doesn't. MEMORY.md should shrink (or stay flat) as often as it grows. If it only ever grows, you're journaling, not reflecting. Inspired by sleep-time compute — the idea that memory formation happens best *between* active sessions, not during them. diff --git a/memory-research/SKILL.md b/memory-research/SKILL.md index 9a661f2..2313c06 100644 --- a/memory-research/SKILL.md +++ b/memory-research/SKILL.md @@ -1,13 +1,13 @@ --- name: memory-research -description: "Research an external subject using web search, synthesize findings into a structured Basic Memory entity. Applies Factor 3 (own your context window) — research notes are context investments; capture why you searched, not just what you found. Use when asked to research a company, person, technology, or topic." +description: "Research an external subject using web search, synthesize findings into a structured Basic Memory entity. Use when asked to research a company, person, technology, or topic." --- # Memory Research Research an external subject, synthesize what you find, and create a structured Basic Memory entity — with the user's approval. -> **Factor 3 — Own Your Context Window:** A research note is a context investment. Structure it so that `build_context(['research-topic'])` returns exactly what a future agent needs to continue this work — not just what you found, but **why you searched** and what decision it's meant to inform. +> A research note is a context investment. Structure it so that `build_context(['research-topic'])` returns exactly what a future agent needs to continue this work — not just what you found, but **why you searched** and what decision it's meant to inform. > > The user's purpose is the most valuable retrieval signal. Capture it. diff --git a/memory-schema/SKILL.md b/memory-schema/SKILL.md index 5df6517..74d4230 100644 --- a/memory-schema/SKILL.md +++ b/memory-schema/SKILL.md @@ -1,15 +1,15 @@ --- name: memory-schema -description: "Schema lifecycle management for Basic Memory: discover unschemaed notes, infer schemas, create and edit schema definitions, validate notes, and detect drift. Applies Factor 4 (typed outputs) and Factor 5 (unified state). Use when working with structured note types (Task, Person, Meeting, etc.)." +description: "Schema lifecycle management for Basic Memory: discover unschemaed notes, infer schemas, create and edit schema definitions, validate notes, and detect drift. Use when working with structured note types (Task, Person, Meeting, etc.)." --- # Memory Schema Manage structured note types using Basic Memory's Picoschema system. Schemas define what fields a note type should have, making notes uniform, queryable, and validatable. -> **Factor 4 — Typed Outputs:** A schema-validated note is a reliable structured output from an agent session. The schema is the output type definition — just as a tool call has a typed return value, a note type has a schema. Schema validation is your CI check on note outputs. +> A schema-validated note is a reliable structured output from an agent session. The schema is the output type definition — just as a tool call has a typed return value, a note type has a schema. Schema validation is your CI check on note outputs. > -> **Factor 5 — Unified State:** Schemas enforce consistency across all notes of a type. Every Task note that follows the schema can be queried the same way, by any agent, in any session. Schemas are the contract that makes the knowledge graph queryable — not just readable. +> Schemas enforce consistency across all notes of a type. Every Task note that follows the schema can be queried the same way, by any agent, in any session. Schemas are the contract that makes the knowledge graph queryable — not just readable. ## When to Use @@ -179,7 +179,7 @@ schema_validate(identifier="meetings/2026-02-10-standup") ### Why Notes Need Fields in Both Frontmatter and Observations -> **Factor 5 — Unified State, two different access patterns:** +> **Two different access patterns:** > > Basic Memory has two querying modes that access notes differently: > - **`search_notes` with `metadata_filters`** — reads frontmatter. This is how you find notes by status, priority, etc. diff --git a/memory-tasks/SKILL.md b/memory-tasks/SKILL.md index 3c13593..96dc0cc 100644 --- a/memory-tasks/SKILL.md +++ b/memory-tasks/SKILL.md @@ -1,6 +1,6 @@ --- name: memory-tasks -description: "Task management via Basic Memory schemas: create, track, and resume structured tasks that survive context compaction. Applies 12-factor-agents principles: stateless reducer framing (Factor 12), unified execution state (Factor 5), and explicit pause/resume protocols (Factor 6)." +description: "Task management via Basic Memory schemas: create, track, and resume structured tasks that survive context compaction." --- # Memory Tasks @@ -9,7 +9,7 @@ Manage work-in-progress using Basic Memory's schema system. Tasks are just notes --- -> **Factor 12 — Stateless Reducer:** Your Copilot CLI session is stateless. The Task note IS the execution state — not a record of it. +> Your agent session is stateless. The Task note IS the execution state — not a record of it. > > **Each session follows this loop:** > 1. **Read state** — `search_notes(note_types=["task"], status="active")` @@ -93,9 +93,9 @@ What future-you needs to pick up this work. Include: ) ``` -### Why Both Frontmatter and Observations? (Factor 5) +### Why Both Frontmatter and Observations? -> **Factor 5 — Unified Execution State:** The task note is the single source of truth. Frontmatter and observations serve *different roles* — they are not redundant: +> The task note is the single source of truth. Frontmatter and observations serve *different roles* — they are not redundant: > > - **Frontmatter** (`metadata`) → powers `search_notes` with `metadata_filters`. This is how agents *find* tasks by status, priority, etc. > - **Observations** (`- [status] active`) → powers `schema_validate`. This is how the schema system checks conformance. @@ -111,7 +111,7 @@ Don't let the two diverge — if frontmatter says `status: done` but observation - **Relations link to other entities** — `parent_task [[Other Task]]`, `related_to [[Some Note]]` - **`note_type` is case-sensitive** — `write_note(note_type="Task")` stores the type as lowercase `task` in frontmatter. Use `note_types=["task"]` (lowercase) in search queries. -## Resume Protocol (Factor 6) +## Resume Protocol On session start or after compaction, follow this sequence exactly: @@ -136,7 +136,7 @@ read_note(identifier="tasks/my-active-task") # If steps 1, 2 are checked but current_step=3 → correct, continue with step 3 ``` -## Pause Protocol (Factor 6) +## Pause Protocol Run this before any `/compact` event, end of session, or before any long-running tool call that might trigger compaction: From 73fc401542af2fc5fbd8df737b83e9eacfa7b431 Mon Sep 17 00:00:00 2001 From: Tyler Raber Date: Sun, 19 Apr 2026 15:19:03 -0400 Subject: [PATCH 5/9] chore(deps): pin versions, drop @changesets/cli devDependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Pin @commitlint/cli and @commitlint/config-conventional to exact 20.5.0 - Drop @changesets/cli from devDependencies (use npx @changesets/cli instead) - Regenerate package-lock.json: 83KB → 40KB, 179 → 87 packages Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- package-lock.json | 1208 +-------------------------------------------- package.json | 5 +- 2 files changed, 20 insertions(+), 1193 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7589a5f..6a57592 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,8 @@ "hasInstallScript": true, "license": "MIT", "devDependencies": { - "@changesets/cli": "^2.31.0", - "@commitlint/cli": "^20.5.0", - "@commitlint/config-conventional": "^20.5.0" + "@commitlint/cli": "20.5.0", + "@commitlint/config-conventional": "20.5.0" }, "engines": { "node": ">=16" @@ -43,258 +42,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@changesets/apply-release-plan": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.1.1.tgz", - "integrity": "sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/config": "^3.1.4", - "@changesets/get-version-range-type": "^0.4.0", - "@changesets/git": "^3.0.4", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "detect-indent": "^6.0.0", - "fs-extra": "^7.0.1", - "lodash.startcase": "^4.4.0", - "outdent": "^0.5.0", - "prettier": "^2.7.1", - "resolve-from": "^5.0.0", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/assemble-release-plan": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.10.tgz", - "integrity": "sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.4", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/changelog-git": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", - "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0" - } - }, - "node_modules/@changesets/cli": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.31.0.tgz", - "integrity": "sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/apply-release-plan": "^7.1.1", - "@changesets/assemble-release-plan": "^6.0.10", - "@changesets/changelog-git": "^0.2.1", - "@changesets/config": "^3.1.4", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.4", - "@changesets/get-release-plan": "^4.0.16", - "@changesets/git": "^3.0.4", - "@changesets/logger": "^0.1.1", - "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.7", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@changesets/write": "^0.4.0", - "@inquirer/external-editor": "^1.0.2", - "@manypkg/get-packages": "^1.1.3", - "ansi-colors": "^4.1.3", - "enquirer": "^2.4.1", - "fs-extra": "^7.0.1", - "mri": "^1.2.0", - "package-manager-detector": "^0.2.0", - "picocolors": "^1.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.3", - "spawndamnit": "^3.0.1", - "term-size": "^2.1.0" - }, - "bin": { - "changeset": "bin.js" - } - }, - "node_modules/@changesets/config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.4.tgz", - "integrity": "sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.4", - "@changesets/logger": "^0.1.1", - "@changesets/should-skip-package": "^0.1.2", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1", - "micromatch": "^4.0.8" - } - }, - "node_modules/@changesets/errors": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", - "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", - "dev": true, - "license": "MIT", - "dependencies": { - "extendable-error": "^0.1.5" - } - }, - "node_modules/@changesets/get-dependents-graph": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.4.tgz", - "integrity": "sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "picocolors": "^1.1.0", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/get-release-plan": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.16.tgz", - "integrity": "sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/assemble-release-plan": "^6.0.10", - "@changesets/config": "^3.1.4", - "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.7", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3" - } - }, - "node_modules/@changesets/get-version-range-type": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", - "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@changesets/git": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz", - "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@manypkg/get-packages": "^1.1.3", - "is-subdir": "^1.1.1", - "micromatch": "^4.0.8", - "spawndamnit": "^3.0.1" - } - }, - "node_modules/@changesets/logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", - "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.0" - } - }, - "node_modules/@changesets/parse": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.3.tgz", - "integrity": "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "js-yaml": "^4.1.1" - } - }, - "node_modules/@changesets/pre": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", - "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1" - } - }, - "node_modules/@changesets/read": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.7.tgz", - "integrity": "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/git": "^3.0.4", - "@changesets/logger": "^0.1.1", - "@changesets/parse": "^0.4.3", - "@changesets/types": "^6.1.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0", - "picocolors": "^1.1.0" - } - }, - "node_modules/@changesets/should-skip-package": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", - "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "@manypkg/get-packages": "^1.1.3" - } - }, - "node_modules/@changesets/types": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", - "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@changesets/write": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", - "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@changesets/types": "^6.1.0", - "fs-extra": "^7.0.1", - "human-id": "^4.1.1", - "prettier": "^2.7.1" - } - }, "node_modules/@commitlint/cli": { "version": "20.5.0", "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.5.0.tgz", @@ -578,138 +325,6 @@ } } }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^2.1.1", - "iconv-lite": "^0.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@manypkg/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.5.5", - "@types/node": "^12.7.1", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - } - }, - "node_modules/@manypkg/find-root/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@manypkg/find-root/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@manypkg/get-packages": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.5.5", - "@changesets/types": "^4.0.1", - "@manypkg/find-root": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "read-yaml-file": "^1.1.0" - } - }, - "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", - "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@manypkg/get-packages/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@simple-libs/child-process-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.2.tgz", @@ -767,16 +382,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -817,42 +422,6 @@ "dev": true, "license": "MIT" }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/better-path-resolve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-windows": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -863,13 +432,6 @@ "node": ">=6" } }, - "node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", - "dev": true, - "license": "MIT" - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -1004,44 +566,6 @@ "typescript": ">=5" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -1062,20 +586,6 @@ "dev": true, "license": "MIT" }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -1106,27 +616,6 @@ "node": ">=6" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extendable-error": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", - "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", - "dev": true, - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1134,23 +623,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/fast-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", @@ -1168,96 +640,31 @@ ], "license": "BSD-3-Clause" }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/git-raw-commits": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.1.tgz", + "integrity": "sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==", "dev": true, "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "@conventional-changelog/git-client": "^2.6.0", + "meow": "^13.0.0" + }, + "bin": { + "git-raw-commits": "src/cli.js" }, "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/git-raw-commits": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.1.tgz", - "integrity": "sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@conventional-changelog/git-client": "^2.6.0", - "meow": "^13.0.0" - }, - "bin": { - "git-raw-commits": "src/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "node": ">=18" } }, "node_modules/global-directory": { @@ -1276,71 +683,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/human-id": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz", - "integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==", - "dev": true, - "license": "MIT", - "bin": { - "human-id": "dist/cli.js" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -1396,16 +738,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -1416,29 +748,6 @@ "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -1462,36 +771,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-subdir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", - "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "better-path-resolve": "1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", @@ -1536,16 +815,6 @@ "dev": true, "license": "MIT" }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -1553,19 +822,6 @@ "dev": true, "license": "MIT" }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -1621,30 +877,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -1655,95 +887,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/outdent": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", - "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-manager-detector": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", - "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "quansync": "^0.2.7" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -1776,36 +919,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -1813,123 +926,6 @@ "dev": true, "license": "ISC" }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/read-yaml-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.6.1", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/read-yaml-file/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -1960,48 +956,6 @@ "node": ">=8" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -2015,70 +969,6 @@ "node": ">=10" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/spawndamnit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", - "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", - "dev": true, - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "cross-spawn": "^7.0.5", - "signal-exit": "^4.0.1" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -2107,29 +997,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tinyexec": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", @@ -2140,19 +1007,6 @@ "node": ">=18" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/typescript": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", @@ -2176,32 +1030,6 @@ "license": "MIT", "peer": true }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/package.json b/package.json index 140b4b3..3b1f018 100644 --- a/package.json +++ b/package.json @@ -37,8 +37,7 @@ "node": ">=16" }, "devDependencies": { - "@changesets/cli": "^2.31.0", - "@commitlint/cli": "^20.5.0", - "@commitlint/config-conventional": "^20.5.0" + "@commitlint/cli": "20.5.0", + "@commitlint/config-conventional": "20.5.0" } } From 2cdee6de647f2ec3ac38330a66407a82a4989e5f Mon Sep 17 00:00:00 2001 From: Tyler Raber Date: Sun, 19 Apr 2026 16:00:54 -0400 Subject: [PATCH 6/9] docs(readme): add link to DEVELOPMENT.md Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 7ed13a7..2f18a8c 100644 --- a/README.md +++ b/README.md @@ -210,6 +210,12 @@ Consolidate insights into MEMORY.md, then clean up fragmented or stale content. --- +## Development + +See [DEVELOPMENT.md](DEVELOPMENT.md) for contributor setup, testing, adding new skills, commit conventions, and changesets. + +--- + ## Attribution Skill content improvements apply principles from [12-factor-agents](https://github.com/humanlayer/12-factor-agents) (Dex Horthy / [HumanLayer](https://github.com/humanlayer)). Commit conventions follow [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/). Version tracking uses [Changesets](https://github.com/changesets/changesets). From 33ff493d7338ae47a13a755aa754f7692fa6f1a2 Mon Sep 17 00:00:00 2001 From: Tyler Raber Date: Sun, 19 Apr 2026 16:14:22 -0400 Subject: [PATCH 7/9] fix: address PR review feedback - Remove Co-authored-by/Session metadata from changeset - Fix 'unschemaed' typo in memory-schema description - Fix postinstall.js comment and add install count tracking - Bump engines.node to >=18 (required by commitlint 20.x) - Fix commitlint.config.js ESM -> CJS (no type:module in package.json) - Add uvx prerequisite note to README - Fix LICENSE link in README, add MIT LICENSE file - Add node_modules to .gitignore Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .changeset/add-copilot-cli-support.md | 3 --- .gitignore | 1 + LICENSE | 21 +++++++++++++++++++++ README.md | 4 +++- commitlint.config.js | 2 +- memory-schema/SKILL.md | 2 +- package-lock.json | 2 +- package.json | 2 +- scripts/postinstall.js | 6 ++++-- 9 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 LICENSE diff --git a/.changeset/add-copilot-cli-support.md b/.changeset/add-copilot-cli-support.md index 9b5e3f0..e4cb489 100644 --- a/.changeset/add-copilot-cli-support.md +++ b/.changeset/add-copilot-cli-support.md @@ -8,6 +8,3 @@ feat: add GitHub Copilot CLI support and 12-factor agent improvements - Applied 12-Factor Agents principles (https://github.com/humanlayer/12-factor-agents) to all 10 SKILL.md files - Added npm postinstall script supporting Copilot CLI, Claude Code, and future agents - Updated README with npm install instructions and compatible agents section - -Co-authored-by: GitHub Copilot CLI v1.0.32 (claude-sonnet-4.6) <223556219+Copilot@users.noreply.github.com> -Copilot-Session: 8a719a9e-819f-4414-bedb-a9f1fdc85d32 diff --git a/.gitignore b/.gitignore index 43b0839..7659259 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store .idea/ moby-dick.txt +node_modules/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f9ad5ae --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 basicmachines-co + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 2f18a8c..c621595 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,8 @@ pip install basic-memory Or see the [full install guide](https://github.com/basicmachines-co/basic-memory#installation). +> **Note:** The `.mcp.json` config uses [`uvx`](https://docs.astral.sh/uv/) to launch the MCP server. If you installed Basic Memory via `pip`, you can either [install `uv`](https://docs.astral.sh/uv/getting-started/installation/) or update `.mcp.json` to use `basic-memory mcp` directly. + ### 2. Configure the MCP Server Copy `.mcp.json` from this repo into your project root (or `~/.copilot/`): @@ -226,4 +228,4 @@ Skill content improvements apply principles from [12-factor-agents](https://gith ## License -MIT — see original source for full license text. +MIT — see [LICENSE](LICENSE). diff --git a/commitlint.config.js b/commitlint.config.js index 3f5e287..422b194 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1 +1 @@ -export default { extends: ['@commitlint/config-conventional'] }; +module.exports = { extends: ['@commitlint/config-conventional'] }; diff --git a/memory-schema/SKILL.md b/memory-schema/SKILL.md index 74d4230..e723354 100644 --- a/memory-schema/SKILL.md +++ b/memory-schema/SKILL.md @@ -1,6 +1,6 @@ --- name: memory-schema -description: "Schema lifecycle management for Basic Memory: discover unschemaed notes, infer schemas, create and edit schema definitions, validate notes, and detect drift. Use when working with structured note types (Task, Person, Meeting, etc.)." +description: "Schema lifecycle management for Basic Memory: discover notes without schemas, infer schemas, create and edit schema definitions, validate notes, and detect drift. Use when working with structured note types (Task, Person, Meeting, etc.)." --- # Memory Schema diff --git a/package-lock.json b/package-lock.json index 6a57592..fe1632e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@commitlint/config-conventional": "20.5.0" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@babel/code-frame": { diff --git a/package.json b/package.json index 3b1f018..55017ef 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "scripts/" ], "engines": { - "node": ">=16" + "node": ">=18" }, "devDependencies": { "@commitlint/cli": "20.5.0", diff --git a/scripts/postinstall.js b/scripts/postinstall.js index 8e28699..21902a4 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -// Installs memory skills to the first available skills directory. +// Installs memory skills to all detected agent skill directories. // Supports: ~/.copilot/skills, ~/.claude/skills, ~/.agents/skills const fs = require('fs'); @@ -56,15 +56,17 @@ let installed = 0; try { for (const skillsDir of targets) { fs.mkdirSync(skillsDir, { recursive: true }); + let count = 0; for (const skill of SKILLS) { const src = path.join(pkgRoot, skill); const dest = path.join(skillsDir, skill); if (fs.existsSync(src)) { copyDirSync(src, dest); + count++; installed++; } } - console.log(`✅ Installed ${SKILLS.length} memory skills → ${skillsDir}`); + console.log(`✅ Installed ${count}/${SKILLS.length} memory skills → ${skillsDir}`); } } catch (err) { console.error(`⚠️ Failed to install skills: ${err.message}`); From dd7602c7993149ae1f8a27f9a56a9aa2453b78e7 Mon Sep 17 00:00:00 2001 From: Tyler Raber Date: Sun, 19 Apr 2026 16:30:40 -0400 Subject: [PATCH 8/9] fix: address second PR review feedback - Clean stale skill files on upgrade (rmSync before copy) - Clarify README: skills install when agent home dir exists - Soften commitlint wording (config included, no hook/CI yet) - Align defrag guidance with archive-never-delete principle Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- DEVELOPMENT.md | 2 +- README.md | 2 +- memory-defrag/SKILL.md | 2 +- scripts/postinstall.js | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 53306de..d202ffe 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -95,7 +95,7 @@ npx skills add basicmachines-co/basic-memory-skills --agent claude ## Commit Conventions -All commits follow [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/), enforced by [commitlint](https://github.com/conventional-changelog/commitlint). +All commits follow [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/). A [commitlint](https://github.com/conventional-changelog/commitlint) configuration is included — run `npx commitlint --edit` to validate commit messages locally. ``` [optional scope]: diff --git a/README.md b/README.md index c621595..51fbe44 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Verify the Basic Memory tools are available — you should see `write_note`, `re npm install -g basic-memory-skills ``` -Skills are automatically copied to `~/.copilot/skills/` (and `~/.claude/skills/` if present). Then in Copilot CLI: +Skills are automatically copied to `~/.copilot/skills/` (and `~/.claude/skills/`) when the corresponding agent home directory exists. Then in Copilot CLI: ``` /skills reload diff --git a/memory-defrag/SKILL.md b/memory-defrag/SKILL.md index 03bd6a3..086e4ee 100644 --- a/memory-defrag/SKILL.md +++ b/memory-defrag/SKILL.md @@ -119,6 +119,6 @@ After changes: - **Target 15-25 focused files.** Too few means bloated files; too many means fragmentation. - **File names should be scannable.** Use descriptive names: `people.md`, `project-status.md`, `competitive-landscape.md` — not `notes-2.md`. - **Don't over-organize.** One level of directories is usually enough. `memory/tasks/` and `memory/competitive/` are fine; `memory/work/projects/active/basic-memory/notes/` is not. -- **Completed tasks**: Tasks with `status: done` older than 14 days can be removed. Their insights should already be in MEMORY.md via reflection. +- **Completed tasks**: Tasks with `status: done` older than 14 days should be archived (not deleted). Their insights should already be in MEMORY.md via reflection. - **Ask before destructive changes.** If uncertain whether information is still relevant, keep it with a `(review needed)` tag rather than deleting. - **Distill, don't just remove.** When pruning error traces or stale observations, ask if there's a one-line lesson worth keeping before deleting entirely. diff --git a/scripts/postinstall.js b/scripts/postinstall.js index 21902a4..fda526b 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -61,6 +61,10 @@ try { const src = path.join(pkgRoot, skill); const dest = path.join(skillsDir, skill); if (fs.existsSync(src)) { + // Remove existing dest to clean stale files from prior versions + if (fs.existsSync(dest)) { + fs.rmSync(dest, { recursive: true, force: true }); + } copyDirSync(src, dest); count++; installed++; From 9582555f8c4325a22181c13a773c5898a2709d12 Mon Sep 17 00:00:00 2001 From: Tyler Raber Date: Sun, 19 Apr 2026 16:39:51 -0400 Subject: [PATCH 9/9] fix(postinstall): skip in CI environments, exit non-zero on errors - Gate postinstall on CI and SKIP_POSTINSTALL env vars - Use process.exitCode = 1 on real errors instead of exit(0) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- scripts/postinstall.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/postinstall.js b/scripts/postinstall.js index fda526b..4eacd3f 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -2,6 +2,11 @@ // Installs memory skills to all detected agent skill directories. // Supports: ~/.copilot/skills, ~/.claude/skills, ~/.agents/skills +// Skip in CI or when explicitly opted out +if (process.env.CI || process.env.SKIP_POSTINSTALL) { + process.exit(0); +} + const fs = require('fs'); const path = require('path'); const os = require('os'); @@ -75,7 +80,7 @@ try { } catch (err) { console.error(`⚠️ Failed to install skills: ${err.message}`); console.error(' You can manually copy skill folders to ~/.copilot/skills/'); - process.exit(0); + process.exitCode = 1; } if (installed > 0) {