Commit Graph

24 Commits

Author SHA1 Message Date
rob 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 <noreply@anthropic.com>
2026-02-21 00:50:18 -04:00
rob 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 <noreply@anthropic.com>
2026-02-01 01:26:56 -04:00
rob 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 <noreply@anthropic.com>
2026-01-30 03:31:27 -04:00
rob 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 <noreply@anthropic.com>
2026-01-30 03:11:49 -04:00
rob 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 <noreply@anthropic.com>
2026-01-30 02:59:46 -04:00
rob 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 <noreply@anthropic.com>
2026-01-30 02:42:24 -04:00
rob 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 <noreply@anthropic.com>
2026-01-30 02:36:32 -04:00
rob 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 <noreply@anthropic.com>
2026-01-30 02:27:54 -04:00
rob 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 <noreply@anthropic.com>
2026-01-30 02:15:23 -04:00
rob 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 <noreply@anthropic.com>
2026-01-29 17:18:37 -04:00
rob 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 <noreply@anthropic.com>
2026-01-27 11:56:07 -04:00
rob 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 <noreply@anthropic.com>
2026-01-16 23:17:55 -04:00
rob 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 <noreply@anthropic.com>
2026-01-16 21:43:37 -04:00
rob 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 <noreply@anthropic.com>
2026-01-16 20:53:26 -04:00
rob 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 <noreply@anthropic.com>
2026-01-16 20:22:26 -04:00
rob 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 <noreply@anthropic.com>
2026-01-16 19:50:30 -04:00
rob f22e95d119 Add automatic background sync for tool statuses
When the Tools page loads, automatically sync statuses for all published
tools in the background. This means users don't need to manually click
"Sync Status" - the indicators will update automatically.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 08:11:17 -04:00
rob 7f976d3f8c Fix hash computation to exclude version/tags metadata
The publish dialog adds version and tags fields that aren't stored in
the local config.yaml. Exclude these from hash computation so the
hash comparison works correctly.

Also use Tool.to_dict() for consistent hash computation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 08:02:42 -04:00
rob f1c462146b Fix publish state tracking and add sync status feature
- Track moderation status (pending/approved/rejected) in local tool config
- Add new "pending" state indicator (◐ yellow) distinct from "published" (✓ green)
- Add "Sync Status" button to check registry for updated moderation status
- Add /me/tools/<name>/status API endpoint for checking tool status
- Improve admin panel error handling with better error messages

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 07:52:42 -04:00
rob 3fccf854be Refresh tools list after successful publish
The tool list now refreshes after publishing to immediately show
the updated publish state indicator (✓).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 07:20:40 -04:00
rob deddd8efbb Fix Publish button always greyed out when not connected
The _update_buttons method wasn't handling the no-token case properly.
When not connected, the Connect button should always be enabled.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 07:01:25 -04:00
rob 0216d1d77a Add disconnect command and fix GUI connection status refresh
- Add `cmdforge config disconnect` command to clear registry token
- Fix GUI connection status label not updating after connect
  - Store status as instance variable instead of local
  - Add _update_connection_status() method
  - Call update after connect dialog completes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 06:55:30 -04:00
rob 78025aac8e Implement content hash system for integrity verification
- Add hash_utils.py module for SHA256 content hashing with normalized YAML
- Store config_hash in registry database on publish
- Include hash in download response for client verification
- Verify downloaded content matches registry hash on install
- Store registry_hash in local tool config for publish state tracking
- Show publish state indicators in Tools page UI:
  - Green checkmark: Published and up to date
  - Orange dot: Modified since last publish
  - No indicator: Local tool (never published)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 01:31:08 -04:00
rob 4fe2d26244 Convert TUI to PySide6 desktop GUI
Major UI overhaul replacing the urwid-based Terminal UI with a modern
PySide6 desktop application.

New GUI features:
- Sidebar navigation (My Tools, Registry, Providers)
- Tool Builder with visual form for creating/editing tools
- Registry browser with search and one-click install
- Provider management page
- Connect dialog for account pairing
- Publish dialog for sharing tools

- Keyboard shortcuts (Ctrl+N, Ctrl+S, Ctrl+R, Ctrl+1/2/3, Escape, Ctrl+Q)
- Window geometry persistence (remembers size/position)
- Modern clean stylesheet

Removed:
- ui.py, ui_snack.py, ui_registry.py, ui_urwid.py
- ui_urwid/ directory (urwid TUI implementation)

Updated:
- pyproject.toml: PySide6 now required, removed urwid
- CLI entry points to launch GUI
- All documentation (README, CLAUDE.md, AGENTS.md, wiki)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-14 04:38:35 -04:00