| name | quicker-exe-type-probing |
| description | Guides agents to find Quicker.exe internal types and methods for quicker-rpc plugin work. Use when implementing or debugging reflection against Quicker.exe, locating internal Quicker APIs, handling obfuscated Release builds, qkref references, or service access from QuickerRpc.Plugin. |
| metadata | {"internal":true} |
Quicker.exe Type Probing
When To Use
Use this skill before changing QuickerRpc/QuickerRpc.Plugin.V1 code that reflects into Quicker internals: action editing, program persistence, variable editing, designer APIs, step-runner catalog, or service access from the injected plugin.
Where To Find Code
Read this section before guessing type names or adding reflection.
Default order: existing QuickerRpc.Plugin.V1 wrappers → QuickerRpc.Plugin.Test exe scans → installed Quicker.exe (Release, obfuscated). Optional maintainer-local source under .ref/Quicker/ (gitignore) only when that directory already exists on disk.
A. quicker-rpc — code you edit
| Area | Path | Notes |
|---|
| Reflection helpers | QuickerRpc/QuickerRpc.Plugin.V1/Reflection/ | QuickerInternalAccess, QuickerAssemblyReflection, QuickerActionEditReflection |
| RPC-facing services | QuickerRpc/QuickerRpc.Plugin.V1/Services/ | One file per capability; V1 host adapters in Adapters/ |
| RPC orchestration | QuickerRpc/QuickerRpc.Runtime/QuickerRpcService.cs | Wire → IQuickerRpcHost + handlers(无 Quicker 反射) |
| Contracts | QuickerRpc.Contracts/Rpc/IQuickerRpcService.cs | Public RPC API |
| XAction compress/patch (no Quicker.exe) | QuickerRpc.AgentModel/ | Agent models; not runtime reflection |
| Action authoring docs for agents | docs/action-authoring-src/ + manifest/*.json | Generate → cli/ (qkrpc) / single skill docs/skills/quicker-authoring/ (QuickerAgent) |
| Offline exe scans | QuickerRpc.Plugin.Test/ | Debug/Release Quicker.exe signature probes |
| Quicker DLL references | qkref.props | Default Release: C:/Program Files/Quicker |
First step: search QuickerRpc.Plugin.V1 for an existing wrapper (rg ActionEditMgr QuickerRpc/QuickerRpc.Plugin.V1).
B. Optional local Quicker source (maintainer only)
.ref/Quicker/ is gitignored and not part of this repository. Clone/setup is out of scope for agents; do not document or assume a public upstream.
When the directory exists, use it for Debug type/method names and call-site context. Trust the tree you have — save/designer APIs differ by version/branch; do not assume types like ActionItem2 exist because another environment had them.
| What you need | Search under .ref/Quicker/ (examples) |
|---|
Domain services (ActionEditMgr, search, runtime lookup) | rg "class ActionEditMgr" |
| XAction program model (steps, variables, subprograms) | rg "SaveEditingAction" / XAction under Actions |
Designer UI (SaveAllData, UpdateXActionUi) | rg "ActionDesignerWindow" |
| Step 双击弹窗 / 字段编辑器(Web 对齐 WPF) | `rg "ActionStepEditorWindow |
| Step runner catalog | rg "IStepRunnerService" |
| Shared DTOs / legacy models | rg for the type name; Common layout varies |
# From repo root — only if .ref/Quicker exists
rg "class ActionEditMgr" .ref/Quicker
rg "SaveEditingAction" .ref/Quicker
rg "IStepRunnerService" .ref/Quicker
Source is reference only — do not ship Quicker internal types into user actions unless exposed via qkrpc step-runner get (see docs/action-authoring/implementation-fallback.md).
C. Runtime binaries — confirm signatures
| Build | Typical path | Override |
|---|
| Release (obfuscated names) | C:/Program Files/Quicker/Quicker.exe | QUICKER_DLL_PATH |
| Debug (readable names) | Local Debug build output directory containing Quicker.exe | QUICKER_DEBUG_DLL_PATH |
Probe tests (no live Quicker required):
dotnet test QuickerRpc.Plugin.Test --filter FullyQualifiedName~QuickerExeDebugScanTests
dotnet test QuickerRpc.Plugin.Test --filter FullyQualifiedName~QuickerExeReleaseScanTests
Live RPC (Quicker + plugin running): QuickerRpc.Test/ — see AGENTS.md.
D. Type → quicker-rpc wrapper (common targets)
| Reflection target (Debug names) | quicker-rpc wrapper |
|---|
Quicker.Domain.AppState | QuickerInternalAccess, QuickerAssemblyReflection |
Quicker.Domain.Services.ActionEditMgr | QuickerInternalAccess, ActionEditMgrAccessor |
Quicker.Domain.Actions.X.* | XActionProgramBodyWriter, ActionProgramPersistence |
ActionItem + Data (JSON XAction) | ActionDesignerProgramAccess, ActionProgramPersistence, ActionDesignerUiSave |
Quicker.View.X.ActionDesignerWindow | ActionDesignerUiSave, DesignerVariableEditService |
Step runner catalog (IStepRunnerService) | StepRunnerCatalogFromQuicker |
Use .ref/Quicker (if present) or Debug Quicker.exe to locate declaring types and full signatures for new wrappers.
Core Rules
- The plugin runs inside
Quicker.exe; resolve against loaded assemblies (Assembly.GetEntryAssembly(), typeof(AppState).Assembly), not assumed folder layout.
- Debug source / Debug exe: use type and method names to learn signatures.
- Release runtime: resolve by signature and behavior, not obfuscated type full names.
- If multiple runtime matches exist, treat the resolver as unavailable — do not guess.
- For generics, compare
GetGenericTypeDefinition().FullName across assemblies.
- Keep wrappers narrow; surface clear errors to the CLI layer.
Recommended Workflow
- Find or add a wrapper in
QuickerRpc/QuickerRpc.Plugin.V1/Services/ or Reflection/.
- If
.ref/Quicker exists, rg / read call sites for type/method and save flow; otherwise use Plugin.Test scans and Debug exe.
- Record full signature: declaring type, static/instance, parameters, return type, async shape.
- Only if needed: validate Release obfuscation via
QuickerRpc.Plugin.Test scans.
- Implement runtime lookup by signature in
QuickerRpc/QuickerRpc.Plugin.V1; avoid hardcoding Release type names.
- Run
pwsh ./build.ps1 -t (see quicker-rpc-build-test skill).
Probe Patterns
Debug discovery (names OK):
var assembly = Assembly.LoadFrom(debugQuickerExePath);
var type = assembly.GetType("Quicker.Domain.Services.ActionEditMgr");
var method = type?.GetMethod("SaveEditingAction", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
Release runtime (signature only):
var candidates = assembly.GetTypes()
.SelectMany(t => t.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
.Where(m => )
.ToArray();
if (candidates.Length != 1)
{
return unavailable;
}
Prefer a focused helper on the service that needs it; share only when several services use the same lookup rule.
Agent Checklist
Related
- Repo overview + CLI:
AGENTS.md
- Build after edits:
.cursor/skills/quicker-rpc-build-test/SKILL.md
- Agent XAction editing (no reflection):
docs/action-authoring/overview.md