Initial commit
This commit is contained in:
24
.claude-plugin/plugin.json
Normal file
24
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"name": "azkg",
|
||||||
|
"description": "Agent-maintained Zettelkasten knowledge graph",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"author": {
|
||||||
|
"name": "Donald Thompson",
|
||||||
|
"email": "dthompson@witt3rd.com"
|
||||||
|
},
|
||||||
|
"commands": [
|
||||||
|
"./commands/conform-note.md",
|
||||||
|
"./commands/create-note.md",
|
||||||
|
"./commands/expand-graph.md",
|
||||||
|
"./commands/graph-add-relationship.md",
|
||||||
|
"./commands/graph-moc.md",
|
||||||
|
"./commands/graph-note.md",
|
||||||
|
"./commands/graph-stats.md",
|
||||||
|
"./commands/graph-validate.md",
|
||||||
|
"./commands/learning-path.md",
|
||||||
|
"./commands/refresh-topic.md",
|
||||||
|
"./commands/rename-note.md",
|
||||||
|
"./commands/search-notes.md",
|
||||||
|
"./commands/update-note.md"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# azkg
|
||||||
|
|
||||||
|
Agent-maintained Zettelkasten knowledge graph
|
||||||
254
commands/conform-note.md
Normal file
254
commands/conform-note.md
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
---
|
||||||
|
description: Restructure a note to follow standard repository format
|
||||||
|
---
|
||||||
|
|
||||||
|
# Conform Note
|
||||||
|
|
||||||
|
Restructure a note to follow the standard repository format as defined in CLAUDE.md and README.md.
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
**IMPORTANT**: Transform the provided note to follow the question-oriented content synthesis approach defined in `_shared_content_synthesis.md`.
|
||||||
|
|
||||||
|
The target structure should be:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
---
|
||||||
|
tags: [domain, technology, content-type]
|
||||||
|
last_refresh: YYYY-MM-DD # Optional, preserve if exists
|
||||||
|
source: <original_url_or_path> # Optional, preserve if exists
|
||||||
|
---
|
||||||
|
|
||||||
|
# Note Title (Based on Central Question)
|
||||||
|
|
||||||
|
## Central Question
|
||||||
|
|
||||||
|
**Question**: [The single overarching question this note addresses]
|
||||||
|
|
||||||
|
**Executive Summary**: 2-3 paragraphs previewing key insights and how the content resolves the central question.
|
||||||
|
|
||||||
|
## Part I: [Domain Question 1]
|
||||||
|
|
||||||
|
### [Specific Question 1.1]
|
||||||
|
|
||||||
|
**Question**: [Clear, specific question from this section]
|
||||||
|
|
||||||
|
**Answer**: [Comprehensive response including:
|
||||||
|
- Direct answer to the question
|
||||||
|
- Supporting evidence from content (specific quotes, examples, data)
|
||||||
|
- Technical details and concrete information
|
||||||
|
- Implications and connections to broader themes]
|
||||||
|
|
||||||
|
### [Specific Question 1.2]
|
||||||
|
|
||||||
|
**Question**: [Next specific question]
|
||||||
|
|
||||||
|
**Answer**: [Evidence-based response...]
|
||||||
|
|
||||||
|
## Part II: [Domain Question 2]
|
||||||
|
|
||||||
|
### [Specific Question 2.1]
|
||||||
|
|
||||||
|
**Question**: [Clear question]
|
||||||
|
|
||||||
|
**Answer**: [Comprehensive response with content evidence...]
|
||||||
|
|
||||||
|
[Continue with additional parts and sections as needed]
|
||||||
|
|
||||||
|
## Resolution: [Answer to Central Question]
|
||||||
|
|
||||||
|
Synthesize domain insights to definitively resolve the central question posed at the beginning.
|
||||||
|
|
||||||
|
## Related Concepts
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
- [[note]] - Why it's needed first
|
||||||
|
|
||||||
|
### Related Topics
|
||||||
|
- [[note]] - Why it connects
|
||||||
|
|
||||||
|
### Extends
|
||||||
|
- [[note]] - What this builds upon
|
||||||
|
|
||||||
|
### Extended By
|
||||||
|
- [[note]] - What builds upon this
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
- [[note]] - Concrete implementation
|
||||||
|
|
||||||
|
### Alternatives
|
||||||
|
- [[note]] - Different approach
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
[1] <https://example.com>
|
||||||
|
[2] <https://example.com>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
|
||||||
|
### 1. Read and Analyze
|
||||||
|
|
||||||
|
- Read the specified note file
|
||||||
|
- Identify existing sections and their purpose
|
||||||
|
- Analyze the content to identify:
|
||||||
|
- The central question the note addresses
|
||||||
|
- Domain areas and their questions
|
||||||
|
- Specific questions within each section
|
||||||
|
- Preserve all valuable content
|
||||||
|
|
||||||
|
### 2. Fix YAML Frontmatter
|
||||||
|
|
||||||
|
- Ensure proper YAML format with `tags: [tag1, tag2, tag3]`
|
||||||
|
- Preserve `last_refresh` if it exists
|
||||||
|
- Ensure tags follow conventions: lowercase with hyphens
|
||||||
|
|
||||||
|
### 3. Restructure Title and Central Question
|
||||||
|
|
||||||
|
- Ensure single H1 title (update to reflect central question if needed)
|
||||||
|
- Add "## Central Question" section immediately after title
|
||||||
|
- Identify and state the single overarching question the note addresses
|
||||||
|
- Create executive summary (2-3 paragraphs) previewing key insights
|
||||||
|
|
||||||
|
### 4. Transform Main Content to Question-Answer Format
|
||||||
|
|
||||||
|
**Apply question-oriented synthesis** (from `_shared_content_synthesis.md`):
|
||||||
|
|
||||||
|
- Organize existing content into Part I, Part II, etc. (domain questions)
|
||||||
|
- Within each part, create subsections with specific questions
|
||||||
|
- For each subsection:
|
||||||
|
- **Question**: State the specific question clearly
|
||||||
|
- **Answer**: Provide comprehensive response with evidence from content
|
||||||
|
- Preserve all substantive content, reorganized into Q&A format
|
||||||
|
- Maintain technical details, examples, and concrete information
|
||||||
|
- Add "## Resolution" section that synthesizes insights to answer central question
|
||||||
|
|
||||||
|
### 5. Fix References Section
|
||||||
|
|
||||||
|
- Change "Citations:" to "## References"
|
||||||
|
- Remove any "---" separator lines between content and references
|
||||||
|
- Remove attribution lines like "Answer from Perplexity: pplx.ai/share"
|
||||||
|
- Keep all citation links properly formatted
|
||||||
|
- Ensure References section comes AFTER Related Concepts
|
||||||
|
|
||||||
|
### 6. Preserve Related Concepts
|
||||||
|
|
||||||
|
- The "## Related Concepts" section contains typed relationships - be careful when editing
|
||||||
|
- This section IS the knowledge graph - relationships live directly in markdown files
|
||||||
|
- Ensure it appears before References section
|
||||||
|
- When conforming structure, preserve all existing relationships exactly as they are
|
||||||
|
|
||||||
|
### 7. Final Structure Check
|
||||||
|
|
||||||
|
The final order should be:
|
||||||
|
|
||||||
|
1. YAML frontmatter
|
||||||
|
2. Title (H1)
|
||||||
|
3. ## Central Question (H2) with executive summary
|
||||||
|
4. ## Part I, Part II, etc. (H2) - Domain questions with Q&A subsections
|
||||||
|
5. ## Resolution (H2) - Answer to central question
|
||||||
|
6. ## Related Concepts (H2) - preserve existing relationships
|
||||||
|
7. ## References (H2)
|
||||||
|
|
||||||
|
## Execution
|
||||||
|
|
||||||
|
1. Use Read tool to load the note
|
||||||
|
2. Use Edit tool to make surgical changes OR Write tool if complete restructure needed
|
||||||
|
3. Preserve all wikilinks in format `[[note]]` NOT `[[note.md]]`
|
||||||
|
4. Maintain all existing content - only reorganize, don't remove substance
|
||||||
|
|
||||||
|
## Important Rules
|
||||||
|
|
||||||
|
- **Preserve content**: Only reorganize, don't delete valuable information
|
||||||
|
- **Preserve Related Concepts**: Keep all existing relationships exactly as written
|
||||||
|
- **Maintain wikilinks**: Use `[[note]]` format
|
||||||
|
- **Keep citations**: Transform format but preserve all references
|
||||||
|
- **Clean formatting**: Remove extraneous separators and attribution lines
|
||||||
|
- **Consistent headings**: Use H2 (##) for major sections
|
||||||
|
|
||||||
|
## Example Transformations
|
||||||
|
|
||||||
|
**Before:**
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Some Note
|
||||||
|
|
||||||
|
Lots of intro text...
|
||||||
|
|
||||||
|
## Content
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
Citations:
|
||||||
|
[1] https://example.com
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Answer from Perplexity: pplx.ai/share
|
||||||
|
|
||||||
|
## Related Concepts
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
**After:**
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
---
|
||||||
|
tags: [relevant, tags]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Some Note
|
||||||
|
|
||||||
|
Brief summary extracted from intro.
|
||||||
|
|
||||||
|
## Content
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
## Related Concepts
|
||||||
|
...
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
[1] <https://example.com>
|
||||||
|
```
|
||||||
|
|
||||||
|
Execute this transformation for the note file specified by the user.
|
||||||
324
commands/create-note.md
Normal file
324
commands/create-note.md
Normal file
@@ -0,0 +1,324 @@
|
|||||||
|
---
|
||||||
|
description: Create a new atomic note in the Zettelkasten knowledge graph
|
||||||
|
---
|
||||||
|
|
||||||
|
# Create Note
|
||||||
|
|
||||||
|
You are tasked with creating a new atomic note in the Zettelkasten knowledge graph. Follow these steps systematically:
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## 1. Parse Input and Check for Duplicates
|
||||||
|
|
||||||
|
**Input format:** User provides either:
|
||||||
|
|
||||||
|
- A topic name: `/create-note semantic_routing`
|
||||||
|
- A descriptive phrase: `/create-note "Rust async runtime comparison"`
|
||||||
|
|
||||||
|
**Duplicate detection:**
|
||||||
|
|
||||||
|
- Search existing notes using Glob for similar filenames
|
||||||
|
- Search content using Grep for similar concepts
|
||||||
|
- If potential duplicate found, ask user:
|
||||||
|
- "Found existing note `similar_note.md`. Would you like to:
|
||||||
|
- Expand/refresh that note instead?
|
||||||
|
- Create a new distinct note (explain the difference)?
|
||||||
|
- Cancel?"
|
||||||
|
|
||||||
|
## 2. Generate Filename
|
||||||
|
|
||||||
|
**Naming convention:**
|
||||||
|
|
||||||
|
- `topic_specific_concept.md` - lowercase with underscores
|
||||||
|
- Descriptive, not generic: `python_mcp_sdk.md` NOT `sdk.md`
|
||||||
|
- No folder prefixes in filename
|
||||||
|
- All notes go in repository root
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
|
||||||
|
- Input: "semantic routing" → `semantic_routing.md`
|
||||||
|
- Input: "Rust async runtime comparison" → `rust_async_runtime_comparison.md`
|
||||||
|
- Input: "First principles thinking" → `first_principles_thinking.md`
|
||||||
|
|
||||||
|
## 3. Research the Topic
|
||||||
|
|
||||||
|
**Use Perplexity for comprehensive research:**
|
||||||
|
|
||||||
|
- Formulate focused query: "Provide comprehensive, technical information about [TOPIC] including: definition, key concepts, how it works, common use cases, best practices, related technologies, and current state as of 2025. Focus on technical accuracy and concrete details."
|
||||||
|
- Use `mcp__perplexity-ask__perplexity_ask` tool
|
||||||
|
- Gather sufficient material for complete, self-contained note
|
||||||
|
- Capture citation sources for references section
|
||||||
|
|
||||||
|
**Research depth:**
|
||||||
|
|
||||||
|
- Note should be atomic (one concept) but complete
|
||||||
|
- Include enough context to be standalone
|
||||||
|
- Technical and specific, not superficial
|
||||||
|
|
||||||
|
## 4. Discover Relationships
|
||||||
|
|
||||||
|
**Analyze against existing knowledge graph using Grep and Read:**
|
||||||
|
|
||||||
|
**Prerequisites:** What must be understood first?
|
||||||
|
|
||||||
|
- Grep for foundational concepts this topic mentions
|
||||||
|
- Check existing notes for topics that should come before this
|
||||||
|
- Example: `mcp_security.md` requires `mcp_overview.md` first
|
||||||
|
|
||||||
|
**Related concepts:** What connects at the same level?
|
||||||
|
|
||||||
|
- Find complementary or adjacent topics via tag search
|
||||||
|
- Technologies that integrate or compare
|
||||||
|
- Example: `semantic_routing.md` relates to `agents.md`
|
||||||
|
|
||||||
|
**Extends:** What does this build upon?
|
||||||
|
|
||||||
|
- Specific notes this concept directly extends
|
||||||
|
- Base concepts or patterns this implements
|
||||||
|
- Example: `python_mcp_sdk.md` extends `mcp_overview.md`
|
||||||
|
|
||||||
|
**Examples:** What concrete implementations exist?
|
||||||
|
|
||||||
|
- Look for specific tool/framework notes
|
||||||
|
- Implementation patterns
|
||||||
|
- Example: `agents.md` has examples like `alita.md`
|
||||||
|
|
||||||
|
**Alternatives:** Different approaches to same problem?
|
||||||
|
|
||||||
|
- Competing technologies or patterns
|
||||||
|
- Different paradigms for same goal
|
||||||
|
|
||||||
|
## 5. Generate Tag Recommendations
|
||||||
|
|
||||||
|
**Read `tag_system.md` for complete tag catalog**
|
||||||
|
|
||||||
|
**Select 3-6 tags across multiple dimensions:**
|
||||||
|
|
||||||
|
1. **Technology/Language:** `#python`, `#rust`, `#typescript`, etc.
|
||||||
|
2. **Framework/Tool:** `#react`, `#mcp`, `#fastmcp`, etc.
|
||||||
|
3. **Domain/Discipline:** `#agents`, `#llm`, `#security`, etc.
|
||||||
|
4. **Content Type:** `#api`, `#guide`, `#pattern`, `#reference`, etc.
|
||||||
|
5. **Cross-cutting Themes:** `#async`, `#optimization`, `#testing`, etc.
|
||||||
|
6. **Method/Thinking:** `#first-principles`, `#systems-thinking`, etc.
|
||||||
|
|
||||||
|
**Tag format:** lowercase with hyphens in YAML array
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
tags: [python, mcp, agents, sdk, api]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. Write the Note
|
||||||
|
|
||||||
|
**IMPORTANT**: Follow the question-oriented content synthesis approach defined in `_shared_content_synthesis.md`.
|
||||||
|
|
||||||
|
**Note Structure Requirements:**
|
||||||
|
|
||||||
|
The note MUST follow this question-answering paradigm:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
---
|
||||||
|
tags: [tag1, tag2, tag3, tag4, tag5]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Note Title (Based on Central Question)
|
||||||
|
|
||||||
|
## Central Question
|
||||||
|
|
||||||
|
**Question**: [The single overarching question this note addresses]
|
||||||
|
|
||||||
|
**Executive Summary**: 2-3 paragraphs previewing key insights and how the content resolves the central question.
|
||||||
|
|
||||||
|
## Part I: [Domain Question 1]
|
||||||
|
|
||||||
|
### [Specific Question 1.1]
|
||||||
|
|
||||||
|
**Question**: [Clear, specific question from this section]
|
||||||
|
|
||||||
|
**Answer**: [Comprehensive response including:
|
||||||
|
- Direct answer to the question
|
||||||
|
- Supporting evidence (specific quotes, examples, data from research)
|
||||||
|
- Technical details and concrete information
|
||||||
|
- Implications and connections to broader themes]
|
||||||
|
|
||||||
|
### [Specific Question 1.2]
|
||||||
|
|
||||||
|
**Question**: [Next specific question]
|
||||||
|
|
||||||
|
**Answer**: [Evidence-based response...]
|
||||||
|
|
||||||
|
## Part II: [Domain Question 2]
|
||||||
|
|
||||||
|
### [Specific Question 2.1]
|
||||||
|
|
||||||
|
**Question**: [Clear question]
|
||||||
|
|
||||||
|
**Answer**: [Comprehensive response with evidence...]
|
||||||
|
|
||||||
|
[Continue with additional parts and sections as needed]
|
||||||
|
|
||||||
|
## Resolution: [Answer to Central Question]
|
||||||
|
|
||||||
|
Synthesize domain insights to definitively resolve the central question posed at the beginning.
|
||||||
|
|
||||||
|
## Related Concepts
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
- [[prerequisite_note]] - Why it's needed first
|
||||||
|
|
||||||
|
### Related Topics
|
||||||
|
- [[related_note]] - Connection explanation
|
||||||
|
|
||||||
|
### Extends
|
||||||
|
- [[base_note]] - What this builds upon
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
[1] Source URL from Perplexity research
|
||||||
|
[2] Source URL from Perplexity research
|
||||||
|
```
|
||||||
|
|
||||||
|
**Content Synthesis Guidelines** (from `_shared_content_synthesis.md`):
|
||||||
|
|
||||||
|
**DO**:
|
||||||
|
- Create complete educational document that systematically answers questions
|
||||||
|
- Include specific details, quotes, examples, data points from research
|
||||||
|
- Build understanding progressively from atomic to central question
|
||||||
|
- Provide standalone educational value for readers learning the topic
|
||||||
|
- Write for LLM context consumption and human reading
|
||||||
|
- Use wikilinks `[[note]]` to reference existing notes
|
||||||
|
- Include code examples where appropriate
|
||||||
|
- Be technical and specific with concrete, actionable information
|
||||||
|
|
||||||
|
**DO NOT**:
|
||||||
|
- Simply analyze the question structure or list questions without substantial answers
|
||||||
|
- Use vague generalities or hyperbolic language
|
||||||
|
- Include marketing claims or unsupported assertions
|
||||||
|
|
||||||
|
## 7. Add Bidirectional Relationships
|
||||||
|
|
||||||
|
**Update connected notes using Edit tool:**
|
||||||
|
|
||||||
|
For each relationship discovered:
|
||||||
|
|
||||||
|
1. **Read the target note** to find its "Related Concepts" section
|
||||||
|
2. **Add inverse relationship:**
|
||||||
|
- If new note extends X → Add new note to X's "Extended By" section
|
||||||
|
- If new note has prerequisite X → Add new note to X's "Extended By" or "Related Topics"
|
||||||
|
- If new note relates to X → Add new note to X's "Related Topics"
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# In agents.md - add to "Related Topics" section:
|
||||||
|
- [[semantic_routing]] - Enables intelligent model selection for agent tasks
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8. Update MOC Files
|
||||||
|
|
||||||
|
**Identify relevant MOC files using Glob:**
|
||||||
|
|
||||||
|
- Check tags to determine which MOCs apply
|
||||||
|
- Common MOCs: `agents_moc.md`, `mcp_moc.md`, `rust_moc.md`, `typescript_moc.md`, `python_moc.md`, `writing_moc.md`
|
||||||
|
|
||||||
|
**For each relevant MOC:**
|
||||||
|
|
||||||
|
- Read the MOC file
|
||||||
|
- Find appropriate section to add link
|
||||||
|
- Add wikilink with brief context: `- [[new_note]] - Brief description`
|
||||||
|
- Maintain MOC organization and structure
|
||||||
|
- Use Edit tool for surgical updates
|
||||||
|
|
||||||
|
## 9. Provide Summary
|
||||||
|
|
||||||
|
**Report to user:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Created new note: `new_note.md`
|
||||||
|
|
||||||
|
**Tags:** tag1, tag2, tag3, tag4, tag5
|
||||||
|
|
||||||
|
**Relationships established:**
|
||||||
|
- Prerequisites: 2 notes
|
||||||
|
- Related concepts: 3 notes
|
||||||
|
- Extends: 1 note
|
||||||
|
- Examples: 2 notes
|
||||||
|
|
||||||
|
**Bidirectional links updated:**
|
||||||
|
- Updated 5 notes with inverse relationships
|
||||||
|
|
||||||
|
**MOCs updated:**
|
||||||
|
- moc_name_moc.md (added to "Section Name")
|
||||||
|
- other_moc.md (added to "Other Section")
|
||||||
|
|
||||||
|
**Next steps:**
|
||||||
|
- Review the note at `new_note.md`
|
||||||
|
- Use `/graph-note new_note.md` to verify relationships
|
||||||
|
- Use `/expand-graph new_note.md` to discover additional connections
|
||||||
|
```
|
||||||
|
|
||||||
|
## Important Constraints
|
||||||
|
|
||||||
|
**Critical rules:**
|
||||||
|
|
||||||
|
- ALWAYS use wikilink format `[[note]]` not `[[note.md]]`
|
||||||
|
- MAINTAIN bidirectionality - update both notes in every relationship
|
||||||
|
- ENSURE atomicity - one complete, usable concept per note
|
||||||
|
- NO hyperbolic language or marketing claims
|
||||||
|
- ALL notes go in repository root (no subdirectories)
|
||||||
|
- Use Write for new files, Edit for updating existing files
|
||||||
|
- Use Grep/Glob for discovery, Read for content analysis
|
||||||
|
|
||||||
|
**Tools to use:**
|
||||||
|
|
||||||
|
- **Write** - Create new markdown file
|
||||||
|
- **Edit** - Update existing notes (add relationships, update MOCs)
|
||||||
|
- **Read** - Read tag_system.md, MOC files, existing notes
|
||||||
|
- **Grep** - Search for similar concepts, find notes by tag
|
||||||
|
- **Glob** - Find MOC files, check for duplicates
|
||||||
|
- **mcp__perplexity-ask** - Research the topic
|
||||||
|
|
||||||
|
**Quality checks before writing:**
|
||||||
|
|
||||||
|
- Is this truly atomic (one concept)?
|
||||||
|
- Is it complete enough to stand alone?
|
||||||
|
- Are relationships meaningful and justified?
|
||||||
|
- Do tags span multiple dimensions?
|
||||||
|
- Is content technical and specific?
|
||||||
|
|
||||||
|
Execute these steps for the topic provided by the user.
|
||||||
730
commands/expand-graph.md
Normal file
730
commands/expand-graph.md
Normal file
@@ -0,0 +1,730 @@
|
|||||||
|
---
|
||||||
|
description: Discover missing relationships for a note via multi-strategy analysis
|
||||||
|
---
|
||||||
|
|
||||||
|
# Expand Graph
|
||||||
|
|
||||||
|
Discover missing relationships between a note and the rest of the knowledge graph through multi-strategy analysis.
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## 1. Parse Input and Load Note
|
||||||
|
|
||||||
|
**Input format:** User provides:
|
||||||
|
|
||||||
|
- A note name: `/expand-graph mcp_security.md`
|
||||||
|
- Or just the topic: `/expand-graph mcp_security`
|
||||||
|
|
||||||
|
**Normalize and validate:**
|
||||||
|
|
||||||
|
- Add `.md` extension if missing
|
||||||
|
- Use Glob to verify the target note exists
|
||||||
|
- If not found, suggest similar notes using Glob
|
||||||
|
|
||||||
|
**Read the target note:**
|
||||||
|
|
||||||
|
- Use Read tool to get full content
|
||||||
|
- Extract YAML tags
|
||||||
|
- Extract main concepts and topics
|
||||||
|
- Parse current "Related Concepts" section to see existing relationships
|
||||||
|
|
||||||
|
## 2. Extract Key Concepts
|
||||||
|
|
||||||
|
**Analyze note content for:**
|
||||||
|
|
||||||
|
**Technical terms:**
|
||||||
|
|
||||||
|
- Technologies mentioned (Python, Rust, MCP, OAuth, etc.)
|
||||||
|
- Frameworks and tools (FastMCP, React, etc.)
|
||||||
|
- Protocols and standards (HTTP, JWT, RFC 8707, etc.)
|
||||||
|
|
||||||
|
**Domain concepts:**
|
||||||
|
|
||||||
|
- Core ideas discussed (authentication, security, agents, etc.)
|
||||||
|
- Patterns mentioned (observer, factory, reactive, etc.)
|
||||||
|
- Problem domains (enterprise, web, async, etc.)
|
||||||
|
|
||||||
|
**Wikilinks:**
|
||||||
|
|
||||||
|
- Existing wikilinks in content `[[note]]`
|
||||||
|
- Are these also in "Related Concepts"? If not, they're candidates to add
|
||||||
|
|
||||||
|
**Tags:**
|
||||||
|
|
||||||
|
- YAML frontmatter tags provide high-level domains
|
||||||
|
|
||||||
|
**Output concept extraction:**
|
||||||
|
|
||||||
|
```
|
||||||
|
📖 Analyzing mcp_security.md...
|
||||||
|
|
||||||
|
🔍 Key concepts identified:
|
||||||
|
Technologies: OAuth, JWT, SAML, Active Directory
|
||||||
|
Domains: security, authentication, authorization, privacy
|
||||||
|
Protocols: RFC 8707, Resource Indicators, OAuth flows
|
||||||
|
Patterns: least privilege, defense in depth, audit logging
|
||||||
|
Tags: #mcp #protocol #security #authentication #authorization
|
||||||
|
|
||||||
|
📊 Current relationships:
|
||||||
|
✅ Prerequisites: 2 (mcp_overview, mcp_architecture)
|
||||||
|
✅ Related Topics: 3
|
||||||
|
✅ Extends: 1
|
||||||
|
✅ Examples: 0
|
||||||
|
✅ Alternatives: 0
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Multi-Strategy Relationship Discovery
|
||||||
|
|
||||||
|
**Strategy 1: Content-Based Search (Grep)**
|
||||||
|
|
||||||
|
For each key concept, search other notes:
|
||||||
|
|
||||||
|
```
|
||||||
|
Searching for "OAuth" across knowledge base...
|
||||||
|
Found in:
|
||||||
|
- oauth_fundamentals.md (15 mentions)
|
||||||
|
- api_security.md (8 mentions)
|
||||||
|
- enterprise_auth.md (12 mentions)
|
||||||
|
|
||||||
|
Searching for "authentication" across knowledge base...
|
||||||
|
Found in:
|
||||||
|
- fastmcp_auth.md (20 mentions)
|
||||||
|
- api_security.md (18 mentions)
|
||||||
|
- enterprise_auth.md (25 mentions)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Filter out:**
|
||||||
|
|
||||||
|
- The target note itself
|
||||||
|
- Notes already in "Related Concepts" section
|
||||||
|
- Low-relevance matches (1-2 mentions)
|
||||||
|
|
||||||
|
**Strategy 2: Tag-Based Discovery**
|
||||||
|
|
||||||
|
Use Grep to find notes with overlapping tags:
|
||||||
|
|
||||||
|
```
|
||||||
|
Target has tags: #mcp #security #authentication
|
||||||
|
|
||||||
|
Finding notes with overlapping tags...
|
||||||
|
Use Grep to search for "tags: [" in YAML frontmatter
|
||||||
|
Parse out tags and find overlaps:
|
||||||
|
- #mcp + #security: mcp_implementation.md, mcp_tools.md
|
||||||
|
- #security + #authentication: api_security.md, zero_trust.md
|
||||||
|
- #mcp (any): 12 other MCP-related notes
|
||||||
|
```
|
||||||
|
|
||||||
|
**Strategy 3: Wikilink Analysis**
|
||||||
|
|
||||||
|
Use Grep to find wikilinks in target note content:
|
||||||
|
|
||||||
|
```
|
||||||
|
Checking wikilinks in content vs "Related Concepts" section...
|
||||||
|
|
||||||
|
Found in content but NOT in "Related Concepts":
|
||||||
|
- [[mcp_overview]] - mentioned in text but not in prerequisites
|
||||||
|
- [[oauth_fundamentals]] - referenced but not linked formally
|
||||||
|
|
||||||
|
Use Grep to find backlinks (other notes linking to this note):
|
||||||
|
Found in other notes' "Related Concepts" sections pointing here:
|
||||||
|
- fastmcp_auth.md lists this as "related" (we should reciprocate)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Strategy 4: Research with Perplexity**
|
||||||
|
|
||||||
|
Ask targeted questions:
|
||||||
|
|
||||||
|
```
|
||||||
|
Query 1: "What foundational knowledge is required to understand [main topic of note]?"
|
||||||
|
Query 2: "What concepts are commonly related to [main topic] in practice?"
|
||||||
|
Query 3: "What are concrete examples or implementations of [main topic]?"
|
||||||
|
Query 4: "What are alternative approaches to [main topic]?"
|
||||||
|
```
|
||||||
|
|
||||||
|
Use Perplexity responses to:
|
||||||
|
|
||||||
|
- Discover conceptual prerequisites
|
||||||
|
- Find related domains
|
||||||
|
- Identify common patterns
|
||||||
|
- Suggest examples and alternatives
|
||||||
|
|
||||||
|
## 4. Classify and Score Relationships
|
||||||
|
|
||||||
|
**For each discovered note, determine:**
|
||||||
|
|
||||||
|
### Relationship Type
|
||||||
|
|
||||||
|
**Prerequisites:** Does target need this first?
|
||||||
|
|
||||||
|
- Contains foundational concepts mentioned in target
|
||||||
|
- Target assumes knowledge from this note
|
||||||
|
- Complexity: This note is simpler/more basic
|
||||||
|
- Example: mcp_overview → mcp_security
|
||||||
|
|
||||||
|
**Related Topics:** Parallel/complementary topics?
|
||||||
|
|
||||||
|
- Same level of complexity
|
||||||
|
- Different but connected domain
|
||||||
|
- Solve similar problems differently
|
||||||
|
- Example: api_security ↔ mcp_security
|
||||||
|
|
||||||
|
**Extends:** Does target build on this?
|
||||||
|
|
||||||
|
- Target is specialized version
|
||||||
|
- Adds capabilities to base concept
|
||||||
|
- Target assumes this as foundation
|
||||||
|
- Example: mcp_security extends mcp_architecture
|
||||||
|
|
||||||
|
**Examples:** Is this a concrete implementation?
|
||||||
|
|
||||||
|
- Shows practical application of target concepts
|
||||||
|
- Code/pattern implementing target ideas
|
||||||
|
- Case study of target in practice
|
||||||
|
- Example: fastmcp_auth is example of mcp_security
|
||||||
|
|
||||||
|
**Alternatives:** Different approach to same problem?
|
||||||
|
|
||||||
|
- Solves same problem differently
|
||||||
|
- Competing technology or pattern
|
||||||
|
- Different paradigm
|
||||||
|
- Example: zero_trust vs traditional_security
|
||||||
|
|
||||||
|
### Confidence Score
|
||||||
|
|
||||||
|
**High (★★★★★):**
|
||||||
|
|
||||||
|
- Many shared concepts (10+)
|
||||||
|
- Strong semantic relationship
|
||||||
|
- Confirmed by Perplexity research
|
||||||
|
- Explicitly mentioned in content
|
||||||
|
- Example: OAuth fundamentals for OAuth-heavy security note
|
||||||
|
|
||||||
|
**Medium (★★★☆☆):**
|
||||||
|
|
||||||
|
- Moderate overlap (5-9 concepts)
|
||||||
|
- Reasonable semantic connection
|
||||||
|
- Supported by tag overlap
|
||||||
|
- Mentioned indirectly
|
||||||
|
- Example: General API security for MCP security
|
||||||
|
|
||||||
|
**Low (★★☆☆☆):**
|
||||||
|
|
||||||
|
- Minimal overlap (2-4 concepts)
|
||||||
|
- Weak semantic connection
|
||||||
|
- Speculative relationship
|
||||||
|
- Not mentioned in content
|
||||||
|
- Example: Zero trust model for MCP (valid but tangential)
|
||||||
|
|
||||||
|
### Evidence Collection
|
||||||
|
|
||||||
|
**For each relationship, capture:**
|
||||||
|
|
||||||
|
- **Frequency:** How many concept matches?
|
||||||
|
- **Quotes:** Specific text showing connection
|
||||||
|
- **Location:** Where in note is this relevant?
|
||||||
|
- **Research:** What did Perplexity say?
|
||||||
|
- **Reasoning:** Why should these be linked?
|
||||||
|
|
||||||
|
## 5. Present Suggestions
|
||||||
|
|
||||||
|
**Format as organized report:**
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Graph Expansion: mcp_security.md
|
||||||
|
|
||||||
|
Found **12 potential relationships** across 8 notes
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
## 📚 Suggested Prerequisites (2)
|
||||||
|
|
||||||
|
### 1. [[mcp_overview]] → prerequisite
|
||||||
|
**Confidence:** ★★★★★ High
|
||||||
|
|
||||||
|
**Evidence:**
|
||||||
|
- Mentioned 3 times in target note
|
||||||
|
- Target references "MCP fundamentals" and "protocol basics"
|
||||||
|
- Research confirms: "Understanding MCP basics required before security"
|
||||||
|
|
||||||
|
**Reasoning:** Can't understand MCP security without knowing what MCP is.
|
||||||
|
The security model builds directly on protocol concepts.
|
||||||
|
|
||||||
|
**Current status:** Referenced in content but missing from "Related Concepts"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. [[oauth_fundamentals]] → prerequisite
|
||||||
|
**Confidence:** ★★★★★ High
|
||||||
|
|
||||||
|
**Evidence:**
|
||||||
|
- 15 mentions of "OAuth" in target note
|
||||||
|
- Entire section dedicated to "OAuth Flows"
|
||||||
|
- Tags overlap: #authentication, #security
|
||||||
|
- Research confirms: "OAuth knowledge essential for MCP auth"
|
||||||
|
|
||||||
|
**Reasoning:** OAuth is the primary authentication mechanism. Deep understanding
|
||||||
|
needed before tackling MCP-specific OAuth implementation.
|
||||||
|
|
||||||
|
**Current status:** Not currently linked
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
## 🔗 Suggested Related Topics (4)
|
||||||
|
|
||||||
|
### 3. [[enterprise_architecture]] → related
|
||||||
|
**Confidence:** ★★★☆☆ Medium
|
||||||
|
|
||||||
|
**Evidence:**
|
||||||
|
- Both discuss: VNet integration, DLP, enterprise deployment
|
||||||
|
- 8 shared concepts
|
||||||
|
- Tags overlap: #enterprise
|
||||||
|
|
||||||
|
**Reasoning:** Both address enterprise concerns at similar abstraction level.
|
||||||
|
MCP security is part of broader enterprise architecture.
|
||||||
|
|
||||||
|
**Current status:** Not currently linked
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. [[api_security_best_practices]] → related
|
||||||
|
**Confidence:** ★★★☆☆ Medium
|
||||||
|
|
||||||
|
**Evidence:**
|
||||||
|
- MCP is API protocol
|
||||||
|
- 12 security best practices mentioned in both
|
||||||
|
- Research: "General API security principles apply to MCP"
|
||||||
|
|
||||||
|
**Reasoning:** MCP security inherits from general API security principles.
|
||||||
|
Provides broader context for MCP-specific patterns.
|
||||||
|
|
||||||
|
**Current status:** Not currently linked
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
## 🏗️ Suggested "Extends" (1)
|
||||||
|
|
||||||
|
### 5. mcp_security extends [[mcp_architecture]]
|
||||||
|
**Confidence:** ★★★★★ High
|
||||||
|
|
||||||
|
**Evidence:**
|
||||||
|
- Security is explicit layer on architecture diagram
|
||||||
|
- Target states: "Security model built on top of MCP architecture"
|
||||||
|
- Architecture defines components, security defines protections
|
||||||
|
|
||||||
|
**Reasoning:** Security adds protection layer to architectural components.
|
||||||
|
Cannot exist without the architecture it secures.
|
||||||
|
|
||||||
|
**Current status:** Architecture listed as prerequisite, should be "extends"
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
## 💡 Suggested Examples (3)
|
||||||
|
|
||||||
|
### 6. [[fastmcp_authentication]] → example
|
||||||
|
**Confidence:** ★★★★★ High
|
||||||
|
|
||||||
|
**Evidence:**
|
||||||
|
- Python implementation of MCP auth patterns
|
||||||
|
- Shows OAuth flow implementation
|
||||||
|
- Research: "FastMCP demonstrates MCP security in practice"
|
||||||
|
|
||||||
|
**Reasoning:** Concrete Python code implementing concepts discussed in target.
|
||||||
|
Shows theory in action.
|
||||||
|
|
||||||
|
**Current status:** Not currently linked
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 7. [[csharp_mcp_auth]] → example
|
||||||
|
**Confidence:** ★★★★☆ High
|
||||||
|
|
||||||
|
**Evidence:**
|
||||||
|
- C# implementation of same patterns
|
||||||
|
- Demonstrates enterprise auth integration
|
||||||
|
- Tags: #csharp, #mcp, #authentication
|
||||||
|
|
||||||
|
**Reasoning:** Alternative language implementation showing same concepts.
|
||||||
|
Useful for enterprise/.NET developers.
|
||||||
|
|
||||||
|
**Current status:** Not currently linked
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
## 🔄 Suggested Alternatives (2)
|
||||||
|
|
||||||
|
### 8. [[zero_trust_security_model]] → alternative
|
||||||
|
**Confidence:** ★★☆☆☆ Low
|
||||||
|
|
||||||
|
**Evidence:**
|
||||||
|
- Different security paradigm
|
||||||
|
- Both address: authentication, authorization, least privilege
|
||||||
|
- Research: "Zero trust can be applied to MCP deployments"
|
||||||
|
|
||||||
|
**Reasoning:** Alternative security philosophy applicable to MCP.
|
||||||
|
Different approach to similar goals.
|
||||||
|
|
||||||
|
**Current status:** Not currently linked
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Discovery Statistics
|
||||||
|
|
||||||
|
- **Total candidates examined:** 93 notes
|
||||||
|
- **Content matches found:** 23 notes
|
||||||
|
- **Tag overlaps found:** 15 notes
|
||||||
|
- **After filtering:** 12 high-quality suggestions
|
||||||
|
- **Confidence breakdown:**
|
||||||
|
- High (★★★★★): 5 suggestions
|
||||||
|
- Medium (★★★☆☆): 5 suggestions
|
||||||
|
- Low (★★☆☆☆): 2 suggestions
|
||||||
|
|
||||||
|
## 💡 Insights
|
||||||
|
|
||||||
|
**Critical missing prerequisite:** oauth_fundamentals
|
||||||
|
This note is heavily referenced but not formally linked. High priority addition.
|
||||||
|
|
||||||
|
**Weak example coverage:** Only 0 examples currently
|
||||||
|
Consider adding fastmcp_authentication and csharp_mcp_auth to show practical application.
|
||||||
|
|
||||||
|
**Architecture relationship:** Currently listed as prerequisite
|
||||||
|
Should be "extends" relationship - security is layer on architecture.
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. User Review and Approval
|
||||||
|
|
||||||
|
**Offer interaction modes:**
|
||||||
|
|
||||||
|
```
|
||||||
|
How would you like to proceed?
|
||||||
|
|
||||||
|
[A] Accept all high-confidence suggestions (★★★★★)
|
||||||
|
[R] Review each suggestion individually
|
||||||
|
[C] Custom selection (specify which to add)
|
||||||
|
[S] Save suggestions to file for later review
|
||||||
|
[Q] Quit without changes
|
||||||
|
|
||||||
|
Choice: █
|
||||||
|
```
|
||||||
|
|
||||||
|
**If user chooses [R] (Review):**
|
||||||
|
|
||||||
|
```
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
Review 1 of 12
|
||||||
|
|
||||||
|
Add [[mcp_overview]] as prerequisite?
|
||||||
|
|
||||||
|
Confidence: ★★★★★ High
|
||||||
|
Evidence: Referenced 3 times, foundational concept
|
||||||
|
Reasoning: Must understand MCP basics before security
|
||||||
|
|
||||||
|
[Y] Yes, add this relationship
|
||||||
|
[N] No, skip this one
|
||||||
|
[E] Edit relationship type (suggest different type)
|
||||||
|
[?] Show full context from both notes
|
||||||
|
[S] Skip remaining and finish
|
||||||
|
|
||||||
|
Choice: █
|
||||||
|
```
|
||||||
|
|
||||||
|
**Track decisions:**
|
||||||
|
|
||||||
|
- Accepted relationships
|
||||||
|
- Rejected relationships (with reasons)
|
||||||
|
- Modified relationships (type changes)
|
||||||
|
|
||||||
|
## 7. Update Markdown Files
|
||||||
|
|
||||||
|
**For each accepted relationship:**
|
||||||
|
|
||||||
|
### Update Target Note
|
||||||
|
|
||||||
|
Use Edit tool to update target note's "Related Concepts" section:
|
||||||
|
|
||||||
|
**Read the target note:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Use Read tool to get full content
|
||||||
|
Parse "Related Concepts" section
|
||||||
|
```
|
||||||
|
|
||||||
|
**Add forward relationship:**
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Related Concepts
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
- [[mcp_overview]] - Must understand MCP basics first
|
||||||
|
- [[oauth_fundamentals]] - OAuth is primary auth mechanism
|
||||||
|
```
|
||||||
|
|
||||||
|
**Use Edit tool** to surgically insert new relationships in appropriate subsections.
|
||||||
|
|
||||||
|
### Update Related Notes
|
||||||
|
|
||||||
|
**For each note mentioned, add inverse relationship:**
|
||||||
|
|
||||||
|
**Read the related note:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Use Read tool to get its "Related Concepts" section
|
||||||
|
```
|
||||||
|
|
||||||
|
**Add bidirectional inverse:**
|
||||||
|
|
||||||
|
If target has "Prerequisites: [[mcp_overview]]"
|
||||||
|
Then mcp_overview gets "Extended By: [[target]]"
|
||||||
|
|
||||||
|
If target has "Related Topics: [[api_security]]"
|
||||||
|
Then api_security gets "Related Topics: [[target]]"
|
||||||
|
|
||||||
|
If target has "Extends: [[mcp_architecture]]"
|
||||||
|
Then mcp_architecture gets "Extended By: [[target]]"
|
||||||
|
|
||||||
|
**Use Edit tool** to add inverse relationships to each related note.
|
||||||
|
|
||||||
|
### Maintain Bidirectionality
|
||||||
|
|
||||||
|
**Ensure every relationship has an inverse:**
|
||||||
|
|
||||||
|
| Forward Type | Inverse Type |
|
||||||
|
|--------------|--------------|
|
||||||
|
| Prerequisites | Extended By or Related Topics |
|
||||||
|
| Related Topics | Related Topics (symmetric) |
|
||||||
|
| Extends | Extended By |
|
||||||
|
| Examples | Extended By |
|
||||||
|
| Alternatives | Alternatives (symmetric) |
|
||||||
|
|
||||||
|
## 8. Provide Completion Report
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
✅ Graph Expansion Complete!
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
## Changes Applied
|
||||||
|
|
||||||
|
### mcp_security.md
|
||||||
|
|
||||||
|
**Added relationships:**
|
||||||
|
✅ Prerequisites: 2
|
||||||
|
- [[mcp_overview]] - Must understand MCP basics first
|
||||||
|
- [[oauth_fundamentals]] - OAuth is primary auth mechanism
|
||||||
|
|
||||||
|
✅ Related Topics: 3
|
||||||
|
- [[enterprise_architecture]] - Parallel enterprise concerns
|
||||||
|
- [[api_security_best_practices]] - General API security principles
|
||||||
|
- [[fastmcp_authentication]] - Moved from suggested examples
|
||||||
|
|
||||||
|
✅ Extends: 1 (modified)
|
||||||
|
- [[mcp_architecture]] - Changed from prerequisite to extends
|
||||||
|
|
||||||
|
✅ Examples: 2
|
||||||
|
- [[fastmcp_authentication]] - Python implementation
|
||||||
|
- [[csharp_mcp_auth]] - C# implementation
|
||||||
|
|
||||||
|
**Rejected:**
|
||||||
|
❌ [[zero_trust_security_model]] - User declined (too tangential)
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
## Bidirectional Updates
|
||||||
|
|
||||||
|
Updated 9 additional notes with inverse relationships:
|
||||||
|
- mcp_overview.md → added to Extended By
|
||||||
|
- oauth_fundamentals.md → added to Extended By
|
||||||
|
- enterprise_architecture.md → added to Related Topics
|
||||||
|
- api_security_best_practices.md → added to Related Topics
|
||||||
|
- mcp_architecture.md → moved to Extended By (from prerequisite inverse)
|
||||||
|
- fastmcp_authentication.md → added to Extended By
|
||||||
|
- csharp_mcp_auth.md → added to Extended By
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
## Knowledge Graph Stats
|
||||||
|
|
||||||
|
**Before expansion:**
|
||||||
|
- Total relationships in mcp_security.md: 6
|
||||||
|
|
||||||
|
**After expansion:**
|
||||||
|
- Total relationships in mcp_security.md: 12 (+6)
|
||||||
|
- Files modified: 10 (target + 9 related notes)
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
## Quality Improvements
|
||||||
|
|
||||||
|
🎯 **Closed gaps:**
|
||||||
|
- Connected heavily-referenced OAuth concepts
|
||||||
|
- Added missing example implementations
|
||||||
|
- Corrected architecture relationship type
|
||||||
|
|
||||||
|
📈 **Coverage increase:**
|
||||||
|
- Prerequisites: 2 → 4 (+100%)
|
||||||
|
- Examples: 0 → 2 (new coverage)
|
||||||
|
- Related Topics: 3 → 6 (+100%)
|
||||||
|
|
||||||
|
🔗 **Network density:**
|
||||||
|
- mcp_security.md now has 12 total relationships (was 6)
|
||||||
|
- Better integrated into knowledge graph
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
💡 **Suggestions:**
|
||||||
|
1. Run `/learning-path mcp_security` to see updated prerequisite chain
|
||||||
|
2. Run `/expand-graph oauth_fundamentals` to enrich that critical note
|
||||||
|
3. Run `/graph-validate` to verify all bidirectional links
|
||||||
|
|
||||||
|
🔄 **Consider expanding:**
|
||||||
|
- fastmcp_authentication.md (added as example, may need more connections)
|
||||||
|
- csharp_mcp_auth.md (added as example, may need more connections)
|
||||||
|
|
||||||
|
📊 **Graph health:**
|
||||||
|
✅ All relationships bidirectional
|
||||||
|
✅ No orphaned nodes created
|
||||||
|
✅ Relationship types semantically appropriate
|
||||||
|
```
|
||||||
|
|
||||||
|
## 9. Handle Edge Cases
|
||||||
|
|
||||||
|
**No new relationships found:**
|
||||||
|
|
||||||
|
```
|
||||||
|
✅ Graph Analysis Complete
|
||||||
|
|
||||||
|
No new high-confidence relationships discovered for mcp_security.md
|
||||||
|
|
||||||
|
**Current coverage:**
|
||||||
|
- Prerequisites: 3 (comprehensive)
|
||||||
|
- Related Topics: 5 (well-connected)
|
||||||
|
- Extends: 1 (appropriate)
|
||||||
|
- Examples: 2 (good coverage)
|
||||||
|
- Alternatives: 1 (adequate)
|
||||||
|
|
||||||
|
**Analysis:**
|
||||||
|
- 93 notes examined
|
||||||
|
- 0 high-confidence matches found
|
||||||
|
- This note appears well-integrated
|
||||||
|
|
||||||
|
💡 This is actually good news - the note is already well-connected!
|
||||||
|
```
|
||||||
|
|
||||||
|
**Conflicting relationships:**
|
||||||
|
|
||||||
|
```
|
||||||
|
⚠️ Potential Conflict Detected
|
||||||
|
|
||||||
|
[[mcp_architecture]] appears as both:
|
||||||
|
- Prerequisite (current)
|
||||||
|
- Should extend (suggested)
|
||||||
|
|
||||||
|
**Analysis:**
|
||||||
|
A note cannot both be a prerequisite AND be extended by the same note.
|
||||||
|
|
||||||
|
**Recommendation:**
|
||||||
|
Change to "extends" because:
|
||||||
|
- Security is specialized layer on architecture
|
||||||
|
- "extends" captures that security builds upon architecture
|
||||||
|
- Prerequisites should be for foundational knowledge
|
||||||
|
|
||||||
|
**Action:**
|
||||||
|
[Y] Accept recommendation (change to extends)
|
||||||
|
[N] Keep as prerequisite
|
||||||
|
[?] Explain difference between prerequisite and extends
|
||||||
|
|
||||||
|
Choice: █
|
||||||
|
```
|
||||||
|
|
||||||
|
**Circular dependency risk:**
|
||||||
|
|
||||||
|
```
|
||||||
|
⚠️ Circular Dependency Warning
|
||||||
|
|
||||||
|
Adding [[note_a]] as prerequisite would create cycle:
|
||||||
|
mcp_security → oauth_fundamentals → mcp_implementation → mcp_security
|
||||||
|
|
||||||
|
**Options:**
|
||||||
|
1. Don't add this relationship
|
||||||
|
2. Add as "related" instead of "prerequisite"
|
||||||
|
3. Review and break the existing cycle
|
||||||
|
|
||||||
|
Recommended: Option 2 (related instead)
|
||||||
|
|
||||||
|
Choice: █
|
||||||
|
```
|
||||||
|
|
||||||
|
## 10. Tools Used
|
||||||
|
|
||||||
|
- **Read** - Get full note content, parse "Related Concepts" sections
|
||||||
|
- **Edit** - Update "Related Concepts" sections in target and related notes
|
||||||
|
- **Grep** - Search for concepts across notes, find tag overlaps, find wikilinks
|
||||||
|
- **Glob** - Verify notes exist, find candidates by file patterns
|
||||||
|
- **mcp__perplexity-ask** - Research relationships using LLM reasoning
|
||||||
|
- **Parse logic** - Extract concepts, classify relationships, score confidence
|
||||||
|
|
||||||
|
## 11. Important Notes
|
||||||
|
|
||||||
|
**Quality principles:**
|
||||||
|
|
||||||
|
- Evidence over guessing
|
||||||
|
- Confidence scoring for transparency
|
||||||
|
- User control over changes
|
||||||
|
- Bidirectional integrity always
|
||||||
|
- Clear reasoning for every suggestion
|
||||||
|
|
||||||
|
**Performance considerations:**
|
||||||
|
|
||||||
|
- Grep can search 93 notes quickly
|
||||||
|
- Perplexity queries in parallel where possible
|
||||||
|
- Cache concept extractions
|
||||||
|
- Filter aggressively before showing to user
|
||||||
|
|
||||||
|
**User experience:**
|
||||||
|
|
||||||
|
- Make suggestions actionable
|
||||||
|
- Provide escape hatches
|
||||||
|
- Allow customization
|
||||||
|
- Show clear before/after
|
||||||
|
- Celebrate improvements
|
||||||
|
|
||||||
|
Execute graph expansion for the note provided by the user.
|
||||||
189
commands/graph-add-relationship.md
Normal file
189
commands/graph-add-relationship.md
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
---
|
||||||
|
description: Add a typed bidirectional relationship between two notes
|
||||||
|
---
|
||||||
|
|
||||||
|
# Graph Add Relationship
|
||||||
|
|
||||||
|
Manually add a typed relationship between two notes with bidirectional update.
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## Input
|
||||||
|
|
||||||
|
User provides:
|
||||||
|
|
||||||
|
- Source note: `agents.md`
|
||||||
|
- Target note: `semantic_routing.md`
|
||||||
|
- Relationship type: `related_topics` (or `prerequisites`, `extends`, `alternatives`, `examples`)
|
||||||
|
- Why: "Semantic routing enables intelligent model selection for agent tasks"
|
||||||
|
|
||||||
|
Example: `/graph-add-relationship agents semantic_routing related_topics "Enables model selection"`
|
||||||
|
|
||||||
|
## Valid Relationship Types
|
||||||
|
|
||||||
|
- `prerequisites` - Target must be understood first
|
||||||
|
- `related_topics` - Connected ideas at same level
|
||||||
|
- `extends` - Source builds upon target
|
||||||
|
- `alternatives` - Different approaches to same problem
|
||||||
|
- `examples` - Target is concrete implementation of source
|
||||||
|
|
||||||
|
## Execution Steps
|
||||||
|
|
||||||
|
### 1. Normalize Filenames
|
||||||
|
|
||||||
|
Ensure both filenames have `.md` extension.
|
||||||
|
|
||||||
|
### 2. Verify Both Notes Exist
|
||||||
|
|
||||||
|
Use Glob to verify both files exist:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Glob "agents.md"
|
||||||
|
Glob "semantic_routing.md"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Read Source Note
|
||||||
|
|
||||||
|
Use Read tool to get source note content, including current "Related Concepts" section.
|
||||||
|
|
||||||
|
### 4. Update Source Note
|
||||||
|
|
||||||
|
Use Edit tool to add relationship to appropriate section in source note:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Related Concepts
|
||||||
|
|
||||||
|
### Related Topics
|
||||||
|
- [[existing_note]] - Existing relationship
|
||||||
|
- [[semantic_routing]] - Enables intelligent model selection for agent tasks
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Read Target Note
|
||||||
|
|
||||||
|
Use Read tool to get target note content, including current "Related Concepts" section.
|
||||||
|
|
||||||
|
### 6. Add Inverse Relationship
|
||||||
|
|
||||||
|
Determine inverse relationship type:
|
||||||
|
|
||||||
|
- `prerequisites` in A → add A to `related_topics` or `extended_by` in B (depending on context)
|
||||||
|
- `related_topics` in A → add A to `related_topics` in B
|
||||||
|
- `extends` in A → add A to `extended_by` in B
|
||||||
|
- `alternatives` in A → add A to `alternatives` in B
|
||||||
|
- `examples` in A → add A to `extended_by` or `related_topics` in B
|
||||||
|
|
||||||
|
Use Edit tool to add inverse relationship to target note.
|
||||||
|
|
||||||
|
### 7. Report Success
|
||||||
|
|
||||||
|
Show what was added to both files.
|
||||||
|
|
||||||
|
## Output Format
|
||||||
|
|
||||||
|
```
|
||||||
|
Added Relationship
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
✓ Forward relationship:
|
||||||
|
agents.md → semantic_routing.md
|
||||||
|
Type: related_topics
|
||||||
|
Why: Enables intelligent model selection for agent tasks
|
||||||
|
|
||||||
|
✓ Inverse relationship:
|
||||||
|
semantic_routing.md → agents.md
|
||||||
|
Type: related_topics
|
||||||
|
Why: Agents use semantic routing for task delegation
|
||||||
|
|
||||||
|
============================================================
|
||||||
|
✅ Relationship Added!
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
Updated files:
|
||||||
|
• agents.md - Added to "Related Topics" section
|
||||||
|
• semantic_routing.md - Added to "Related Topics" section
|
||||||
|
|
||||||
|
💡 Next steps:
|
||||||
|
• Review both notes to verify relationships make sense
|
||||||
|
• Use `/graph-note agents.md` to see all relationships
|
||||||
|
• Use `/graph-validate` to check bidirectionality
|
||||||
|
```
|
||||||
|
|
||||||
|
## Validation
|
||||||
|
|
||||||
|
Before adding:
|
||||||
|
|
||||||
|
- Both notes must exist
|
||||||
|
- Relationship type must be valid
|
||||||
|
- "Why" explanation should be provided (required for quality)
|
||||||
|
|
||||||
|
After adding:
|
||||||
|
|
||||||
|
- Both notes should have matching inverse relationships
|
||||||
|
- No duplicate relationships in either file
|
||||||
|
|
||||||
|
## Inverse Relationship Rules
|
||||||
|
|
||||||
|
| Forward Type | Inverse Type | Notes |
|
||||||
|
|--------------|--------------|-------|
|
||||||
|
| prerequisites | related_topics or extended_by | Context dependent |
|
||||||
|
| related_topics | related_topics | Symmetric |
|
||||||
|
| extends | extended_by | Clear inverse |
|
||||||
|
| alternatives | alternatives | Symmetric |
|
||||||
|
| examples | extended_by | Examples extend the concept |
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- **Fill gaps**: Add relationships discovered through usage
|
||||||
|
- **Manual correction**: Fix missing inverse relationships
|
||||||
|
- **Connect new notes**: Link newly created note to existing ones
|
||||||
|
- **Cross-domain links**: Connect concepts from different areas
|
||||||
|
|
||||||
|
## Tools Used
|
||||||
|
|
||||||
|
- **Glob** - Verify notes exist
|
||||||
|
- **Read** - Get current note content
|
||||||
|
- **Edit** - Update "Related Concepts" sections in both notes
|
||||||
|
- **Logic** - Determine inverse relationship type
|
||||||
|
|
||||||
|
## Important Notes
|
||||||
|
|
||||||
|
- Always provide meaningful "why" explanation
|
||||||
|
- Use consistent relationship types (follow conventions)
|
||||||
|
- Check both notes after adding to verify correctness
|
||||||
|
- Run `/graph-validate` if unsure about bidirectionality
|
||||||
203
commands/graph-moc.md
Normal file
203
commands/graph-moc.md
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
---
|
||||||
|
description: Display information about a Map of Content (MOC) file
|
||||||
|
---
|
||||||
|
|
||||||
|
# Graph MOC (Map of Content)
|
||||||
|
|
||||||
|
Display information about a specific MOC (Map of Content) file, which serves as a thematic navigation hub.
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
Show:
|
||||||
|
|
||||||
|
- MOC name and theme
|
||||||
|
- Total notes linked in this MOC
|
||||||
|
- List of all notes with their brief descriptions
|
||||||
|
- Section organization within the MOC
|
||||||
|
|
||||||
|
## Input
|
||||||
|
|
||||||
|
User provides the MOC name (e.g., "agents", "mcp", "python", "rust")
|
||||||
|
|
||||||
|
Common MOCs:
|
||||||
|
|
||||||
|
- agents_moc.md - AI agents and agentic systems
|
||||||
|
- mcp_moc.md - Model Context Protocol
|
||||||
|
- python_moc.md - Python development
|
||||||
|
- rust_moc.md - Rust programming
|
||||||
|
- typescript_moc.md - TypeScript and React
|
||||||
|
- windows_moc.md - Windows development
|
||||||
|
- writing_moc.md - Writing and communication
|
||||||
|
- csharp_moc.md - C# development
|
||||||
|
|
||||||
|
## Execution Steps
|
||||||
|
|
||||||
|
### 1. Normalize MOC Name
|
||||||
|
|
||||||
|
Ensure filename has `_moc.md` suffix:
|
||||||
|
|
||||||
|
- Input: "agents" → "agents_moc.md"
|
||||||
|
- Input: "agents_moc" → "agents_moc.md"
|
||||||
|
- Input: "agents_moc.md" → "agents_moc.md"
|
||||||
|
|
||||||
|
### 2. Verify MOC Exists
|
||||||
|
|
||||||
|
Use Glob to check if MOC file exists:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Glob "agents_moc.md"
|
||||||
|
```
|
||||||
|
|
||||||
|
If not found, list available MOCs and suggest closest match.
|
||||||
|
|
||||||
|
### 3. Read MOC Content
|
||||||
|
|
||||||
|
Use Read tool to get full MOC content.
|
||||||
|
|
||||||
|
### 4. Parse MOC Structure
|
||||||
|
|
||||||
|
Extract:
|
||||||
|
|
||||||
|
- **Title** (H1 heading)
|
||||||
|
- **Sections** (H2 headings)
|
||||||
|
- **Wikilinks** in each section
|
||||||
|
- **Brief descriptions** next to each wikilink
|
||||||
|
|
||||||
|
Example MOC structure:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Agents - Map of Content
|
||||||
|
|
||||||
|
## Core Concepts
|
||||||
|
- [[agents]] - AI agents powered by LLMs
|
||||||
|
- [[semantic_routing]] - Intelligent model selection
|
||||||
|
|
||||||
|
## Coding Assistants
|
||||||
|
- [[claude_code]] - Agentic AI coding assistant
|
||||||
|
- [[claude_code_agents]] - Subagent system
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Count Notes
|
||||||
|
|
||||||
|
Count total wikilinks across all sections.
|
||||||
|
|
||||||
|
## Output Format
|
||||||
|
|
||||||
|
```
|
||||||
|
MOC: agents_moc.md
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
Theme: AI agents and agentic systems
|
||||||
|
Total notes: 15
|
||||||
|
|
||||||
|
## Sections and Notes:
|
||||||
|
|
||||||
|
### Core Concepts (5 notes)
|
||||||
|
- [[agents]] - AI agents powered by LLMs for autonomous action
|
||||||
|
- [[semantic_routing]] - Intelligent model selection based on query
|
||||||
|
- [[react_agent_pattern]] - Design pattern for agent UIs
|
||||||
|
- [[llm_self_talk_optimization]] - Token-efficient agent communication
|
||||||
|
- [[agentic_development_context]] - Comprehensive development ecosystems
|
||||||
|
|
||||||
|
### Coding Assistants (5 notes)
|
||||||
|
- [[claude_code]] - Anthropic's agentic AI coding assistant
|
||||||
|
- [[claude_code_agents]] - Subagent system for parallel tasks
|
||||||
|
- [[claude_code_plugins]] - Extensibility via slash commands
|
||||||
|
- [[claude_code_hooks]] - Lifecycle event system
|
||||||
|
- [[zettelkasten_claude_plugin]] - Knowledge graph plugin
|
||||||
|
|
||||||
|
### Integration & APIs (2 notes)
|
||||||
|
- [[agent_mcp_apis]] - MCP APIs for agent tool integration
|
||||||
|
- [[adding_mcp_to_claude_code]] - Adding custom agents
|
||||||
|
|
||||||
|
### Related Topics (3 notes)
|
||||||
|
- [[mcp_overview]] - Protocol for agent tool integration
|
||||||
|
- [[react_framework]] - UI framework for agents
|
||||||
|
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
💡 Next steps:
|
||||||
|
• Use `/graph-note [filename]` to explore any note in this MOC
|
||||||
|
• Use `/create-note` to add new notes to this domain
|
||||||
|
• Use `/search-notes #agents` to find all agent-tagged notes
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- **Explore a domain**: See all notes in a specific theme
|
||||||
|
- **Find related notes**: Discover notes you didn't know existed
|
||||||
|
- **Assess coverage**: Check if a topic area is well-covered
|
||||||
|
- **Navigate efficiently**: Jump to specific concepts in a domain
|
||||||
|
- **Plan additions**: Identify gaps where new notes are needed
|
||||||
|
|
||||||
|
## Tools Used
|
||||||
|
|
||||||
|
- **Glob** - Verify MOC file exists, list all MOCs
|
||||||
|
- **Read** - Get full MOC content
|
||||||
|
- **Parse logic** - Extract sections, wikilinks, descriptions
|
||||||
|
|
||||||
|
## Present Results
|
||||||
|
|
||||||
|
After displaying MOC information:
|
||||||
|
|
||||||
|
- Assess coverage (comprehensive vs sparse)
|
||||||
|
- Comment on organization (clear sections vs needs structure)
|
||||||
|
- Suggest if MOC is getting too large (might need splitting)
|
||||||
|
- Identify potential notes to add based on theme
|
||||||
|
- Note any wikilinks that point to non-existent notes
|
||||||
|
|
||||||
|
## If MOC Not Found
|
||||||
|
|
||||||
|
```
|
||||||
|
MOC not found: unknown_moc.md
|
||||||
|
|
||||||
|
Available MOCs:
|
||||||
|
- agents_moc.md - AI agents and agentic systems
|
||||||
|
- mcp_moc.md - Model Context Protocol
|
||||||
|
- python_moc.md - Python development
|
||||||
|
- rust_moc.md - Rust programming
|
||||||
|
- typescript_moc.md - TypeScript and React
|
||||||
|
- windows_moc.md - Windows development
|
||||||
|
- writing_moc.md - Writing and communication
|
||||||
|
- csharp_moc.md - C# development
|
||||||
|
|
||||||
|
Did you mean one of these?
|
||||||
|
```
|
||||||
185
commands/graph-note.md
Normal file
185
commands/graph-note.md
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
---
|
||||||
|
description: Display detailed information about a specific note
|
||||||
|
---
|
||||||
|
|
||||||
|
# Graph Note
|
||||||
|
|
||||||
|
Show detailed information about a specific note, including all relationships and backlinks.
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
Display:
|
||||||
|
|
||||||
|
- Note title, tags, and summary (from YAML frontmatter and heading)
|
||||||
|
- All relationships from "Related Concepts" section
|
||||||
|
- Backlinks (other notes that reference this note)
|
||||||
|
|
||||||
|
## Input
|
||||||
|
|
||||||
|
User provides filename: `/graph-note agents.md` or `/graph-note agents`
|
||||||
|
|
||||||
|
## Execution Steps
|
||||||
|
|
||||||
|
### 1. Normalize Filename
|
||||||
|
|
||||||
|
Ensure filename has `.md` extension.
|
||||||
|
|
||||||
|
### 2. Verify Note Exists
|
||||||
|
|
||||||
|
Use Glob to check if note exists:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Glob "agents.md"
|
||||||
|
```
|
||||||
|
|
||||||
|
If not found, report error.
|
||||||
|
|
||||||
|
### 3. Read Note Content
|
||||||
|
|
||||||
|
Use Read tool to get full note content.
|
||||||
|
|
||||||
|
### 4. Extract Metadata
|
||||||
|
|
||||||
|
From the note content:
|
||||||
|
|
||||||
|
- **Title**: First `# Heading` after YAML frontmatter
|
||||||
|
- **Tags**: From `tags:` field in YAML frontmatter
|
||||||
|
- **Summary**: First paragraph after title (before `##` sections)
|
||||||
|
|
||||||
|
### 5. Parse "Related Concepts" Section
|
||||||
|
|
||||||
|
From note content, extract all relationships:
|
||||||
|
|
||||||
|
- Prerequisites
|
||||||
|
- Related Topics
|
||||||
|
- Extends
|
||||||
|
- Extended By
|
||||||
|
- Alternatives
|
||||||
|
- Examples
|
||||||
|
|
||||||
|
For each relationship, capture the target note and "why" explanation.
|
||||||
|
|
||||||
|
### 6. Find Backlinks
|
||||||
|
|
||||||
|
Use Grep to find all notes that reference this note:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Find all wikilinks to this note
|
||||||
|
Grep "\[\[agents\]\]" --glob="*.md" --output_mode="files_with_matches"
|
||||||
|
```
|
||||||
|
|
||||||
|
Count and list the files that link to this note.
|
||||||
|
|
||||||
|
## Output Format
|
||||||
|
|
||||||
|
```
|
||||||
|
Note: agents.md
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
Title: AI Agents
|
||||||
|
Tags: #agents, #ai, #llm, #architecture
|
||||||
|
Summary: AI agents are autonomous systems powered by LLMs that can perceive,
|
||||||
|
decide, and act to achieve goals.
|
||||||
|
|
||||||
|
## Relationships (Total: 8)
|
||||||
|
|
||||||
|
### Prerequisites (0)
|
||||||
|
(None)
|
||||||
|
|
||||||
|
### Related Topics (3)
|
||||||
|
- [[semantic_routing]] - Enables intelligent model selection for agent tasks
|
||||||
|
- [[llm_self_talk_optimization]] - Token-efficient communication between agents
|
||||||
|
- [[react_agent_pattern]] - UI pattern for building agent interfaces
|
||||||
|
|
||||||
|
### Extends (0)
|
||||||
|
(None)
|
||||||
|
|
||||||
|
### Extended By (2)
|
||||||
|
- [[claude_code]] - Implements agentic coding assistant
|
||||||
|
- [[alita]] - Example implementation of AI agent system
|
||||||
|
|
||||||
|
### Alternatives (0)
|
||||||
|
(None)
|
||||||
|
|
||||||
|
### Examples (3)
|
||||||
|
- [[alita]] - Production AI agent implementation
|
||||||
|
- [[claude_code]] - Agentic coding assistant
|
||||||
|
- [[another_example]] - Another implementation
|
||||||
|
|
||||||
|
## Backlinks (12 notes reference this)
|
||||||
|
|
||||||
|
Files that link to [[agents]]:
|
||||||
|
- semantic_routing.md
|
||||||
|
- react_agent_pattern.md
|
||||||
|
- mcp_overview.md
|
||||||
|
- claude_code.md
|
||||||
|
- agents_moc.md
|
||||||
|
- ...
|
||||||
|
|
||||||
|
============================================================
|
||||||
|
💡 Next Steps:
|
||||||
|
• Use `/expand-graph agents.md` to discover more relationships
|
||||||
|
• Review backlinks to understand how this note is used
|
||||||
|
• Check if "Extended By" relationships should be in "Examples" instead
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- **Understand connections**: See how a note fits into the knowledge graph
|
||||||
|
- **Find usage**: See where a concept is referenced (backlinks)
|
||||||
|
- **Verify relationships**: Check if relationships are accurate and complete
|
||||||
|
- **Discover gaps**: Find missing prerequisite or extension relationships
|
||||||
|
|
||||||
|
## Tools Used
|
||||||
|
|
||||||
|
- **Glob** - Verify note exists
|
||||||
|
- **Read** - Get full note content
|
||||||
|
- **Grep** - Find backlinks (wikilinks to this note)
|
||||||
|
- **Parse logic** - Extract YAML, title, summary, relationships
|
||||||
|
|
||||||
|
## Present Results
|
||||||
|
|
||||||
|
- Show clear breakdown of relationship types
|
||||||
|
- Highlight if note has no prerequisites (might be foundational)
|
||||||
|
- Highlight if note has many Extended By (indicates it's a base concept)
|
||||||
|
- Show backlink count to indicate note importance/usage
|
||||||
|
- Suggest using `/expand-graph` if relationship count seems low
|
||||||
198
commands/graph-stats.md
Normal file
198
commands/graph-stats.md
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
---
|
||||||
|
description: Display comprehensive statistics about the knowledge graph
|
||||||
|
---
|
||||||
|
|
||||||
|
# Graph Stats
|
||||||
|
|
||||||
|
Display comprehensive statistics about the knowledge graph.
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
Use Grep and Glob to calculate:
|
||||||
|
|
||||||
|
- Total notes count
|
||||||
|
- Total MOC files count
|
||||||
|
- Relationship counts by type
|
||||||
|
- Unique tag count and top 10 tags
|
||||||
|
- Notes per MOC
|
||||||
|
|
||||||
|
## Execution Steps
|
||||||
|
|
||||||
|
### 1. Count Total Notes
|
||||||
|
|
||||||
|
Use Glob to count all markdown files (excluding MOCs):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Count all .md files
|
||||||
|
Glob "*.md"
|
||||||
|
```
|
||||||
|
|
||||||
|
Filter out MOC files (files ending in `_moc.md`) for pure note count.
|
||||||
|
|
||||||
|
### 2. Count MOC Files
|
||||||
|
|
||||||
|
Use Glob to find MOC files:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Find all MOC files
|
||||||
|
Glob "*_moc.md"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Count Relationships by Type
|
||||||
|
|
||||||
|
Use Grep to find each relationship type in "Related Concepts" sections:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Count Prerequisites
|
||||||
|
Grep "### Prerequisites" --glob="*.md" --output_mode="count"
|
||||||
|
|
||||||
|
# Count Related Topics
|
||||||
|
Grep "### Related Topics" --glob="*.md" --output_mode="count"
|
||||||
|
|
||||||
|
# Count Extends
|
||||||
|
Grep "### Extends" --glob="*.md" --output_mode="count"
|
||||||
|
|
||||||
|
# Count Extended By
|
||||||
|
Grep "### Extended By" --glob="*.md" --output_mode="count"
|
||||||
|
|
||||||
|
# Count Alternatives
|
||||||
|
Grep "### Alternatives" --glob="*.md" --output_mode="count"
|
||||||
|
|
||||||
|
# Count Examples
|
||||||
|
Grep "### Examples" --glob="*.md" --output_mode="count"
|
||||||
|
```
|
||||||
|
|
||||||
|
For each type, also count individual relationship entries by counting lines starting with `- [[` within those sections.
|
||||||
|
|
||||||
|
### 4. Extract and Count Tags
|
||||||
|
|
||||||
|
Use Grep to find all tags in YAML frontmatter:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Find all tags lines
|
||||||
|
Grep "^tags: \[" --glob="*.md" --output_mode="content"
|
||||||
|
```
|
||||||
|
|
||||||
|
Parse out individual tags, count occurrences, and sort by frequency.
|
||||||
|
|
||||||
|
### 5. Calculate Additional Metrics
|
||||||
|
|
||||||
|
- Average tags per note
|
||||||
|
- Average relationships per note
|
||||||
|
- Notes without "Related Concepts" section (orphaned)
|
||||||
|
- Most connected notes (top 5 by relationship count)
|
||||||
|
|
||||||
|
## Output Format
|
||||||
|
|
||||||
|
```
|
||||||
|
Graph Statistics
|
||||||
|
============================================================
|
||||||
|
Total notes: N
|
||||||
|
Total MOCs: M
|
||||||
|
Pure notes (excluding MOCs): X
|
||||||
|
|
||||||
|
Relationship counts:
|
||||||
|
Prerequisites: X notes have prerequisites (Y total relationships)
|
||||||
|
Related Topics: X notes have related topics (Y total relationships)
|
||||||
|
Extends: X notes extend others (Y total relationships)
|
||||||
|
Extended By: X notes are extended by others (Y total relationships)
|
||||||
|
Alternatives: X notes have alternatives (Y total relationships)
|
||||||
|
Examples: X notes have examples (Y total relationships)
|
||||||
|
|
||||||
|
Total relationships: Z
|
||||||
|
|
||||||
|
Tag Statistics:
|
||||||
|
Unique tags: N
|
||||||
|
Average tags per note: X.Y
|
||||||
|
|
||||||
|
Top 10 tags:
|
||||||
|
#python: 25 notes
|
||||||
|
#mcp: 18 notes
|
||||||
|
#agents: 15 notes
|
||||||
|
#rust: 12 notes
|
||||||
|
#typescript: 10 notes
|
||||||
|
...
|
||||||
|
|
||||||
|
Graph Health:
|
||||||
|
✓ Well-connected notes: X (>3 relationships)
|
||||||
|
! Sparsely connected: Y (1-2 relationships)
|
||||||
|
⚠ Orphaned notes: Z (0 relationships)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Analysis and Insights
|
||||||
|
|
||||||
|
After displaying stats, provide brief analysis:
|
||||||
|
|
||||||
|
**Good signs:**
|
||||||
|
|
||||||
|
- Balanced relationship distribution (no single type dominates)
|
||||||
|
- High average tags per note (3-6 ideal)
|
||||||
|
- Few orphaned notes (<5%)
|
||||||
|
- Diverse tag usage (no extreme tag concentration)
|
||||||
|
|
||||||
|
**Potential issues:**
|
||||||
|
|
||||||
|
- Many orphaned notes → Use `/expand-graph` to discover relationships
|
||||||
|
- Imbalanced relationships → Consider adding missing relationship types
|
||||||
|
- Tag concentration → Some notes may need more specific tags
|
||||||
|
- Low relationship count → Graph may not be well-connected
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- **Growth tracking**: Monitor note and relationship count over time
|
||||||
|
- **Health check**: Identify orphaned or poorly connected notes
|
||||||
|
- **Tag consistency**: Find most-used tags for standardization
|
||||||
|
- **Balance analysis**: Ensure relationship types are balanced
|
||||||
|
- **Discover trends**: See which domains are growing fastest
|
||||||
|
|
||||||
|
## Tools Used
|
||||||
|
|
||||||
|
- **Glob** - Count files (notes, MOCs)
|
||||||
|
- **Grep** - Find relationship sections, count relationships, extract tags
|
||||||
|
- **Parse logic** - Extract tags from YAML, calculate statistics, sort and rank
|
||||||
|
|
||||||
|
## Present Results
|
||||||
|
|
||||||
|
After displaying stats:
|
||||||
|
|
||||||
|
- Highlight any concerning metrics (too many orphaned notes, imbalanced relationships)
|
||||||
|
- Suggest actions (use `/expand-graph` on orphaned notes, add missing relationship types)
|
||||||
|
- Celebrate growth (if note count is increasing, congratulate user on knowledge expansion)
|
||||||
225
commands/graph-validate.md
Normal file
225
commands/graph-validate.md
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
---
|
||||||
|
description: Run validation checks on the knowledge graph
|
||||||
|
---
|
||||||
|
|
||||||
|
# Validate Graph
|
||||||
|
|
||||||
|
Run validation checks on the knowledge graph to ensure integrity.
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
Check markdown files for:
|
||||||
|
|
||||||
|
- All wikilinks point to existing notes (no broken links)
|
||||||
|
- "Related Concepts" sections are well-formed
|
||||||
|
- Bidirectional relationships are consistent
|
||||||
|
- YAML frontmatter is valid
|
||||||
|
|
||||||
|
## Execution Steps
|
||||||
|
|
||||||
|
### 1. Find All Wikilinks
|
||||||
|
|
||||||
|
Use Grep to extract all wikilinks from all markdown files:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Find all wikilinks in the format [[note_name]]
|
||||||
|
Grep "\[\[([^\]]+)\]\]" --glob="*.md" --output_mode="content" -n
|
||||||
|
```
|
||||||
|
|
||||||
|
Extract unique note names from results.
|
||||||
|
|
||||||
|
### 2. Verify All Wikilinks Point to Existing Files
|
||||||
|
|
||||||
|
For each unique wikilink target found:
|
||||||
|
|
||||||
|
- Use Glob to check if `target.md` exists in repository root
|
||||||
|
- Record any broken links (wikilink but no corresponding file)
|
||||||
|
|
||||||
|
### 3. Check Bidirectional Consistency
|
||||||
|
|
||||||
|
For notes with "Related Concepts" sections:
|
||||||
|
|
||||||
|
- Read notes with "Extends" relationships
|
||||||
|
- Verify target notes have "Extended By" back-reference
|
||||||
|
- Read notes with "Prerequisites" relationships
|
||||||
|
- Verify reasonable consistency (prerequisites should be foundational)
|
||||||
|
|
||||||
|
### 4. Validate YAML Frontmatter
|
||||||
|
|
||||||
|
Use Read tool to check a sample of notes:
|
||||||
|
|
||||||
|
- YAML frontmatter starts with `---` and ends with `---`
|
||||||
|
- `tags:` field is present and is an array
|
||||||
|
- Tags use lowercase-with-hyphens format
|
||||||
|
|
||||||
|
### 5. Check for Common Issues
|
||||||
|
|
||||||
|
- Notes without any "Related Concepts" section (orphaned notes)
|
||||||
|
- Notes with empty tags array
|
||||||
|
- Duplicate note filenames (shouldn't happen but check)
|
||||||
|
- MOC files that reference non-existent notes
|
||||||
|
|
||||||
|
## Output Format
|
||||||
|
|
||||||
|
**Success:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Graph Validation
|
||||||
|
============================================================
|
||||||
|
[OK] Knowledge graph is valid
|
||||||
|
|
||||||
|
All checks passed:
|
||||||
|
✓ All wikilinks point to existing notes (N wikilinks checked)
|
||||||
|
✓ No broken links found
|
||||||
|
✓ Bidirectional relationships are consistent
|
||||||
|
✓ YAML frontmatter is well-formed
|
||||||
|
✓ No orphaned notes detected
|
||||||
|
|
||||||
|
Statistics:
|
||||||
|
• Total notes: N
|
||||||
|
• Total wikilinks: M
|
||||||
|
• Total relationships: X
|
||||||
|
• MOC files: Y
|
||||||
|
```
|
||||||
|
|
||||||
|
**Failure:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Graph Validation
|
||||||
|
============================================================
|
||||||
|
[ERROR] Found N issue(s):
|
||||||
|
|
||||||
|
1. Broken wikilink: file1.md:42 references [[non_existent_note]]
|
||||||
|
2. Broken wikilink: file2.md:18 references [[another_missing]]
|
||||||
|
3. Missing inverse: agents.md extends [[semantic_routing]] but inverse not found
|
||||||
|
4. Orphaned note: lonely_note.md has no "Related Concepts" section
|
||||||
|
5. Invalid YAML: broken_note.md frontmatter is malformed
|
||||||
|
|
||||||
|
Recommendations:
|
||||||
|
• Fix or remove broken wikilinks
|
||||||
|
• Add "Extended By" section to semantic_routing.md
|
||||||
|
• Consider adding relationships to lonely_note.md
|
||||||
|
• Fix YAML frontmatter in broken_note.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## Validation Rules
|
||||||
|
|
||||||
|
**Wikilink validation:**
|
||||||
|
|
||||||
|
- Every `[[note_name]]` must have corresponding `note_name.md` file
|
||||||
|
- Case-sensitive matching
|
||||||
|
- Should NOT include `.md` in wikilink (use `[[note]]` not `[[note.md]]`)
|
||||||
|
|
||||||
|
**Bidirectional validation:**
|
||||||
|
|
||||||
|
- If A extends B, then B should have "Extended By" section mentioning A
|
||||||
|
- If A is prerequisite for B, then B should mention A in "Prerequisites"
|
||||||
|
- Not always perfectly symmetric, but should be logically consistent
|
||||||
|
|
||||||
|
**YAML validation:**
|
||||||
|
|
||||||
|
- Well-formed YAML with proper delimiters
|
||||||
|
- Tags field exists and is array
|
||||||
|
- Tags follow naming convention (lowercase-with-hyphens)
|
||||||
|
|
||||||
|
**Structural validation:**
|
||||||
|
|
||||||
|
- Notes should have "Related Concepts" section (unless intentionally standalone)
|
||||||
|
- MOC files should only reference existing notes
|
||||||
|
- No circular dependencies in prerequisite chains (optional advanced check)
|
||||||
|
|
||||||
|
## If Validation Fails
|
||||||
|
|
||||||
|
For each error type, suggest fixes:
|
||||||
|
|
||||||
|
**Broken wikilinks:**
|
||||||
|
|
||||||
|
```
|
||||||
|
File: example.md:42
|
||||||
|
Issue: References [[missing_note]]
|
||||||
|
Fixes:
|
||||||
|
• Create the missing note
|
||||||
|
• Remove the wikilink
|
||||||
|
• Change to reference an existing note
|
||||||
|
```
|
||||||
|
|
||||||
|
**Missing inverse relationships:**
|
||||||
|
|
||||||
|
```
|
||||||
|
File: agents.md
|
||||||
|
Issue: Extends [[semantic_routing]] but inverse not found
|
||||||
|
Fix:
|
||||||
|
• Add to semantic_routing.md "Related Concepts" section:
|
||||||
|
### Extended By
|
||||||
|
- [[agents]] - Uses routing for agent task selection
|
||||||
|
```
|
||||||
|
|
||||||
|
**Orphaned notes:**
|
||||||
|
|
||||||
|
```
|
||||||
|
File: lonely_note.md
|
||||||
|
Issue: No "Related Concepts" section
|
||||||
|
Fix:
|
||||||
|
• Add "Related Concepts" section with at least one relationship
|
||||||
|
• Link to appropriate MOC
|
||||||
|
• Use /expand-graph to discover relationships
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tools Used
|
||||||
|
|
||||||
|
- **Grep** - Find all wikilinks across all markdown files
|
||||||
|
- **Glob** - Check if wikilink targets exist as files
|
||||||
|
- **Read** - Read notes to check "Related Concepts" sections and YAML frontmatter
|
||||||
|
- **Parse logic** - Extract wikilinks, validate YAML, check consistency
|
||||||
|
|
||||||
|
## Success Criteria
|
||||||
|
|
||||||
|
- All wikilinks resolve to existing files
|
||||||
|
- No malformed YAML frontmatter
|
||||||
|
- Bidirectional relationships are logically consistent
|
||||||
|
- Minimal orphaned notes
|
||||||
|
|
||||||
|
## When to Run
|
||||||
|
|
||||||
|
- After creating new notes (check new relationships valid)
|
||||||
|
- After renaming notes (check wikilinks updated correctly)
|
||||||
|
- After bulk operations (check graph still consistent)
|
||||||
|
- Periodically (ensure graph health over time)
|
||||||
446
commands/learning-path.md
Normal file
446
commands/learning-path.md
Normal file
@@ -0,0 +1,446 @@
|
|||||||
|
---
|
||||||
|
description: Generate an optimal learning sequence for a target note
|
||||||
|
---
|
||||||
|
|
||||||
|
# Learning Path
|
||||||
|
|
||||||
|
Generate an optimal learning sequence for a target note by tracing prerequisite chains through the knowledge graph.
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## 1. Parse Input
|
||||||
|
|
||||||
|
**Input format:** User provides:
|
||||||
|
|
||||||
|
- A note name: `/learning-path mcp_security.md`
|
||||||
|
- Or just the topic: `/learning-path mcp_security`
|
||||||
|
|
||||||
|
**Normalize input:**
|
||||||
|
|
||||||
|
- Add `.md` extension if missing
|
||||||
|
- Use Glob to verify the target note exists
|
||||||
|
- If not found, suggest similar notes using Glob
|
||||||
|
|
||||||
|
## 2. Load Target Note
|
||||||
|
|
||||||
|
**Read the target note:**
|
||||||
|
|
||||||
|
- Use Read tool to get full content
|
||||||
|
- Extract YAML tags and title
|
||||||
|
- Parse "Related Concepts" section to get prerequisites
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Related Concepts
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
- [[mcp_overview]] - Must understand MCP basics first
|
||||||
|
- [[oauth_fundamentals]] - OAuth is primary auth mechanism
|
||||||
|
|
||||||
|
### Related Topics
|
||||||
|
- [[api_security]] - General API security principles
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Trace Prerequisite Chains
|
||||||
|
|
||||||
|
**Algorithm: Depth-First Traversal**
|
||||||
|
|
||||||
|
Starting from the target note, recursively follow prerequisite relationships:
|
||||||
|
|
||||||
|
```
|
||||||
|
function buildPrerequisiteTree(note, visited = new Set()):
|
||||||
|
if note in visited:
|
||||||
|
return [] // Cycle detection
|
||||||
|
|
||||||
|
visited.add(note)
|
||||||
|
|
||||||
|
// Read the note and parse "Related Concepts" → "Prerequisites"
|
||||||
|
prerequisites = readNote(note).prerequisites
|
||||||
|
|
||||||
|
if prerequisites is empty:
|
||||||
|
return [note] // Foundation reached
|
||||||
|
|
||||||
|
tree = []
|
||||||
|
for prereq in prerequisites:
|
||||||
|
subtree = buildPrerequisiteTree(prereq.note, visited)
|
||||||
|
tree.extend(subtree)
|
||||||
|
|
||||||
|
tree.append(note)
|
||||||
|
return tree
|
||||||
|
```
|
||||||
|
|
||||||
|
**Implementation with tools:**
|
||||||
|
|
||||||
|
1. **Read** target note to get prerequisites
|
||||||
|
2. For each prerequisite, **Read** that note to get its prerequisites
|
||||||
|
3. Recursively traverse until reaching foundation notes (no prerequisites)
|
||||||
|
4. Track visited nodes to detect cycles
|
||||||
|
|
||||||
|
**Key features:**
|
||||||
|
|
||||||
|
- **Cycle detection:** Track visited nodes to prevent infinite loops
|
||||||
|
- **Multiple paths:** Handle notes with multiple prerequisites
|
||||||
|
- **Foundation detection:** Identify notes with no prerequisites
|
||||||
|
- **Depth tracking:** Calculate how many levels deep each note is
|
||||||
|
|
||||||
|
## 4. Build Learning Sequence
|
||||||
|
|
||||||
|
**Create ordered learning path:**
|
||||||
|
|
||||||
|
1. **Topological sort:** Order notes so prerequisites always come before dependents
|
||||||
|
2. **Remove duplicates:** Each note appears once, at earliest possible position
|
||||||
|
3. **Group by depth level:** Show conceptual layers
|
||||||
|
|
||||||
|
**Example structure:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Level 0 (Foundations):
|
||||||
|
- note_a.md
|
||||||
|
- note_b.md
|
||||||
|
|
||||||
|
Level 1 (Builds on foundations):
|
||||||
|
- note_c.md (requires: note_a)
|
||||||
|
- note_d.md (requires: note_b)
|
||||||
|
|
||||||
|
Level 2 (Intermediate):
|
||||||
|
- note_e.md (requires: note_c, note_d)
|
||||||
|
|
||||||
|
Level 3 (Target):
|
||||||
|
- target_note.md (requires: note_e)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. Read Note Summaries
|
||||||
|
|
||||||
|
**For each note in the learning path:**
|
||||||
|
|
||||||
|
- Use Read tool to get first 3-5 lines (the summary)
|
||||||
|
- Extract the brief description after the title
|
||||||
|
- This provides context for each step
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```
|
||||||
|
## mcp_overview.md
|
||||||
|
"Introduction to Model Context Protocol, a standardized way for AI assistants to connect to data sources and tools."
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. Analyze Learning Path
|
||||||
|
|
||||||
|
**Calculate metrics:**
|
||||||
|
|
||||||
|
**Path statistics:**
|
||||||
|
|
||||||
|
- Total notes in sequence: `N`
|
||||||
|
- Depth levels: `M` (foundation to target)
|
||||||
|
- Estimated reading time: `N × 10 minutes = X minutes`
|
||||||
|
- Foundational notes: Count of level 0 notes
|
||||||
|
- Branching factor: Average prerequisites per note
|
||||||
|
|
||||||
|
**Complexity assessment:**
|
||||||
|
|
||||||
|
- **Simple path (1-3 notes):** "Quick learning path"
|
||||||
|
- **Moderate path (4-7 notes):** "Intermediate learning sequence"
|
||||||
|
- **Complex path (8+ notes):** "Comprehensive learning journey"
|
||||||
|
|
||||||
|
**Identify critical concepts:**
|
||||||
|
|
||||||
|
- Notes that multiple paths converge through
|
||||||
|
- "Bottleneck" concepts that are prerequisites for many others
|
||||||
|
|
||||||
|
## 7. Suggest Related Learning
|
||||||
|
|
||||||
|
**Enrich the path with optional content:**
|
||||||
|
|
||||||
|
**Parallel reading (Related Topics):**
|
||||||
|
|
||||||
|
- Read "Related Topics" sections from notes in path
|
||||||
|
- Notes at same level that provide additional context
|
||||||
|
- Not strictly required but enhance understanding
|
||||||
|
|
||||||
|
**Deeper dives (Extended By):**
|
||||||
|
|
||||||
|
- Read "Extended By" sections from notes in path
|
||||||
|
- Advanced topics that build on concepts in the path
|
||||||
|
- "After mastering this path, explore..."
|
||||||
|
|
||||||
|
**Alternative approaches (Alternatives):**
|
||||||
|
|
||||||
|
- Read "Alternatives" sections from notes in path
|
||||||
|
- Different ways to achieve similar understanding
|
||||||
|
- "For a different perspective, consider..."
|
||||||
|
|
||||||
|
**Practical examples (Examples):**
|
||||||
|
|
||||||
|
- Read "Examples" sections from notes in path
|
||||||
|
- Concrete implementations to solidify understanding
|
||||||
|
- "Apply these concepts with..."
|
||||||
|
|
||||||
|
## 8. Generate Output
|
||||||
|
|
||||||
|
**Format the learning path:**
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Learning Path: [Target Note Title]
|
||||||
|
|
||||||
|
🎯 **Goal:** Understand [target topic]
|
||||||
|
📚 **Total Notes:** N notes across M levels
|
||||||
|
⏱️ **Estimated Time:** X minutes
|
||||||
|
🏗️ **Complexity:** [Simple|Moderate|Complex]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Prerequisites Sequence
|
||||||
|
|
||||||
|
### Level 0: Foundations
|
||||||
|
Start here if you're new to this topic.
|
||||||
|
|
||||||
|
1. **[[note_a]]** (5 min read)
|
||||||
|
Brief description from note.
|
||||||
|
*Why it's needed:* Foundation for understanding [concept]
|
||||||
|
|
||||||
|
2. **[[note_b]]** (8 min read)
|
||||||
|
Brief description from note.
|
||||||
|
*Why it's needed:* Introduces core [concept]
|
||||||
|
|
||||||
|
### Level 1: Core Concepts
|
||||||
|
Once you understand the foundations, proceed here.
|
||||||
|
|
||||||
|
3. **[[note_c]]** (10 min read)
|
||||||
|
Brief description from note.
|
||||||
|
*Builds on:* note_a
|
||||||
|
*Why it's needed:* Extends [concept] with [new idea]
|
||||||
|
|
||||||
|
4. **[[note_d]]** (7 min read)
|
||||||
|
Brief description from note.
|
||||||
|
*Builds on:* note_b
|
||||||
|
*Why it's needed:* Applies [concept] to [domain]
|
||||||
|
|
||||||
|
### Level 2: Integration
|
||||||
|
Combining concepts from previous levels.
|
||||||
|
|
||||||
|
5. **[[note_e]]** (12 min read)
|
||||||
|
Brief description from note.
|
||||||
|
*Builds on:* note_c, note_d
|
||||||
|
*Why it's needed:* Synthesizes [concepts] for [purpose]
|
||||||
|
|
||||||
|
### Level 3: Target Concept
|
||||||
|
Your destination!
|
||||||
|
|
||||||
|
6. **[[target_note]]** (15 min read)
|
||||||
|
Brief description from note.
|
||||||
|
*Builds on:* note_e
|
||||||
|
*This is your goal:* Complete understanding of [target topic]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Optional Enrichment
|
||||||
|
|
||||||
|
### Parallel Reading (Same Level)
|
||||||
|
Enhance understanding at each level:
|
||||||
|
- **[[related_a]]** - Provides additional context on [concept]
|
||||||
|
- **[[related_b]]** - Alternative perspective on [concept]
|
||||||
|
|
||||||
|
### Go Deeper (Beyond Target)
|
||||||
|
After mastering this path:
|
||||||
|
- **[[advanced_a]]** - Builds on target with [advanced concept]
|
||||||
|
- **[[advanced_b]]** - Applies target to [specific domain]
|
||||||
|
|
||||||
|
### Practical Applications
|
||||||
|
See these concepts in action:
|
||||||
|
- **[[example_a]]** - Real implementation of [concept]
|
||||||
|
- **[[example_b]]** - Case study using [concept]
|
||||||
|
|
||||||
|
### Alternative Paths
|
||||||
|
Different approaches to similar understanding:
|
||||||
|
- **[[alternative_a]]** - [Different approach] to achieving similar goals
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Critical Concepts
|
||||||
|
|
||||||
|
These notes are central to this learning path:
|
||||||
|
- **[[critical_note]]** - Required by X other notes in this path
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Visual Path
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Foundations Core Concepts Integration Target
|
||||||
|
───────────── ───────────── ─────────── ──────
|
||||||
|
|
||||||
|
note_a ──────────┐
|
||||||
|
├──> note_c ────────┐
|
||||||
|
│ │
|
||||||
|
note_b ──────────┴──> note_d ────────┴──> note_e ──> target_note
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
1. **Start with Level 0** if concepts are new
|
||||||
|
2. **Skip familiar sections** if you have background knowledge
|
||||||
|
3. **Use `/graph-note`** to inspect relationships for each note
|
||||||
|
4. **Use `/expand-graph`** to discover more connections
|
||||||
|
5. **Review in Obsidian** for visual graph navigation
|
||||||
|
|
||||||
|
**Pro tip:** Open multiple notes in tabs and read through the sequence in order!
|
||||||
|
```
|
||||||
|
|
||||||
|
## 9. Handle Edge Cases
|
||||||
|
|
||||||
|
**No prerequisites:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Learning Path: [Target Note]
|
||||||
|
|
||||||
|
✅ This note has no prerequisites!
|
||||||
|
|
||||||
|
This is a foundational concept that can be learned directly.
|
||||||
|
No background knowledge required.
|
||||||
|
|
||||||
|
**Estimated reading time:** X minutes
|
||||||
|
|
||||||
|
**What builds on this:**
|
||||||
|
After understanding this note, you can explore:
|
||||||
|
- [[note_x]] - Extends this concept
|
||||||
|
- [[note_y]] - Applies this concept
|
||||||
|
```
|
||||||
|
|
||||||
|
**Circular dependencies:**
|
||||||
|
|
||||||
|
```
|
||||||
|
⚠️ Circular Dependency Detected
|
||||||
|
|
||||||
|
The following notes form a dependency cycle:
|
||||||
|
- [[note_a]] requires [[note_b]]
|
||||||
|
- [[note_b]] requires [[note_c]]
|
||||||
|
- [[note_c]] requires [[note_a]]
|
||||||
|
|
||||||
|
**Suggested reading order:**
|
||||||
|
Read these notes together as an interconnected group:
|
||||||
|
1. [[note_a]] - Brief overview
|
||||||
|
2. [[note_b]] - Builds on understanding from note_a
|
||||||
|
3. [[note_c]] - Completes the cycle
|
||||||
|
4. Re-read all three for full understanding
|
||||||
|
|
||||||
|
**Action needed:** Consider refactoring these notes to break the cycle.
|
||||||
|
Use `/graph-validate` to check for more circular dependencies.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Very long path (>15 notes):**
|
||||||
|
|
||||||
|
```
|
||||||
|
📚 Complex Learning Path Detected
|
||||||
|
|
||||||
|
This path contains N notes across M levels.
|
||||||
|
|
||||||
|
**Suggested approach:**
|
||||||
|
- Break into smaller milestones
|
||||||
|
- Focus on one level at a time
|
||||||
|
- Take breaks between levels
|
||||||
|
- Consider creating intermediate checkpoints
|
||||||
|
|
||||||
|
**Milestones:**
|
||||||
|
🎯 Milestone 1: Foundations (Notes 1-5)
|
||||||
|
🎯 Milestone 2: Core Concepts (Notes 6-10)
|
||||||
|
🎯 Milestone 3: Advanced Topics (Notes 11-15)
|
||||||
|
🎯 Milestone 4: Target Mastery (Notes 16-N)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 10. Provide Summary Stats
|
||||||
|
|
||||||
|
**Output concise metrics:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Learning Path Summary
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
📊 Path Metrics:
|
||||||
|
- Total notes: N
|
||||||
|
- Depth levels: M
|
||||||
|
- Estimated time: X minutes
|
||||||
|
- Foundation notes: Y
|
||||||
|
- Average prerequisites per note: Z
|
||||||
|
|
||||||
|
🎯 Complexity: [Simple|Moderate|Complex]
|
||||||
|
|
||||||
|
💡 Key Insight: [Most important observation about this path]
|
||||||
|
|
||||||
|
🔗 Critical Concept: [Note that appears most frequently as prerequisite]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tools Used
|
||||||
|
|
||||||
|
- **Read** - Get note content, parse "Related Concepts" sections, extract summaries
|
||||||
|
- **Glob** - Verify notes exist, find similar notes if target not found
|
||||||
|
- **Parse logic** - Traverse prerequisite chains, topological sort, depth calculation
|
||||||
|
- **Graph traversal** - Depth-first search with cycle detection
|
||||||
|
|
||||||
|
## Important Notes
|
||||||
|
|
||||||
|
**Quality guidelines:**
|
||||||
|
|
||||||
|
- Clear level progression
|
||||||
|
- Justify why each prerequisite is needed
|
||||||
|
- Provide time estimates (realistic reading + comprehension)
|
||||||
|
- Make path scannable with good formatting
|
||||||
|
- Include visual representation when helpful
|
||||||
|
- Handle edge cases gracefully
|
||||||
|
|
||||||
|
**User experience:**
|
||||||
|
|
||||||
|
- Make it easy to start learning immediately
|
||||||
|
- Show progress milestones
|
||||||
|
- Suggest checkpoints for complex paths
|
||||||
|
- Provide escape hatches (skip, alternative paths)
|
||||||
|
- Encourage practical application
|
||||||
|
|
||||||
|
**Graph integrity:**
|
||||||
|
|
||||||
|
- Report any issues found (cycles, broken links)
|
||||||
|
- Suggest graph improvements
|
||||||
|
- Validate prerequisite chains make semantic sense
|
||||||
|
- Use `/graph-validate` to check bidirectionality
|
||||||
|
|
||||||
|
Execute the learning path generation for the note provided by the user.
|
||||||
117
commands/refresh-topic.md
Normal file
117
commands/refresh-topic.md
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
---
|
||||||
|
description: Refresh a topic page with latest information from Perplexity
|
||||||
|
---
|
||||||
|
|
||||||
|
# Refresh Topic
|
||||||
|
|
||||||
|
You are tasked with refreshing a topic page with the latest information. Follow these steps:
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## 1. Read the Topic File
|
||||||
|
|
||||||
|
- The user will provide a filename (e.g., `agents.md` or just `agents`)
|
||||||
|
- Read the file from REPO_PATH (not current directory)
|
||||||
|
- Parse the YAML frontmatter and main content
|
||||||
|
|
||||||
|
## 2. Formulate Perplexity Query
|
||||||
|
|
||||||
|
- Analyze the topic content to understand the main subject
|
||||||
|
- Extract key concepts, technologies, or themes
|
||||||
|
- Create a focused query to find:
|
||||||
|
- Recent developments (last 6-12 months)
|
||||||
|
- New research or papers
|
||||||
|
- Updated best practices
|
||||||
|
- Emerging trends
|
||||||
|
- Deprecated or outdated information
|
||||||
|
|
||||||
|
Example query format: "What are the latest developments, research, and best practices for [TOPIC] as of 2025? Include any significant changes, new tools, or deprecated approaches."
|
||||||
|
|
||||||
|
## 3. Query Perplexity
|
||||||
|
|
||||||
|
- Use the `mcp__perplexity-ask__perplexity_ask` tool
|
||||||
|
- Provide a clear, focused query based on the topic analysis
|
||||||
|
- Request comprehensive, up-to-date information
|
||||||
|
|
||||||
|
## 4. Incorporate Updates
|
||||||
|
|
||||||
|
- Review the Perplexity response carefully
|
||||||
|
- Identify genuinely new or updated information that should be added
|
||||||
|
- For each update:
|
||||||
|
- Determine the appropriate section to update
|
||||||
|
- Maintain the existing structure and format
|
||||||
|
- Add new information without removing valuable existing content
|
||||||
|
- Preserve all existing citations and references
|
||||||
|
- Add new citations for updated information if provided
|
||||||
|
|
||||||
|
## 5. Update Metadata
|
||||||
|
|
||||||
|
- Add or update the YAML frontmatter with:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
last_refresh: 2025-10-11 # Use today's date
|
||||||
|
```
|
||||||
|
|
||||||
|
- Preserve all existing YAML fields (tags, etc.)
|
||||||
|
- Maintain YAML formatting
|
||||||
|
|
||||||
|
## 6. Write Updated File
|
||||||
|
|
||||||
|
- Use the Edit tool to make surgical updates to specific sections
|
||||||
|
- OR use the Write tool if comprehensive rewrite is needed
|
||||||
|
- Ensure all formatting is preserved (markdown, wikilinks, etc.)
|
||||||
|
|
||||||
|
## 7. Summary
|
||||||
|
|
||||||
|
- Provide a brief summary of:
|
||||||
|
- What updates were found
|
||||||
|
- Which sections were modified
|
||||||
|
- Any significant new information added
|
||||||
|
- Any outdated information identified (but keep unless contradicted)
|
||||||
|
|
||||||
|
## Important Notes
|
||||||
|
|
||||||
|
- **Preserve existing content**: Only add or update, don't remove unless information is clearly outdated or contradicted
|
||||||
|
- **Maintain structure**: Keep the same section organization
|
||||||
|
- **Keep relationships**: Don't modify the "Related Concepts" section
|
||||||
|
- **Respect format**: Maintain wikilink format `[[note]]`, YAML format, etc.
|
||||||
|
- **Be conservative**: Only incorporate high-quality, verifiable updates
|
||||||
|
- **No hyperbole**: Don't add marketing language or grandiose claims
|
||||||
|
|
||||||
|
Execute these steps for the topic file provided by the user.
|
||||||
232
commands/rename-note.md
Normal file
232
commands/rename-note.md
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
---
|
||||||
|
description: Rename a note and update all wikilink references
|
||||||
|
---
|
||||||
|
|
||||||
|
# Rename Note Command
|
||||||
|
|
||||||
|
Rename a note file and update all wikilink references throughout the knowledge base.
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## Task
|
||||||
|
|
||||||
|
1. Rename the physical markdown file (using Bash mv)
|
||||||
|
2. Update all wikilinks `[[old_filename]]` → `[[new_filename]]` in all markdown files (using Grep + Edit)
|
||||||
|
3. Update MOC files if needed (using Edit)
|
||||||
|
|
||||||
|
## Input
|
||||||
|
|
||||||
|
User provides:
|
||||||
|
|
||||||
|
- Old filename (e.g., "mcp_sdk.md" or just "mcp_sdk")
|
||||||
|
- New filename (e.g., "python_mcp_sdk.md" or just "python_mcp_sdk")
|
||||||
|
|
||||||
|
## Execution Steps
|
||||||
|
|
||||||
|
### 1. Normalize Filenames
|
||||||
|
|
||||||
|
Ensure both filenames have `.md` extension:
|
||||||
|
|
||||||
|
```
|
||||||
|
old_filename = "mcp_sdk" → "mcp_sdk.md"
|
||||||
|
new_filename = "python_mcp_sdk" → "python_mcp_sdk.md"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verify Old File Exists
|
||||||
|
|
||||||
|
Use Glob to check if old file exists:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check if file exists
|
||||||
|
Glob mcp_sdk.md
|
||||||
|
```
|
||||||
|
|
||||||
|
If not found, report error to user.
|
||||||
|
|
||||||
|
### 3. Check New Filename Not In Use
|
||||||
|
|
||||||
|
Use Glob to ensure new filename doesn't already exist:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check if new filename is available
|
||||||
|
Glob python_mcp_sdk.md
|
||||||
|
```
|
||||||
|
|
||||||
|
If exists, report error to user.
|
||||||
|
|
||||||
|
### 4. Find All Wikilinks to Old Note
|
||||||
|
|
||||||
|
Use Grep to find all markdown files containing wikilinks to the old note:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Find all files with wikilinks to old note
|
||||||
|
Grep "\[\[mcp_sdk\]\]" --glob="*.md" --output_mode="files_with_matches"
|
||||||
|
```
|
||||||
|
|
||||||
|
Store list of files that need updating.
|
||||||
|
|
||||||
|
### 5. Rename the Physical File
|
||||||
|
|
||||||
|
Use Bash to rename the file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Rename the file
|
||||||
|
mv "mcp_sdk.md" "python_mcp_sdk.md"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Update Wikilinks in All Files
|
||||||
|
|
||||||
|
For each file found in step 4, use Edit tool to replace wikilinks:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Old wikilink
|
||||||
|
[[mcp_sdk]]
|
||||||
|
|
||||||
|
# New wikilink
|
||||||
|
[[python_mcp_sdk]]
|
||||||
|
```
|
||||||
|
|
||||||
|
Use Edit tool for each file:
|
||||||
|
|
||||||
|
- old_string: `[[mcp_sdk]]`
|
||||||
|
- new_string: `[[python_mcp_sdk]]`
|
||||||
|
- replace_all: true (to catch all occurrences in the file)
|
||||||
|
|
||||||
|
Track how many files were updated.
|
||||||
|
|
||||||
|
### 7. Update MOC Files
|
||||||
|
|
||||||
|
Check if any MOC files were updated in step 6. If so, verify the context around the wikilink makes sense with the new name.
|
||||||
|
|
||||||
|
## Output Format
|
||||||
|
|
||||||
|
Report to user:
|
||||||
|
|
||||||
|
```
|
||||||
|
============================================================
|
||||||
|
Renamed Note: mcp_sdk.md → python_mcp_sdk.md
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
📝 Physical file renamed
|
||||||
|
✓ mcp_sdk.md → python_mcp_sdk.md
|
||||||
|
|
||||||
|
📄 Updated wikilinks in N files:
|
||||||
|
✓ file1.md: X reference(s)
|
||||||
|
✓ file2.md: Y reference(s)
|
||||||
|
✓ file3.md: Z reference(s)
|
||||||
|
|
||||||
|
============================================================
|
||||||
|
✅ Rename Complete!
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
📋 Summary:
|
||||||
|
• File renamed: mcp_sdk.md → python_mcp_sdk.md
|
||||||
|
• Markdown files updated: N
|
||||||
|
• Total wikilink updates: M
|
||||||
|
|
||||||
|
💡 Next steps:
|
||||||
|
• Review changes with git diff
|
||||||
|
• Update note title if needed to match new filename
|
||||||
|
• Update note tags if needed
|
||||||
|
• Verify MOC entries make sense with new name
|
||||||
|
```
|
||||||
|
|
||||||
|
## Validation
|
||||||
|
|
||||||
|
After renaming:
|
||||||
|
|
||||||
|
- Old file no longer exists (verify with Glob)
|
||||||
|
- New file exists (verify with Glob)
|
||||||
|
- No remaining wikilinks to old filename (verify with Grep)
|
||||||
|
- All "Related Concepts" sections still valid (Read a few files to spot check)
|
||||||
|
|
||||||
|
## Safety Features
|
||||||
|
|
||||||
|
- Check old file exists before renaming
|
||||||
|
- Check new filename not in use before renaming
|
||||||
|
- Use replace_all to catch all wikilinks in each file
|
||||||
|
- Report which files were updated for transparency
|
||||||
|
- All changes visible in git diff
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- **Clarify naming**: Rename `mcp_sdk.md` → `python_mcp_sdk.md` to be more specific
|
||||||
|
- **Fix typos**: Rename `agnet.md` → `agent.md`
|
||||||
|
- **Reorganize**: Rename `notes.md` → `note_taking_systems.md` for better descriptiveness
|
||||||
|
- **Language consistency**: Ensure all filenames follow `language_topic.md` pattern
|
||||||
|
|
||||||
|
## Present Results
|
||||||
|
|
||||||
|
After renaming:
|
||||||
|
|
||||||
|
- Show summary of changes made
|
||||||
|
- Highlight number of files and references updated
|
||||||
|
- Suggest reviewing MOC files to ensure context still makes sense
|
||||||
|
- Recommend updating note title/tags if needed to match new filename
|
||||||
|
|
||||||
|
## Common Patterns
|
||||||
|
|
||||||
|
**Language-specific SDK notes:**
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp_sdk.md → python_mcp_sdk.md
|
||||||
|
(leaves room for typescript_mcp_sdk.md, rust_mcp_sdk.md, etc.)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Generic to specific:**
|
||||||
|
|
||||||
|
```
|
||||||
|
agents.md → ai_agents.md
|
||||||
|
deployment.md → docker_deployment.md
|
||||||
|
```
|
||||||
|
|
||||||
|
**Consistency with existing patterns:**
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp-overview.md → mcp_overview.md (underscore convention)
|
||||||
|
llm_agents.md → agents.md (when already specific enough)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tools Used
|
||||||
|
|
||||||
|
- **Glob** - Check if files exist
|
||||||
|
- **Grep** - Find all wikilinks to old filename
|
||||||
|
- **Bash** - Rename the physical file (mv command)
|
||||||
|
- **Edit** - Update wikilinks in each markdown file
|
||||||
|
- **Read** - Spot check updated files for correctness
|
||||||
315
commands/search-notes.md
Normal file
315
commands/search-notes.md
Normal file
@@ -0,0 +1,315 @@
|
|||||||
|
---
|
||||||
|
description: Search across all notes for a phrase or pattern with context
|
||||||
|
---
|
||||||
|
|
||||||
|
# Search Notes
|
||||||
|
|
||||||
|
You are tasked with searching across all notes in the Zettelkasten for a specific phrase or pattern, showing context for each match.
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## 1. Parse Search Input
|
||||||
|
|
||||||
|
**Input format:** User provides either:
|
||||||
|
|
||||||
|
- A simple phrase: `/search-notes "semantic routing"`
|
||||||
|
- A regex pattern: `/search-notes "async.*await"`
|
||||||
|
- Multiple terms: `/search-notes "MCP security authentication"`
|
||||||
|
|
||||||
|
**Extract:**
|
||||||
|
|
||||||
|
- Search pattern (the phrase or regex)
|
||||||
|
- Optional flags (case-sensitive, whole word, etc.)
|
||||||
|
|
||||||
|
## 2. Execute Search with Context
|
||||||
|
|
||||||
|
**Use Grep tool to search all markdown files:**
|
||||||
|
|
||||||
|
```
|
||||||
|
pattern: <user's search term>
|
||||||
|
glob: "*.md"
|
||||||
|
output_mode: "content"
|
||||||
|
-n: true (show line numbers)
|
||||||
|
-C: 2 (show 2 lines of context before and after)
|
||||||
|
-i: true (case insensitive by default)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Search strategy:**
|
||||||
|
|
||||||
|
- Search all `.md` files in repository root
|
||||||
|
- Include line numbers for reference
|
||||||
|
- Show 2 lines context before and after each match
|
||||||
|
- Case-insensitive by default (unless user specifies otherwise)
|
||||||
|
|
||||||
|
## 3. Format Results
|
||||||
|
|
||||||
|
**Group results by file and present clearly:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Found <N> matches across <M> notes:
|
||||||
|
|
||||||
|
## note_name.md (X matches)
|
||||||
|
|
||||||
|
Match 1 (line 45):
|
||||||
|
43: context before
|
||||||
|
44: more context
|
||||||
|
45: **matching line with PATTERN highlighted**
|
||||||
|
46: context after
|
||||||
|
47: more context
|
||||||
|
|
||||||
|
Match 2 (line 120):
|
||||||
|
118: context before
|
||||||
|
119: more context
|
||||||
|
120: **matching line with PATTERN highlighted**
|
||||||
|
121: context after
|
||||||
|
122: more context
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## another_note.md (Y matches)
|
||||||
|
|
||||||
|
Match 1 (line 78):
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
**Formatting guidelines:**
|
||||||
|
|
||||||
|
- Use `##` headers for each file
|
||||||
|
- Show match count per file
|
||||||
|
- Include line numbers for easy navigation
|
||||||
|
- Bold or highlight the matching text
|
||||||
|
- Separate files with `---`
|
||||||
|
- Show total stats at top
|
||||||
|
|
||||||
|
## 4. Analyze Results
|
||||||
|
|
||||||
|
**Provide insights:**
|
||||||
|
|
||||||
|
**Thematic clustering:**
|
||||||
|
|
||||||
|
- Which tags/domains show up most?
|
||||||
|
- Are matches concentrated in certain batches?
|
||||||
|
- Example: "Most matches in MCP Protocol notes (5 files)"
|
||||||
|
|
||||||
|
**Related concepts:**
|
||||||
|
|
||||||
|
- Which notes frequently appear together in results?
|
||||||
|
- Suggest wikilinks between related notes if not already linked
|
||||||
|
|
||||||
|
**Coverage assessment:**
|
||||||
|
|
||||||
|
- Is this concept well-covered or sparse?
|
||||||
|
- Suggest potential new notes or expansions
|
||||||
|
|
||||||
|
## 5. Suggest Next Actions
|
||||||
|
|
||||||
|
**Based on search results, suggest:**
|
||||||
|
|
||||||
|
**If many matches (>10):**
|
||||||
|
|
||||||
|
- "This concept is well-covered. Consider creating a MOC for [topic]"
|
||||||
|
- "Consider using `/generate-moc` for this theme"
|
||||||
|
|
||||||
|
**If few matches (1-3):**
|
||||||
|
|
||||||
|
- "Limited coverage found. Consider `/create-note` for deeper treatment"
|
||||||
|
- "Consider `/expand-graph` on existing notes to add related content"
|
||||||
|
|
||||||
|
**If related concepts found:**
|
||||||
|
|
||||||
|
- "Found related notes that aren't linked. Consider `/link-notes`"
|
||||||
|
- List specific note pairs that should be connected
|
||||||
|
|
||||||
|
**If search term in multiple contexts:**
|
||||||
|
|
||||||
|
- "This term appears in different contexts: [list domains]"
|
||||||
|
- "Consider creating separate atomic notes for each context"
|
||||||
|
|
||||||
|
## 6. Advanced Search Options
|
||||||
|
|
||||||
|
**Support optional flags:**
|
||||||
|
|
||||||
|
**Case-sensitive search:**
|
||||||
|
|
||||||
|
- User specifies: `/search-notes --case-sensitive "Python"`
|
||||||
|
- Set `-i: false` in Grep
|
||||||
|
|
||||||
|
**Whole word only:**
|
||||||
|
|
||||||
|
- User specifies: `/search-notes --whole-word "test"`
|
||||||
|
- Adjust pattern to: `\btest\b`
|
||||||
|
|
||||||
|
**Regex mode:**
|
||||||
|
|
||||||
|
- User specifies: `/search-notes --regex "mcp.*server"`
|
||||||
|
- Pass pattern directly to Grep
|
||||||
|
|
||||||
|
**More context:**
|
||||||
|
|
||||||
|
- User specifies: `/search-notes --context 5 "pattern"`
|
||||||
|
- Set `-C: 5` for 5 lines of context
|
||||||
|
|
||||||
|
**Files only (no content):**
|
||||||
|
|
||||||
|
- User specifies: `/search-notes --files-only "pattern"`
|
||||||
|
- Set `output_mode: "files_with_matches"`
|
||||||
|
|
||||||
|
## 7. Output Summary
|
||||||
|
|
||||||
|
**Provide concise summary:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Search Summary for "<search-pattern>"
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
📊 Statistics:
|
||||||
|
- Total matches: <N>
|
||||||
|
- Files with matches: <M>
|
||||||
|
- Most matches: <filename> (<X> matches)
|
||||||
|
|
||||||
|
📁 Distribution by batch:
|
||||||
|
- MCP Protocol: 5 notes
|
||||||
|
- Python Stack: 3 notes
|
||||||
|
- Core AI/Agents: 2 notes
|
||||||
|
|
||||||
|
🏷️ Common tags in results:
|
||||||
|
#mcp, #python, #security, #api
|
||||||
|
|
||||||
|
💡 Suggestions:
|
||||||
|
- [Specific actionable next step based on results]
|
||||||
|
- [Another suggestion]
|
||||||
|
|
||||||
|
🔗 Potentially missing links:
|
||||||
|
- [[note_a]] ↔ [[note_b]] - both discuss same concept
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8. Special Search Patterns
|
||||||
|
|
||||||
|
**Recognize common search needs:**
|
||||||
|
|
||||||
|
**Tag search:**
|
||||||
|
|
||||||
|
- Input: `/search-notes "#mcp"`
|
||||||
|
- Search in YAML frontmatter tags specifically
|
||||||
|
- List all notes with that tag
|
||||||
|
|
||||||
|
**Broken wikilinks:**
|
||||||
|
|
||||||
|
- Input: `/search-notes --broken-links`
|
||||||
|
- Find `[[wikilinks]]` that don't point to existing files
|
||||||
|
- Report with locations
|
||||||
|
|
||||||
|
**TODOs and incomplete sections:**
|
||||||
|
|
||||||
|
- Input: `/search-notes --todos`
|
||||||
|
- Find `TODO`, `FIXME`, `[placeholder]`, etc.
|
||||||
|
- Report what needs completion
|
||||||
|
|
||||||
|
**Missing related concepts:**
|
||||||
|
|
||||||
|
- Input: `/search-notes --no-relationships`
|
||||||
|
- Find notes with empty "Related Concepts" sections
|
||||||
|
- Suggest running `/expand-graph` on them
|
||||||
|
|
||||||
|
## Usage Examples
|
||||||
|
|
||||||
|
**Simple search:**
|
||||||
|
|
||||||
|
```
|
||||||
|
/search-notes "semantic routing"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Regex search:**
|
||||||
|
|
||||||
|
```
|
||||||
|
/search-notes --regex "async.*(await|runtime)"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Case-sensitive search:**
|
||||||
|
|
||||||
|
```
|
||||||
|
/search-notes --case-sensitive "Python"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Find all notes about a technology:**
|
||||||
|
|
||||||
|
```
|
||||||
|
/search-notes --context 3 "FastMCP"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Tag search:**
|
||||||
|
|
||||||
|
```
|
||||||
|
/search-notes "#agents"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Find broken links:**
|
||||||
|
|
||||||
|
```
|
||||||
|
/search-notes --broken-links
|
||||||
|
```
|
||||||
|
|
||||||
|
**Find incomplete notes:**
|
||||||
|
|
||||||
|
```
|
||||||
|
/search-notes --todos
|
||||||
|
```
|
||||||
|
|
||||||
|
## Important Notes
|
||||||
|
|
||||||
|
**Performance:**
|
||||||
|
|
||||||
|
- Grep is fast even across 93+ notes
|
||||||
|
- Results should return quickly
|
||||||
|
- If >100 matches, consider limiting output or grouping
|
||||||
|
|
||||||
|
**Formatting:**
|
||||||
|
|
||||||
|
- Keep results scannable
|
||||||
|
- Use consistent formatting
|
||||||
|
- Include enough context to understand match
|
||||||
|
- Link to line numbers for easy navigation: `note.md:45`
|
||||||
|
|
||||||
|
**Accuracy:**
|
||||||
|
|
||||||
|
- Match user's search term exactly as specified
|
||||||
|
- Don't modify regex patterns unless clarifying with user
|
||||||
|
- Report if pattern yields no results
|
||||||
|
|
||||||
|
Execute the search for the pattern provided by the user.
|
||||||
185
commands/update-note.md
Normal file
185
commands/update-note.md
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
---
|
||||||
|
description: Update a note's metadata (title, tags, or summary)
|
||||||
|
---
|
||||||
|
|
||||||
|
# Update Note
|
||||||
|
|
||||||
|
Update a note's metadata (title, tags, or summary) in the YAML frontmatter.
|
||||||
|
|
||||||
|
## 0. Locate AZKG Repository
|
||||||
|
|
||||||
|
**Check for AZKG_REPO_PATH environment variable:**
|
||||||
|
|
||||||
|
- Use bash conditional: `if [ -z "$AZKG_REPO_PATH" ]; then REPO_PATH=$(pwd); else REPO_PATH="$AZKG_REPO_PATH"; fi`
|
||||||
|
- **If AZKG_REPO_PATH is set:** Use that path as the repository root
|
||||||
|
- **If AZKG_REPO_PATH is not set:** Use current working directory (pwd)
|
||||||
|
- Store result as REPO_PATH for all subsequent file operations
|
||||||
|
|
||||||
|
**All file operations must use REPO_PATH:**
|
||||||
|
|
||||||
|
- Read: `Read(REPO_PATH/filename.md)` or `Read("$REPO_PATH/filename.md")`
|
||||||
|
- Write: `Write(REPO_PATH/filename.md)` or `Write("$REPO_PATH/filename.md")`
|
||||||
|
- Edit: `Edit(REPO_PATH/filename.md)` or `Edit("$REPO_PATH/filename.md")`
|
||||||
|
- Grep: `Grep(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
- Glob: `Glob(pattern, path=REPO_PATH)` or with explicit path
|
||||||
|
|
||||||
|
**Example usage:**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Check environment variable
|
||||||
|
if [ -z "$AZKG_REPO_PATH" ]; then
|
||||||
|
REPO_PATH=$(pwd)
|
||||||
|
else
|
||||||
|
REPO_PATH="$AZKG_REPO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Then use REPO_PATH for all operations
|
||||||
|
Read("$REPO_PATH/agents.md")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Concrete examples:**
|
||||||
|
|
||||||
|
- If AZKG_REPO_PATH="/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg"
|
||||||
|
→ Read("/c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg/agents.md")
|
||||||
|
- If AZKG_REPO_PATH is not set and pwd is /c/Users/dothompson/OneDrive/src/witt3rd/donald-azkg
|
||||||
|
→ Read("agents.md") or use full path from pwd
|
||||||
|
|
||||||
|
## Input
|
||||||
|
|
||||||
|
User provides filename and fields to update:
|
||||||
|
|
||||||
|
- `/update-note agents.md --title "AI Agents: Autonomous Intelligence Systems"`
|
||||||
|
- `/update-note agents.md --tags "ai,agents,llm,autonomous"`
|
||||||
|
- `/update-note agents.md --summary "Brief new summary"`
|
||||||
|
|
||||||
|
Can update multiple fields in one command:
|
||||||
|
|
||||||
|
- `/update-note agents.md --title "New Title" --tags "new,tags"`
|
||||||
|
|
||||||
|
## Execution Steps
|
||||||
|
|
||||||
|
### 1. Normalize Filename
|
||||||
|
|
||||||
|
Ensure filename has `.md` extension.
|
||||||
|
|
||||||
|
### 2. Verify Note Exists
|
||||||
|
|
||||||
|
Use Glob to check note exists:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Glob "agents.md"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Read Current Note
|
||||||
|
|
||||||
|
Use Read tool to get full note content, including current YAML frontmatter.
|
||||||
|
|
||||||
|
### 4. Update YAML Frontmatter
|
||||||
|
|
||||||
|
Use Edit tool to update the specific fields:
|
||||||
|
|
||||||
|
**For title update:**
|
||||||
|
|
||||||
|
- No YAML field for title (title is the first `#` heading)
|
||||||
|
- Update the first `# Heading` line after YAML frontmatter
|
||||||
|
|
||||||
|
**For tags update:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
tags: [old, tags]
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
becomes:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
tags: [new, tags, here]
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
**For summary update:**
|
||||||
|
|
||||||
|
- Summary is the first paragraph after title (not in YAML)
|
||||||
|
- Replace first paragraph after title heading
|
||||||
|
|
||||||
|
### 5. Report Changes
|
||||||
|
|
||||||
|
Show old vs new values for updated fields.
|
||||||
|
|
||||||
|
## Output Format
|
||||||
|
|
||||||
|
```
|
||||||
|
Updated Note: agents.md
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
Title:
|
||||||
|
Old: AI Agents
|
||||||
|
New: AI Agents: Autonomous Intelligence Systems
|
||||||
|
|
||||||
|
Tags:
|
||||||
|
Old: [agents, ai, llm]
|
||||||
|
New: [ai, agents, llm, autonomous, architecture]
|
||||||
|
|
||||||
|
Summary:
|
||||||
|
Old: AI agents are autonomous systems...
|
||||||
|
New: AI agents are autonomous, goal-directed systems...
|
||||||
|
|
||||||
|
============================================================
|
||||||
|
✅ Metadata Updated!
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
💡 Next steps:
|
||||||
|
• Review the updated note at agents.md
|
||||||
|
• Ensure title matches filename semantically
|
||||||
|
• Verify tags span multiple dimensions (see tag_system.md)
|
||||||
|
• Consider if related notes need similar updates
|
||||||
|
```
|
||||||
|
|
||||||
|
## Validation
|
||||||
|
|
||||||
|
Before updating:
|
||||||
|
|
||||||
|
- Note must exist
|
||||||
|
- At least one field (title, tags, or summary) must be specified
|
||||||
|
|
||||||
|
After updating:
|
||||||
|
|
||||||
|
- YAML frontmatter remains well-formed
|
||||||
|
- Tags follow naming convention (lowercase-with-hyphens)
|
||||||
|
- Title and summary are non-empty
|
||||||
|
|
||||||
|
## Tag Guidelines
|
||||||
|
|
||||||
|
When updating tags, follow best practices:
|
||||||
|
|
||||||
|
- **3-6 tags** per note (enough for discovery, not too many)
|
||||||
|
- **Mix dimensions**: technology + domain + content type
|
||||||
|
- **Lowercase with hyphens**: `first-principles` not `FirstPrinciples`
|
||||||
|
- **Specific over generic**: `mcp` better than `protocol`
|
||||||
|
|
||||||
|
See `tag_system.md` for complete tag catalog.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
- **Clarify title**: Make note title more specific or descriptive
|
||||||
|
- **Add tags**: Add missing tags to improve discoverability
|
||||||
|
- **Refine summary**: Update summary to better reflect current content
|
||||||
|
- **Standardize**: Ensure tags follow consistent naming conventions
|
||||||
|
- **Tag migration**: Update tags when tag system evolves
|
||||||
|
|
||||||
|
## Tools Used
|
||||||
|
|
||||||
|
- **Glob** - Verify note exists
|
||||||
|
- **Read** - Get current note content
|
||||||
|
- **Edit** - Update YAML frontmatter and note content
|
||||||
|
- **Parse logic** - Extract and modify YAML fields
|
||||||
|
|
||||||
|
## Important Notes
|
||||||
|
|
||||||
|
- Changes affect only metadata, not main content
|
||||||
|
- "Related Concepts" section is never modified by this command
|
||||||
|
- Title should semantically match filename (e.g., `agents.md` → "AI Agents")
|
||||||
|
- Tags should be comma-separated when provided
|
||||||
|
- Use `/conform-note` for structural changes beyond metadata
|
||||||
93
plugin.lock.json
Normal file
93
plugin.lock.json
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:witt3rd/claude-plugins:plugins/azkg",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "fca22364c0e2deb681206bbfb532c49723a39249",
|
||||||
|
"treeHash": "da524f9b06f6405dc75e379724a8dddab4324a492f3f7662ae67e19a8ba40414",
|
||||||
|
"generatedAt": "2025-11-28T10:29:03.908620Z",
|
||||||
|
"toolVersion": "publish_plugins.py@0.2.0"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||||
|
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||||
|
},
|
||||||
|
"manifest": {
|
||||||
|
"name": "azkg",
|
||||||
|
"description": "Agent-maintained Zettelkasten knowledge graph",
|
||||||
|
"version": "0.1.0"
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "f48f8255c41c87663c5092e4a64691e26c9ee4c9b4303394a258c5df74afcee6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "e013f2cfca1999e723405853998da668180b4778483fd2ca6ce179df03ab5dad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/learning-path.md",
|
||||||
|
"sha256": "8aec08c9ac21b894567e9d3fce490df6986f93dfd0576251f67a20697be06111"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/graph-moc.md",
|
||||||
|
"sha256": "0169eb085a980849f5ae4f218ce208d098e754b6fd1aa1e003cc324cded8c4a3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/create-note.md",
|
||||||
|
"sha256": "76b3db54f1cdbc01ed580ed3461bba6ccc0a596a68559b8d8e03a4b10281f9fb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/search-notes.md",
|
||||||
|
"sha256": "d2e019e63773a4f1aed6f341c8c0d24e8f4070ac16cc30c2ba7b85c6ddb8eee9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/graph-validate.md",
|
||||||
|
"sha256": "c614470adfb9f8ccb5ed95f70a597065e0b3f864b5b757f372379863ecb57095"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/graph-add-relationship.md",
|
||||||
|
"sha256": "2b94a399c75de562274180d307108a1998e17484694813aa0a6a6ef19e772c97"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/expand-graph.md",
|
||||||
|
"sha256": "0b8f03913023d91dcd62cd58a53767fdd683c8b0f69e8a8979ea9aec7302fbe3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/graph-stats.md",
|
||||||
|
"sha256": "abd720f37061e274c11bef240e9648bba3789e7f13ea7f9bc8b4f4bf51d5b1c2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/rename-note.md",
|
||||||
|
"sha256": "a95ec63b022ca7ce9c5d284dd5668898921f2ff651334f1361cc00129d9c874d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/graph-note.md",
|
||||||
|
"sha256": "b61e7bd38873e5370132ad300032e29100c67c3ccaf822dc9caea6ff2eb30300"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/refresh-topic.md",
|
||||||
|
"sha256": "544d6df796f9753e20566ba72b278073467d51683a7e41cb69f2ee768679bb1b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/conform-note.md",
|
||||||
|
"sha256": "4d51e3620ff1e7fc2b657ffe1a52087fab0534345296ce74505e8d0d1c2988a0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/update-note.md",
|
||||||
|
"sha256": "137a3e43d0a0e2d6db085a4ba2a622714cc35c04caf6b229e255aa64d15f65ab"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "da524f9b06f6405dc75e379724a8dddab4324a492f3f7662ae67e19a8ba40414"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user