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:
parent
b37bc3ed2a
commit
17b0e37ad1
@ -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
|
||||
32
commands/commit-push-pr.md
Normal file
32
commands/commit-push-pr.md
Normal 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.
|
||||
@ -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
24
commands/commit.md
Normal 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.
|
||||
486
plugins/install-counts-cache.json
Normal file
486
plugins/install-counts-cache.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
16
plugins/installed_plugins.json
Normal file
16
plugins/installed_plugins.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
18
plugins/known_marketplaces.json
Normal file
18
plugins/known_marketplaces.json
Normal 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"
|
||||
}
|
||||
}
|
||||
1
plugins/marketplaces/claude-code-plugins
Submodule
1
plugins/marketplaces/claude-code-plugins
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 1718a574950cd8979b27b3e21f5e82760b10e8e0
|
||||
1
plugins/marketplaces/claude-plugins-official
Submodule
1
plugins/marketplaces/claude-plugins-official
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 261ce4fba4f2c314c490302158909a32e5889c88
|
||||
@ -1 +0,0 @@
|
||||
Subproject commit c4c2ee6a4ed494d30c60a6d26e6a604d1dfccee4
|
||||
1
scripts/claude-statusline
Submodule
1
scripts/claude-statusline
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 7c90ce508bff6de1f8a9c2f9034ecd7a75eb3779
|
||||
@ -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"
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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")
|
||||
|
||||
|
||||
# ============================================================================
|
||||
|
||||
248
skills/major-domo/cli_admin.py
Normal file
248
skills/major-domo/cli_admin.py
Normal 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)
|
||||
Loading…
Reference in New Issue
Block a user