Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
1fbed6a
[tutor] Add AI-Powered Installation Tutor (Issue #131)
srikrishnavansi Jan 11, 2026
e0dd20b
Merge branch 'main' into feature/ai-tutor
Anshgrover23 Jan 12, 2026
4b524e2
Merge branch 'main' into feature/ai-tutor
Anshgrover23 Jan 12, 2026
e8b3314
Merge branch 'main' into feature/ai-tutor
Anshgrover23 Jan 12, 2026
654370c
fix(tutor): address PR review comments from Gemini and CodeRabbit
srikrishnavansi Jan 12, 2026
bb8c491
Merge branch 'feature/ai-tutor' of https://github.com/srikrishnavansi…
srikrishnavansi Jan 12, 2026
aeef51c
Merge branch 'main' into feature/ai-tutor
srikrishnavansi Jan 12, 2026
03c11ad
Merge branch 'main' into feature/ai-tutor
Anshgrover23 Jan 12, 2026
d95ee00
style(tutor): fix ruff lint errors
srikrishnavansi Jan 12, 2026
b8cedf0
Merge branch 'feature/ai-tutor' of https://github.com/srikrishnavansi…
srikrishnavansi Jan 12, 2026
a799d27
test(tutor): move tests to standard location for CI coverage
srikrishnavansi Jan 12, 2026
049185d
fix(tutor): address CodeRabbit review comments
srikrishnavansi Jan 12, 2026
4e86d28
fix(security): use tempfile.gettempdir() instead of hardcoded /tmp path
srikrishnavansi Jan 12, 2026
bce506a
fix: address SonarQube code quality issues
srikrishnavansi Jan 12, 2026
f4beddd
style: fix black formatting in cli.py
srikrishnavansi Jan 12, 2026
29a7a8b
refactor: remove duplicate tests from cortex/tutor/tests
srikrishnavansi Jan 12, 2026
4ff4eb6
fix: remaining floating point comparisons in test_integration.py
srikrishnavansi Jan 12, 2026
2fab6a5
fix: address reviewer feedback and CodeRabbit suggestions
srikrishnavansi Jan 12, 2026
79bc930
chore: remove unused imports (CodeRabbit nitpicks)
srikrishnavansi Jan 12, 2026
92df93b
fix: correct return types and add input validation (CodeRabbit)
srikrishnavansi Jan 12, 2026
24bd578
fix: refactor QAHandlerTool with lazy init and input validation
srikrishnavansi Jan 12, 2026
5fe8a89
style: fix black formatting in qa_handler.py
srikrishnavansi Jan 12, 2026
0d0b495
fix: resolve Pydantic forward reference and type annotation issues
srikrishnavansi Jan 12, 2026
814018b
fix: add safe access pattern for result["answer"] in ConversationHandler
srikrishnavansi Jan 12, 2026
49830cb
refactor: cleanup code quality issues from review
srikrishnavansi Jan 13, 2026
fff6646
Merge upstream/main: migrate deps to pyproject.toml
srikrishnavansi Jan 13, 2026
2bf80bb
style: fix import sorting in cli.py (ruff I001)
srikrishnavansi Jan 13, 2026
b481abd
fix: address CodeRabbit review feedback
srikrishnavansi Jan 13, 2026
8ce6277
refactor: remove LangChain/LangGraph, use existing llm_router
srikrishnavansi Jan 13, 2026
0329f5b
fix: remove langchain imports from deterministic tools
srikrishnavansi Jan 13, 2026
1b9c88a
fix: black formatting and add exception logging
srikrishnavansi Jan 13, 2026
7f0b30d
fix: handle zero score correctly in progress tracker
srikrishnavansi Jan 13, 2026
a813fd9
Merge branch 'main' into feature/ai-tutor
srikrishnavansi Jan 13, 2026
b0a19c5
refactor: fix unused kwargs warnings and nested conditionals
srikrishnavansi Jan 13, 2026
284f119
fix: allow explicit completed=False in update_progress
srikrishnavansi Jan 13, 2026
db6a101
docs: update AI_TUTOR.md to reflect simplified architecture
srikrishnavansi Jan 13, 2026
c382393
Merge branch 'main' into feature/ai-tutor
Anshgrover23 Jan 13, 2026
5f93fd7
Merge branch 'main' into feature/ai-tutor
srikrishnavansi Jan 13, 2026
ec37b80
Merge branch 'main' into feature/ai-tutor
srikrishnavansi Jan 14, 2026
bbe7029
test: add llm.py tests, update coverage docs
srikrishnavansi Jan 14, 2026
bc773d3
fix: use pytest.approx for floats, suppress config warning
srikrishnavansi Jan 14, 2026
859cde2
Merge branch 'main' into feature/ai-tutor
srikrishnavansi Jan 15, 2026
f42f286
merge: sync with upstream/main and update docs
srikrishnavansi Jan 16, 2026
6fe19cd
Merge branch 'feature/ai-tutor' of https://github.com/srikrishnavansi…
srikrishnavansi Jan 16, 2026
1c08c7f
docs: fix placeholder URL in AI_TUTOR.md
srikrishnavansi Jan 16, 2026
1e12ac3
docs: remove hardcoded model versions from AI_TUTOR.md
srikrishnavansi Jan 16, 2026
a96a303
docs: add TUTOR_OFFLINE to config section and fix placeholders
srikrishnavansi Jan 16, 2026
67c9461
Merge branch 'main' into feature/ai-tutor
srikrishnavansi Jan 17, 2026
82ebb5c
refactor: flatten tutor module structure and add layered prompts
srikrishnavansi Jan 17, 2026
a122bee
[autofix.ci] apply automated fixes
autofix-ci[bot] Jan 17, 2026
fa6a4c4
fix: use Pydantic models for structured LLM output parsing
srikrishnavansi Jan 17, 2026
fdb7478
fix: use pytest.approx for floating point comparison
srikrishnavansi Jan 17, 2026
4f69c2b
refactor: use structured outputs and remove dead code
srikrishnavansi Jan 17, 2026
aa9531f
fix: use conlist for proper Pydantic list length validation
srikrishnavansi Jan 17, 2026
1d41fca
fix: replace conlist with plain list types in contracts
srikrishnavansi Jan 17, 2026
662d48f
docs: update AI_TUTOR.md to reflect structured outputs architecture
srikrishnavansi Jan 17, 2026
9bd9f32
Merge branch 'main' into feature/ai-tutor
srikrishnavansi Jan 17, 2026
ab99dc2
Merge branch 'main' into feature/ai-tutor
Anshgrover23 Jan 17, 2026
5502b85
Merge branch 'main' into feature/ai-tutor
Anshgrover23 Jan 17, 2026
b525eb8
Merge branch 'main' into feature/ai-tutor
srikrishnavansi Jan 17, 2026
808b1ff
refactor: address reviewer comments
srikrishnavansi Jan 18, 2026
496c220
fix: resolve merge conflict - include both tutor and i18n packages
srikrishnavansi Jan 18, 2026
1bea813
fix: merge upstream/main and resolve pyproject.toml conflict
srikrishnavansi Jan 18, 2026
7d40a30
[autofix.ci] apply automated fixes
autofix-ci[bot] Jan 18, 2026
ced43c9
docs: clarify clear_cache docstring behavior
srikrishnavansi Jan 18, 2026
f0e8bc8
docs: add TUTOR_MODEL_NAME and TUTOR_CACHE_TTL_HOURS to configuration
srikrishnavansi Jan 18, 2026
a1ec904
Merge branch 'main' into feature/ai-tutor
Anshgrover23 Jan 18, 2026
78846db
fix: add exception logging to LessonLoaderTool and cache_lesson
srikrishnavansi Jan 18, 2026
6dc0764
fix: address CodeRabbit review - truthiness check and logging
srikrishnavansi Jan 18, 2026
933fd4d
Merge branch 'main' into feature/ai-tutor
srikrishnavansi Jan 18, 2026
3d2eda4
Merge branch 'main' into feature/ai-tutor
Anshgrover23 Jan 19, 2026
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
79 changes: 79 additions & 0 deletions cortex/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -1722,6 +1722,66 @@ def status(self):
doctor = SystemDoctor()
return doctor.run_checks()

def tutor(self, args: argparse.Namespace) -> int:
"""AI-powered package tutor for interactive learning.

Provides LLM-powered explanations, Q&A, code examples,
and step-by-step tutorials for packages.

Args:
args: Parsed command-line arguments.

Returns:
Exit code (0 for success, 1 for error).
"""
from cortex.tutor.branding import print_banner
from cortex.tutor.cli import (
cmd_list_packages,
cmd_progress,
cmd_question,
cmd_reset,
cmd_teach,
)

# Handle --list flag
if getattr(args, "list", False):
return cmd_list_packages()

# Handle --progress flag
if getattr(args, "progress", False):
package = getattr(args, "package", None)
return cmd_progress(package)

# Handle --reset flag
reset_target = getattr(args, "reset", None)
if reset_target is not None:
package = None if reset_target == "__all__" else reset_target
return cmd_reset(package)

# Handle -q/--question flag
question = getattr(args, "question", None)
package = getattr(args, "package", None)

if question:
if not package:
cx_print("Please specify a package: cortex tutor <package> -q 'question'", "error")
return 1
return cmd_question(package, question, verbose=self.verbose)

# Handle package argument (start interactive tutor)
if package:
print_banner()
fresh = getattr(args, "fresh", False)
return cmd_teach(package, verbose=self.verbose, fresh=fresh)

# No arguments - show help
cx_print("Usage: cortex tutor <package> [options]", "info")
cx_print(" cortex tutor docker - Start interactive lesson", "info")
cx_print(" cortex tutor docker -q 'What is Docker?' - Quick Q&A", "info")
cx_print(" cortex tutor --list - List studied packages", "info")
cx_print(" cortex tutor --progress - Show learning progress", "info")
return 0

def update(self, args: argparse.Namespace) -> int:
"""Handle the update command for self-updating Cortex."""
from rich.progress import Progress, SpinnerColumn, TextColumn
Expand Down Expand Up @@ -3289,6 +3349,23 @@ def main():
# Status command (includes comprehensive health checks)
subparsers.add_parser("status", help="Show comprehensive system status and health checks")

# Tutor command - AI-powered package education (Issue #131)
tutor_parser = subparsers.add_parser("tutor", help="AI-powered package tutor")
tutor_parser.add_argument("package", nargs="?", help="Package to learn about")
tutor_parser.add_argument(
"-q", "--question", type=str, help="Ask a quick question about the package"
)
tutor_parser.add_argument("--list", "-l", action="store_true", help="List studied packages")
tutor_parser.add_argument(
"--progress", "-p", action="store_true", help="Show learning progress"
)
tutor_parser.add_argument(
"--reset", nargs="?", const="__all__", metavar="PACKAGE", help="Reset progress"
)
tutor_parser.add_argument(
"--fresh", "-f", action="store_true", help="Skip cache, generate fresh"
)

# Benchmark command
benchmark_parser = subparsers.add_parser("benchmark", help="Run AI performance benchmark")
benchmark_parser.add_argument("--verbose", "-v", action="store_true", help="Verbose output")
Expand Down Expand Up @@ -3933,6 +4010,8 @@ def main():
return cli.wizard()
elif args.command == "status":
return cli.status()
elif args.command == "tutor":
return cli.tutor(args)
elif args.command == "benchmark":
return cli.benchmark(verbose=getattr(args, "verbose", False))
elif args.command == "systemd":
Expand Down
11 changes: 11 additions & 0 deletions cortex/tutor/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
"""
Intelligent Tutor - AI-Powered Installation Tutor for Cortex Linux.

An interactive AI tutor that teaches users about packages and best practices.
"""

from cortex.tutor import agent
from cortex.tutor.branding import console, tutor_print
from cortex.tutor.config import Config

__all__ = ["Config", "agent", "console", "tutor_print"]
Loading