Use this skill before adding shared code or moving code between modules. The goal is to keep EasyPostman's Maven modules small enough to reason about and strict enough that future changes do not turn into a catch-all common layer.
-
Put non-UI base capabilities in easy-postman-foundation.
Examples: shared DTOs, enums, constants, config paths, JSON helpers, system utilities, user-setting helpers, i18n mechanism, base message keys, and generic parsing/formatting helpers such as Cron, JSON Path, XML, file-size, file-extension, time-display, and HTTP header constants.
-
Put plugin extension contracts in easy-postman-plugin-api.
Examples: EasyPostmanPlugin, PluginContext, PluginDescriptor, service interfaces, toolbox/script/snippet contracts.
-
Put request specification models in easy-postman-request-core.
Examples: HttpRequestItem, SavedResponse, HttpHeader, HttpParam, HttpFormData, HttpFormUrlencoded, CookieInfo, auth/body/protocol enums, redirect metadata, and transport-auth metadata. Keep it UI-free and transport-implementation-free: no Swing, OkHttp, app service/panel code, plugin runtime, or concrete send/render implementation.
-
Put collection domain models and neutral import parsing in easy-postman-collection-core.
Examples: RequestGroup, CollectionNode, CollectionNodeType, CollectionParseResult, collection auth parsing helpers, and Postman collection parsing. Keep it UI-free and host-free: no Swing/AWT, OkHttp, app service/panel/runtime code, platform, plugin runtime, IOC, or concrete send/render implementation.
-
Put HTTP transport runtime in easy-postman-http-runtime.
Examples: PreparedRequest, HttpResponse, HttpEventInfo, runtime settings/provider, OkHttp adapters, TLS/client certificate ports, Cookie store, SSE callbacks, redirect execution, UI-neutral interaction sinks, and network observation sinks. Keep it UI-free and host-free: no Swing/AWT, app SettingManager, app plugin-host accessors, panel code, platform IOC, or JavaFX/Swing-specific adapters.
-
Put shared Swing design-system code in easy-postman-ui.
Examples: FontsUtil, IconUtil, NotificationCenter, EditorThemeUtil, ModernColors, reusable toolbar buttons/search/table/dialog/form controls such as EditButton, SaveButton, WrapToggleButton, EasyComboBox, EasyJSpinner, EasyPasswordField, and the icons/resources those reusable components directly reference.
UI singleton framework classes such as UiSingletonFactory, UiSingletonPanel, UiSingletonMenuBar, plus Swing refresh/save helpers such as IRefreshable and DebouncedSaveSupport, also belong here.
Generic action/control/status icons such as save, copy, paste, search, clear, cancel, close, delete, duplicate, eye, info, warning, arrows, chevrons, wrap, start, stop, send, connect, collapse, expand, more, detail, import, and export belong here. Do not duplicate the same icons/*.svg resource path in easy-postman-app, and do not make official plugins depend on app-only icon resources.
-
Put plugin loading mechanics in easy-postman-plugin-runtime.
Examples: plugin scanning, descriptor parsing, classloaders, registry, lifecycle, disabled/uninstall state.
-
Put performance domain core contracts in easy-postman-performance-core: editable plan data, executable plan.json, runtime contracts, stats/report snapshots, worker assignments, and asset references. Keep concrete GUI/headless execution adapters in easy-postman-app until the app execution semantics can be extracted without pulling in Swing, workspace services, or app-only state.
-
Put host platform framework capabilities in easy-postman-platform when they can be separated from concrete app UI.
Current examples: the custom IOC container under com.laker.postman.ioc, and update discovery core under com.laker.postman.platform.update (version comparison, update source selection, asset resolution, changelog fetching/formatting, update result models).
Future examples: startup orchestration, welcome/help, settings center, and theme/font application orchestration.
-
Keep concrete host UI and composition in easy-postman-app.
Examples: App, MainFrame, menus, app-only panels, settings pages, update dialogs, update download/install/exit flow, welcome/help pages, and concrete startup wiring that still depends on app UI.
Do not recreate a generic app model package for HTTP runtime exchange snapshots. Domain-specific app models should live with their owner package, such as functional.model, script.model, stream, snippet, history, certificate, variable, environment, or service.curl.
-
Keep HTTP request preparation adapters separated from HTTP transport runtime.
Request preparation, validation, collection inheritance, variable resolution, scripts, and default request factories may stay in easy-postman-app/http.request while they still depend on app services. URL/query helpers belong in request-core. Transport execution belongs in easy-postman-http-runtime. Swing implementations belong in UI adapters such as com.laker.postman.panel.http.runtime, and app-specific runtime bootstrap belongs under com.laker.postman.http.runtime.app.
Before removing, renaming, moving, or changing signatures/behavior for public types in modules that plugins may depend on, check whether old plugin JARs can still link against the new host. This includes easy-postman-plugin-api, easy-postman-foundation, and easy-postman-ui, because official and third-party plugins use them with provided scope.
If preserving compatibility is the goal instead, keep a binary-compatible facade or overload with the old package/class/signature and add tests for old entry points. Do not bump plugin.platform.version for a compatible refactor.