- 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 <noreply@anthropic.com>
- 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 <noreply@anthropic.com>
- 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 <noreply@anthropic.com>
- 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 <noreply@anthropic.com>
- 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 <noreply@anthropic.com>
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>
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 <noreply@anthropic.com>
- 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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
- 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 <noreply@anthropic.com>
- 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>
- 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>
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 <noreply@anthropic.com>
_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>
- 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 <noreply@anthropic.com>
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>
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>