Commit Graph

221 Commits

Author SHA1 Message Date
rob 93797a450a Add cmdforge remove command for project dependencies
- `cmdforge remove <tool>` removes a dependency from cmdforge.yaml
- Matches by exact name or short name (e.g., both "eli5" and "official/eli5" work)
- Returns exit code 1 if dependency not found
- Complements `cmdforge add` for full manifest management

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 23:45:54 -04:00
rob df29b28167 Improve cmdforge add UX for locally-installed tools
- Check if tool is already installed locally before trying registry
- Show clear message: "Already installed globally/locally: <tool>"
- Better error messages for VERSION_NOT_FOUND vs TOOL_NOT_FOUND
- Skip unnecessary registry calls when tool is already available

This fixes confusing UX where `cmdforge add` would show an error for
unpublished tools that were actually satisfied by local installation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 23:34:40 -04:00
rob 9be0ab4551 Fix hash verification for imported tools
- Add config_hash computation to sync.py when importing tools from repo
- Add migrate_hashes.py script to recompute all hashes in the database

The hash mismatch bug was caused by:
1. Tools imported via sync.py never had config_hash computed
2. The exclude_fields list changed over time, causing old hashes to mismatch

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 23:10:27 -04:00
rob 3e7eaeb504 Add transitive dependency resolution and lock file support
Implements two major features for project dependency management:

Transitive Dependency Resolution:
- DependencyGraph/DependencyNode for structured dependency tracking
- DependencyGraphBuilder with recursive resolution and cycle detection
- Topological sorting for correct install order (dependencies first)
- Version conflict detection with provenance tracking
- Full semver support: ^, ~, >=, <=, >, <, = constraints
- New `cmdforge deps tree` command to visualize dependency tree
- Install flags: --dry-run, --force, --verbose

Lock File Support (cmdforge.lock):
- Lockfile/LockedPackage/LockfileMetadata dataclasses
- Records exact versions of all dependencies (direct + transitive)
- Integrity verification via SHA256 hashes
- `cmdforge lock` to generate/update lock file
- `cmdforge verify` to check installed tools match lock
- Install flags: --frozen, --strict-frozen, --ignore-lock

62 new tests for version, dependency_graph, and lockfile modules.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 22:05:09 -04:00
rob 29869ef59f Add local collections support with GUI, CLI, and publishing workflow
Features:
- Local collection definitions stored in ~/.cmdforge/collections/
- CLI commands: create, show, add, remove, delete, publish, status
- GUI Collections page with local and registry tabs
- Collection publishing with tool resolution and visibility checks
- New API endpoints: GET /api/v1/me, GET /api/v1/tools/.../approved,
  POST /api/v1/collections
- RegistryClient methods: get_me(), has_approved_public_tool(),
  publish_collection()

Implementation:
- collection.py: Collection dataclass, resolve_tool_references(),
  classify_tool_reference(), ToolResolutionResult
- collections_page.py: GUI with background workers for install/publish
- collections_commands.py: Full CLI command implementations
- registry/app.py: New authenticated endpoints with validation

Tests:
- test_collection.py: 27 unit tests for collection module
- test_collection_api.py: 20 tests (8 client, 12 API with Flask skip)

Documentation updated: README, CHANGELOG, CLAUDE.md, tests/README

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 16:50:19 -04:00
rob 37e74bf339 Configure all opencode model variants in Docker container
Add providers for opencode-pickle, opencode-grok, opencode-deepseek
to match the example tools' requirements.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 05:16:09 -04:00
rob 317dd6b3b6 Configure opencode provider in Docker ready container
Add provider config for opencode using 'opencode run' command.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 05:09:09 -04:00
rob cb6a8df79b Fix cf arrow key handling - remove broken select() logic
The select() timeout approach was causing arrow keys to be
misinterpreted as Escape. Revert to direct reading since escape
sequence bytes arrive together from the terminal.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 04:52:47 -04:00
rob d230cffb5f Add complete Qt/PySide6 deps and opencode to Docker images
- Add all required Qt libraries (glib, xcb, xkb, nss, etc.)
- Install opencode-ai via npm in ready container
- Add nodejs/npm for opencode support

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 04:38:46 -04:00
rob b4ff6af84d Add complete Qt/PySide6 dependencies to Dockerfiles
Add fontconfig, freetype, and xcb libraries needed for Qt GUI.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 04:23:02 -04:00
rob 0d2e5f5b60 Add OpenGL/Qt dependencies to Dockerfiles
Add libgl1, libegl1, libxkbcommon0, libdbus-1-3 for PySide6 GUI support.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 04:12:20 -04:00
rob def8baf344 Add cf tutorial and graceful Ctrl+C handling
- Add Interactive Tool Picker tutorial to web docs
- Handle SIGINT signal for clean exit on Ctrl+C
- Add KeyboardInterrupt handling in main()
- Add tutorial to Getting Started section in TOC

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 03:49:18 -04:00
rob f6bb863f60 Add piped input support and documentation for cf picker
- Support piped input: cat file.txt | cf | cf
- Write picker UI to stderr when stdout is piped
- Use /dev/tty for keyboard input independent of stdin
- Add select() for non-blocking escape sequence detection
- Document cf in CLI reference and Getting Started

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 03:34:55 -04:00
rob 9f3227f7ef Swap Tab/Enter in argument picker: Tab edits, Enter runs
More consistent with main picker flow.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 02:52:52 -04:00
rob 356a47eebc Make cf dropdown scroll instead of showing +N more
Arrow past the last visible item now scrolls the list smoothly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 02:49:32 -04:00
rob df1d3ace23 Rewrite cf as lightweight inline dropdown
- 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>
2026-01-18 02:46:04 -04:00
rob 992c473939 Improve cf picker: Enter runs, Tab opens argument editor
- 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>
2026-01-18 02:39:37 -04:00
rob 7f0dabd328 Add interactive fuzzy tool picker (cf command)
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>
2026-01-18 02:26:46 -04:00
rob 3d87d888ab Add GUI provider installer to provider-setup documentation
- 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>
2026-01-18 01:50:57 -04:00
rob b20abec39d Add setuptools dependency for Python 3.12+ compatibility
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>
2026-01-18 01:34:28 -04:00
rob cf82baef1d Add NodeGraphQt to base dependencies
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>
2026-01-18 01:33:06 -04:00
rob f442759344 Add Provider Install wizard to GUI
- 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>
2026-01-18 01:14:49 -04:00
rob f0d175f3c6 Add --category option to cmdforge create command
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>
2026-01-18 01:05:12 -04:00
rob cdc910d7b6 Add comprehensive documentation for Collections, Project Dependencies, Provider Setup, and CLI Reference
- 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>
2026-01-18 00:54:36 -04:00
rob d0581daa35 Add comprehensive tutorials for registry, tool composition, and testing
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>
2026-01-18 00:34:55 -04:00
rob 50ba841a62 Update web UI documentation for current implementation
- 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>
2026-01-18 00:16:11 -04:00
rob d66446672b Update documentation with missing features and fix broken links
- Fix 10 broken documentation links (now point to docs/reference/)
- Add CLI commands for Registry, Collections, Project Dependencies, Config
- Add Project Dependencies section (cmdforge.yaml manifest)
- Add Collections section (curated tool bundles)
- Add Registry section (search, publish, moderation status)
- Add Tool Documentation section (cmdforge docs command)
- Update wiki with Collections, Registry, and Project Dependencies

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 22:42:13 -04:00
rob f07f9102f6 Move tooltips to title labels instead of group boxes
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>
2026-01-17 14:44:00 -04:00
rob 59e4191fd1 Add contextual tooltips to TestStepDialog
- 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>
2026-01-17 14:39:17 -04:00
rob dc23c2d1cb Reduce remove button height to match other widgets
- Fixed height 28px
- Reduced font to 14px
- Minimal padding (0px vertical, 6px horizontal)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 14:35:50 -04:00
rob 70e9c7b789 Increase assertion row and widget heights for proper display
- 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>
2026-01-17 14:33:22 -04:00
rob 0548f6e3ec Let table cells manage widget sizes naturally
- 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>
2026-01-17 14:24:24 -04:00
rob 0e1a5b5f62 Fix assertion row alignment and improve delete button visibility
- 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>
2026-01-17 14:13:43 -04:00
rob 7516a9b5ed Fix assertion table column widths in TestStepDialog
- 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>
2026-01-17 14:04:06 -04:00
rob 7110e82eca Fix assertion type combo box height in TestStepDialog
Set minimum height (28px) on type combo box to display selection.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 14:02:28 -04:00
rob 4176573e9d Fix assertion table row height in TestStepDialog
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>
2026-01-17 14:00:08 -04:00
rob 68ab329c33 Add interactive step testing to Tool Builder
- 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>
2026-01-17 13:42:20 -04:00
rob a134fb59c3 Add dark mode and simple theming support to GUI
- 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>
2026-01-17 13:19:26 -04:00
rob 9baddeef18 Add Help menu and contextual tooltips to GUI
- 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>
2026-01-17 06:27:23 -04:00
rob 3f259449d4 Add tool composition UI with auto-dependency management
- Add ToolStepDialog for configuring tool steps (tool selection, input mapping, args)
- Add "Add Tool" button in Tool Builder alongside Add Prompt/Add Code
- Add ToolNode in flow graph visualization (purple puzzle piece icon)
- Auto-populate dependencies when adding ToolStep in GUI
- Add --auto-install flag for automatic runtime dependency installation
- Add check_dependencies() and auto_install_dependencies() functions
- Update runner to pass auto_install parameter through execution chain

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 05:27:54 -04:00
rob 05a2fae94c Add password reset flow with email-based token verification
Implement secure password reset functionality:
- Add password_reset_tokens table for storing hashed reset tokens
- Create email utility module (dev mode logs to console)
- Add API endpoints: request, validate, and complete password reset
- Add web routes and templates for forgot-password and reset-password
- Security: 1-hour token expiry, single-use, rate limiting, session invalidation
- Prevent email enumeration by always returning success message

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 04:34:43 -04:00
rob 205cd8d9cf Update collections documentation with implementation details
- 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>
2026-01-17 04:16:46 -04:00
rob ae6ec7cea1 Fix collections CLI to handle API's expanded tool format
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>
2026-01-17 04:10:30 -04:00
rob 2b927478a6 Fix NameError in admin collections endpoints
- 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>
2026-01-17 04:06:19 -04:00
rob c35512dee9 Fix: Use @require_admin decorator instead of @require_auth
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>
2026-01-17 03:52:55 -04:00
rob 2c2707679f Add collections CLI commands and admin management
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>
2026-01-17 03:43:58 -04:00
rob 0d91eb7fa0 Update olddocs to reflect current implementation state
- REGISTRY.md: Mark phases 1-4, 6-8 complete; phase 5 partial
- WEB_UI.md: Update Phase 7 checklist with completion status
- DESIGN.md: Note TUI replaced by PySide6 GUI, update structure
- PROJECT.md: Update source structure and database schema
- PROVIDERS.md, META_TOOLS.md, COLLECTIONS.md: Add status notes
- Add "Features Implemented Beyond Original Design" sections

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 03:35:42 -04:00
rob a46add05b7 Add prefix matching to registry search
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>
2026-01-17 02:42:46 -04:00
rob 85d1212c0d Add startup connection validation to GUI
- 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>
2026-01-17 01:59:16 -04:00
rob 66fd121ee4 Add AI review logging and --skip-ai-review flag to fabric sync
- Add comprehensive logging to run_ai_scrutiny_review() function
  - Log tool path checks, warning counts, timing
  - Log timeout events, JSON parse errors, all exceptions
  - Previously failures were silently swallowed
- Add --skip-ai-review flag for large bulk imports
  - Prevents rate limiting during initial imports
  - Passes through daemon_loop, run_sync, sync_pattern, publish_to_registry

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 01:41:45 -04:00