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.
Files changed (80) hide show
  1. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/PKG-INFO +1 -1
  2. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/pyproject.toml +1 -1
  3. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/agent.py +72 -1
  4. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/README.md +0 -0
  5. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/__init__.py +0 -0
  6. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/__main__.py +0 -0
  7. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/__init__.py +0 -0
  8. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/agent_components.py +0 -0
  9. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/backend.py +0 -0
  10. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/brief.py +0 -0
  11. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/ci.py +0 -0
  12. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/docs.py +0 -0
  13. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/hook.py +0 -0
  14. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/issues/__init__.py +0 -0
  15. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/issues/dedup.py +0 -0
  16. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/issues/github_client.py +0 -0
  17. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/issues/issue_builder.py +0 -0
  18. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/issues/issues_app.py +0 -0
  19. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/mcp_server.py +0 -0
  20. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/notify.py +0 -0
  21. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/policy.py +0 -0
  22. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/report.py +0 -0
  23. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/scan.py +0 -0
  24. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/skill.py +0 -0
  25. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/commands/skill_remote.py +0 -0
  26. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/__init__.py +0 -0
  27. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/audit_logger.py +0 -0
  28. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/command_interceptor.py +0 -0
  29. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/config_manager.py +0 -0
  30. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/config_schema.py +0 -0
  31. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/custom_patterns.py +0 -0
  32. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/docs_loader.py +0 -0
  33. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/pattern_engine.py +0 -0
  34. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/policy_loader.py +0 -0
  35. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/core/risk_rules.py +0 -0
  36. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/__init__.py +0 -0
  37. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/pre-commit-hook.sh +0 -0
  38. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/pre-push-hook.sh +0 -0
  39. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/rafter-security-skill.md +0 -0
  40. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/__init__.py +0 -0
  41. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/SKILL.md +0 -0
  42. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/__init__.py +0 -0
  43. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/docs/backend.md +0 -0
  44. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/docs/cli-reference.md +0 -0
  45. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/docs/finding-triage.md +0 -0
  46. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/docs/guardrails.md +0 -0
  47. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter/docs/shift-left.md +0 -0
  48. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/SKILL.md +0 -0
  49. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/api.md +0 -0
  50. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/asvs.md +0 -0
  51. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/cwe-top25.md +0 -0
  52. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/investigation-playbook.md +0 -0
  53. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/llm.md +0 -0
  54. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-code-review/docs/web-app.md +0 -0
  55. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/SKILL.md +0 -0
  56. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/api-design.md +0 -0
  57. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/auth.md +0 -0
  58. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/data-storage.md +0 -0
  59. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/dependencies.md +0 -0
  60. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/deployment.md +0 -0
  61. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/ingestion.md +0 -0
  62. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/standards-pointers.md +0 -0
  63. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-secure-design/docs/threat-modeling.md +0 -0
  64. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/SKILL.md +0 -0
  65. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/docs/authorship-provenance.md +0 -0
  66. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/docs/changelog-review.md +0 -0
  67. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/docs/data-practices.md +0 -0
  68. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/docs/malware-indicators.md +0 -0
  69. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/docs/prompt-injection.md +0 -0
  70. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/resources/skills/rafter-skill-review/docs/telemetry.md +0 -0
  71. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/scanners/__init__.py +0 -0
  72. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/scanners/gitleaks.py +0 -0
  73. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/scanners/regex_scanner.py +0 -0
  74. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/scanners/secret_patterns.py +0 -0
  75. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/utils/__init__.py +0 -0
  76. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/utils/api.py +0 -0
  77. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/utils/binary_manager.py +0 -0
  78. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/utils/formatter.py +0 -0
  79. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/utils/git.py +0 -0
  80. {rafter_cli-0.7.3 → rafter_cli-0.7.4}/rafter_cli/utils/skill_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rafter-cli
3
- Version: 0.7.3
3
+ Version: 0.7.4
4
4
  Summary: Rafter CLI — the default security agent for AI workflows. Free for individuals and open source.
5
5
  License: MIT
6
6
  Author: Rafter Team
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "rafter-cli"
3
- version = "0.7.3"
3
+ version = "0.7.4"
4
4
  description = "Rafter CLI — the default security agent for AI workflows. Free for individuals and open source."
5
5
  authors = ["Rafter Team <hello@rafter.so>"]
6
6
  license = "MIT"
@@ -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