rafter-cli 0.7.3__tar.gz → 0.7.4__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.
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/PKG-INFO +1 -1
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/pyproject.toml +1 -1
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/agent.py +72 -1
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/README.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/__init__.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/__main__.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/__init__.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/agent_components.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/backend.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/brief.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/ci.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/docs.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/hook.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/issues/__init__.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/issues/dedup.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/issues/github_client.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/issues/issue_builder.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/issues/issues_app.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/mcp_server.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/notify.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/policy.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/report.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/scan.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/skill.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/skill_remote.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/__init__.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/audit_logger.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/command_interceptor.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/config_manager.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/config_schema.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/custom_patterns.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/docs_loader.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/pattern_engine.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/policy_loader.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/risk_rules.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/__init__.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/pre-commit-hook.sh +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/pre-push-hook.sh +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/rafter-security-skill.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/__init__.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/SKILL.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/__init__.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/docs/backend.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/docs/cli-reference.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/docs/finding-triage.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/docs/guardrails.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/docs/shift-left.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/SKILL.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/api.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/asvs.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/cwe-top25.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/investigation-playbook.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/llm.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/web-app.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/SKILL.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/api-design.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/auth.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/data-storage.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/dependencies.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/deployment.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/ingestion.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/standards-pointers.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/threat-modeling.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/SKILL.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/docs/authorship-provenance.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/docs/changelog-review.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/docs/data-practices.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/docs/malware-indicators.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/docs/prompt-injection.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/docs/telemetry.md +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/scanners/__init__.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/scanners/gitleaks.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/scanners/regex_scanner.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/scanners/secret_patterns.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/utils/__init__.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/utils/api.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/utils/binary_manager.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/utils/formatter.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/utils/git.py +0 -0
- {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/utils/skill_manager.py +0 -0
|
@@ -304,6 +304,72 @@ def _install_codex_skills(root: Path) -> tuple[bool, str]:
|
|
|
304
304
|
return False, str(e)
|
|
305
305
|
|
|
306
306
|
|
|
307
|
+
def _install_gemini_skills(root: Path) -> tuple[bool, str]:
|
|
308
|
+
"""Install all Rafter skills to <root>/.agents/skills/ for Gemini CLI.
|
|
309
|
+
|
|
310
|
+
Gemini shares the same skills dir as Codex — overwrite is harmless.
|
|
311
|
+
"""
|
|
312
|
+
try:
|
|
313
|
+
_install_skills_to(root / ".agents" / "skills")
|
|
314
|
+
return True, ""
|
|
315
|
+
except Exception as e:
|
|
316
|
+
return False, str(e)
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def _register_gemini_skills(skills_dir: Path) -> None:
|
|
320
|
+
"""Register installed skills with Gemini CLI via `gemini skills link <abs>`.
|
|
321
|
+
|
|
322
|
+
Requires gemini CLI >= 0.35. Missing CLI / subcommand / per-skill failures
|
|
323
|
+
are non-fatal: warn and continue so the on-disk install still succeeds.
|
|
324
|
+
"""
|
|
325
|
+
gemini = shutil.which("gemini")
|
|
326
|
+
if not gemini:
|
|
327
|
+
rprint(fmt.warning(
|
|
328
|
+
"gemini CLI not found on PATH — skipping skill registration. "
|
|
329
|
+
"Skills are installed to disk; re-run after installing gemini ≥ 0.35."
|
|
330
|
+
))
|
|
331
|
+
return
|
|
332
|
+
|
|
333
|
+
# Probe `gemini skills` subcommand (added in 0.35).
|
|
334
|
+
try:
|
|
335
|
+
subprocess.run(
|
|
336
|
+
[gemini, "skills", "--help"],
|
|
337
|
+
check=True,
|
|
338
|
+
capture_output=True,
|
|
339
|
+
timeout=5,
|
|
340
|
+
)
|
|
341
|
+
except (subprocess.CalledProcessError, subprocess.TimeoutExpired, OSError):
|
|
342
|
+
rprint(fmt.warning(
|
|
343
|
+
"gemini CLI does not support `skills` subcommand (needs ≥ 0.35). "
|
|
344
|
+
"Skipping registration — skills are still installed to disk."
|
|
345
|
+
))
|
|
346
|
+
return
|
|
347
|
+
|
|
348
|
+
for skill in _AGENT_SKILLS:
|
|
349
|
+
abs_path = (skills_dir / skill["name"]).resolve()
|
|
350
|
+
if not abs_path.exists():
|
|
351
|
+
continue
|
|
352
|
+
try:
|
|
353
|
+
subprocess.run(
|
|
354
|
+
[gemini, "skills", "link", str(abs_path)],
|
|
355
|
+
check=True,
|
|
356
|
+
capture_output=True,
|
|
357
|
+
timeout=10,
|
|
358
|
+
)
|
|
359
|
+
rprint(fmt.success(f"Registered {skill['name']} with Gemini CLI"))
|
|
360
|
+
except (subprocess.CalledProcessError, subprocess.TimeoutExpired, OSError) as e:
|
|
361
|
+
first_line = ""
|
|
362
|
+
stderr = getattr(e, "stderr", None)
|
|
363
|
+
if stderr:
|
|
364
|
+
try:
|
|
365
|
+
first_line = stderr.decode("utf-8", errors="replace").strip().split("\n", 1)[0]
|
|
366
|
+
except Exception:
|
|
367
|
+
first_line = ""
|
|
368
|
+
rprint(fmt.warning(
|
|
369
|
+
f"Failed to register {skill['name']} with Gemini CLI: {first_line or 'unknown error'}"
|
|
370
|
+
))
|
|
371
|
+
|
|
372
|
+
|
|
307
373
|
# ── MCP server entry (shared across MCP-native clients) ──────────────
|
|
308
374
|
|
|
309
375
|
_RAFTER_MCP_ENTRY = {
|
|
@@ -630,11 +696,16 @@ def init(
|
|
|
630
696
|
except Exception as e:
|
|
631
697
|
rprint(fmt.error(f"Failed to install Codex CLI integration: {e}"))
|
|
632
698
|
|
|
633
|
-
# Install Gemini CLI MCP if opted in
|
|
699
|
+
# Install Gemini CLI MCP + skills if opted in
|
|
634
700
|
gemini_ok = False
|
|
635
701
|
if (has_gemini or (local and want_gemini)) and want_gemini:
|
|
636
702
|
try:
|
|
637
703
|
gemini_ok = _install_gemini_mcp(root)
|
|
704
|
+
skills_ok, skills_error = _install_gemini_skills(root)
|
|
705
|
+
if not skills_ok:
|
|
706
|
+
rprint(fmt.error(f"Failed to install Gemini CLI skills: {skills_error}"))
|
|
707
|
+
else:
|
|
708
|
+
_register_gemini_skills(root / ".agents" / "skills")
|
|
638
709
|
if gemini_ok and scope == "user":
|
|
639
710
|
manager.set("agent.environments.gemini.enabled", True)
|
|
640
711
|
except Exception as e:
|
|
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
|
|
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
|
{rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/docs/cli-reference.md
RENAMED
|
File without changes
|
{rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/docs/finding-triage.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/SKILL.md
RENAMED
|
File without changes
|
{rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/api.md
RENAMED
|
File without changes
|
{rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/asvs.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/llm.md
RENAMED
|
File without changes
|
{rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/web-app.md
RENAMED
|
File without changes
|
{rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
{rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/auth.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/SKILL.md
RENAMED
|
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
|