Commit Graph
100 Commits
Author SHA1 Message Date
rob 3525e2eeae Add M7.3 CmdForge as MCP server with FastMCP, expose/deny policy, and schema mapping 2026-07-20 00:24:54 -03:00
rob dee48d8cea Add M7.2 MCP client support with McpStep, CLI commands, and stdio transport 2026-07-20 00:20:40 -03:00
rob 6908d8ee6f Modernize provider support 2026-07-19 20:58:04 -03:00
robandClaude Opus 4.5 15943f251c Add proof-of-concept and before/after sections to philosophy page
- Added "Proof of Concept" section showcasing Orchestrated Discussions
  as a real-world example of the composable system (21 tools, 0 deps)
- Added "Before vs After" code comparison showing traditional Python
  approach vs CmdForge pipes/composition
- Visual flow diagram showing how tools chain together in practice

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-04-05 21:37:06 -03:00
robandClaude Opus 4.5 97be7e7b2d Update homepage messaging to emphasize capabilities paradigm
- Changed hero from "Build Custom AI Commands in YAML" to
  "Ask for Capabilities. Compose Solutions."
- Added semantic search demo in hero showing registry describe
- Renamed three pillars to: Ask for Capabilities, Compose Solutions,
  Share & Discover
- Added "See It In Action" section with side-by-side demos of
  semantic search and tool composition
- Added provider-agnostic callout highlighting multi-AI support
- Updated meta description to reflect vision
- Swapped secondary CTA from Tutorials to Philosophy page

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-04-05 19:12:15 -03:00
robandClaude Opus 4.5 c920bb5384 Add Mermaid diagrams to Philosophy page
- Add Mermaid.js support to base template
- Add "The System" diagram showing AI assistant flow
- Add "Composable By Design" diagram showing tool composition
- Add "Future Vision" section with networked nodes diagram
- Diagrams from ChatGPT conversation about project vision

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-04-05 19:05:49 -03:00
robandClaude Opus 4.5 b673ea019c Add provider for-tools command and max_tokens support
- Add 'cmdforge providers for-tools <tool>...' to list providers used by tools
- Add --warm flag to pre-load local models (Ollama) for faster first inference
- Warm larger models first to claim contiguous GPU memory
- Skip cloud providers (claude, opencode, gemini) during warm-up
- Add max_tokens field to PromptStep for controlling output length
- Pass max_tokens to call_provider with provider-specific flags
- Add comprehensive tests for provider functionality

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-04-04 17:50:26 -03:00
robandClaude Opus 4.5 468a999b80 Add Philosophy page and improve documentation
- Add /philosophy page explaining the paradigm shift from libraries to capabilities
- Visual diagrams comparing traditional vs CmdForge approach (bin of circuits vs organized workshop)
- Composition flow diagram showing tools chaining together
- Link from About page and homepage
- Update CLAUDE.md with accurate field names (output_schema not structured_output)
- Add Provider Install dialog to GUI dialogs list

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-04-04 17:49:59 -03:00
robandClaude Opus 4.5 1087b65c50 Update CLAUDE.md and AGENTS.md to reflect current codebase
- Add missing CLI subcommands (ui, docs, check, providers, deps, install, lock, verify, add, remove, init, config)
- Document new core modules (config.py, system_deps.py, dependency_graph.py, hash_utils.py)
- Update GUI structure (Welcome page, widgets/, expanded dialogs list)
- Add missing web modules (auth.py, sessions.py, email.py, seo.py)
- Add missing registry modules (categorize.py, rate_limit.py, scrutiny.py, similarity.py, stats.py, settings.py)
- Streamline AGENTS.md as quick reference that defers to CLAUDE.md

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-02-27 03:54:16 -04:00
robandClaude Opus 4.5 71c6358b9d Add provider fallback, visual schema builder, and UI improvements
Provider fallback system:
- Add optional fallback field to Provider dataclass
- Automatically try fallback provider when primary fails (timeout, error, offline)
- Prevent infinite loops with circular fallback detection
- Add fallback column and dropdown in providers UI

Visual schema builder for prompt steps:
- Add SchemaBuilderDialog with table-based field editor
- Support field name, type, description, and required flag
- Live JSON schema preview
- Integrate into PromptStepDialog with Edit Schema button
- Fix output_schema being lost when editing prompt steps

Other improvements:
- Add search box to tools page
- Improve schema example generation for structured output
- Update CLAUDE.md documentation

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-02-21 00:50:18 -04:00
robandClaude Opus 4.5 8581775002 Implement structured output for prompt steps (Phase 1)
Add schema validation and retry logic for AI responses:

- Add output_schema, max_retries, plain_text fields to PromptStep
- Add DEFAULT_OUTPUT_SCHEMA with output/reasoning fields
- Implement append_schema_instructions() for prompt augmentation
- Implement validate_schema() using jsonschema library
- Add retry logic with error feedback on validation failure
- Enhance substitute_variables() for nested field access ({var.field})
- Add jsonschema to dependencies
- Update GUI dialog with plain_text checkbox and max_retries spinner
- Add comprehensive tests for structured output and nested access

Tools using plain_text=True bypass validation (current behavior).
Tools without plain_text get structured JSON output with schema enforcement.

Migration Phase 1 complete. Next: Apply plain_text=True to all 72 tools.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-02-17 17:34:48 -04:00
robandClaude Opus 4.5 f980fe05f1 Add strip_fences option and fix exec() scoping for nested functions
- Add strip_fences field to PromptStep for removing markdown code fences
- Fix exec() to use same dict for globals and locals, allowing nested
  functions to access module-level imports
- Add GUI checkbox for strip_fences option
- Update CLAUDE.md with improved documentation

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-02-17 16:14:45 -04:00
robandClaude Opus 4.5 33b807d545 Reduce backfill throttle to 0.1s to fit within gunicorn timeout
0.5s × 136 tools = 68s of sleep alone, which combined with network
time exceeded gunicorn's 120s worker timeout.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-02-02 08:17:56 -04:00
robandClaude Opus 4.5 5159450feb Add semantic search (RAG) for registry tool discovery
Users can now find tools by describing what they need in natural language.
Uses Ollama embeddings (nomic-embed-text) on AI-Server for vector similarity
search. Available via CLI (registry describe), GUI (AI search row), and API.

New files:
- registry/embeddings.py: core embedding logic (Ollama API, cosine similarity,
  pack/unpack vectors, backfill)
- tests/test_embeddings.py: 16 unit tests

Modified:
- registry/db.py: tool_embeddings table (schema + migration)
- registry/settings.py: embeddings.* settings (ollama_url, model, enabled, min_score)
- registry/app.py: semantic-search endpoint, publish hook, admin backfill/status
- registry_client.py: semantic_search() method with error surfacing
- gui/pages/registry_page.py: AI search row with SemanticSearchWorker
- cli/__init__.py + registry_commands.py: registry describe subcommand

Backfill required after deploy: POST /api/v1/admin/embeddings/backfill

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-02-02 01:52:27 -04:00
robandClaude Opus 4.5 f24450c19c Fix update-readme CLI and allow admin to update any tool's README
Make tool argument optional when --all is used, add validation for
single-tool mode without tool name, and allow admin role to update
READMEs for tools owned by any publisher (e.g. official namespace).

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-02-01 01:43:51 -04:00
robandClaude Opus 4.5 e83c9c15f3 Add registry endpoint and CLI command for updating tool READMEs
- PATCH /api/v1/tools/<owner>/<name>/readme updates README without
  affecting config hash or requiring version bump
- Add RegistryClient.update_readme() method
- Add `cmdforge registry update-readme` CLI command with --all flag
  for batch updating all published tools

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-02-01 01:35:10 -04:00
robandClaude Opus 4.5 f2cb9c0057 Add collapsible README viewer to tool details panel and owner override for publish
- Add collapsible README section to tools page detail panel with lazy loading
- README loads from disk only when user clicks the toggle bar
- Section collapses to a single header bar, expands to show content
- Add --owner flag to registry publish command for admin use
- Simplify dependency gathering in publish to use unified code path

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-02-01 01:26:56 -04:00
robandClaude Opus 4.5 94e33c0763 Update docs for tool ratings, reviews, and issue reporting
Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-30 03:50:28 -04:00
robandClaude Opus 4.5 23631ff4e7 Add Report Issue button to tool details panel
- Client: add submit_issue() method for POST /tools/{owner}/{name}/issues
- New IssueDialog with type (bug/compatibility/security), severity, title,
  and description fields with character count and validation
- Report Issue button in rating bar beside Rate Tool, visible for registry
  tools only. Submits via background SubmitIssueWorker thread.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-30 03:31:27 -04:00
robandClaude Opus 4.5 a486bb6d45 Fix star rating buttons clipping text in review dialog
Increased button size from 36x36 to 40x40 and added padding: 0px so the
star glyphs render fully instead of being cut off on the sides.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-30 03:18:38 -04:00
robandClaude Opus 4.5 58e270746d Move slug fetch to background thread to prevent UI freeze
_fetch_my_slug() was making a synchronous HTTP request on the main thread
during tool selection, which froze the UI if the server was slow or
unreachable. Moved the /me call into StatusSyncWorker which already runs
in a background thread on page load. The slug is delivered via a
slug_fetched signal and the rate button re-evaluates when it arrives.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-30 03:11:49 -04:00
robandClaude Opus 4.5 fe5b2047a9 Preserve registry fields on tool save and store owner in all publish paths
- save_tool() now preserves registry_hash, registry_status, registry_owner,
  and registry_feedback from existing config when writing Tool.to_dict(),
  preventing edits from erasing registry metadata.
- CLI publish (registry_commands.py) and collection publish
  (collections_commands.py) now save registry_owner from the publish
  response, matching the GUI publish dialog behavior.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-30 03:07:00 -04:00
robandClaude Opus 4.5 5ff108cdb3 Save and use registry_owner for rating lookups on flat-dir tools
Tools in flat directories (no owner subdir) had no way to resolve the
registry owner for rating API calls. This affected both own-published
tools and admin-published official tools.

- Publish dialog: save registry_owner from the publish response
- Status sync worker: backfill registry_owner from hash-based lookup
- get_tool_registry_info: check registry_owner before fallback_owner

Existing tools get backfilled on next background sync.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-30 02:59:46 -04:00
robandClaude Opus 4.5 9a284d7d04 Fix rating bar not showing for own published tools in flat directories
Tools published by the user and stored at ~/.cmdforge/<name>/ (no owner
subdir) had no way to resolve the registry owner, so get_tool_registry_info
returned None and the rating bar was hidden. Added fallback_owner parameter
that uses the current user's slug when no owner can be determined from the
path or config.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-30 02:42:24 -04:00
robandClaude Opus 4.5 7022bb10f2 Show ratings for own published tools, hide Rate button instead
Own tools now display the rating bar (average, count) so authors can
see how their tool is rated. The Rate button is hidden entirely for
own tools rather than shown disabled, since the server enforces the
self-review restriction anyway.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-30 02:36:32 -04:00
robandClaude Opus 4.5 b1c73aba3f Move rating display and Rate button to bottom of tool details panel
Instead of the Rate button sitting in the action bar with Create/Edit/Delete,
the average rating, review count, and Rate/Edit Rating button now appear as
a bar at the bottom of the tool detail section where they contextually belong.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-30 02:27:54 -04:00
robandClaude Opus 4.5 14b3f3d856 Add tool rating & review from My Tools page
- Server: add GET /api/v1/tools/<owner>/<name>/my-review endpoint
- Client: add get_tool_rating, get_my_review, submit/update/delete review methods
- GUI: new ReviewDialog with star selector, title, content, submit/update/delete
- Tools page: rating display in details panel, Rate/Edit Rating button with
  context-sensitive enable/disable, background workers, rating cache
- Fix qualified name usage throughout tools page for owner-prefixed tools

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-30 02:15:23 -04:00
robandClaude Opus 4.5 b00115a52e Add registry sort/pagination features and improve code step dialog
Registry:
- Add owner and rating sort options to both server endpoints
- Add letter-based prefix filtering (A-Z, #) with server-side validation
- LEFT JOIN tool_stats for average_rating/rating_count in responses
- Add interactive numbered page buttons with sliding window and ellipsis
- Add letter bar UI (shown when sorting by name) with highlight state
- Auto-select asc/desc order based on sort field
- Disable cell editing on results table
- Client: add order and prefix params to list_tools/search_tools

Code step dialog:
- Split AI prompt into user instruction input and collapsible wrapper
- User types plain instruction, wrapper is hidden by default
- Injection of user text into wrapper via {user_instruction} placeholder
- Increase dialog minimum height to 750px

Runner:
- Support variable substitution in prompt step provider name

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-30 01:35:03 -04:00
robandClaude Opus 4.5 0ee21f27f7 Add admin publish-as-official, hash-based status sync, and GUI fixes
Registry:
- Add admin owner override for publishing tools as "official"
- Add POST /api/v1/tools/status-by-hash batch endpoint for status lookup
  scoped to publisher_id (works for tools published under any owner)

GUI:
- Add "Publish as" dropdown in publish dialog for admin users
- Add "installed" tool state (teal with arrow indicator) for registry-installed tools
- Fix tool editing for official/* qualified tool names (_get_qualified_name helper)
- Fix cancel navigation returning to wrong page (Welcome instead of Tools)
- Fix collections tab not refreshing after publish
- Refactor StatusSyncWorker to use batch hash lookup (1 request instead of N)
  with chunking (100 max) and hash collision handling

CLI:
- Switch registry status sync to hash-based lookup
- Add collection dependency checking and unpublished dep detection

Publish dialog cleanup:
- Move yaml import to module level, remove duplicate _bump_patch_version
- Fix owner combo using currentText() for reliable selection

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-29 17:18:37 -04:00
robandClaude Opus 4.5 071ade0ffb Add system dependencies support for tools
Tools can now declare system-level package dependencies (apt, brew, pacman, dnf)
that get checked and optionally installed when the tool is installed or run.

Features:
- SystemDependency dataclass with short form (string) and long form (dict)
- New system_deps.py module with platform detection and installation
- `cmdforge system-deps <tool>` command to check/install system packages
- `cmdforge check` now shows both CmdForge and system dependencies
- `cmdforge registry install` prompts for system dep installation
- GUI: System Dependencies section in Tool Builder with add/edit dialog
- Runner warns about missing system deps before execution
- Integration with project install (manifest and lock-based)

Also includes:
- Quote paths in wrapper scripts for spaces support
- Tests for value type preservation in code steps
- Unskip invalid tool name test

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-28 16:31:37 -04:00
robandClaude Opus 4.5 8eff55ed1e Add tool settings files for configurable tool defaults
Tools can now ship with defaults.yaml containing configurable settings
that users can customize via settings.yaml (auto-created from defaults).

Features:
- ensure_settings() helper copies defaults to settings on first use
- Settings available as {settings.key} in templates (scalars only)
- Full dict access via settings['key'] in code steps
- CLI: cmdforge settings <tool> show/edit/reset/diff
- GUI: Defaults editor in Tool Builder, Configure button on Tools page
- Registry: defaults.yaml published with tools, included in downloads
- Secret detection warning on publish (api_key, password, token, etc.)

Fully backward compatible - tools without defaults work unchanged.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-27 11:56:07 -04:00
robandClaude Opus 4.5 ce94ba89dc Fix list_tools and load_tool to handle owner subdirectories
Tools from the registry are installed to ~/.cmdforge/owner/name/ (e.g.,
~/.cmdforge/official/summarize/), but list_tools() only searched direct
children of ~/.cmdforge/.

Changes:
- list_tools() now searches both direct children and owner subdirectories
- Returns qualified names for nested tools (e.g., "official/summarize")
- load_tool() already handled qualified paths, added docstring clarification

Fixes tools installed via `cmdforge install` not appearing in `cmdforge list`.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-27 01:10:57 -04:00
robandClaude Opus 4.5 be712ddc2e Improve Dependencies section layout in Tool Builder
- Make section compact (doesn't stretch to fill space)
- Add stretch at bottom of left panel to push content up
- Reduce list height slightly (80px max, 60px min)
- Tighter margins and spacing
- Simplified tooltip: "Declare tools called via subprocess in code steps.
  Tool steps are automatically included when saved."

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-27 00:43:19 -04:00
robandClaude Opus 4.5 b0e8bb3e65 Add Dependencies section to Tool Builder GUI
- Add Dependencies group box with dropdown to select installed tools
- Dropdown is editable for typing tool references (e.g., official/summarize)
- Add/Remove buttons to manage dependency list
- Dependencies are loaded when editing existing tools
- Dependencies are saved with the tool

This allows users to declare dependencies for tools that call other tools
via subprocess in code steps, making them visible to the dependency system.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-27 00:25:27 -04:00
robandClaude Opus 4.5 a36c2db05c Fix dependency parsing for dict format in tool configs
- Normalize dependencies in Tool.from_dict() to handle both string and dict formats
- Dict format: {name: "tts", version: "*"} → extracts just the name for Tool.dependencies
- Fixes "unhashable type: dict" error in check_dependencies()

This allows tools to declare dependencies with version constraints in config.yaml:
  dependencies:
    - name: tts
      version: "*"

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-27 00:16:34 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-26 23:45:54 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-26 23:34:40 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-26 23:10:27 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-26 22:05:09 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-26 16:50:19 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 05:16:09 -04:00
robandClaude Opus 4.5 317dd6b3b6 Configure opencode provider in Docker ready container
Add provider config for opencode using 'opencode run' command.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-18 05:09:09 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 04:52:47 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 04:38:46 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 04:23:02 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 04:12:20 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 03:49:18 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 03:34:55 -04:00
robandClaude Opus 4.5 9f3227f7ef Swap Tab/Enter in argument picker: Tab edits, Enter runs
More consistent with main picker flow.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-18 02:52:52 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 02:49:32 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 02:46:04 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 02:39:37 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 02:26:46 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 01:50:57 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 01:34:28 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 01:33:06 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 01:14:49 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 01:05:12 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 00:54:36 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 00:34:55 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-18 00:16:11 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 22:42:13 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 14:44:00 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 14:39:17 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 14:35:50 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 14:33:22 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 14:24:24 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 14:13:43 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 14:04:06 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 14:02:28 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 14:00:08 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 13:42:20 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 13:19:26 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 06:27:23 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 05:27:54 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 04:34:43 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 04:16:46 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 04:10:30 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 04:06:19 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 03:52:55 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 03:43:58 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 03:35:42 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 02:42:46 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 01:59:16 -04:00
robandClaude Opus 4.5 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 <[email protected]>
2026-01-17 01:41:45 -04:00
robandClaude Opus 4.5 adefe909c2 Add fork display, version selector, and admin cleanup features
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 <[email protected]>
2026-01-16 23:42:32 -04:00
robandClaude Opus 4.5 74b5124360 Fix publish flow and consolidate My Tools view
- 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 <[email protected]>
2026-01-16 23:17:55 -04:00
robandClaude Opus 4.5 16de3e371c Add version display and bump buttons to publish dialog
- 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 <[email protected]>
2026-01-16 22:45:42 -04:00
robandClaude Opus 4.5 4756ea906c Replace Sync Status button with F5 keyboard shortcut
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 <[email protected]>
2026-01-16 21:43:37 -04:00
robandClaude Opus 4.5 9f60e84075 Remove local hash comparison for publish state detection
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 <[email protected]>
2026-01-16 20:53:26 -04:00
robandClaude Opus 4.5 66c0fc77ae Fix GUI publish to save normalized config for hash consistency
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 <[email protected]>
2026-01-16 20:37:29 -04:00
robandClaude Opus 4.5 d7d0019472 Add registry_feedback to hash exclude list
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 <[email protected]>
2026-01-16 20:30:59 -04:00
robandClaude Opus 4.5 23c42faf75 Fix hash comparison in get_tool_publish_state
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 <[email protected]>
2026-01-16 20:22:26 -04:00
robandClaude Opus 4.5 19c1cf086f Save registry_hash and status after CLI publish
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 <[email protected]>
2026-01-16 20:02:17 -04:00
robandClaude Opus 4.5 64b9e8e70d Add status polling and CLI status command for tool moderation
- 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 <[email protected]>
2026-01-16 19:50:30 -04:00
robandClaude Opus 4.5 cd4c0682e8 Add Request Changes feature for admin tool moderation
- 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 <[email protected]>
2026-01-16 17:59:15 -04:00
robandClaude Opus 4.5 9029286d4c Fix AI review variable name in publish endpoint
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 <[email protected]>
2026-01-16 17:00:50 -04:00
robandClaude Opus 4.5 12ae870b3c Fix tool argument passing for flag-style arguments
- 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 <[email protected]>
2026-01-16 16:39:36 -04:00
robandClaude Opus 4.5 e1cae5ffda Fix cmdforge executable path for AI review
Find cmdforge in venv or PATH instead of assuming it's in PATH.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-16 16:05:51 -04:00
robandClaude Opus 4.5 8471480aa7 Add AI-powered secondary review for scrutiny warnings
- Create scrutiny-ai-review tool that uses AI to analyze warnings
- Integrate AI review into publish flow (app.py)
- Integrate AI review into Fabric sync script
- If AI review returns APPROVE with >=80% confidence, auto-approve
- Display AI review results in admin pending tools modal
- Shows verdict (APPROVE/REJECT/NEEDS_HUMAN_REVIEW) with confidence
- Shows per-finding analysis (FALSE_POSITIVE/LEGITIMATE_CONCERN)

Co-Authored-By: Claude Opus 4.5 <[email protected]>
2026-01-16 16:03:44 -04:00