Rename project from SmartTools to CmdForge

Major rename operation:
- Rename Python package: smarttools -> cmdforge
- Update CLI entry point: smarttools -> cmdforge
- Update all imports and module references
- Update pyproject.toml with new name, URLs, entry point
- Update all HTML templates with new branding
- Update documentation (CLAUDE.md, README.md, docs/*, wiki/*)
- Update environment variables:
  - SMARTTOOLS_ENV -> CMDFORGE_ENV
  - SMARTTOOLS_REGISTRY_DB -> CMDFORGE_REGISTRY_DB
  - SMARTTOOLS_TOKEN -> CMDFORGE_TOKEN
  - SMARTTOOLS_REGISTRY_* -> CMDFORGE_REGISTRY_*
- Update Dockerfile and docker-compose.yml
- Update tests to use new package name
- Update scripts and examples
- Update package.json and tailwind.config.js

All 158 unit tests pass. The CLI is working correctly with the
new cmdforge command.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>
This commit is contained in:
rob
2026-01-02 22:15:55 -04:00
co-authored by Claude Opus 4.5
parent 2939dd806b
commit 497fe87fc5
113 changed files with 822 additions and 822 deletions
+42
View File
@@ -0,0 +1,42 @@
"""Category suggestion helpers for registry tools."""
from __future__ import annotations
from pathlib import Path
from typing import Dict, List, Tuple
import yaml
def load_categories(categories_path: Path) -> List[Dict]:
data = yaml.safe_load(categories_path.read_text(encoding="utf-8")) or {}
return data.get("categories", [])
def suggest_categories(
name: str,
description: str,
tags: List[str],
categories_path: Path,
) -> List[Tuple[str, float]]:
"""Suggest categories ranked by confidence.
Uses keyword matching against name/description/tags.
Returns a list of (category_name, confidence).
"""
categories = load_categories(categories_path)
text = f"{name} {description} {' '.join(tags)}".lower()
suggestions: List[Tuple[str, float]] = []
for cat in categories:
cat_name = cat.get("name")
keywords = [str(k).lower() for k in cat.get("keywords", []) if k]
if not cat_name or not keywords:
continue
hits = sum(1 for k in keywords if k in text)
confidence = hits / max(len(keywords), 1)
if hits:
suggestions.append((cat_name, round(confidence, 3)))
suggestions.sort(key=lambda item: item[1], reverse=True)
return suggestions