Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ jobs:
run: black --check --diff .

- name: Run isort import checker
run: isort --check-only --diff .
run: isort --check-only --diff --settings-path pyproject.toml .

- name: Run Flake8 linter
run: flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
Expand Down Expand Up @@ -98,7 +98,7 @@ jobs:
pip install -r requirements-dev.txt

- name: Run pytest
run: pytest --cov=plugins --cov=examples --cov-report=term -v
run: pytest --cov=005-plugins --cov=003-skills --cov-report=term -v

validate-plugins:
name: Validate Plugin Structure
Expand All @@ -112,7 +112,7 @@ jobs:
- name: Validate plugin.json files
run: |
echo "Validating plugin.json files..."
for plugin_json in $(find plugins -name "plugin.json" 2>/dev/null); do
for plugin_json in $(find 005-plugins -name "plugin.json" 2>/dev/null); do
echo "Checking $plugin_json"
jq empty "$plugin_json" || exit 1
jq -e '.name' "$plugin_json" > /dev/null || (echo "Missing 'name' in $plugin_json" && exit 1)
Expand Down
46 changes: 46 additions & 0 deletions .github/workflows/gemini-code-assist-trigger.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Gemini Code Assist Trigger

# Triggers Gemini Code Assist (GitHub App) review immediately on PR creation
# This complements the Vertex AI review in gemini-pr-review.yml

on:
pull_request:
types: [opened, synchronize, reopened]

permissions:
contents: read
pull-requests: write
issues: write

jobs:
trigger-gemini-code-assist:
runs-on: ubuntu-latest
steps:
- name: Trigger Gemini Code Assist Review
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const prNumber = context.payload.pull_request.number;
const owner = context.repo.owner;
const repo = context.repo.repo;

console.log(`Triggering Gemini Code Assist for PR #${prNumber}`);

// Post /gemini review command to trigger immediate review
await github.rest.issues.createComment({
owner,
repo,
issue_number: prNumber,
body: '/gemini review'
});

// Post /gemini summary command for PR summary
await github.rest.issues.createComment({
owner,
repo,
issue_number: prNumber,
body: '/gemini summary'
});

console.log('Gemini Code Assist commands posted');
99 changes: 0 additions & 99 deletions .github/workflows/gemini-pr-review.yml

This file was deleted.

61 changes: 50 additions & 11 deletions .github/workflows/plugin-validator.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
name: Plugin Validator

# Validates plugins against 099-SPEC-MASTER-claude-code-plugins-standard.md
# Validates plugins against Anthropic Official Claude Code Plugin Specification (Dec 2025)
# Source: https://code.claude.com/docs/en/plugins
# Also: https://modelcontextprotocol.io/specification/2025-11-25/server/tools (MCP Tools)
#
# Required plugin.json fields per official spec:
# - name (required)
# - description (required)
# - version (required)
# - author.name (required)

on:
push:
Expand Down Expand Up @@ -98,20 +106,51 @@ jobs:
fi
echo "name: $name"

- name: Validate recommended fields
- name: Validate required field - description
run: |
plugin_json="005-plugins/${{ matrix.plugin }}/.claude-plugin/plugin.json"
version=$(jq -r '.version // empty' "$plugin_json")
description=$(jq -r '.description // empty' "$plugin_json")
[ -z "$version" ] && echo "::warning::Recommended field 'version' is missing"
[ -z "$description" ] && echo "::warning::Recommended field 'description' is missing"
if [ -n "$version" ]; then
if ! echo "$version" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+'; then
echo "::warning::Version '$version' doesn't follow semver"
fi
if [ -z "$description" ]; then
echo "::error::REQUIRED field 'description' is missing (per Anthropic spec)"
exit 1
fi
echo "description: $description"

- name: Validate required field - version
run: |
plugin_json="005-plugins/${{ matrix.plugin }}/.claude-plugin/plugin.json"
version=$(jq -r '.version // empty' "$plugin_json")
if [ -z "$version" ]; then
echo "::error::REQUIRED field 'version' is missing (per Anthropic spec)"
exit 1
fi
echo "version: ${version:-not set}"
echo "description: ${description:-not set}"
if ! echo "$version" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+'; then
echo "::warning::Version '$version' doesn't follow semver (recommended: X.Y.Z)"
fi
echo "version: $version"

- name: Validate required field - author.name
run: |
plugin_json="005-plugins/${{ matrix.plugin }}/.claude-plugin/plugin.json"
author_name=$(jq -r '.author.name // empty' "$plugin_json")
if [ -z "$author_name" ]; then
echo "::error::REQUIRED field 'author.name' is missing (per Anthropic spec)"
exit 1
fi
echo "author.name: $author_name"

- name: Validate optional fields
run: |
plugin_json="005-plugins/${{ matrix.plugin }}/.claude-plugin/plugin.json"
homepage=$(jq -r '.homepage // empty' "$plugin_json")
repository=$(jq -r '.repository // empty' "$plugin_json")
license=$(jq -r '.license // empty' "$plugin_json")
[ -z "$homepage" ] && echo "::notice::Optional field 'homepage' not set"
[ -z "$repository" ] && echo "::notice::Optional field 'repository' not set"
[ -z "$license" ] && echo "::notice::Optional field 'license' not set"
echo "homepage: ${homepage:-not set}"
echo "repository: ${repository:-not set}"
echo "license: ${license:-not set}"

validate-structure:
name: Validate Plugin Structure
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -127,3 +127,5 @@ claude-code-plugins-plus/
# TimeGPT Lab environment file
002-workspaces/timegpt-lab/.env
.venv-skill-tests/
# Local emailer utility (contains API keys)
emailer/
41 changes: 27 additions & 14 deletions 000-docs/000a-planned-plugins/README.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,39 @@
# Planned Plugins Directory
# Plugins Documentation Directory

This directory contains specifications for **future Claude Code plugins** organized by strategic category.
This directory contains documentation for both **implemented** and **planned** Claude Code plugins.

## Directory Structure

```
planned-005-plugins/
├── internal-efficiency/ # Tools for Nixtla's team (33% of roadmap)
├── business-growth/ # Market expansion tools (58% of roadmap)
└── vertical-defi/ # DeFi/Crypto vertical (experimental)
000a-planned-plugins/
├── implemented/ # Documentation for working plugins
│ ├── nixtla-baseline-lab/
│ ├── nixtla-bigquery-forecaster/
│ └── nixtla-search-to-slack/
├── internal-efficiency/ # Planned: Tools for Nixtla's team (33% of roadmap)
├── business-growth/ # Planned: Market expansion tools (58% of roadmap)
└── nixtla-defi-sentinel/ # Planned: DeFi/Crypto vertical (experimental)
```

---

## Current Status
## Implemented Plugins

**Implemented Plugins**: 3 (in `/005-plugins/` directory)
- nixtla-baseline-lab (v0.8.0)
- nixtla-bigquery-forecaster
- nixtla-search-to-slack (v0.1.0)
Working plugins with full documentation in `implemented/`:

**Planned Plugins**: 12 (specifications in this directory)
| Plugin | Status | Documentation |
|--------|--------|---------------|
| **nixtla-baseline-lab** | v0.8.0 | `implemented/nixtla-baseline-lab/` |
| **nixtla-bigquery-forecaster** | Demo | `implemented/nixtla-bigquery-forecaster/` |
| **nixtla-search-to-slack** | v0.1.0 MVP | `implemented/nixtla-search-to-slack/` |

Each has 6 standardized docs: Business Case, PRD, Architecture, User Journey, Technical Spec, Status.

---

## Planned Plugins

**Planned Plugins**: 10 (specifications in category directories)

---

Expand Down Expand Up @@ -209,6 +222,6 @@ To add a new planned plugin:

---

**Last Updated**: 2025-12-05
**Version**: 1.2.0 (Categorized Structure)
**Last Updated**: 2025-12-12
**Version**: 1.3.0 (Added Implemented Plugins Documentation)
**Maintained By**: Intent Solutions × Nixtla
Loading
Loading