kctl-github 0.5.3__tar.gz → 0.6.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kctl_github-0.5.3 → kctl_github-0.6.0}/PKG-INFO +1 -1
- {kctl_github-0.5.3 → kctl_github-0.6.0}/pyproject.toml +1 -1
- {kctl_github-0.5.3 → kctl_github-0.6.0}/skills/github-admin/SKILL.md +40 -7
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/__init__.py +1 -1
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/cli.py +5 -0
- kctl_github-0.6.0/tests/test_standard.py +57 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/.gitignore +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/README.md +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/__main__.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/__init__.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/billing.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/ci.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/config_cmd.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/dashboard.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/doctor_cmd.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/health.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/labels.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/prs.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/repos.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/secrets.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/skill_cmd.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/commands/stats.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/core/__init__.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/core/callbacks.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/core/client.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/core/config.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/core/exceptions.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/src/kctl_github/core/plugins.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/tests/conftest.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/tests/test_client.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/tests/test_dashboard.py +0 -0
- {kctl_github-0.5.3 → kctl_github-0.6.0}/tests/test_smoke.py +0 -0
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: github-admin
|
|
3
3
|
description: >
|
|
4
|
-
GitHub cross-repo management via kctl-github CLI (
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Auto-generated: 2026-04-05
|
|
8
|
-
registry_hash: 226d58bc8834
|
|
4
|
+
GitHub cross-repo management via kctl-github CLI (16 groups, ~45 commands). MUST use for ANY kctl-github operation. See SKILL.md ## Triggers for keywords.
|
|
5
|
+
Auto-generated: 2026-05-22
|
|
6
|
+
registry_hash: 7da309501bb5
|
|
9
7
|
---
|
|
10
8
|
|
|
11
9
|
# github-admin — kctl-github CLI Reference
|
|
@@ -17,8 +15,8 @@ description: >
|
|
|
17
15
|
## Overview
|
|
18
16
|
|
|
19
17
|
**CLI:** `kctl-github`
|
|
20
|
-
**Command groups:**
|
|
21
|
-
**Total commands:** ~
|
|
18
|
+
**Command groups:** 16
|
|
19
|
+
**Total commands:** ~45
|
|
22
20
|
**Install:** `cd cli && uv tool install --editable .`
|
|
23
21
|
|
|
24
22
|
## Global Options
|
|
@@ -32,6 +30,12 @@ description: >
|
|
|
32
30
|
| `--profile`, `-p` | Config profile name |
|
|
33
31
|
| `--version`, `-V` | Show version |
|
|
34
32
|
|
|
33
|
+
## Triggers
|
|
34
|
+
|
|
35
|
+
Auto-invoke this skill when the user references any of these keywords:
|
|
36
|
+
|
|
37
|
+
"actions", "activity", "audit", "billing", "bulk-status", "check", "ci", "commands", "completions", "config", "contributors", "current", "dashboard", "diff", "doctor", "generate", "health", "init", "kctl-github", "labels", "languages", "monitor", "overview", "packages", "profile", "profiles", "prs", "remove", "repos", "rerun", "rotate", "secrets", "self-update", "skill", "stale", "stats", "storage", "sync", "test", "tree", "tui", "validate"
|
|
38
|
+
|
|
35
39
|
## Command Reference
|
|
36
40
|
|
|
37
41
|
### `kctl-github billing`
|
|
@@ -57,6 +61,21 @@ CI/CD monitoring across kodemeio-* repositories.
|
|
|
57
61
|
| `ci stats [--period]` | CI statistics: success rate, avg duration, failure trends. |
|
|
58
62
|
| `ci status` | Latest workflow run status across ALL repos (pass/fail/running). |
|
|
59
63
|
|
|
64
|
+
### `kctl-github commands`
|
|
65
|
+
|
|
66
|
+
Machine-readable command discovery (for AI agents).
|
|
67
|
+
|
|
68
|
+
| Command | Description |
|
|
69
|
+
|---------|-------------|
|
|
70
|
+
| `commands list [--json_flag]` | List all leaf commands as 'group verb' strings. |
|
|
71
|
+
| `commands tree` | Dump the full command tree as JSON. |
|
|
72
|
+
|
|
73
|
+
### `kctl-github completions`
|
|
74
|
+
|
|
75
|
+
Generate or install shell completions.
|
|
76
|
+
|
|
77
|
+
Usage: `kctl-github completions [--shell] [--install]`
|
|
78
|
+
|
|
60
79
|
### `kctl-github config`
|
|
61
80
|
|
|
62
81
|
Profile and configuration management.
|
|
@@ -78,6 +97,10 @@ Profile and configuration management.
|
|
|
78
97
|
|
|
79
98
|
Quick overview dashboard.
|
|
80
99
|
|
|
100
|
+
### `kctl-github doctor`
|
|
101
|
+
|
|
102
|
+
Run diagnostic checks.
|
|
103
|
+
|
|
81
104
|
### `kctl-github health`
|
|
82
105
|
|
|
83
106
|
API connectivity and rate limits.
|
|
@@ -123,6 +146,10 @@ Cross-repo Actions secret management.
|
|
|
123
146
|
| `secrets rotate <name>` | Update a secret across all repos that have it. |
|
|
124
147
|
| `secrets set <name> <repos>` | Set a secret across multiple repos (prompts for value). |
|
|
125
148
|
|
|
149
|
+
### `kctl-github self-update`
|
|
150
|
+
|
|
151
|
+
Check for updates and upgrade kctl-github.
|
|
152
|
+
|
|
126
153
|
### `kctl-github skill`
|
|
127
154
|
|
|
128
155
|
Claude Code skill management.
|
|
@@ -149,6 +176,12 @@ Repository statistics across kodemeio-* repos.
|
|
|
149
176
|
| `stats languages` | Language breakdown across all repos. |
|
|
150
177
|
| `stats overview` | Total repos, total stars, total issues, total PRs. |
|
|
151
178
|
|
|
179
|
+
### `kctl-github tui`
|
|
180
|
+
|
|
181
|
+
Launch the interactive TUI.
|
|
182
|
+
|
|
183
|
+
Usage: `kctl-github tui [--profile]`
|
|
184
|
+
|
|
152
185
|
## Configuration
|
|
153
186
|
|
|
154
187
|
Shared config: `~/.config/kodemeio/config.yaml`
|
|
@@ -7,6 +7,7 @@ from typing import Annotated
|
|
|
7
7
|
|
|
8
8
|
import typer
|
|
9
9
|
from kctl_lib import KctlError, handle_cli_error
|
|
10
|
+
from kctl_lib import cli_entrypoint, register_introspection_commands
|
|
10
11
|
|
|
11
12
|
from kctl_github import __version__
|
|
12
13
|
from kctl_github.commands.billing import app as billing_app
|
|
@@ -123,6 +124,10 @@ def completions(
|
|
|
123
124
|
typer.echo(script)
|
|
124
125
|
|
|
125
126
|
|
|
127
|
+
# Wrap app so KctlError subclasses surface as clean user-facing messages.
|
|
128
|
+
app = cli_entrypoint(app)
|
|
129
|
+
register_introspection_commands(app)
|
|
130
|
+
|
|
126
131
|
def _run() -> None:
|
|
127
132
|
"""Entry point with error handling."""
|
|
128
133
|
try:
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Standard CLI smoke/config/completions tests for kctl-github."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
from typer.testing import CliRunner
|
|
7
|
+
|
|
8
|
+
from kctl_github.cli import app
|
|
9
|
+
|
|
10
|
+
runner = CliRunner()
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@pytest.fixture(autouse=True)
|
|
14
|
+
def _isolate(tmp_path, monkeypatch):
|
|
15
|
+
config_dir = tmp_path / "config"
|
|
16
|
+
config_dir.mkdir()
|
|
17
|
+
config_file = config_dir / "config.yaml"
|
|
18
|
+
monkeypatch.setattr("kctl_lib.config.CONFIG_DIR", config_dir, raising=False)
|
|
19
|
+
monkeypatch.setattr("kctl_lib.config.CONFIG_FILE", config_file, raising=False)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TestVersion:
|
|
23
|
+
def test_version_long(self) -> None:
|
|
24
|
+
result = runner.invoke(app, ["--version"])
|
|
25
|
+
assert result.exit_code == 0
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TestHelp:
|
|
29
|
+
def test_top_level_help(self) -> None:
|
|
30
|
+
result = runner.invoke(app, ["--help"])
|
|
31
|
+
assert result.exit_code == 0
|
|
32
|
+
assert "Usage:" in result.output
|
|
33
|
+
|
|
34
|
+
@pytest.mark.parametrize(
|
|
35
|
+
"group",
|
|
36
|
+
["billing", "ci", "config", "dashboard", "doctor", "health", "labels", "prs", "repos", "secrets", "stats"],
|
|
37
|
+
)
|
|
38
|
+
def test_group_help(self, group: str) -> None:
|
|
39
|
+
result = runner.invoke(app, [group, "--help"])
|
|
40
|
+
assert result.exit_code == 0, result.output
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class TestConfigSubcommands:
|
|
44
|
+
def test_config_help(self) -> None:
|
|
45
|
+
result = runner.invoke(app, ["config", "--help"])
|
|
46
|
+
assert result.exit_code == 0
|
|
47
|
+
|
|
48
|
+
def test_config_show(self) -> None:
|
|
49
|
+
result = runner.invoke(app, ["config", "show"])
|
|
50
|
+
assert result.exit_code in (0, 1, 2)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class TestCompletions:
|
|
54
|
+
@pytest.mark.parametrize("shell", ["bash", "zsh", "fish"])
|
|
55
|
+
def test_completions(self, shell: str) -> None:
|
|
56
|
+
result = runner.invoke(app, ["completions", shell])
|
|
57
|
+
assert result.exit_code == 0, result.output
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|