Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
557e3d5
Disable commenter from lint action
stbenjam Oct 27, 2025
64901c8
feat(jira): add modular skills for issue type creation
bryan-cox Oct 24, 2025
7108bc9
feat(jira): add /jira:create command for unified issue creation
bryan-cox Oct 24, 2025
273729a
Expand /prow-job:analyze-test-failure skill to process intervals
dgoodwin Oct 27, 2025
927bd1d
Download and create a new OpenShift OCP cluster
ngopalak-redhat Oct 27, 2025
e228977
Fix linter error
ngopalak-redhat Oct 27, 2025
a0131df
Add a usage note to prefer other tools
ngopalak-redhat Oct 28, 2025
f2759aa
Keep usage limited
ngopalak-redhat Oct 28, 2025
c807a81
feat: new slash command to bump deps on projects belonging to OpenShi…
davidesalerno Oct 24, 2025
91b64b9
Add a must-gather plugin for basic must-gather parsing and analysis
Prashanth684 Oct 22, 2025
82717f1
Add claude interactive cluster creation and destroy command
ngopalak-redhat Oct 28, 2025
b4ec9f6
docs(jira): update spec file location in solve command
bryan-cox Oct 28, 2025
a7b8a79
feat(git): add commit-suggest command for AI-powered commit messages
LiangquanLi930 Oct 28, 2025
fbce587
Adds theobarberbany to OWNERS
theobarberbany Oct 28, 2025
ed7cd74
docs(git): document Git plugin commands
LiangquanLi930 Oct 29, 2025
c0c13de
Add script to automatically generate PLUGINS.md
chiragkyal Oct 29, 2025
8c74410
Add TOC, Skills, and linter for README
stbenjam Oct 29, 2025
7ddec81
Add OLM plugin with debug command and Jira integration
jianzhangbjz Oct 24, 2025
1a1fa44
Update docs for olm plugin
stbenjam Oct 29, 2025
8c8770d
feat(git): add branch-cleanup command
smg247 Oct 29, 2025
f5908ff
Add marketplace website for AI Helpers plugins
stbenjam Oct 29, 2025
86dc011
Add OLM Plugin for Day-2 Operator Management
chiragkyal Oct 30, 2025
9d89b1a
config: Add config plugin for hooks and status line management
ibihim Oct 30, 2025
528a6a2
plugins/config: emphasize that prompt storing is optional
ibihim Oct 30, 2025
0d0425a
status-line: improvements in the prompt after testing
ibihim Nov 14, 2025
208cd27
plugins/config: improve install-hooks.md formatting and documentation
ibihim Nov 14, 2025
8579cb0
plugins/config: use TMPDIR and claude-sessions directory in hook
ibihim Nov 14, 2025
6e1944b
plugins/config: enhance status line with path context and emojis
ibihim Nov 14, 2025
d113273
plugins/config: update documentation with $HOME and new features
ibihim Nov 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@
"source": "./plugins/doc",
"description": "A plugin for engineering documentation and notes"
},
{
"name": "config",
"source": "./plugins/config",
"description": "Claude Code configuration management for hooks and status line customization"
},
{
"name": "session",
"source": "./plugins/session",
Expand All @@ -39,6 +44,11 @@
"source": "./plugins/utils",
"description": "A generic utilities plugin serving as a catch-all for various helper commands"
},
{
"name": "olm",
"source": "./plugins/olm",
"description": "OLM (Operator Lifecycle Manager) plugin for operator management and debugging"
},
{
"name": "prow-job",
"source": "./plugins/prow-job",
Expand All @@ -58,6 +68,11 @@
"name": "yaml",
"source": "./plugins/yaml",
"description": "YAML documentation and utilities"
},
{
"name": "must-gather",
"source": "./plugins/must-gather",
"description": "A plugin to analyze and report on must-gather data"
}
]
}
}
135 changes: 135 additions & 0 deletions .claudelint-custom.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
"""
Custom claudelint rules for ai-helpers marketplace
"""

import subprocess
from pathlib import Path
from typing import List

try:
from src.rule import Rule, RuleViolation, Severity
from src.context import RepositoryContext
except ImportError:
# Fallback for when running as a custom rule
from claudelint import Rule, RuleViolation, Severity, RepositoryContext


class PluginsDocUpToDateRule(Rule):
"""Check that PLUGINS.md and docs/data.json are up-to-date by running 'make update'"""

@property
def rule_id(self) -> str:
return "plugins-doc-up-to-date"

@property
def description(self) -> str:
return "PLUGINS.md and docs/data.json must be up-to-date with plugin metadata. Run 'make update' to regenerate."

def default_severity(self) -> Severity:
return Severity.ERROR

def check(self, context: RepositoryContext) -> List[RuleViolation]:
violations = []

# Only check marketplace repos
if not context.has_marketplace():
return violations

plugins_md_path = context.root_path / "PLUGINS.md"
data_json_path = context.root_path / "docs" / "data.json"

if not plugins_md_path.exists():
return violations

# Check if generate_plugin_docs.py script exists
script_path = context.root_path / "scripts" / "generate_plugin_docs.py"
if not script_path.exists():
return violations

try:
# Read current content of files to check
original_plugins_md = plugins_md_path.read_text()
original_data_json = data_json_path.read_text() if data_json_path.exists() else None

# Run the docs generation script
result = subprocess.run(
["python3", str(script_path)],
cwd=str(context.root_path),
capture_output=True,
text=True,
timeout=30
)

if result.returncode != 0:
violations.append(
self.violation(
f"'make update' failed: {result.stderr}",
file_path=plugins_md_path
)
)
return violations

# Also run build-website.py if it exists
website_script_path = context.root_path / "scripts" / "build-website.py"
if website_script_path.exists():
result = subprocess.run(
["python3", str(website_script_path)],
cwd=str(context.root_path),
capture_output=True,
text=True,
timeout=30
)

if result.returncode != 0:
violations.append(
self.violation(
f"build-website.py failed: {result.stderr}",
file_path=data_json_path if data_json_path.exists() else plugins_md_path
)
)
return violations

# Check if PLUGINS.md changed
generated_plugins_md = plugins_md_path.read_text()
if original_plugins_md != generated_plugins_md:
# Restore original content
plugins_md_path.write_text(original_plugins_md)

violations.append(
self.violation(
"PLUGINS.md is out of sync with plugin metadata. Run 'make update' to update.",
file_path=plugins_md_path
)
)

# Check if docs/data.json changed
if data_json_path.exists():
generated_data_json = data_json_path.read_text()
if original_data_json != generated_data_json:
# Restore original content
if original_data_json is not None:
data_json_path.write_text(original_data_json)

violations.append(
self.violation(
"docs/data.json is out of sync with plugin metadata. Run 'make update' to update.",
file_path=data_json_path
)
)

except subprocess.TimeoutExpired:
violations.append(
self.violation(
"'make update' timed out",
file_path=plugins_md_path
)
)
except Exception as e:
violations.append(
self.violation(
f"Error checking files up-to-date status: {e}",
file_path=plugins_md_path
)
)

return violations
9 changes: 9 additions & 0 deletions .claudelint.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# claudelint configuration for ai-helpers marketplace
# https://github.com/stbenjam/claudelint

# Load custom rules (paths relative to repository root)
custom-rules:
- .claudelint-custom.py

rules:
# Plugin structure rules
plugin-json-required:
Expand Down Expand Up @@ -58,6 +62,11 @@ rules:
enabled: true
severity: warning

# Custom rules for plugin documentation
plugins-doc-up-to-date:
enabled: true
severity: error

# Exclude patterns
exclude: []

Expand Down
30 changes: 0 additions & 30 deletions .github/workflows/lint-plugins.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@ name: Lint Plugins

on:
pull_request:
paths:
- 'plugins/**'
- '.claude-plugin/**'
- '.github/workflows/lint-plugins.yml'
push:
branches:
- main
Expand All @@ -28,29 +24,3 @@ jobs:
-w /workspace \
ghcr.io/stbenjam/claudelint:main \
-v --strict

- name: Comment on PR (on failure)
if: failure() && github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const output = `⚠️ Plugin linter found issues.

Run locally to see details:
\`\`\`bash
docker run --rm -v $(pwd):/workspace ghcr.io/stbenjam/claudelint:main
\`\`\`

Or install and run directly:
\`\`\`bash
pip install claudelint
claudelint
\`\`\`
`;

github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: output
});
7 changes: 7 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,12 @@ lint-pull: ## Pull the latest claudelint image
@echo "Pulling latest claudelint image..."
$(CONTAINER_RUNTIME) pull $(CLAUDELINT_IMAGE)

.PHONY: update
update: ## Update plugin documentation and website data
@echo "Updating plugin documentation..."
@python3 scripts/generate_plugin_docs.py
@echo "Building website data..."
@python3 scripts/build-website.py

.DEFAULT_GOAL := help

2 changes: 2 additions & 0 deletions OWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ approvers:
- dgoodwin
- rvanderp3
- stbenjam
- theobarberbany
reviewers:
- enxebre
- bryan-cox
Expand All @@ -14,3 +15,4 @@ reviewers:
- dgoodwin
- rvanderp3
- stbenjam
- theobarberbany
Loading