Skip to content

Add pair programming plugin#43

Open
Daniel-ADFA wants to merge 2 commits into
mainfrom
ADFA-4395
Open

Add pair programming plugin#43
Daniel-ADFA wants to merge 2 commits into
mainfrom
ADFA-4395

Conversation

@Daniel-ADFA

Copy link
Copy Markdown
Collaborator

No description provided.

@Daniel-ADFA Daniel-ADFA requested review from a team and jomen-adfa July 9, 2026 22:06

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review for a one-time review, or @claude review always to subscribe this PR to a review on every future push.

Tip: disable this comment in your organization's Code Review settings.

@hal-eisen-adfa hal-eisen-adfa left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code On The Go plugin review — pair

Ran the /plugin-review workflow (build + security audit + submission rubric). Great engineering underneath — clean lifecycle teardown, canonicalized path handling, an authenticated LAN transport, and thorough docs — but there are submission-conformance blockers. Details inline; summary here.

🔴 Blockers

  1. Build fails from a clean checkout. ./gradlew assemblePlugin fails at :compileReleaseKotlin: libs/shared.jar doesn't exist, and behind it the code calls IdeEditorService.showPeerCursor/hidePeerCursor/clearPeerCursors and IdeProjectService.openProject(File), which aren't in the committed plugin-api.jar. The README/HTML confirm these live on the unmerged feat/ADFA-4419 branch. The plugin can't build against the repo's stage-tracked libs/ as submitted — this is the primary blocker.
  2. native.code permission with no native code. No .so/jniLibs/NDK C++ (and no QR/camera library is even declared), yet plugin.permissions requests native.code.
  3. No in-app help. No class implements DocumentationExtension — no Tier 1/2 tooltip entries, no Tier-3 offline assets/ help page, and the sidebar item has no tooltipTag.
  4. Missing plugin.editor_tabs manifest entry for the contributed editor tab.

🟡 Conditional

  • Add plugin.max_ide_version for a real compatibility range (only min is declared).

✅ Clean

  • Security: path traversal is defended (PathMapper.toLocalChecked canonicalizes + enforces the root boundary), the WebSocket server enforces a join token, no reflection, no committed secrets/keystores.
  • Resource discipline (6.2): the coroutine scope is cancelled in dispose(), sockets are closed on stopSession(), streams use .use{}, and PairServiceLocator.shutdown() nulls the PluginContext holder.
  • HTML documentation (6.6): all required sections, light bg / dark text, English, top-level.

Rubric scorecard

Clause Verdict
6.1 Compatibility Partial (no max_ide_version)
6.2 Resource discipline Pass
6.3 Build reproducibility Fail (build fails)
6.4 Native binaries Fail (native.code unused)
6.5 No reflection Pass
6.6 HTML documentation Pass
6.7 Tooltips & in-app help Fail (no DocumentationExtension)
Manifest declarations Fail (no plugin.editor_tabs)

Overall: BLOCK. Note: no device verification was possible — the build never produced a .cgp.

Comment thread pair/build.gradle.kts
dependencies {
compileOnly(files("../libs/plugin-api.jar"))
compileOnly(files("../libs/eventbus-events.jar"))
compileOnly(files("../libs/shared.jar"))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocker (build fails). ../libs/shared.jar doesn't exist in the repo's libs/ (only common.jar, eventbus-events.jar, gradle-plugin.jar, idetooltips.jar, plugin-api.jar). assemblePlugin fails here:

> Failed to transform shared.jar to match attributes ...
   > File/directory does not exist: .../libs/shared.jar

The jar providing com.itsaky.androidide.models.Range needs to be committed to libs/, or this dependency reworked to use what's already there.

runCatching { editorService.hidePeerCursor(previous, peerId) }
}
runCatching {
editorService.showPeerCursor(local, line, column, peerId, peerName, peerColorArgb(colorIndex))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocker (unreleased API). showPeerCursor / hidePeerCursor / clearPeerCursors are not present in the committed plugin-api.jar — they only exist on the feat/ADFA-4419-remote-peer-editor-decoration branch. Until that API lands in the baseline libs/, this repo can't compile the plugin from a clean checkout.

return
}
PairLog.d("[PULL] calling openProject(${root.absolutePath}) exists=${root.exists()} isDir=${root.isDirectory}")
runCatching { service.openProject(root) }

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocker (unreleased API). IdeProjectService.openProject(File) isn't in the committed plugin-api.jar (current surface exposes getCurrentProject() only). Same feat/ADFA-4419 dependency — the plugin can't build against the stage-tracked libs/.


<meta-data
android:name="plugin.permissions"
android:value="filesystem.read,filesystem.write,network.access,native.code" />

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocker (rubric 6.4). native.code is requested but the plugin ships no native code — no .so, no jniLibs/, no externalNativeBuild, and no QR/camera library is declared in build.gradle.kts. (The HTML doc justifies it as "camera / QR-decoding native libraries", which don't exist here.) Remove native.code from plugin.permissions.


<meta-data
android:name="plugin.sidebar_items"
android:value="1" />

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocker (manifest completeness). PairPlugin.getMainEditorTabs() contributes an editor tab, but there's no plugin.editor_tabs meta-data entry (only plugin.sidebar_items). Add a plugin.editor_tabs declaration — see icons-repository/src/main/AndroidManifest.xml for the pattern.


<meta-data
android:name="plugin.min_ide_version"
android:value="1.0.0" />

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conditional (rubric 6.1). Only plugin.min_ide_version is declared. The rubric wants a supported range — add plugin.max_ide_version so compatibility is bounded on both ends.

import com.itsaky.androidide.plugins.extensions.UIExtension
import com.itsaky.androidide.plugins.services.IdeEditorTabService

class PairPlugin : IPlugin, UIExtension, EditorTabExtension {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocker (rubric 6.7 — in-app help). No class implements DocumentationExtension, so the plugin has no Tier-1/2 tooltips or Tier-3 offline help wired into the IDE. Needed:

  • implement DocumentationExtension with getTooltipEntries() (non-empty summary + detail) and getTier3DocsAssetPath() backed by a real assets/ HTML page;
  • add a tooltipTag to the sidebar NavigationItem at line 59 (currently none — the EditorTabItem.tooltip string alone doesn't cover the tooltip contract).

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.

3 participants