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]>
- 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 <[email protected]>
Registry API improvements:
- Add /api/v1/me POST endpoint for profile updates
- Add /api/v1/me/password POST endpoint for password changes
- Fix visibility filtering on categories and tags endpoints to only
show approved public tools
- Allow underscores in tool names for fabric pattern compatibility
- Fix sqlite3.Row access (use bracket notation instead of .get())
Web UI improvements:
- Add tag filter to /tools page with three-state buttons
(include/exclude/neutral)
- Add mobile-friendly tag filter in responsive view
- Display tags on tool cards in the tools listing
- Add dashboard settings form handlers for profile and password
Admin improvements:
- Add scrutiny audit page for reviewing tool safety analysis
- Improve pending tools page with scrutiny report display
- Add scrutiny stats to admin dashboard
Fabric sync improvements:
- Add direct database publishing with scrutiny vetting
- Support auto-approve for tools passing scrutiny
- Improve error handling and logging
- Add source attribution for imported tools
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- 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 <[email protected]>
- Add icons module with programmatically drawn icons:
- Speech bubble for prompt steps
- Code brackets </> for code steps
- Arrow icons for input/output nodes
- Display icons in list view next to step names
- Display icons in flow view node headers
- Add inline name editing in flow view via property_changed signal
- Sync name changes from flow view to tool model and list view
Co-Authored-By: Claude Opus 4.5 <[email protected]>
Added "Cut links: Alt+Shift+drag" to help banner.
Shortened other labels to fit.
In NodeGraphQt, connections are cut by:
- Alt+Shift+Left-drag to slice through connections
- Dragging a connection endpoint to empty space
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Add _rebuilding flag to ignore signals during rebuild
- Prevents cascade of port_disconnected signals when clearing graph
- Fixes KeyError in NodeGraphQt undo stack
- Fixes false dependency warnings on view switch
The port_disconnected and nodes_deleted signals were firing during
clear_session(), causing recursive rebuilds and errors.
Co-Authored-By: Claude Opus 4.5 <[email protected]>
When a connection is broken in the flow view:
1. The node that lost its input moves to the end of the chain
2. The remaining nodes reconnect automatically
3. Tool model updates to reflect new order
4. Dependency validation warns about broken references
Flow: Input → A → B → C → Output
Break B's input: Input → A → C → B → Output
Co-Authored-By: Claude Opus 4.5 <[email protected]>
Only parse {variable} patterns in PromptSteps, not CodeSteps.
In CodeSteps, variables are available directly as Python variables
(e.g., use `input` not `{input}`). The {var} syntax in code is
typically Python f-string or .format() syntax, not CmdForge
template substitution.
This fixes false positives like artifact-ai where Python f-strings
like f"{format_guide}" were incorrectly flagged as missing CmdForge
variable references.
Co-Authored-By: Claude Opus 4.5 <[email protected]>
List View:
- Enable drag-drop reordering of steps
- Show broken dependency warnings when reordering
- Steps with missing variable refs shown in red with tooltip
Validation:
- Parse {variable} references from prompts and code
- Track available variables at each step position
- Warn when steps reference undefined variables
Flow View Sync:
- Deleting nodes in flow view updates the tool model
- steps_deleted signal propagates changes to builder
- Both views stay in sync
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- F key now fits to selected nodes (or all if none selected)
- A key selects all nodes
- Workflow: drag-select nodes then F to zoom, or A then F for all
- Updated help banner and context menu
- Context menu now has Select All (A) and Fit Selection (F)
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Show banner on showEvent (when flow view becomes visible)
- Show banner on mouse enter event
- Raise banner to front to ensure visibility
- Recalculate size before positioning
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Remove Fit All button, F key shortcut is sufficient
- Add right-click context menu with "Fit All (F)" option
- Add floating help banner that appears on focus and auto-hides
- Banner stays visible when mouse hovers over it
- Fix default step naming to increment per type (Code 1, Prompt 1, Code 2)
instead of globally (Code 1, Prompt 2, Code 3)
- List view still shows overall step number (1, 2, 3) with per-type names
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Create welcome_page.py with branded landing page
- Add quick action cards for common tasks (Create Tool, Registry, etc.)
- Add "CmdForge" entry at top of sidebar navigation
- Update page indices for navigation
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Add name field to PromptStep, CodeStep, and ToolStep dataclasses
- Update step dialogs to allow editing step names
- Display custom step names in both list and flow views
- Fix F key shortcut by installing event filter on graph widget
- Steps without custom names show default "Prompt N" / "Code N"
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Add navigation help bar at top of flow view with instructions:
Pan, Zoom, Select, Edit step shortcuts
- Fix zoom to fit all nodes on initial load (was only centering last node)
- Use QTimer to ensure fit happens after widget is fully rendered
- Clear selection after fitting so nodes don't appear selected
Co-Authored-By: Claude Opus 4.5 <[email protected]>
The setSelectionArea() API changed in PySide6 6.7 - it now requires
an ItemSelectionOperation parameter before ItemSelectionMode.
Files added:
- patches/nodegraphqt_pyside6_compat.patch: Git-style patch file
- patches/UPSTREAM_ISSUE.md: Issue report for upstream project
- scripts/patch_nodegraphqt.py: Script to auto-apply the patch
The patch fixes rubber band selection errors when dragging in the
node graph viewer. Run after pip install:
python scripts/patch_nodegraphqt.py
Co-Authored-By: Claude Opus 4.5 <[email protected]>
Implements node-based flow visualization using NodeGraphQt-QuiltiX-fork:
New files:
- src/cmdforge/gui/widgets/flow_graph.py: FlowGraphWidget with custom node types
- InputNode: Shows tool inputs ($input + argument variables)
- PromptNode: AI prompt steps with provider display
- CodeNode: Python code steps
- OutputNode: Final output
- scripts/test_nodegraph.py: Standalone prototype for testing
Modified files:
- tool_builder_page.py: Added List/Flow view toggle with QStackedWidget
- Lazy-loads flow widget on first use
- Syncs between list and flow views
- Double-click nodes to edit steps
- styles.py: Added viewToggle button styling
- widgets/__init__.py: Export FlowGraphWidget
- pyproject.toml: Added 'flow' optional dependency group
Features:
- Toggle between List and Flow views in Steps panel
- Nodes auto-connected based on step order
- Auto-layout and fit-to-view on load
- Double-click nodes opens step edit dialog
- Graceful fallback if NodeGraphQt not installed
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Set default value "{response}" for new tools
- Add minimum height (80px) so it's always visible
- Add stretch factors to layout so Steps expands, Output stays fixed
- Update placeholder text to be more helpful
Co-Authored-By: Claude Opus 4.5 <[email protected]>
Validates code with ast.parse() before accepting. Shows line number
and error message if syntax is invalid.
Co-Authored-By: Claude Opus 4.5 <[email protected]>
Feature was present in TUI but missing after GUI conversion. Now includes:
- Split layout: Code editor (left) | AI Assist panel (right)
- Provider selector dropdown for AI calls
- Prompt editor with smart default template showing available variables
- "Generate Code" button that calls AI in background thread
- Response feedback area showing success/error status
- Automatic markdown fence stripping from AI responses
- Available variables computed from tool arguments + previous step outputs
Co-Authored-By: Claude Opus 4.5 <[email protected]>
Profiles allow users to inject system instructions into prompts,
customizing the AI's behavior and persona for tool execution.
Features:
- Profile dataclass with name, description, system_prompt
- 8 built-in profiles: None, Comedian, Technical Writer, Teacher,
Concise, Creative, Code Reviewer, Analyst
- Custom profile creation and storage in ~/.cmdforge/profiles/
- Profile selector in Prompt Step dialog
- Profile injection during tool execution
- Profiles page in GUI (Ctrl+4) for viewing and managing profiles
Co-Authored-By: Claude Opus 4.5 <[email protected]>
search_tools requires a query, but list_tools allows browsing
without a search term. Use list_tools when no query or tags are set.
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Browse all tools on page load without search
- Category filter dropdown (Text, Developer, Data, etc.)
- Sort options (downloads, rating, newest, name)
- Star ratings display in results table
- Clickable tags for filtering
- Installed indicator (✓) for local tools
- Update available indicator (↑) for newer versions
- Pagination controls for large result sets
- Publisher reputation info in details
Co-Authored-By: Claude Opus 4.5 <[email protected]>
Web UI:
- Change sidebar "API Tokens" to "Connections"
- Change empty state button to "Make Your First Connection"
- Add TUI option to "About Connected Apps" info banner
- Add both TUI and CLI options to pairing modal
TUI:
- Change dialog title to "Connect to your CmdForge Account"
- Add account creation hint in username prompt
- Improve instructions with full URL and steps
- Fix timer refresh by calling loop.draw_screen()
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Add pairing_requests table and hostname column to api_tokens
- Add pairing API endpoints: initiate, check, status, connected-apps
- Add cmdforge config connect <username> CLI command
- Rewrite tokens.html as Connected Apps with pairing flow
- Update TUI: Connect button when not authenticated, Publish when connected
- Add private sync option after save in TUI when connected
- Add visibility parameter to publish_tool in registry_client
Co-Authored-By: Claude Opus 4.5 <[email protected]>
Was using werkzeug's generate_password_hash which creates incompatible
hashes. Now uses the same argon2 password_hasher as registration/login.
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Fix _api_get to handle query strings in URL path
- Replace placeholder github.com/your-org URLs with gitea.brrd.tech/rob
Co-Authored-By: Claude Opus 4.5 <[email protected]>
The index creation for moderation_status, visibility, role, and banned
columns was in SCHEMA_SQL which runs before migrate_db(). This caused
failures on existing databases that didn't have these columns yet.
Co-Authored-By: Claude Opus 4.5 <[email protected]>
Add documentation for running as a user service (systemctl --user)
which is how the current OMV deployment is configured. The previous
docs only showed system service setup which caused confusion.
Co-Authored-By: Claude Opus 4.5 <[email protected]>