Skip to content

Dev#9

Merged
kafuexe merged 19 commits into
mainfrom
dev
May 23, 2026
Merged

Dev#9
kafuexe merged 19 commits into
mainfrom
dev

Conversation

@kafuexe

@kafuexe kafuexe commented May 23, 2026

Copy link
Copy Markdown
Owner

No description provided.

kafuexe and others added 19 commits March 14, 2026 02:19
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>
@kafuexe kafuexe merged commit aab9d9a into main May 23, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant