Initialize Harmness Browser JetBrains plugin skeleton

- Gradle + Kotlin + IntelliJ Platform SDK build
- JCEF embedded browser tool window with configurable start URL
- Settings page (Tools > Harmness Browser)
- JS<->Java bridge scaffold (window.harmnessBridge)
- Vite + React + TypeScript web scaffold for embedded page
- README: build, register, upload to Marketplace, install guide
This commit is contained in:
harmness
2026-09-10 13:27:43 +08:00
commit cbe41e4f4f
23 changed files with 1125 additions and 0 deletions
@@ -0,0 +1,44 @@
package com.harmness.toolwindow
import com.intellij.openapi.components.PersistentStateComponent
import com.intellij.openapi.components.State
import com.intellij.openapi.components.Storage
import com.intellij.openapi.diagnostic.Logger
/**
* 插件设置:目前仅保存一个「浏览器起始地址」。
*
* 该地址必须是一个允许被嵌入的 Web 应用地址(例如本地 Harness 服务地址),
* 并且需要在页面上开启允许被 iframe/嵌入浏览(X-Frame-Options / CSP frame-ancestors
* 或者由 Harness 提供专门的无 frame 限制入口。
*/
@State(name = "HarmnessToolwindowSettings", storages = [Storage("harmness-toolwindow.xml")])
class SettingsState : PersistentStateComponent<SettingsState.State> {
data class State(
var startUrl: String = "http://127.0.0.1:8888",
)
private var myState = State()
private val logger = Logger.getInstance(SettingsState::class.java)
override fun getState(): State = myState
override fun loadState(state: State) {
myState = state
logger.info("Loaded settings: ${state.startUrl}")
}
var startUrl: String
get() = myState.startUrl.ifBlank { DEFAULT_URL }
set(value) {
myState = myState.copy(startUrl = value.trim())
}
companion object {
const val DEFAULT_URL = "http://127.0.0.1:8888"
fun getInstance(): SettingsState =
com.intellij.openapi.components.ServiceManager.getService(SettingsState::class.java)
}
}