Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…in class Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Also add ContinueOnError=WarnAndContinue to post-build copy tasks so builds succeed when the FlowLauncher DLL is locked by the running host process. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Item model tests (aliases, matching, URL detection) - ItemSearcher tests (scoring, fuzzy matching, ordering) - ItemValidator tests (alias validation, property validation) - CommandParser tests (argument splitting, quoted strings) - Command handler tests (Add, Alias, Remove, Delete, Update, SetIcon) - CommandProcessor routing tests - ItemRepository integration tests (CRUD, persistence, reload) - SettingsManager integration tests (defaults, save/load, corruption) - Fixed ItemSearcher to handle empty/whitespace queries - Updated test project to net8.0-windows (runtime compatibility) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add GitHub Actions release workflow that builds, tests, creates zip with DLL, assets, icon, and plugin.json, and uploads to GitHub release - Resize all context menu assets to consistent 32x32px Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a search TextBox above the items list that filters by alias using case-insensitive substring matching. Includes placeholder "Search" text. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a ComboBox to select Normal or Administrator run mode when editing an item, bound to the existing RunAs property. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Suppress CS1591 (missing XML doc comments) in csproj since this is a plugin, not a public API. Remove unused _commands field (CS0169). Fix nullable warnings (CS8618/CS8604/CS8625) across Main, Item, ItemViewModel, and SettingsViewModel. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds tests for RelayCommand, InverseBooleanConverter, InverseBooleanToVisibilityConverter, Item.ToString, ItemRepository error paths, SettingsViewModel (search filtering, AddItem, property change), and ItemViewModel (edit/save/cancel flow, alias management, display properties, delete event). Total: 90 → 158 tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Break the 525-line IconHelper into 5 single-responsibility classes under Utils/Icons/: - ShellIconExtractor: native P/Invoke shell icon extraction - FaviconDownloader: HTTP favicon download (patterns, HTML, root) - ImageConverter: bytes/Icon to PNG conversion - FileNameSanitizer: safe file name generation - IconHelper: slim orchestrator delegating to the above All functionality preserved. 158 tests pass. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Meta items are items whose FileName matches @alias1@@alias2@... and execute each referenced alias in sequence by resolving them via the item repository. Nested meta items (alias resolves to another meta item) work transparently. Cycle detection uses a DFS path set: ExecuteMetaItem walks the alias graph once via CollectMetaItemPlan, throwing InvalidOperationException if any ancestor is revisited on the same call path. The walk is side-effect free, so no leaf launches and no ExecCount increments when a cycle is detected, even when the cycle hides behind a leading non-cyclic sibling. ContextMenuProvider delegate now takes IItemRepository so RunAsAdministratorProvider can forward it to Execute for meta items. Tests: 17 cases covering pattern detection, single/multiple/nested resolution, missing-alias errors, force-admin propagation, direct self-reference, two-node and long-chain cycles, sibling re-use (not a cycle), and atomicity when cycle is detected mid-walk. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Items can now declare placeholders in FileName and Arguments using
<<NAME>>, optionally with default value and display hint:
<<port>> just a name
<<port=8080>> with default
<<host|target hostname>> with hint
<<port=8080|web server port>> default + hint
When such an item is invoked, the Flow Launcher bar enters a sequential
prompt mode driven by ChangeQuery: "<alias> | k1=v1 | ... | name: input".
The user fills one placeholder at a time; defaults pre-fill the prompt;
each Enter advances to the next placeholder or executes the item once
all are filled. The bar pattern is the only state - editing away from it
exits prompt mode and resumes normal search.
Meta-items participate too: PlaceholderSchema walks the alias chain
(reusing the cycle-safe traversal extracted from ExecuteMetaItem),
collects placeholders from every parameterized leaf, deduplicates by
name (first occurrence wins), and the same prompt loop covers the chain.
On execute, values flow through the chain to each leaf via a new
optional values dict on Item.Execute. Substitution happens against the
original strings each call, so items are never mutated.
New components under Items/Parameters/:
- Placeholder, PlaceholderParser: regex extraction + substitution
- PlaceholderSchema: ordered, deduplicated schema across a meta chain
- PromptModeParser: parse/format the Flow bar prompt syntax
- PromptModeHandler: builds the guided Result for the active prompt
Item.cs: refactored CollectMetaItemPlan into a reusable WalkMetaChain
that takes onLeaf/onMetaExit callbacks; ExecuteMetaItem and
PlaceholderSchema both use it. Execute gained an optional values
parameter that substitutes locally without mutating stored fields.
Tests: 77 new (parser syntax, IsParameterized, Substitute clone
semantics, schema dedup + chain walk, prompt-mode round-trip, handler
preview/advance/execute including meta-with-parameterized-leaf). Full
suite: 257 / 257.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Flow Launcher merges results across every loaded plugin. Without an explicit Score the prompt-mode Result defaulted to 0, letting global plugins like web search outrank it; the user pressed Enter on the active prompt and ended up triggering a Google search of the prompt-mode query text instead of advancing the prompt. Setting Score = int.MaxValue guarantees the active prompt is always the top result, which matches the intent: while filling placeholders, the prompt must be the only thing the user can act on. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.