Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude/skills/plugin-review/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: cogo-plugin-review
description: Review a Code on the Go (CoGo or cotg) plugin project for submission readiness — verify the assemblePlugin build, audit actual security risks, and score the code against the submission rubric (compatibility, resource discipline, build reproducibility, native binaries, reflection ban, html documentation, tooltips and in-app help, manifest completeness, icons and imagery). Use when the user asks to review, audit, or check a Code On The Go plugin repo.
description: Review a Code on the Go (CoGo or cotg) plugin project for submission readiness — verify the assemblePlugin build, audit actual security risks, and score the code against the submission rubric (compatibility, resource discipline, build reproducibility, native binaries, reflection ban, html documentation, tooltips and in-app help, manifest completeness, icons and imagery). Use when the user asks to review, audit, or check a Code on the Go plugin repo.
metadata:
author: Hal Eisen
keywords:
Expand Down Expand Up @@ -100,7 +100,7 @@ Search the source tree:
- Must be at the top-level of the plugin folder, named after the **plugin folder** (kebab-case) with a `.html` extension: `template-manager/` → `template-manager.html`. The short folder-name form is preferred; a `-documentation` suffix (`random-xkcd-documentation.html`) is also acceptable. Do **not** name it after the lowercase `pluginBuilder { pluginName }` when that differs from the folder (i.e. not `templatemanagerplugin.html`).

#### 6.7 Tooltips and in-app help
Code On The Go has a three-tier in-IDE help model: Tier 1 (brief) and Tier 2 (more detail) are tooltips; Tier 3 is a full offline web page reached from a button on the tooltip. Plugins participate through `DocumentationExtension` (all symbols verifiable in `plugin-api.jar`). This is separate from the 6.6 install-decision page — grade them independently.
Code on the Go has a three-tier in-IDE help model: Tier 1 (brief) and Tier 2 (more detail) are tooltips; Tier 3 is a full offline web page reached from a button on the tooltip. Plugins participate through `DocumentationExtension` (all symbols verifiable in `plugin-api.jar`). This is separate from the 6.6 install-decision page — grade them independently.

- **Implements the extension**: confirm the main class (or one of the plugin's classes) implements `DocumentationExtension`. `grep -rlE 'DocumentationExtension' src --include='*.kt' --include='*.java'`. Absent → **Fail** (no in-app help at all).
- **Every UI element has a tooltip**: reuse the extension enumeration from *Manifest completeness* below. For each contributed `NavigationItem` / `MenuItem` / `TabItem` / FAB / toolbar action, confirm `tooltipTag` is set; for each `EditorTabItem`, confirm `tooltip` is set. Any custom `View` the plugin shows (dialog, fragment, bottom sheet) must be wired to the tooltip system (`IdeTooltipService.showTooltip(...)` or `View.displayTooltipOnLongPress(...)`). One or more contributed elements with no tooltip → **Fail** ("all UI elements" is the bar); a stray non-interactive view missing one → **Partial**.
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/plugin-review/references/RUBRIC.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Helps potential users of the plugin to decide if they want to download and insta

## 6.7 Tooltips and in-app help

Help must be available *inside* the running IDE, not only in the standalone 6.6 page. Code On The Go uses a three-tier help model and plugins are expected to participate fully:
Help must be available *inside* the running IDE, not only in the standalone 6.6 page. Code on the Go uses a three-tier help model and plugins are expected to participate fully:

- **Tier 1 (brief)** and **Tier 2 (more detail)** are delivered as tooltips. A user long-presses any UI element and sees a brief summary, then "See More" for detail.
- **Tier 3 (full)** is an exhaustive in-app web page reached from a button on the tooltip, served from the bundled documentation database — no network required.
Expand Down
2 changes: 1 addition & 1 deletion .githooks/pre-push
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#
# pre-push nudge (ADFA-4678)
#
# Reminds the developer to run the Code On The Go plugin-review skill
# Reminds the developer to run the Code on the Go plugin-review skill
# (/plugin-review) before finishing a PR, so peer review isn't spent on
# issues the skill catches automatically.
#
Expand Down
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# plugin-examples

Reference plugins for [CodeOnTheGo](https://github.com/appdevforall/CodeOnTheGo). Each folder is a fully self-contained Gradle project that builds to a `.cgp` installable plugin file.
Reference plugins for [Code on the Go](https://github.com/appdevforall/CodeOnTheGo). Each folder is a fully self-contained Gradle project that builds to a `.cgp` installable plugin file.

See the official [plugin documentation](https://www.appdevforall.org/codeonthego/help/exp-plugins-top.html) for concepts, the plugin API surface, and install workflow.

Expand All @@ -11,7 +11,7 @@ See the official [plugin documentation](https://www.appdevforall.org/codeonthego
| [`plugins/APK-Analyzer/`](plugins/APK-Analyzer/) | Inspects the structure of an APK file inside the editor. |
| [`plugins/Bookshelf/`](plugins/Bookshelf/) | Offline reference textbooks inside the in-app help. |
| [`plugins/Client-Time-Tracker/`](plugins/Client-Time-Tracker/) | Tracks billable time for each project and creates invoices. |
| [`plugins/Code-Suggestions/`](plugins/Code-Suggestions/) | Shows inline code completions as you type. |
| [`plugins/AI-Code-Suggestions/`](plugins/AI-Code-Suggestions/) | Shows inline code completions as you type. |
| [`plugins/Code-Together/`](plugins/Code-Together/) | Pair programming between two devices on the same network. |
| [`plugins/Favorite-Snippets/`](plugins/Favorite-Snippets/) | Saves your own code snippets and inserts them in the editor. |
| [`plugins/Flutter-Templates/`](plugins/Flutter-Templates/) | Adds five Flutter starter projects to the New Project screen. |
Expand Down Expand Up @@ -43,7 +43,7 @@ cd plugins/Voice-Alerts
./gradlew assemblePlugin
```

The resulting `.cgp` file lands under the plugin's `build/plugin/` directory. Install it from inside CodeOnTheGo via the Plugin Manager.
The resulting `.cgp` file lands under the plugin's `build/plugin/` directory. Install it from inside Code on the Go via the Plugin Manager.

## Git hooks

Expand All @@ -65,7 +65,7 @@ when your push doesn't touch any plugin folder.

## The `libs/` folder

Every plugin depends on two jars produced by the CodeOnTheGo source tree:
Every plugin depends on two jars produced by the Code on the Go source tree:

- **`plugin-api.jar`** — the interface surface a plugin implements (`IPlugin`, `BuildStatusListener`, etc.). Used as `compileOnly` at build time; provided by the IDE at runtime.
- **`gradle-plugin.jar`** — the custom Gradle plugin (`com.itsaky.androidide.plugins.build`) that packages a compiled Android library into a `.cgp` file. Applied via `classpath` in each plugin's `settings.gradle.kts`.
Expand All @@ -74,11 +74,11 @@ Both jars live in `libs/` at the repo root; each plugin references them via `../

## Refreshing `libs/`

Whenever CodeOnTheGo changes the plugin API or the build plugin, the jars need to be rebuilt. Two ways to do that:
Whenever Code on the Go changes the plugin API or the build plugin, the jars need to be rebuilt. Two ways to do that:

### GitHub Action (normal path)

Go to [Actions → **Update libs from CodeOnTheGo**](../../actions/workflows/update-libs.yml) and click **Run workflow**. It will clone CodeOnTheGo at the branch or tag you specify (default: `stage`), build both jars, and commit them directly to the default branch.
Go to [Actions → **Update libs from CodeOnTheGo**](../../actions/workflows/update-libs.yml) and click **Run workflow**. It will clone Code on the Go at the branch or tag you specify (default: `stage`), build both jars, and commit them directly to the default branch.

### Locally

Expand All @@ -88,7 +88,7 @@ Go to [Actions → **Update libs from CodeOnTheGo**](../../actions/workflows/upd
./scripts/update-libs.sh --local ../CodeOnTheGo # use an existing local checkout instead of cloning
```

First local run clones CodeOnTheGo into `.cache/CodeOnTheGo/` (gitignored); subsequent runs `git pull` in place. Review the diff in `libs/` and commit if you're happy with it.
First local run clones Code on the Go into `.cache/CodeOnTheGo/` (gitignored); subsequent runs `git pull` in place. Review the diff in `libs/` and commit if you're happy with it.

## Adding a new plugin example

Expand Down
4 changes: 2 additions & 2 deletions docs/process/learnings.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ Cross-session gotchas, discoveries, and patterns worth not re-deriving.
## Android / adb

- Pulling SQLite databases out of an emulator-installed app:
- First try `adb -s <device> shell run-as <pkg> cat databases/<file> > local.db`. This only works if the app's APK has `android:debuggable="true"`. Code On The Go's release builds do not, so `run-as` returns "package not debuggable" and writes that error string to your output file.
- First try `adb -s <device> shell run-as <pkg> cat databases/<file> > local.db`. This only works if the app's APK has `android:debuggable="true"`. Code on the Go's release builds do not, so `run-as` returns "package not debuggable" and writes that error string to your output file.
- On an emulator (root-capable), the fallback is `adb root` (one-time per boot) followed by `adb pull /data/data/<pkg>/databases/<file> .`. This bypasses the debuggable check entirely. Reach for `adb root` early when inspecting/clearing on-device app data — it's far more reliable than fighting `run-as`'s working-directory quirks.
- **Launching Code On The Go via adb — don't use `monkey`.** CoGo *debug* builds bundle **LeakCanary**, which registers its own launcher activity, so `adb shell monkey -p com.itsaky.androidide -c android.intent.category.LAUNCHER 1` (or any bare LAUNCHER intent) may open LeakCanary's "Leaks" screen or a disambiguation chooser instead of the IDE, and the IDE's own activities are not exported (direct `am start` on them is denied). Launch the explicit launcher component: `adb shell am start -n com.itsaky.androidide/.activities.SplashActivity`.
- **Launching Code on the Go via adb — don't use `monkey`.** CoGo *debug* builds bundle **LeakCanary**, which registers its own launcher activity, so `adb shell monkey -p com.itsaky.androidide -c android.intent.category.LAUNCHER 1` (or any bare LAUNCHER intent) may open LeakCanary's "Leaks" screen or a disambiguation chooser instead of the IDE, and the IDE's own activities are not exported (direct `am start` on them is denied). Launch the explicit launcher component: `adb shell am start -n com.itsaky.androidide/.activities.SplashActivity`.
- **Plugin Manager icons are Glide-cached.** CoGo loads plugin icons through Glide's disk cache (`/data/data/com.itsaky.androidide/cache/image_manager_disk_cache`), keyed by path without mtime invalidation. Reinstalling a plugin under the same `plugin.id` with changed `icon_day/night.png` keeps showing the **old** icon (the on-disk extracted icon under `app_plugin_icons/<id>/` updates correctly, but the rendered bitmap is stale). Clear that cache dir (via `adb root`) and restart, or install on a clean device, to confirm an icon change. Template *thumbnails* are not affected — they're re-read from the `.cgt` each time.

## Plugin build & install gotchas
Expand Down
16 changes: 8 additions & 8 deletions docs/superpowers/plans/2026-09-04-addon-distribution.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Publish Code On The Go addons to Cloudflare R2 directly from the build job, and stop all use of GitHub Actions artifact storage.
**Goal:** Publish Code on the Go addons to Cloudflare R2 directly from the build job, and stop all use of GitHub Actions artifact storage.

**Architecture:** A small Python tool owns addon identity. It derives names from directory names, builds source tarballs, generates a catalog, and uploads to R2. The workflows only call the tool. The tool runs offline against test data, so a pull request can check names and metadata.

Expand All @@ -21,7 +21,7 @@ Every task must obey this section.
3. Python version is 3.11 or later.
4. Do not change `plugin.id`, `namespace`, or `applicationId` in any addon.
5. The directory name is the only source of addon identity. Do not add an override.
6. Write "Code On The Go" in full in all text that a user reads. Do not write "CoGo", "CotG", or "CodeOnTheGo".
6. Write "Code on the Go" in full in all text that a user reads. Do not write "CoGo", "CotG", or "CodeOnTheGo".
7. Every catalog field is always present. Write `""` or `[]` for an empty value. Never write `null`. Never omit a field.
8. Upload `v1/catalog.json` last, after all other objects.
9. Do not add `actions/upload-artifact` or `actions/download-artifact` to any workflow.
Expand Down Expand Up @@ -889,7 +889,7 @@ from addons import model

README = """# {name}

Source for the {name} addon for Code On The Go.
Source for the {name} addon for Code on the Go.

## Build

Expand Down Expand Up @@ -1328,11 +1328,11 @@ cat > site/page.template.html <<'EOF'
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{title}} — Code On The Go</title>
<title>{{title}} — Code on the Go</title>
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<header class="chrome"><a href="/">Code On The Go addons</a></header>
<header class="chrome"><a href="/">Code on the Go addons</a></header>
<main class="page">{{body}}</main>
<footer class="chrome"><a href="/">Back to all addons</a></footer>
</body>
Expand Down Expand Up @@ -1621,11 +1621,11 @@ cat > site/index.html <<'EOF'
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Addons for Code On The Go</title>
<title>Addons for Code on the Go</title>
<link rel="stylesheet" href="/assets/styles.css">
</head>
<body>
<header class="chrome"><h1>Addons for Code On The Go</h1></header>
<header class="chrome"><h1>Addons for Code on the Go</h1></header>
<main>
<div class="controls">
<input id="q" type="search" placeholder="Search addons" aria-label="Search addons">
Expand Down Expand Up @@ -2151,7 +2151,7 @@ mkdir -p snippets
cat > snippets/README.md <<'EOF'
# Snippets

Snippet addons for Code On The Go. This directory is empty for now.
Snippet addons for Code on the Go. This directory is empty for now.
EOF
```

Expand Down
Loading
Loading