feat(s7.3): error handling, structured logging, and Marketplace prep#46
Conversation
- StackTreeNotifier: centralized balloon notifications with Show Details action - StateException sealed hierarchy: StateCorruptedException for corrupt JSON - StateStorage: ReentrantLock for concurrent writes, full DEBUG/WARN/ERROR logging - GitExecutor + GitLayerImpl: structured logging throughout all operations - UiLayer/UiLayerImpl: notifyError() delegates to StackTreeNotifier - StacksTabFactory: initContent() wrapped in try/catch with readable fallback panel - plugin.xml: renamed to StackTree, added vendor URL - pluginIcon.svg + pluginIcon_dark.svg: Marketplace listing icons - README.md: complete rewrite with plugin description markers - CHANGELOG.md: populated [Unreleased] with S3–S7 feature list - StackIntegrationTest: 7 platform-free integration tests via ProcessGitRunner - OpsLayerImplTest + RemoveStackTest: FakeUiLayer updated with notifyError() Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
[Maestro Review] Automated Code ReviewVerdict: ✅ Accepted SummaryAll acceptance criteria are met: error handling, structured logging, user-facing notifications with Show Details, ReentrantLock concurrency guard, StateCorruptedException, 7 integration tests, and full marketplace prep (icons, name, vendor, CHANGELOG). Minor gaps: MyProjectActivity missing its planned LOG.info, MyToolWindowFactory.kt does not exist (plan assumed it would, but the plugin no longer uses a tool window factory), minor dead code in integration test 5, and un-indented try-block body in StacksTabFactory. Stats
Additional Issues (outside diff)🟡 Plan requires adding companion LOG and LOG.info("StackTree initialized") in execute(), but no logger was added and no startup log line is emitted.File: Plan requires adding companion LOG and LOG.info("StackTree initialized") in execute(), but no logger was added and no startup log line is emitted. 💡 Suggestion: Add This review was generated automatically by Maestro. |
Qodana Community for JVM2 new problems were found
💡 Qodana analysis was run in the pull request mode: only the changed files were checked View the detailed Qodana reportTo be able to view the detailed Qodana report, you can either:
To get - name: 'Qodana Scan'
uses: JetBrains/qodana-action@v2025.3.2
with:
upload-result: trueContact Qodana teamContact us at qodana-support@jetbrains.com
|
Summary
info/warn/error) with a Show Details action that opens a scrollable dialog — no uncaught exceptions reach the user silentlyStateStorage.read()catchesSerializationExceptionand re-throws, giving callers a typed recovery path;StateStorage.write()guards every git plumbing step withReentrantLockDEBUG/WARN/ERROR) added toStateStorage,GitExecutor,GitLayerImpl, andUiLayerImpl— all entries logged under#StackTreeinidea.logFakeUiLayerinOpsLayerImplTestandRemoveStackTestupdatedpluginIcon.svg+pluginIcon_dark.svg(40×40, stacked-branch motif),README.mdrewritten with<!-- Plugin description -->markers,CHANGELOG.mdpopulatedIntegration tests (7 × JUnit 5, no IntelliJ Platform)
StateStoragerefs/stacktree/stateassertThrows<StateCorruptedException>read()returns null,exists()falseTest plan
./gradlew build)StateExceptionandStackTreeNotifierclassesverifyPlugintask passes (no compatibility errors)refs/stacktree/state→ balloon error with Show Details appearsidea.logfor#StackTreeDEBUG entries during stack operations🤖 Generated with Claude Code