From 17b0e37ad15d1ad51ce651386366804fe31e70ce Mon Sep 17 00:00:00 2001 From: Cal Corum Date: Tue, 17 Feb 2026 16:14:44 -0600 Subject: [PATCH] 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 --- agents/claude-researcher.md | 92 ++-- commands/commit-push-pr.md | 32 ++ commands/commit-push.md | 55 +-- commands/commit.md | 24 + plugins/install-counts-cache.json | 486 +++++++++++++++++++ plugins/installed_plugins.json | 16 + plugins/known_marketplaces.json | 18 + plugins/marketplaces/claude-code-plugins | 1 + plugins/marketplaces/claude-plugins-official | 1 + scripts/claude-pulse | 1 - scripts/claude-statusline | 1 + settings.json | 13 +- skills/cognitive-memory/SKILL.md | 58 +-- skills/major-domo/SKILL.md | 21 +- skills/major-domo/cli.py | 2 + skills/major-domo/cli_admin.py | 248 ++++++++++ 16 files changed, 929 insertions(+), 140 deletions(-) create mode 100644 commands/commit-push-pr.md create mode 100644 commands/commit.md create mode 100644 plugins/install-counts-cache.json create mode 100644 plugins/installed_plugins.json create mode 100644 plugins/known_marketplaces.json create mode 160000 plugins/marketplaces/claude-code-plugins create mode 160000 plugins/marketplaces/claude-plugins-official delete mode 160000 scripts/claude-pulse create mode 160000 scripts/claude-statusline create mode 100644 skills/major-domo/cli_admin.py diff --git a/agents/claude-researcher.md b/agents/claude-researcher.md index 718f0b6..f48c76f 100644 --- a/agents/claude-researcher.md +++ b/agents/claude-researcher.md @@ -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 \ No newline at end of file diff --git a/commands/commit-push-pr.md b/commands/commit-push-pr.md new file mode 100644 index 0000000..aff4eba --- /dev/null +++ b/commands/commit-push-pr.md @@ -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 ` where `` 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 --title "Title" --body "..."` + - If remote URL contains `git.manticorum.com` or other Gitea host → use `tea pulls create --head --base --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. diff --git a/commands/commit-push.md b/commands/commit-push.md index 0f2a3b0..4c623ed 100644 --- a/commands/commit-push.md +++ b/commands/commit-push.md @@ -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 ` where `` 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 ` -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 ` where `` 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 ` +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//HEAD | sed 's|.*/||'` (fallback to `main`) -3. Run `git log ..HEAD --oneline` to summarize all commits in the PR -4. Create the PR: - - **GitHub**: `gh pr create --base --title "Title" --body "..."` - - **Gitea**: `tea pulls create --head --base --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. diff --git a/commands/commit.md b/commands/commit.md new file mode 100644 index 0000000..bd56040 --- /dev/null +++ b/commands/commit.md @@ -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 ` where `` 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. diff --git a/plugins/install-counts-cache.json b/plugins/install-counts-cache.json new file mode 100644 index 0000000..76b5746 --- /dev/null +++ b/plugins/install-counts-cache.json @@ -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 + } + ] +} \ No newline at end of file diff --git a/plugins/installed_plugins.json b/plugins/installed_plugins.json new file mode 100644 index 0000000..ba2585e --- /dev/null +++ b/plugins/installed_plugins.json @@ -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" + } + ] + } +} \ No newline at end of file diff --git a/plugins/known_marketplaces.json b/plugins/known_marketplaces.json new file mode 100644 index 0000000..8ca041c --- /dev/null +++ b/plugins/known_marketplaces.json @@ -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" + } +} \ No newline at end of file diff --git a/plugins/marketplaces/claude-code-plugins b/plugins/marketplaces/claude-code-plugins new file mode 160000 index 0000000..1718a57 --- /dev/null +++ b/plugins/marketplaces/claude-code-plugins @@ -0,0 +1 @@ +Subproject commit 1718a574950cd8979b27b3e21f5e82760b10e8e0 diff --git a/plugins/marketplaces/claude-plugins-official b/plugins/marketplaces/claude-plugins-official new file mode 160000 index 0000000..261ce4f --- /dev/null +++ b/plugins/marketplaces/claude-plugins-official @@ -0,0 +1 @@ +Subproject commit 261ce4fba4f2c314c490302158909a32e5889c88 diff --git a/scripts/claude-pulse b/scripts/claude-pulse deleted file mode 160000 index c4c2ee6..0000000 --- a/scripts/claude-pulse +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c4c2ee6a4ed494d30c60a6d26e6a604d1dfccee4 diff --git a/scripts/claude-statusline b/scripts/claude-statusline new file mode 160000 index 0000000..7c90ce5 --- /dev/null +++ b/scripts/claude-statusline @@ -0,0 +1 @@ +Subproject commit 7c90ce508bff6de1f8a9c2f9034ecd7a75eb3779 diff --git a/settings.json b/settings.json index 8c4ef18..ffeb892 100644 --- a/settings.json +++ b/settings.json @@ -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" } diff --git a/skills/cognitive-memory/SKILL.md b/skills/cognitive-memory/SKILL.md index 89cfcfe..97df6ae 100644 --- a/skills/cognitive-memory/SKILL.md +++ b/skills/cognitive-memory/SKILL.md @@ -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 +claude-memory tags list +claude-memory tags related "python" +claude-memory tags suggest ``` **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 SOLVES \ +claude-memory relate SOLVES \ --context "Keepalive prevents idle disconnections" ``` @@ -202,16 +202,16 @@ python client.py relate 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 +claude-memory tags suggest ``` ### 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 diff --git a/skills/major-domo/SKILL.md b/skills/major-domo/SKILL.md index 4063e90..4ab4ed4 100644 --- a/skills/major-domo/SKILL.md +++ b/skills/major-domo/SKILL.md @@ -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 +uv run --with typer --with rich --with requests python ~/.claude/skills/major-domo/cli.py ``` ### 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 diff --git a/skills/major-domo/cli.py b/skills/major-domo/cli.py index fecb569..236a1b8 100755 --- a/skills/major-domo/cli.py +++ b/skills/major-domo/cli.py @@ -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") # ============================================================================ diff --git a/skills/major-domo/cli_admin.py b/skills/major-domo/cli_admin.py new file mode 100644 index 0000000..ee5df0f --- /dev/null +++ b/skills/major-domo/cli_admin.py @@ -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)