Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
1d21f73
docs: design LinkedIn post-comments command
ankitranjan7 Aug 5, 2026
c1019eb
feat: add LinkedIn post-comments command
ankitranjan7 Aug 5, 2026
01dd7bc
fix: complete LinkedIn comment collection
ankitranjan7 Aug 5, 2026
1bd20ad
refactor: move LinkedIn commands to community plugin
ankitranjan7 Aug 5, 2026
2076351
Merge remote-tracking branch 'origin/main' into feat/linkedin-post-co…
ankitranjan7 Aug 5, 2026
e291f2e
feat: add public Webcmd plugin runtime
ankitranjan7 Aug 5, 2026
cbd1fdf
fix: preserve plugin runtime error messages
ankitranjan7 Aug 5, 2026
4b7faa4
feat: add independent plugin migration infrastructure
ankitranjan7 Aug 5, 2026
32255d3
fix: make plugin migrations collision safe
ankitranjan7 Aug 5, 2026
29dcbdd
refactor: migrate public API adapters to plugins
ankitranjan7 Aug 5, 2026
8d7f28b
refactor: migrate package and Jira adapters to plugins
ankitranjan7 Aug 5, 2026
ab64ca8
fix: make plugin manifest resolution fail closed
ankitranjan7 Aug 5, 2026
d36432a
refactor: migrate reference adapters to plugins
ankitranjan7 Aug 5, 2026
f2b520e
refactor: consolidate PyPI commands in plugin
ankitranjan7 Aug 5, 2026
ea26cb9
refactor: migrate search and desktop adapters to plugins
ankitranjan7 Aug 5, 2026
f893411
refactor: migrate content and market adapters to plugins
ankitranjan7 Aug 5, 2026
fb9eafc
refactor: migrate commerce and utility adapters to plugins
ankitranjan7 Aug 5, 2026
ecc9499
refactor: migrate chat and professional adapters to plugins
ankitranjan7 Aug 5, 2026
66d6a4e
refactor: migrate document and messaging adapters to plugins
ankitranjan7 Aug 5, 2026
42885ca
refactor: complete independent adapter plugin migration
ankitranjan7 Aug 5, 2026
52004ef
refactor: make Webcmd core adapter-free
ankitranjan7 Aug 5, 2026
552f22f
fix: address plugin migration final review
ankitranjan7 Aug 5, 2026
9c01da4
test: make CI portability checks deterministic
ankitranjan7 Aug 5, 2026
9324869
test: fix Windows plugin path portability
ankitranjan7 Aug 5, 2026
c872b47
fix: match migrated plugin webcmd version floor to the shipping release
ankitranjan7 Aug 6, 2026
f3246ae
test: install fixture plugins in e2e/smoke suites now that core ships…
ankitranjan7 Aug 6, 2026
dc4a4f6
docs: fix bundled skills to describe the plugin architecture, not clis/
ankitranjan7 Aug 6, 2026
11efee5
feat: hint at plugin search/install when webcmd list has no sites
ankitranjan7 Aug 6, 2026
4aec6c5
chore: stop committing the generated plugin-command-manifest.json
ankitranjan7 Aug 6, 2026
c9cefc3
fix: generate plugin-command-manifest.json as part of npm run build
ankitranjan7 Aug 6, 2026
c53e447
Merge branch 'main' into feat/linkedin-post-comments
ankitranjan7 Aug 6, 2026
3c1c9f5
Merge branch 'main' into feat/linkedin-post-comments
ankitranjan7 Aug 6, 2026
ef8d96e
feat: export deriveHostedAvailability for hosted consumers
beubax Aug 6, 2026
1238d4d
fix: handle ports in local IPv4 address detection for deriveHostedAva…
beubax Aug 6, 2026
4ea0479
feat: support plugin list, uninstall, update, and create in hosted mode
beubax Aug 6, 2026
fd84029
fix: refuse to update a plugin with uncommitted changes unless forced
beubax Aug 6, 2026
6f83a75
fix: count untracked files as dirty in the plugin update guard
beubax Aug 7, 2026
5816d50
ci: reconcile the hosted plugin catalog on merge to main
beubax Aug 7, 2026
5b158ff
ci: clarify --update-env-vars semantics and workflow_dispatch usage
beubax Aug 7, 2026
3342973
fix: fail closed on unexpected git errors in the plugin dirty-checkou…
beubax Aug 7, 2026
f9b2ea7
Merge branch 'feat/linkedin-post-comments' of https://github.com/agen…
beubax Aug 7, 2026
77e51dd
fix: ensure parent directories exist before writing plugin output files
beubax Aug 7, 2026
56b0ceb
chore: update lockfile dependencies for package-lock.json
beubax Aug 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
29 changes: 24 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,22 @@ jobs:
- name: Build
run: npm run build

- name: Build plugin command manifest
if: runner.os == 'Linux'
run: npm run build-plugin-manifest

- name: Check plugin command parity
if: runner.os == 'Linux'
run: npm run check:plugin-parity

- name: Check generated contract artifacts
if: runner.os == 'Linux'
run: npm run check:hosted-contract

- name: Check all generated artifacts are committed
if: runner.os == 'Linux'
run: git diff --exit-code -- cli-manifest.json hosted-contract.json webcmd-plugin.json README.md

- name: Verify packed CLI executables
run: npm run check:package-bin

Expand Down Expand Up @@ -85,10 +97,14 @@ jobs:
- name: Run unit tests
run: npx vitest run --project unit --reporter=verbose --shard=${{ matrix.shard }}/2

adapter-test:
name: Adapter tests
plugin-test:
name: Plugin tests (${{ matrix.os }})
needs: build
runs-on: ubuntu-latest
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v6

Expand All @@ -100,8 +116,11 @@ jobs:
- name: Install dependencies
run: npm ci

- name: Run adapter tests
run: npm run test:adapter -- --reporter=verbose
- name: Build
run: npm run build

- name: Run plugin tests
run: npm run test:plugin -- --reporter=verbose

bun-test:
name: Bun compatibility
Expand Down
51 changes: 51 additions & 0 deletions .github/workflows/reconcile-hosted-plugins.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Required repository secrets:
# GCP_WORKLOAD_IDENTITY_PROVIDER — workload identity provider resource name
# GCP_RECONCILE_SERVICE_ACCOUNT — service account with run.jobs.run on the job
# GCP_REGION — region hosting webcmd-reconcile-marketplace
#
# The Cloud Run Job webcmd-reconcile-marketplace must exist and run
# `npm run job:reconcile-marketplace` with DATABASE_URL, WEBCMD_ARTIFACT_ROOT,
# and GITHUB_TOKEN configured.

name: Reconcile hosted plugin catalog

on:
push:
branches: [main]
paths:
- 'plugins/**'
- 'webcmd-plugin.json'
workflow_dispatch:
# Note: manual runs should be triggered against main to ensure github.sha
# points to the current tip. Reconciling an older ref would delist plugins
# added since that commit.

concurrency:
group: reconcile-hosted-plugins
cancel-in-progress: false

jobs:
reconcile:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- name: Authenticate to Google Cloud
uses: google-github-actions/auth@v2
with:
workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
service_account: ${{ secrets.GCP_RECONCILE_SERVICE_ACCOUNT }}

- name: Set up gcloud CLI
uses: google-github-actions/setup-gcloud@v2

- name: Execute Cloud Run Job
run: |
# Note: --update-env-vars on 'execute' (not 'update') is a per-execution
# override that does not modify the job's stored configuration. See:
# "environment variables overrides for an execution of a job"
gcloud run jobs execute webcmd-reconcile-marketplace \
--region "${{ secrets.GCP_REGION }}" \
--update-env-vars "WEBCMD_PLUGINS_COMMIT=${{ github.sha }}" \
--wait
16 changes: 16 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,26 @@ jobs:
if: ${{ steps.release.outputs.release_created || inputs.publish_tag != '' }}
run: npm run build

- name: Build plugin command manifest
if: ${{ steps.release.outputs.release_created || inputs.publish_tag != '' }}
run: npm run build-plugin-manifest

- name: Check plugin command parity
if: ${{ steps.release.outputs.release_created || inputs.publish_tag != '' }}
run: npm run check:plugin-parity

- name: Check community plugin metadata
if: ${{ steps.release.outputs.release_created || inputs.publish_tag != '' }}
run: npm run check-community-plugins

- name: Check generated contract artifacts
if: ${{ steps.release.outputs.release_created || inputs.publish_tag != '' }}
run: npm run check:hosted-contract

- name: Check all generated artifacts are committed
if: ${{ steps.release.outputs.release_created || inputs.publish_tag != '' }}
run: git diff --exit-code -- cli-manifest.json hosted-contract.json webcmd-plugin.json README.md

- name: Check Codex plugin metadata
if: ${{ steps.release.outputs.release_created || inputs.publish_tag != '' }}
run: npm run check:codex-plugin
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ dist/
!extension/dist/
*.tsbuildinfo
hosted-contract.json
plugin-command-manifest.json
.webcmd/
.superpowers/
.worktrees/
Expand Down
16 changes: 13 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,21 @@ skills with `webcmd skills add` in Codex.

### Other agents or plugin-free setup

Webcmd requires Node.js 20+.
Webcmd requires Node.js 20.6+.

```bash
npm install -g @agentrhq/webcmd
```

The npm package ships the Webcmd core and browser commands, but no site
adapters. Search the plugin catalog and explicitly install the adapter you
need:

```bash
webcmd plugin search <site> -f json
webcmd plugin install <installSource-from-search>
```

```bash
webcmd skills add
```
Expand Down Expand Up @@ -110,7 +119,8 @@ Beyond website adapters, Webcmd can work through authenticated browser sessions,
| AI tools | ChatGPT, Claude, Gemini, NotebookLM | Retrieve conversations, research outputs, notebooks, and generated materials from the tools you already use. |
| shopping and bookings | Amazon, Blinkit, Zepto, BigBasket, District, Practo | Compare products, availability, prices, appointments, events, and delivery options. |

This list is illustrative; ask your agent to use webcmd to discover what is currently available.
This list is illustrative; availability comes from installed plugins. Ask your
agent to search and install the relevant plugin when a site is not installed.

## Learn More

Expand All @@ -130,7 +140,7 @@ Webcmd Cloud can run supported commands and browser sessions on hosted infrastru

| Plugin | Description | Author |
| --- | --- | --- |
| [`pypi`](./plugins/pypi/) | Inspect public Python package metadata and releases from PyPI | [Kemal Kaya](https://github.com/yoldaolmak) |
| [`pypi`](./plugins/pypi/) | Inspect public Python package metadata, downloads, and releases from PyPI | [Kemal Kaya](https://github.com/yoldaolmak) |
| [`skyscanner`](./plugins/skyscanner/) | Skyscanner flight search commands for Webcmd | [Rishabh](https://github.com/rishabhraj36) |
<!-- webcmd-community-plugins:end -->

Expand Down
6 changes: 6 additions & 0 deletions TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,21 @@
```bash
npm run typecheck
npm run build
npm run build-plugin-manifest
npm test
```

`npm run build` must run before plugin tests because repository plugins import
the compiled public package exports. The core package contains no site
adapters; `npm test` runs the unit and generic plugin projects.

## Focused Checks

```bash
npx vitest run --project unit src/skills.test.ts
npx vitest run --project unit src/package-exports.test.ts
npx vitest run --project unit src/convention-audit.test.ts src/runtime-copy.test.ts
npm run test:plugin -- --reporter=verbose
```

## Cloak Runtime Smoke
Expand Down
Loading