diff --git a/.github/ISSUE_TEMPLATE/agent_skill_request.yml b/.github/ISSUE_TEMPLATE/agent_skill_request.yml new file mode 100644 index 0000000..382f789 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/agent_skill_request.yml @@ -0,0 +1,44 @@ +name: 🤖 Agent / Skill Request +description: Propose a new subagent or skill to bundle +title: "agent: " +labels: ["🤖 Agent", "🔍 Triage"] +body: + - type: dropdown + id: kind + attributes: + label: Type + options: + - Agent (under `agents/`) + - Skill (under `skills//SKILL.md`) + validations: + required: true + + - type: input + id: name + attributes: + label: Proposed name + placeholder: e.g. terraform-reviewer / accessibility-auditor + validations: + required: true + + - type: textarea + id: description + attributes: + label: Description + description: One-paragraph summary for the frontmatter. + validations: + required: true + + - type: textarea + id: when-to-use + attributes: + label: When to use it + description: Specific, actionable trigger conditions. + validations: + required: true + + - type: textarea + id: gap + attributes: + label: Why isn't this covered by an existing one? + description: Link the closest existing agent/skill and explain the gap. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..e7ac96a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,43 @@ +name: 🐞 Bug Report +description: Something is broken — agent fails, hook misbehaves, install errors, etc. +title: "bug: " +labels: ["🐞 Bug", "🔍 Triage"] +body: + - type: textarea + id: what-happened + attributes: + label: What happened? + description: Include reproduction steps if possible. + placeholder: | + 1. Run `./install.sh` + 2. Invoke `/egc-plan ...` + 3. See error + validations: + required: true + + - type: dropdown + id: environment + attributes: + label: Environment + multiple: true + options: + - Gemini CLI + - Antigravity + - npm package + - Other + validations: + required: true + + - type: input + id: version + attributes: + label: OS / Version + placeholder: macOS 14.5 / v1.3.6 + validations: + required: true + + - type: textarea + id: logs + attributes: + label: Logs (optional) + render: shell diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..c4be900 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: 💬 Discussions + url: https://github.com/Jamkris/everything-gemini-code/discussions + about: Questions, ideas, "is this the right pattern?", show and tell + - name: 📖 Documentation + url: https://github.com/Jamkris/everything-gemini-code/tree/main/docs + about: Multilingual docs (en / ko-KR / zh-CN) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..e6e5b98 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,33 @@ +name: ✨ Feature Request +description: Suggest a new feature, command, hook, or integration +title: "feat: " +labels: ["✨ Feature", "🔍 Triage"] +body: + - type: textarea + id: problem + attributes: + label: Problem + description: What are you trying to do that the current bundle doesn't support? + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposed solution + validations: + required: true + + - type: dropdown + id: scope + attributes: + label: Scope + multiple: true + options: + - Agent + - Skill + - Slash command + - Hook + - Install / packaging + - Docs + - Other diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..05afc43 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,30 @@ +## Summary + + + +## Type + + + +- [ ] feat — new agent / skill / command / hook +- [ ] fix — bug fix +- [ ] refactor — non-behavioral cleanup +- [ ] docs — documentation only +- [ ] chore — tooling, CI, dependency bumps +- [ ] breaking — changes a command name, agent tool list, or hook contract + +## Test plan + + + +- [ ] `npm run lint` clean +- [ ] `npm test` passes +- [ ] `node scripts/ci/validate-agents.js` passes (if touching `agents/`) +- [ ] `node scripts/ci/validate-commands.js` passes (if touching `commands/`) +- [ ] Manual smoke test in Gemini CLI / Antigravity (describe below) + + + +## Related + + diff --git a/.github/labels.yml b/.github/labels.yml new file mode 100644 index 0000000..91e5f27 --- /dev/null +++ b/.github/labels.yml @@ -0,0 +1,70 @@ +# --- Type --------------------------------------------------------------- +- name: 🐞 Bug + color: d73a4a + description: Something isn't working +- name: ✨ Feature + color: a2eeef + description: New feature or improvement request +- name: 🔨 Refactor + color: f29a4e + description: Code refactoring with no behavior change +- name: 📃 Docs + color: 1D76DB + description: Documentation changes (README, docs/) +- name: ✅ Test + color: ccffc4 + description: Test additions or fixes (tests/, fixtures) +- name: ⚙ Setting + color: e3dede + description: Tooling, CI, dependencies, build setup +- name: 🌏 Release + color: C2E0C6 + description: Release, packaging, publish +- name: 🙋‍♂️ Question + color: 9ED447 + description: Further information is requested + +# --- Area --------------------------------------------------------------- +- name: 🤖 Agent + color: 7057ff + description: Changes under agents/ (subagent definitions) +- name: 🧠 Skill + color: 0e8a16 + description: Changes under skills/ (SKILL.md) +- name: ⌨ Command + color: D4C5F9 + description: Changes under commands/ (egc-* slash commands) +- name: 🪝 Hook + color: e99695 + description: Changes under hooks/ or scripts/hooks/ +- name: 📚 Rules + color: C5DEF5 + description: Changes under rules/ (shipped to user ~/.gemini/rules/) +- name: 📦 Install + color: FEF2C0 + description: install.sh / install.ps1 / npm packaging + +# --- Severity / nature -------------------------------------------------- +- name: 🛡 Security + color: b60205 + description: Security-relevant change or vulnerability +- name: 💥 Breaking + color: d93f0b + description: Breaks command names, tool lists, or hook contracts + +# --- Triage / flow ------------------------------------------------------ +- name: 🔍 Triage + color: ededed + description: Awaiting maintainer triage +- name: 🌱 Good First Issue + color: 7057ff + description: Approachable for first-time contributors +- name: 🤝 Help Wanted + color: 008672 + description: Maintainer would like community help on this +- name: 🌀 Duplicate + color: cccccc + description: Already tracked elsewhere +- name: 🚫 Wontfix + color: ffffff + description: Out of scope or intentionally not addressed diff --git a/scripts/setup-labels.sh b/scripts/setup-labels.sh new file mode 100644 index 0000000..ab3b907 --- /dev/null +++ b/scripts/setup-labels.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +# Sync GitHub labels from .github/labels.yml. +# +# Idempotent: re-running updates color/description on existing labels. +# Requires `gh` CLI and `python3` (used to parse the YAML). + +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +LABELS_FILE="$ROOT/.github/labels.yml" + +if [ ! -f "$LABELS_FILE" ]; then + echo "Labels manifest not found at $LABELS_FILE" >&2 + exit 1 +fi + +if ! command -v gh >/dev/null 2>&1; then + echo "gh CLI not installed. See https://cli.github.com/" >&2 + exit 1 +fi + +if ! command -v python3 >/dev/null 2>&1; then + echo "python3 not found. Please install Python 3." >&2 + exit 1 +fi + +# Parse YAML into TSV rows (namecolordescription) via python. +python3 - "$LABELS_FILE" <<'PY' | while IFS=$'\t' read -r name color description; do +import sys, re + +path = sys.argv[1] +with open(path, encoding='utf-8') as f: + src = f.read() + +entries = [] +current = None +for line in src.splitlines(): + if line.startswith('#') or not line.strip(): + continue + m = re.match(r'^- name:\s*(.+?)\s*$', line) + if m: + if current: + entries.append(current) + current = {'name': m.group(1), 'color': '', 'description': ''} + continue + m = re.match(r'^\s+color:\s*(.+?)\s*$', line) + if m and current is not None: + current['color'] = m.group(1) + continue + m = re.match(r'^\s+description:\s*(.+?)\s*$', line) + if m and current is not None: + current['description'] = m.group(1) +if current: + entries.append(current) + +for e in entries: + print(f"{e['name']}\t{e['color']}\t{e['description']}") +PY + echo "Syncing label: $name" + gh label create "$name" --color "$color" --description "$description" --force >/dev/null +done + +echo "Done."