- No longer fullscreen - just a small dropdown below cursor
- Shows max 8 items at a time with "+N more" indicator
- No curses dependency - uses simple ANSI escape codes
- Minimal UI: just type to filter, arrows to navigate
- Cleans up after itself when done
- Much more integrated terminal feel
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Enter: immediately runs the selected tool
- Tab: opens argument picker for tools with arguments
- Shows ⚙ indicator for tools that have arguments
- Argument editor lets you set values with Enter to edit, Tab to run
- Esc in argument picker goes back to tool list
- Footer changes based on whether selected tool has args
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
New `cf` command provides a fuzzy-searchable tool picker:
- Type to filter tools by name or description
- Arrow keys to navigate
- Enter/Tab to select and run
- ? to show arguments for selected tool
- Escape to cancel
Uses curses for a lightweight terminal UI with no extra dependencies.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add new "Visual Installer (GUI)" section explaining the desktop wizard
- Update intro to mention both GUI and CLI options
- Rename "Interactive Installer" to "Command-Line Installer" for clarity
- Update headings list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
NodeGraphQt uses distutils which was removed from Python 3.12's
standard library. setuptools provides the compatibility shim.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The flow graph widget in the GUI requires NodeGraphQt, but it wasn't
in the base dependencies. This caused import errors when running the
GUI from a fresh venv.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create ProviderInstallDialog for installing AI provider CLI tools
- Shows available providers (Claude, Codex, Gemini, OpenCode, Ollama)
- Detects which providers are already installed
- Runs installation commands with live output
- Offers to add provider variants after installation
- Add "Tools" menu with "Install AI Provider..." option
- Add "Install Provider..." button to Providers page
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tools support categories (Text, Developer, Data, Other) but the CLI
create command was missing this option. Now users can specify a
category when creating tools from the command line.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Tool Collections tutorial covering bundles, installation, and creating collections
- Add Project Dependencies tutorial for cmdforge.yaml manifests and team workflows
- Add Provider Setup guide with interactive installer and testing commands
- Add complete CLI Reference for all commands
- Update TOC with new sections
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
New documentation sections:
- "Discovering Community Tools" - browsing, searching, installing, and
managing tools from the registry with both GUI and CLI instructions
- "Tools Within Tools" - composing tools using the tool step type, with
patterns for pipelines, forks, and conditionals
- "The Testing Sandbox" - step-by-step testing in the Visual Builder,
mock providers, and debugging workflows
Updated table of contents to include new sections under appropriate
categories.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace API tokens with Connections/app pairing flow in Publishing section
- Add moderation process documentation
- Update Visual Builder section to describe PySide6 desktop GUI
- Replace old TUI references (cmdforge ui, urwid, etc.) with desktop app
- Update keyboard shortcuts for Qt application
- Fix various outdated references throughout docs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tooltips now only appear when hovering over the title text:
- "Input Variables"
- "Assertions (Optional)"
- "Output"
Rather than triggering anywhere in the group box area.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Input Variables: explains {variable} syntax and variable sources
- Assertions: lists all available assertion types with descriptions
- Provider: explains override options including mock provider
- Run Step: describes what happens when clicked
- Output: explains status, output text, variables, and assertion results
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Row height: 50px
- Widget minimum heights: 34px
- Button max height constrained to 34px
- Table max height increased to 220px for taller rows
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove fixed heights, let Qt size widgets to fit cells
- Increase row height to 40px for more room
- Use padding instead of fixed size on remove button
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Set consistent fixed height (26px) on all row widgets
- Replace × with ✕ and style as red delete button
- Add hover/pressed states and tooltip
- Reduce row height to 32px for tighter alignment
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Set fixed column widths (Type: 130px, Remove: 40px)
- Add minimum width (120px) on type combo box
- Value column stretches to fill remaining space
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Set explicit row height (36px) and minimum input height (28px)
to prevent value input from being cut off.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- New TestStepDialog for testing individual steps from the GUI
- Test button in Tool Builder to test selected step
- Auto-detects variables from step templates
- Multiple assertion types: not_empty, contains, valid_json,
matches_regex, min/max_length, equals, valid_python
- Background execution with timing metrics
- Provider override option for testing with mock provider
- Output variable display and assertion pass/fail results
Completes M5: Testing & Polish milestone (100%)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add DARK_THEME stylesheet alongside existing LIGHT_THEME
- Add load_theme() function to load themes by name
- Support custom themes via ~/.cmdforge/theme.qss
- Add View menu with Theme submenu for switching themes
- Persist theme choice in QSettings across sessions
- Update META_TOOLS.md to reflect implemented dependency commands
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Help menu with quick guides: Getting Started, Create Tool,
Install Tools, Publish Tools, Keyboard Shortcuts, About
- F1 shortcut opens Getting Started guide
- Add tooltips to Tool Builder section headings (Arguments, Steps,
Output Template) that appear on hover over the label text
- Add tooltips to Registry page controls (search, filters, pagination)
- Enhance sidebar tooltips with keyboard shortcuts
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Mark collections CLI as fully implemented
- Add admin management UI documentation
- Update CLI command examples (cmdforge collections list/info/install)
- Add API endpoint documentation
- Include example output and usage instructions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The API returns tools as objects with owner/name fields, but the CLI
expected string refs. Now handles both formats correctly.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace undefined get_current_user() with existing g.current_publisher
- Replace undefined log_admin_action() with existing log_audit() function
- Remove redundant role checks (already handled by @require_admin decorator)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The @require_auth decorator doesn't exist - should use @require_admin
for admin-only endpoints.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
CLI Commands:
- cmdforge collections list - List available collections
- cmdforge collections info <name> - Show collection details
- cmdforge collections install <name> - Install all tools in a collection
Admin API:
- GET /api/v1/admin/collections - List all collections (admin)
- POST /api/v1/admin/collections - Create collection
- PUT /api/v1/admin/collections/<name> - Update collection
- DELETE /api/v1/admin/collections/<name> - Delete collection
Admin Web UI:
- /dashboard/admin/collections - List and manage collections
- /dashboard/admin/collections/new - Create new collection form
- /dashboard/admin/collections/<name>/edit - Edit collection form
- Added "Manage collections" link to admin dashboard
Registry Client:
- Added get_collections() method
- Added get_collection(name) method
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Search terms now automatically get a * suffix for prefix matching.
E.g., searching "summ" matches "summarize", "summary", etc.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add validate_token() method to RegistryClient
- Returns (is_valid, error_message) tuple
- Catches 401/UNAUTHORIZED errors and connection issues
- Add startup validation in MainWindow
- Runs 500ms after window shows (non-blocking)
- Clears invalid tokens automatically
- Shows status bar message explaining what happened
- Document cmdforge config disconnect command
This prevents confusing errors when trying to publish with stale or
revoked credentials - the GUI now auto-clears bad connections on restart.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Registry Features:
- Fork tracking with forked_from/forked_version metadata
- Forked tools show "Forked from" notice on detail page
- Original tools display "Forks" section listing all forks
- Fork count in tool stats
- API: GET /api/v1/tools/<owner>/<name>/forks
GUI Improvements:
- Version selector dropdown for registry installs
- Fetch available versions via GET /api/v1/tools/<owner>/<name>/versions
- "Latest" option plus all available versions listed
Admin Features:
- POST /api/v1/admin/cleanup/rejected endpoint
- Maintenance section in admin dashboard
- "Dry Run" and "Run Cleanup" buttons for rejected version cleanup
- Configurable grace period (default 7 days)
Documentation:
- Updated CHANGELOG.md with all recent changes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Make publish endpoint idempotent: return success if same content
already exists instead of VERSION_EXISTS error (fixes retry issues)
- Always refresh tools page after publish dialog closes
- Consolidate My Tools page to group versions by tool name
- Show version count and list instead of separate rows per version
- Sum downloads across all versions for accurate totals
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Show local and registry version in publish dialog
- Add +Patch/+Minor/+Major bump buttons
- Auto-fetch registry version on dialog open
- Suggest next version based on latest registry version
- Add fork detection and forked_from metadata support
- Update registry schema for forked_from/forked_version fields
- Display fork indicator when publishing forked tools
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The visible button was confusing since auto-polling handles status
updates. Power users can press F5 to manually sync if needed.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Simplified approach: just show the moderation status from the server
without trying to detect local modifications. This eliminates the
fragile hash comparison that kept breaking due to representation
differences between to_dict(), raw YAML, and server-side normalization.
States are now simply: local, pending, published, changes_requested, rejected
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The GUI was sending to_dict() output to server but only updating the
existing config file with the hash. This caused mismatches because
to_dict() adds fields like 'arguments: []' that weren't in the original.
Now saves the exact config that was published, ensuring local file
matches what was sent to server.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When syncing feedback from server, the registry_feedback field was
being saved to config but not excluded from hash computation, causing
tools to appear as "modified" instead of showing their actual status.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use raw config for hash comparison instead of to_dict(), which was
adding fields like 'arguments: []' that weren't in the original config.
This caused tools to show as "modified" when they weren't.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The GUI was saving tracking fields but CLI wasn't. Now both save
registry_hash, registry_status, and clear feedback on republish.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add QTimer polling every 30s when tools are pending/changes_requested
- Display changes_requested (⚠) and rejected (✗) states in tool tree
- Show moderator feedback in tool info panel
- Add `cmdforge registry status <tool>` CLI command with --sync flag
- Update _sync_tool to persist registry_feedback field
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add POST /api/v1/admin/tools/{id}/request-changes endpoint
- Sets moderation_status to 'changes_requested' with feedback
- Extend /me/tools/{name}/status to return feedback when status is
changes_requested or rejected
- Add Request Changes button and modal in admin pending UI
- Make changes modal draggable like other modals
This allows admins to send feedback to publishers instead of just
approving or rejecting tools outright.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The AI review was failing because it referenced 'config' which doesn't
exist in the publish endpoint scope. Changed to 'data' which is the
actual variable containing the parsed tool configuration.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Change nargs="*" to REMAINDER for tool_args to stop argparse from
intercepting --flag style arguments meant for the tool
- Add -- separator handling to distinguish cmdforge args from tool args
- Map flag names to variable names using tool argument definitions
- Update AI review subprocess calls to use -- separator
Fixes scrutiny-ai-review tool arguments not being passed correctly.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>