- 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]>
- 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]>
- 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]>
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]>
_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]>
- 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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
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]>
- 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]>
- 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]>
- 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]>
- `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]>
- 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]>
- 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]>
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]>
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]>
Add providers for opencode-pickle, opencode-grok, opencode-deepseek
to match the example tools' requirements.
Co-Authored-By: Claude Opus 4.5 <[email protected]>
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]>
- 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]>
- 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]>
- 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]>
- 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]>
- 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]>
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]>
- 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]>
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]>
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]>
- 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]>
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]>
- 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]>
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]>
- 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]>
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]>
- 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]>
- 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]>
- 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]>
- 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]>
- 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]>
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]>
- 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]>
- 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]>
- 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]>
- 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]>
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]>
- 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]>
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]>
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]>
- 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]>
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]>
- 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]>
- 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]>
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]>
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]>
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]>
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]>
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]>
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]>
- 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]>
- 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]>
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]>
- 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]>
- 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]>
Shows warnings at the top of the detail view with:
- Yellow warning styling
- Check name, message, and suggestion
- Warning icon for visibility
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Modal now has max-height of viewport minus padding
- Content area scrolls independently (overflow-y-auto)
- Header and footer buttons stay fixed/visible
- Background scroll locked when modal is open
- Fixes scroll context issues after dragging
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Header now flush with top of modal (full draggable area)
- Content area properly padded below header
- Fix step rendering: use step.prompt not step.content
- Show provider, output_var, and step name in step display
- Add support for tool steps
- Add max-height with scroll for long prompts/code
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Darker overlay (bg-gray-900 bg-opacity-60)
- Stronger border (border-2 border-gray-300)
- Larger shadow (shadow-2xl)
- Gray header bar with cursor-move indicator
- Draggable by header (both detail and reject modals)
- Position resets on close for re-centering
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Click tool name to view full details in modal
- Shows description, arguments, steps (prompt/code), and README
- Approve/Reject buttons in detail modal
- New API endpoint GET /api/v1/admin/tools/<id> returns full tool config
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Page number links with ellipsis for large ranges
- First/Last page buttons (« and »)
- "Go to page" input for direct page jumping
- Current page highlighted in indigo
Co-Authored-By: Claude Opus 4.5 <[email protected]>
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 <[email protected]>
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 <[email protected]>
- 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 <[email protected]>
The tool list now refreshes after publishing to immediately show
the updated publish state indicator (✓).
Co-Authored-By: Claude Opus 4.5 <[email protected]>
The Tool dataclass now has a path field that points to the config.yaml
file it was loaded from. This is set by load_tool() and enables the
publish dialog to save the registry_hash back to the local config.
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Add config_hash to publish API response
- Save registry_hash to local tool config after successful publish
- Show appropriate message based on moderation status (approved vs pending)
This enables the GUI to show publish state indicators (✓ published, ● modified)
for tools that have been published to the registry.
Co-Authored-By: Claude Opus 4.5 <[email protected]>
The publish_tool() API expects a YAML config string, but the dialog
was passing a dict directly, causing a 500 error on the server.
- Update PublishWorker to accept config_yaml string and readme
- Build complete tool config from Tool.to_dict()
- Convert to YAML string before sending
- Also include README.md if it exists in tool directory
Co-Authored-By: Claude Opus 4.5 <[email protected]>
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 <[email protected]>