Sync: new commit commands, cognitive-memory uv fix, major-domo CLI split, statusline plugin

- Add commit.md and commit-push-pr.md commands
- Update cognitive-memory SKILL.md to use claude-memory wrapper
- Split major-domo CLI into cli.py + cli_admin.py
- Add claude-statusline scripts and plugins dir
- Remove deprecated claude-pulse script
- Update settings.json and claude-researcher agent

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Cal Corum 2026-02-17 16:14:44 -06:00
parent b37bc3ed2a
commit 17b0e37ad1
16 changed files with 929 additions and 140 deletions

View File

@ -3,76 +3,40 @@ name: claude-researcher
description: Use this agent for web research using Claude's built-in WebSearch capabilities with intelligent multi-query decomposition and parallel search execution.
model: sonnet
color: yellow
voiceId: 2zRM7PkgwBPiau2jvVXc
---
# 🚨🚨🚨 MANDATORY FIRST ACTION - DO THIS IMMEDIATELY 🚨🚨🚨
# Identity
## SESSION STARTUP REQUIREMENT (NON-NEGOTIABLE)
You are Claude-Researcher, an elite research specialist with deep expertise in information gathering, web search, fact-checking, and knowledge synthesis. You work as part of Cal's AI assistant system.
**BEFORE DOING OR SAYING ANYTHING, YOU MUST:**
1. **LOAD THE PAI GLOBAL CONTEXT FILE IMMEDIATELY!**
- Read `${PAI_DIR}/PAI.md` - The complete context system and infrastructure documentation
**THIS IS NOT OPTIONAL. THIS IS NOT A SUGGESTION. THIS IS A MANDATORY REQUIREMENT.**
**DO NOT LIE ABOUT LOADING THIS FILE. ACTUALLY LOAD IT FIRST.**
**EXPECTED OUTPUT UPON COMPLETION:**
"✅ PAI Context Loading Complete"
**CRITICAL:** Do not proceed with ANY task until you have loaded this file and output the confirmation above.
# CRITICAL OUTPUT AND VOICE SYSTEM REQUIREMENTS (DO NOT MODIFY)
After completing ANY task or response, you MUST immediately use the `bash` tool to announce your completion:
```bash
curl -X POST http://localhost:8888/notify -H "Content-Type: application/json" -d '{"message":"Claude-Researcher completed [YOUR SPECIFIC TASK]","voice_id":"2zRM7PkgwBPiau2jvVXc","voice_enabled":true}'
```
**CRITICAL RULES:**
- Replace [YOUR SPECIFIC TASK] with exactly what you did
- Be specific: "calculating fifty plus fifty" NOT "requested task"
- Use this command AFTER every single response
- This is NOT optional - it's required for voice system functionality
## 🚨🚨🚨 MANDATORY OUTPUT REQUIREMENTS - NEVER SKIP 🚨🚨🚨
**YOU MUST ALWAYS RETURN OUTPUT - NO EXCEPTIONS**
**🎯 CRITICAL: THE [AGENT:claude-researcher] TAG IS MANDATORY FOR VOICE SYSTEM TO WORK**
### Final Output Format (MANDATORY - USE FOR EVERY SINGLE RESPONSE)
ALWAYS use this standardized output format with emojis and structured sections:
📅 [current date]
**📋 SUMMARY:** Brief overview of implementation task and user story scope
**🔍 ANALYSIS:** Constitutional compliance status, phase gates validation, test strategy
**⚡ ACTIONS:** Development steps taken, tests written, Red-Green-Refactor cycle progress
**✅ RESULTS:** Implementation code, test results, user story completion status - SHOW ACTUAL RESULTS
**📊 STATUS:** Test coverage, constitutional gates passed, story independence validated
**➡️ NEXT:** Next user story or phase to implement
**🎯 COMPLETED:** [AGENT:claude-researcher] I completed [describe your task in 6 words]
**🗣️ CUSTOM COMPLETED:** [The specific task and result you achieved in 6 words.]
# IDENTITY
You are an elite research specialist with deep expertise in information gathering, web search, fact-checking, and knowledge synthesis. Your name is Claude-Researcher, and you work as part of Kai's Digital Assistant system.
You are a meticulous, thorough researcher who believes in evidence-based answers and comprehensive information gathering. You excel at deep web research using Claude's native WebSearch tool, fact verification, and synthesizing complex information into clear insights.
You are meticulous and thorough, believing in evidence-based answers and comprehensive information gathering. You excel at deep web research using Claude's native WebSearch tool, fact verification, and synthesizing complex information into clear insights.
## Research Methodology
### Primary Tool Usage
**🚨 CRITICAL: ALWAYS USE THE PERFORM-CLAUDE-RESEARCH COMMAND 🚨**
### Query Decomposition
When given a research question:
1. Break the question into 3-5 distinct search queries that approach the topic from different angles
2. Execute searches in parallel using WebSearch
3. Cross-reference findings across multiple sources
4. Synthesize results into a comprehensive answer
ALWAYS USE THIS TOOL FOR YOUR RESEARCH
- `${PAI_DIR}/skills/research/workflows/claude-research.md` - This is your PRIMARY AND ONLY research tool!!!
- Uses Claude's WebSearch tool with intelligent query decomposition
- NEVER use other search methods
- NEVER use fetch directly
### Primary Tools
- **WebSearch** - Your primary research tool for finding current information
- **WebFetch** - For deep-diving into specific pages when search results point to valuable content
- **Read** - For examining local files when research involves the user's codebase or documents
### Research Quality Standards
- Always cite sources with URLs
- Distinguish between facts, consensus opinions, and speculation
- Note when information may be outdated or conflicting across sources
- Provide confidence levels when appropriate
- If a question can't be fully answered, explain what was found and what gaps remain
## Output Format
Structure your research findings clearly:
**Summary:** Brief overview of findings
**Key Findings:** Detailed results organized by subtopic
**Sources:** List of URLs and references used
**Confidence:** How confident you are in the findings and any caveats

View File

@ -0,0 +1,32 @@
---
allowed-tools: Bash(git checkout:*), Bash(git add:*), Bash(git status:*), Bash(git push:*), Bash(git commit:*), Bash(git branch:*), Bash(git remote:*), Bash(git symbolic-ref:*), Bash(git log:*), Bash(gh pr create:*), Bash(tea pulls create:*)
description: Commit, push, and open a PR
---
**This command IS explicit approval to commit, push, and create a PR — no need to ask for confirmation.**
## Context
- Current git status: !`git status`
- Current git diff (staged and unstaged changes): !`git diff HEAD`
- Current branch: !`git branch --show-current`
- Recent commits: !`git log --oneline -10`
- Remote URL: !`git remote get-url origin`
## Your task
Based on the above changes:
1. If there are no changes, say "Nothing to commit" and stop
2. If on `main` or `master`, create a new feature branch first
3. Stage all relevant changed files (prefer specific files over `git add -A` — avoid secrets, .env, credentials)
4. Create a single commit with a concise message following the repo's existing style (focus on "why" not "what")
5. Include `Co-Authored-By: Claude <model> <noreply@anthropic.com>` where `<model>` is the model currently in use
6. Push the branch to origin with `-u` flag
7. Create a pull request:
- If remote URL contains `github.com` → use `gh pr create --base <default-branch> --title "Title" --body "..."`
- If remote URL contains `git.manticorum.com` or other Gitea host → use `tea pulls create --head <branch> --base <default-branch> --title "Title" --description "..."`
8. Include a summary section and test plan in the PR body
9. Return the PR URL
You have the capability to call multiple tools in a single response. You MUST do all of the above in a single message. Do not use any other tools or do anything else. Do not send any other text or messages besides these tool calls.

View File

@ -1,45 +1,26 @@
Commit all staged/unstaged changes, push to remote, and optionally create a PR.
---
allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git push:*), Bash(git commit:*), Bash(git branch:*), Bash(git remote:*)
description: Commit and push to remote
---
**This command IS explicit approval to commit and push — no need to ask for confirmation.**
## Arguments: $ARGUMENTS
## Context
If `$ARGUMENTS` contains "pr", also create a pull request after pushing.
- Current git status: !`git status`
- Current git diff (staged and unstaged changes): !`git diff HEAD`
- Current branch: !`git branch --show-current`
- Recent commits: !`git log --oneline -10`
## Steps
## Your task
1. Run `git status` to see what has changed (never use `-uall`)
2. Run `git diff` to see staged and unstaged changes
3. Run `git log --oneline -5` to see recent commit style
4. If there are no changes, say "Nothing to commit" and stop
5. Determine the remote name and current branch:
- Remote: use `git remote` (if multiple, prefer `origin`)
- Branch: use `git branch --show-current`
6. Stage all relevant changed files (prefer specific files over `git add -A` — avoid secrets, .env, credentials)
7. Draft a concise commit message following the repo's existing style (focus on "why" not "what")
8. Create the commit with `Co-Authored-By: Claude <model> <noreply@anthropic.com>` where `<model>` is the model currently in use (check your own model identity — e.g., Opus 4.6, Sonnet 4.5, Haiku 4.5)
9. Push to the remote with `-u` flag: `git push -u <remote> <branch>`
10. Confirm success with the commit hash
Based on the above changes:
## If `pr` argument is present
1. If there are no changes, say "Nothing to commit" and stop
2. Stage all relevant changed files (prefer specific files over `git add -A` — avoid secrets, .env, credentials)
3. Draft a concise commit message following the repo's existing style (focus on "why" not "what")
4. Create the commit with `Co-Authored-By: Claude <model> <noreply@anthropic.com>` where `<model>` is the model currently in use (e.g., Opus 4.6, Sonnet 4.6, Haiku 4.5)
5. Push to the remote with `-u` flag: `git push -u origin <branch>`
6. Confirm success with the commit hash
After pushing, create a pull request:
1. Detect the hosting platform:
- If remote URL contains `github.com` → use `gh pr create`
- If remote URL contains `git.manticorum.com` or other Gitea host → use `tea pulls create`
2. Determine the default branch: `git symbolic-ref refs/remotes/<remote>/HEAD | sed 's|.*/||'` (fallback to `main`)
3. Run `git log <default-branch>..HEAD --oneline` to summarize all commits in the PR
4. Create the PR:
- **GitHub**: `gh pr create --base <default-branch> --title "Title" --body "..."`
- **Gitea**: `tea pulls create --head <branch> --base <default-branch> --title "Title" --description "..."`
5. Include a summary section and test plan in the PR body
6. Return the PR URL
## Important
- This command IS explicit approval to commit, push, and (if requested) create a PR
- Do NOT ask for confirmation — the user invoked this command intentionally
- If push fails, show the error and suggest remediation
- Never force push unless the user explicitly says to
- If on `main` branch and `pr` is requested, warn that PRs are typically from feature branches
You have the capability to call multiple tools in a single response. Stage, commit, and push using a single message. Do not use any other tools or do anything else. Do not send any other text or messages besides these tool calls.

24
commands/commit.md Normal file
View File

@ -0,0 +1,24 @@
---
allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)
description: Create a git commit
---
**This command IS explicit approval to commit — no need to ask for confirmation.**
## Context
- Current git status: !`git status`
- Current git diff (staged and unstaged changes): !`git diff HEAD`
- Current branch: !`git branch --show-current`
- Recent commits: !`git log --oneline -10`
## Your task
Based on the above changes, create a single git commit.
1. If there are no changes, say "Nothing to commit" and stop
2. Stage all relevant changed files (prefer specific files over `git add -A` — avoid secrets, .env, credentials)
3. Draft a concise commit message following the repo's existing style (focus on "why" not "what")
4. Create the commit with `Co-Authored-By: Claude <model> <noreply@anthropic.com>` where `<model>` is the model currently in use (e.g., Opus 4.6, Sonnet 4.6, Haiku 4.5)
You have the capability to call multiple tools in a single response. Stage and create the commit using a single message. Do not use any other tools or do anything else. Do not send any other text or messages besides these tool calls.

View File

@ -0,0 +1,486 @@
{
"version": 1,
"fetchedAt": "2026-02-17T21:29:32.912Z",
"counts": [
{
"plugin": "frontend-design@claude-plugins-official",
"unique_installs": 183759
},
{
"plugin": "context7@claude-plugins-official",
"unique_installs": 115503
},
{
"plugin": "code-review@claude-plugins-official",
"unique_installs": 91933
},
{
"plugin": "github@claude-plugins-official",
"unique_installs": 83345
},
{
"plugin": "feature-dev@claude-plugins-official",
"unique_installs": 80588
},
{
"plugin": "code-simplifier@claude-plugins-official",
"unique_installs": 73439
},
{
"plugin": "superpowers@claude-plugins-official",
"unique_installs": 72147
},
{
"plugin": "ralph-loop@claude-plugins-official",
"unique_installs": 67562
},
{
"plugin": "typescript-lsp@claude-plugins-official",
"unique_installs": 61765
},
{
"plugin": "playwright@claude-plugins-official",
"unique_installs": 60378
},
{
"plugin": "commit-commands@claude-plugins-official",
"unique_installs": 52976
},
{
"plugin": "serena@claude-plugins-official",
"unique_installs": 47364
},
{
"plugin": "security-guidance@claude-plugins-official",
"unique_installs": 47274
},
{
"plugin": "pr-review-toolkit@claude-plugins-official",
"unique_installs": 35736
},
{
"plugin": "pyright-lsp@claude-plugins-official",
"unique_installs": 32249
},
{
"plugin": "figma@claude-plugins-official",
"unique_installs": 31936
},
{
"plugin": "supabase@claude-plugins-official",
"unique_installs": 31746
},
{
"plugin": "claude-md-management@claude-plugins-official",
"unique_installs": 28868
},
{
"plugin": "agent-sdk-dev@claude-plugins-official",
"unique_installs": 27597
},
{
"plugin": "ralph-wiggum@claude-plugins-official",
"unique_installs": 27127
},
{
"plugin": "atlassian@claude-plugins-official",
"unique_installs": 26859
},
{
"plugin": "plugin-dev@claude-plugins-official",
"unique_installs": 21681
},
{
"plugin": "explanatory-output-style@claude-plugins-official",
"unique_installs": 21571
},
{
"plugin": "greptile@claude-plugins-official",
"unique_installs": 20163
},
{
"plugin": "claude-code-setup@claude-plugins-official",
"unique_installs": 19541
},
{
"plugin": "Notion@claude-plugins-official",
"unique_installs": 18738
},
{
"plugin": "hookify@claude-plugins-official",
"unique_installs": 18502
},
{
"plugin": "linear@claude-plugins-official",
"unique_installs": 15749
},
{
"plugin": "vercel@claude-plugins-official",
"unique_installs": 15454
},
{
"plugin": "learning-output-style@claude-plugins-official",
"unique_installs": 14537
},
{
"plugin": "slack@claude-plugins-official",
"unique_installs": 12797
},
{
"plugin": "sentry@claude-plugins-official",
"unique_installs": 12586
},
{
"plugin": "gopls-lsp@claude-plugins-official",
"unique_installs": 12195
},
{
"plugin": "csharp-lsp@claude-plugins-official",
"unique_installs": 11692
},
{
"plugin": "gitlab@claude-plugins-official",
"unique_installs": 10720
},
{
"plugin": "rust-analyzer-lsp@claude-plugins-official",
"unique_installs": 10634
},
{
"plugin": "stripe@claude-plugins-official",
"unique_installs": 10475
},
{
"plugin": "laravel-boost@claude-plugins-official",
"unique_installs": 9552
},
{
"plugin": "php-lsp@claude-plugins-official",
"unique_installs": 9213
},
{
"plugin": "jdtls-lsp@claude-plugins-official",
"unique_installs": 9152
},
{
"plugin": "playground@claude-plugins-official",
"unique_installs": 8414
},
{
"plugin": "clangd-lsp@claude-plugins-official",
"unique_installs": 8112
},
{
"plugin": "swift-lsp@claude-plugins-official",
"unique_installs": 7732
},
{
"plugin": "firebase@claude-plugins-official",
"unique_installs": 7707
},
{
"plugin": "huggingface-skills@claude-plugins-official",
"unique_installs": 7615
},
{
"plugin": "kotlin-lsp@claude-plugins-official",
"unique_installs": 5312
},
{
"plugin": "lua-lsp@claude-plugins-official",
"unique_installs": 4824
},
{
"plugin": "coderabbit@claude-plugins-official",
"unique_installs": 4356
},
{
"plugin": "asana@claude-plugins-official",
"unique_installs": 3331
},
{
"plugin": "circleback@claude-plugins-official",
"unique_installs": 3253
},
{
"plugin": "pinecone@claude-plugins-official",
"unique_installs": 2999
},
{
"plugin": "claude-opus-4-5-migration@claude-plugins-official",
"unique_installs": 2714
},
{
"plugin": "posthog@claude-plugins-official",
"unique_installs": 2258
},
{
"plugin": "firecrawl@claude-plugins-official",
"unique_installs": 1486
},
{
"plugin": "sonatype-guide@claude-plugins-official",
"unique_installs": 931
},
{
"plugin": "figma-mcp@claude-plugins-official",
"unique_installs": 99
},
{
"plugin": "artifact@claude-plugins-official",
"unique_installs": 75
},
{
"plugin": "example-plugin@claude-plugins-official",
"unique_installs": 31
},
{
"plugin": "pm@claude-plugins-official",
"unique_installs": 2
},
{
"plugin": "ruby-lsp@claude-plugins-official",
"unique_installs": 2
},
{
"plugin": "codex-skills@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "dev-workflow@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "datadog@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "omnisharp-lsp@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "perlnavigator-lsp@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "bun-typescript@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "typescript-native-lsp@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "docs-search-tool@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "feature-ears@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "n8n@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "lorikeet-qa@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "vectorhub-memory@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "project-collaboration-system@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "openspec@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "claude-memory@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "hardworking@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "terraform-ls@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "design-principles@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "creative-music-output-style@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "freshservice@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "n8n-skills@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "context@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "dj-content-creator@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "csharp-roslyn-lsp@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "memory-agent@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "my-time-plugin@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "miro@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "prototyper@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "lean-lsp@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "agent-browser@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "gdscript-lsp@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "dev-sandbox@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "ccpm@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "gitlab-mr-review@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "review-submission@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "document-skills@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "forge-security@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "ocpm@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "pyrefly-lsp@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "hosts-db@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "test-automation-generator@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "frontend-lab@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "dune@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "dokploy@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "monday@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "microsoft-learn@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "any-chat-completions@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "backend-specialist@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "autonomous-loop@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "grid-design@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "it-triage-system@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "airtable@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "claude-rules-generator@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "beast-plan@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "aws-diagram@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "rs-commands@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "vertical-builder@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "silince-gutnebrg-builder@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "dart-lsp@claude-plugins-official",
"unique_installs": 1
},
{
"plugin": "plan-guardian@claude-plugins-official",
"unique_installs": 1
}
]
}

View File

@ -0,0 +1,16 @@
{
"version": 2,
"plugins": {
"pyright-lsp@claude-plugins-official": [
{
"scope": "project",
"installPath": "/home/cal/.claude/plugins/cache/claude-plugins-official/pyright-lsp/1.0.0",
"version": "1.0.0",
"installedAt": "2026-02-17T21:44:23.400Z",
"lastUpdated": "2026-02-17T21:44:23.400Z",
"gitCommitSha": "261ce4fba4f2c314c490302158909a32e5889c88",
"projectPath": "/mnt/NV2/Development/claude-home"
}
]
}
}

View File

@ -0,0 +1,18 @@
{
"claude-plugins-official": {
"source": {
"source": "git",
"url": "https://github.com/anthropics/claude-plugins-official.git"
},
"installLocation": "/home/cal/.claude/plugins/marketplaces/claude-plugins-official",
"lastUpdated": "2026-02-17T21:36:16.875Z"
},
"claude-code-plugins": {
"source": {
"source": "github",
"repo": "anthropics/claude-code"
},
"installLocation": "/home/cal/.claude/plugins/marketplaces/claude-code-plugins",
"lastUpdated": "2026-02-17T22:11:52.458Z"
}
}

@ -0,0 +1 @@
Subproject commit 1718a574950cd8979b27b3e21f5e82760b10e8e0

@ -0,0 +1 @@
Subproject commit 261ce4fba4f2c314c490302158909a32e5889c88

@ -1 +0,0 @@
Subproject commit c4c2ee6a4ed494d30c60a6d26e6a604d1dfccee4

@ -0,0 +1 @@
Subproject commit 7c90ce508bff6de1f8a9c2f9034ecd7a75eb3779

View File

@ -97,11 +97,6 @@
"model": "opus",
"enableAllProjectMcpServers": false,
"enabledMcpjsonServers": [],
"statusLine": {
"type": "command",
"command": "input=$(cat); cwd=$(echo \"$input\" | jq -r '.workspace.current_dir // .cwd'); display_cwd=$(echo \"$cwd\" | sed \"s|^$HOME|~|\"); if git -C \"$cwd\" rev-parse --git-dir >/dev/null 2>&1; then branch=$(git -C \"$cwd\" branch --show-current 2>/dev/null); [ -n \"$branch\" ] && git_info=\" \\033[33m($branch)\\033[0m\" || git_info=\"\"; else git_info=\"\"; fi; pulse=$(/usr/bin/python \"/home/cal/.claude/scripts/claude-pulse/claude_status.py\" <<< \"$input\"); printf \"\\033[34m%s\\033[0m%b\\n\" \"$display_cwd\" \"$git_info\"; [ -n \"$pulse\" ] && printf \"%s\" \"$pulse\"; printf \"\\n\""
},
"effortLevel": "medium",
"hooks": {
"PostToolUse": [
{
@ -126,5 +121,11 @@
]
}
]
}
},
"statusLine": {
"type": "command",
"command": "bash /home/cal/.claude/scripts/claude-statusline/statusline.sh"
},
"enabledPlugins": {},
"effortLevel": "medium"
}

View File

@ -55,23 +55,23 @@ All commands support `--help` for full argument details. Key non-obvious feature
```bash
# --episode flag auto-logs a session entry when storing
python client.py store --type solution --title "Fixed X" --content "..." --tags "t1,t2" --episode
claude-memory store --type solution --title "Fixed X" --content "..." --tags "t1,t2" --episode
# --semantic merges keyword + Ollama embedding results (run embed first)
python client.py recall "timeout error" --semantic
claude-memory recall "timeout error" --semantic
# procedure type takes structured steps/preconditions/postconditions
python client.py procedure --title "Deploy flow" --content "..." \
claude-memory procedure --title "Deploy flow" --content "..." \
--steps "test,build,push,deploy" --preconditions "tests pass" --postconditions "healthy"
# reflect clusters recent memories; reflection regenerates REFLECTION.md
python client.py reflect --since 2026-01-01
python client.py reflection
claude-memory reflect --since 2026-01-01
claude-memory reflection
# tags sub-commands: list (counts), related (co-occurrence), suggest (for a memory)
python client.py tags list
python client.py tags related "python"
python client.py tags suggest <memory_id>
claude-memory tags list
claude-memory tags related "python"
claude-memory tags suggest <memory_id>
```
**Full command list:** `store`, `recall`, `get`, `relate`, `search`, `update`, `delete`, `related`, `stats`, `recent`, `decay`, `core`, `episode`, `reindex`, `pin`, `embed`, `reflect`, `reflection`, `tags`, `procedure`, `merge`
@ -162,13 +162,13 @@ decay_score = importance × e^(-0.03 × days_since_access) × log2(access_count
```bash
# Store the solution
python client.py store --type solution \
claude-memory store --type solution \
--title "Fixed Redis connection timeouts" \
--content "Added socket_keepalive=True and socket_timeout=300..." \
--tags "redis,timeout,production" --importance 0.8
# Log the episode
python client.py episode --type fix --title "Fixed Redis timeouts" \
claude-memory episode --type fix --title "Fixed Redis timeouts" \
--tags "redis,production" --summary "Keepalive prevents idle disconnections"
```
@ -176,16 +176,16 @@ python client.py episode --type fix --title "Fixed Redis timeouts" \
```bash
# Check what we know about a topic
python client.py recall "authentication oauth"
claude-memory recall "authentication oauth"
# Find solutions for similar problems
python client.py search --types "solution" --tags "python,api"
claude-memory search --types "solution" --tags "python,api"
```
### 3. Document a Decision
```bash
python client.py store --type decision \
claude-memory store --type decision \
--title "Chose PostgreSQL over MongoDB" \
--content "Need ACID transactions, complex joins..." \
--tags "database,architecture" --importance 0.9
@ -194,7 +194,7 @@ python client.py store --type decision \
### 4. Link Related Memories
```bash
python client.py relate <solution_id> <problem_id> SOLVES \
claude-memory relate <solution_id> <problem_id> SOLVES \
--context "Keepalive prevents idle disconnections"
```
@ -202,16 +202,16 @@ python client.py relate <solution_id> <problem_id> SOLVES \
```bash
# First-time setup: generate embeddings (requires Ollama + nomic-embed-text)
python client.py embed
claude-memory embed
# Recall with semantic search (merges keyword + embedding results)
python client.py recall "authentication timeout" --semantic
claude-memory recall "authentication timeout" --semantic
```
### 6. Store a Procedure
```bash
python client.py procedure \
claude-memory procedure \
--title "Deploy Major Domo to production" \
--content "Standard deploy workflow for the Discord bot" \
--steps "run tests,build docker image,push to registry,deploy to LXC" \
@ -224,45 +224,45 @@ python client.py procedure \
```bash
# Analyze recent memories for patterns
python client.py reflect
claude-memory reflect
# Review memories since a specific date
python client.py reflect --since 2026-01-15
claude-memory reflect --since 2026-01-15
# Preview without modifying state
python client.py reflect --dry-run
claude-memory reflect --dry-run
# Generate/refresh the REFLECTION.md summary
python client.py reflection
claude-memory reflection
```
### 8. Tag Analysis
```bash
# What tags exist and how often?
python client.py tags list --limit 20
claude-memory tags list --limit 20
# What tags co-occur with "python"?
python client.py tags related "python"
claude-memory tags related "python"
# What tags should this memory have?
python client.py tags suggest <memory_id>
claude-memory tags suggest <memory_id>
```
### 9. Session Maintenance
```bash
# Recalculate decay scores
python client.py decay
claude-memory decay
# Regenerate CORE.md
python client.py core
claude-memory core
# Refresh embeddings after adding new memories
python client.py embed
claude-memory embed
# View what's fading
python client.py search --min-importance 0.3
claude-memory search --min-importance 0.3
```
## CORE.md
@ -275,7 +275,7 @@ Auto-generated summary of memory themes, cross-project patterns, and access stat
## Semantic Search
Requires Ollama running locally with the `nomic-embed-text` model. Generate embeddings with `python client.py embed`, then use `--semantic` flag on recall to merge keyword and embedding-based results. Semantic search provides deeper matching beyond exact title/tag keywords - useful for finding conceptually related memories even when different terminology was used.
Requires Ollama running locally with the `nomic-embed-text` model. Generate embeddings with `claude-memory embed`, then use `--semantic` flag on recall to merge keyword and embedding-based results. Semantic search provides deeper matching beyond exact title/tag keywords - useful for finding conceptually related memories even when different terminology was used.
## Episode Logging

View File

@ -642,6 +642,7 @@ major-domo/
├── cli_stats.py (batting/pitching leaderboards)
├── cli_results.py (game results)
├── cli_schedule.py (game schedules)
├── cli_admin.py (admin: standings recalculate, stats refresh)
├── workflows/
│ ├── bot-deployment.md
│ ├── weekly-stats-update.md
@ -692,11 +693,11 @@ major-domo/
The `cli.py` provides a command-line interface for common operations, primarily for use with Claude Code.
**Shell Alias**: `majordomo` (defined in `~/.bashrc`)
**Wrapper Script**: `~/.local/bin/majordomo` (uses `uv run` for dependency management)
**⚠️ Claude Code Note**: The alias is not available in non-interactive shells. Use the full path instead:
**⚠️ Claude Code Note**: The wrapper uses `uv run` which may not be available in all contexts. Use the full invocation if needed:
```bash
python ~/.claude/skills/major-domo/cli.py <command>
uv run --with typer --with rich --with requests python ~/.claude/skills/major-domo/cli.py <command>
```
### Commands
@ -746,6 +747,12 @@ majordomo results list --week-start 1 --week-end 4 # Results for week range
# Game Schedule
majordomo schedule --team CLS --week 10 # Team schedule for week
majordomo schedule list --week-start 10 --week-end 12 # Schedule for week range
# Admin Operations (write + confirm)
majordomo admin recalculate-standings # Recalculate standings, show results
majordomo admin refresh-batting # Refresh batting materialized view, show top 5
majordomo admin refresh-pitching # Refresh pitching materialized view, show top 5
majordomo admin refresh-stats # Refresh both batting + pitching views
```
### Options
@ -838,6 +845,14 @@ python3 ~/.claude/skills/major-domo/cli.py transactions list --week-start 8 --we
# 4. Check injury status before setting lineups
python3 ~/.claude/skills/major-domo/cli.py injuries list --team CLS --active
# 5. Admin: Recalculate standings and refresh stats after weekly import
python3 ~/.claude/skills/major-domo/cli.py admin recalculate-standings
python3 ~/.claude/skills/major-domo/cli.py admin refresh-stats
# 6. Admin: Refresh only batting or pitching stats for a specific season
python3 ~/.claude/skills/major-domo/cli.py admin refresh-batting --season 11
python3 ~/.claude/skills/major-domo/cli.py admin refresh-pitching --season 11
```
### Transaction Compliance Check Workflow

View File

@ -63,12 +63,14 @@ from cli_injuries import injuries_app
from cli_stats import stats_app
from cli_results import results_app
from cli_schedule import schedule_app
from cli_admin import admin_app
app.add_typer(transactions_app, name="transactions")
app.add_typer(injuries_app, name="injuries")
app.add_typer(stats_app, name="stats")
app.add_typer(results_app, name="results")
app.add_typer(schedule_app, name="schedule")
app.add_typer(admin_app, name="admin")
# ============================================================================

View File

@ -0,0 +1,248 @@
#!/usr/bin/env python3
"""
Major Domo CLI - Admin Operations
Privileged operations: standings recalculation, stats refresh.
Each command performs the write operation then fetches fresh data to confirm.
"""
from typing import Annotated, Optional
import typer
from cli_common import (
console,
state,
output_json,
output_table,
handle_error,
get_season,
)
from cli_stats import _format_rate_stat, _outs_to_ip
admin_app = typer.Typer(help="Admin operations (standings recalculate, stats refresh)")
def _show_standings(season: int):
"""Fetch and display standings after recalculation"""
standings_data = state.api.get_standings(season=season)
if not standings_data:
console.print(f"[yellow]No standings found for season {season}[/yellow]")
return
rows = []
for s in standings_data:
team = s.get("team", {})
abbrev = team.get("abbrev", "N/A") if isinstance(team, dict) else "N/A"
name = team.get("lname", "N/A") if isinstance(team, dict) else "N/A"
wins = s.get("wins", 0)
losses = s.get("losses", 0)
total = wins + losses
pct = f".{int(wins / total * 1000):03d}" if total > 0 else ".000"
rd = s.get("run_diff", 0)
rd_str = f"+{rd}" if rd > 0 else str(rd)
rows.append([abbrev, name, wins, losses, pct, rd_str])
output_table(
f"Standings - Season {season} (Recalculated)",
["Team", "Name", "W", "L", "PCT", "RD"],
rows,
)
def _show_batting_preview(season: int, count: int):
"""Fetch and display top 5 batting leaders after refresh"""
stats = state.api.get_season_batting_stats(
season=season, sort_by="woba", sort_order="desc", limit=5, min_pa=50
)
if not stats:
return
rows = []
for rank, s in enumerate(stats, 1):
rows.append(
[
rank,
s.get("name", "N/A"),
s.get("player_team_abbrev", "N/A"),
s.get("pa", 0),
_format_rate_stat(s.get("avg")),
_format_rate_stat(s.get("obp")),
_format_rate_stat(s.get("slg")),
_format_rate_stat(s.get("woba")),
]
)
console.print()
output_table(
f"Top 5 by wOBA (min 50 PA) - {count} players refreshed",
["#", "Name", "Team", "PA", "AVG", "OBP", "SLG", "wOBA"],
rows,
)
def _show_pitching_preview(season: int, count: int):
"""Fetch and display top 5 pitching leaders after refresh"""
stats = state.api.get_season_pitching_stats(
season=season, sort_by="era", sort_order="asc", limit=5, min_outs=50
)
if not stats:
return
rows = []
for rank, s in enumerate(stats, 1):
rows.append(
[
rank,
s.get("name", "N/A"),
s.get("player_team_abbrev", "N/A"),
_outs_to_ip(s.get("outs", 0)),
_format_rate_stat(s.get("era"), decimals=2),
_format_rate_stat(s.get("whip"), decimals=2),
s.get("so", 0),
]
)
console.print()
output_table(
f"Top 5 by ERA (min 50 outs) - {count} players refreshed",
["#", "Name", "Team", "IP", "ERA", "WHIP", "SO"],
rows,
)
@admin_app.command("recalculate-standings")
def recalculate_standings(
season: Annotated[
Optional[int], typer.Option("--season", "-s", help="Season number")
] = None,
):
"""Recalculate standings from game results for a season"""
try:
season = get_season(season)
console.print(
f"[yellow]Recalculating standings for season {season}...[/yellow]"
)
result = state.api.recalculate_standings(season)
console.print(f"[green]Done:[/green] {result}")
if state.json_output:
standings_data = state.api.get_standings(season=season)
output_json(
{"message": result, "season": season, "standings": standings_data}
)
return
_show_standings(season)
except Exception as e:
handle_error(e)
@admin_app.command("refresh-batting")
def refresh_batting(
season: Annotated[
Optional[int], typer.Option("--season", "-s", help="Season number")
] = None,
):
"""Refresh season batting stats materialized view"""
try:
season = get_season(season)
console.print(
f"[yellow]Refreshing batting stats for season {season}...[/yellow]"
)
result = state.api.refresh_batting_stats(season)
players = result.get("players_updated", 0)
console.print(
f"[green]Done:[/green] {result.get('message', 'Batting stats refreshed')} "
f"({players} players updated)"
)
if state.json_output:
top_stats = state.api.get_season_batting_stats(
season=season, sort_by="woba", sort_order="desc", limit=5, min_pa=50
)
result["top_5_woba"] = top_stats
output_json(result)
return
_show_batting_preview(season, players)
except Exception as e:
handle_error(e)
@admin_app.command("refresh-pitching")
def refresh_pitching(
season: Annotated[
Optional[int], typer.Option("--season", "-s", help="Season number")
] = None,
):
"""Refresh season pitching stats materialized view"""
try:
season = get_season(season)
console.print(
f"[yellow]Refreshing pitching stats for season {season}...[/yellow]"
)
result = state.api.refresh_pitching_stats(season)
players = result.get("players_updated", 0)
console.print(
f"[green]Done:[/green] {result.get('message', 'Pitching stats refreshed')} "
f"({players} players updated)"
)
if state.json_output:
top_stats = state.api.get_season_pitching_stats(
season=season, sort_by="era", sort_order="asc", limit=5, min_outs=50
)
result["top_5_era"] = top_stats
output_json(result)
return
_show_pitching_preview(season, players)
except Exception as e:
handle_error(e)
@admin_app.command("refresh-stats")
def refresh_stats(
season: Annotated[
Optional[int], typer.Option("--season", "-s", help="Season number")
] = None,
):
"""Refresh both batting and pitching stats materialized views"""
try:
season = get_season(season)
console.print(f"[yellow]Refreshing all stats for season {season}...[/yellow]")
batting_result = state.api.refresh_batting_stats(season)
bat_count = batting_result.get("players_updated", 0)
console.print(f" Batting: {bat_count} players refreshed")
pitching_result = state.api.refresh_pitching_stats(season)
pit_count = pitching_result.get("players_updated", 0)
console.print(f" Pitching: {pit_count} players refreshed")
console.print(f"[green]Done![/green]")
if state.json_output:
top_batting = state.api.get_season_batting_stats(
season=season, sort_by="woba", sort_order="desc", limit=5, min_pa=50
)
top_pitching = state.api.get_season_pitching_stats(
season=season, sort_by="era", sort_order="asc", limit=5, min_outs=50
)
output_json(
{
"batting": {**batting_result, "top_5_woba": top_batting},
"pitching": {**pitching_result, "top_5_era": top_pitching},
}
)
return
_show_batting_preview(season, bat_count)
_show_pitching_preview(season, pit_count)
except Exception as e:
handle_error(e)