Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
b79f428
refactor: rebrand user-visible strings from Liquid Web to Nexcess (SM…
glaubersilva Jun 19, 2026
f07cbfe
Build frontend assets
glaubersilva Jun 19, 2026
d980917
refactor: replace LW logo with NX logo
glaubersilva Jun 19, 2026
ab319e2
Merge remote-tracking branch 'origin/refctor/SMTNC-1494-rebranding' i…
glaubersilva Jun 19, 2026
a771c9f
Build frontend assets
glaubersilva Jun 19, 2026
ebc0414
docs: streamline CONTRIBUTING and extract partner-plugin testing guide
glaubersilva Jun 29, 2026
92ed23a
tests: update expectations for Nexcess rebrand (SMTNC-1494)
glaubersilva Jun 29, 2026
9ba2218
Merge branch 'main' into refctor/SMTNC-1494-rebranding
glaubersilva Jun 29, 2026
974f262
fix: resolve CI lint failures after main merge
glaubersilva Jun 29, 2026
8f3ddab
docs: streamline CONTRIBUTING quick start for harbor-dev-tools workflow
glaubersilva Jun 29, 2026
bff93e9
fix: satisfy cspell in CONTRIBUTING.md
glaubersilva Jun 29, 2026
977018a
refactor: document harbor-dev-tools workflow and legacy slug coverage
glaubersilva Jun 29, 2026
3315b20
doc: add since TBD tags
glaubersilva Jun 30, 2026
19dec0b
Build frontend assets
glaubersilva Jun 30, 2026
df3682c
docs: clarify partner-plugin-testing environment paths and scope
glaubersilva Jun 30, 2026
f526678
chore: add docroot to cspell.json exclusion
glaubersilva Jun 30, 2026
6658689
refactor(admin): restrict PAGE_SLUG_LEGACY visibility to private
glaubersilva Jul 7, 2026
725511a
refactor(admin): extract page slug check to Feature_Manager_Page method
glaubersilva Jul 7, 2026
85bf45c
test(admin): replace PAGE_SLUG_LEGACY constant with literal string in…
glaubersilva Jul 7, 2026
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
6 changes: 6 additions & 0 deletions .cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
"dashicons",
"dealerdirect",
"disconnector",
"docroot",
"dont",
"dpanta",
"eventbrite",
Expand All @@ -68,9 +69,13 @@
"learndash",
"liquidweb",
"litespeed",
"appserver",
"lando",
"lightningcss",
"lndo",
"lucatume",
"lwsw",
"mamp",
"memberdash",
"multisite",
"muwpunit",
Expand Down Expand Up @@ -136,6 +141,7 @@
"wpspin",
"wpunit",
"writeln",
"wamp",
"xdebugging"
],
"dictionaries": [
Expand Down
63 changes: 63 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Contributing to Harbor

## Quick start

**Day-to-day development** with [harbor-dev-tools](https://github.com/stellarwp/harbor-dev-tools) — PHP and UI. Install and activate **harbor-dev-tools** on your local WordPress site, then clone **this repository** as a sibling directory:

```
wp-content/plugins/
├── harbor-dev-tools/ ← active plugin (runs harbor:watch)
└── harbor/ ← this repo (your git checkout)
```

Setup, watch script, Branch Switcher, and fixtures: [harbor-dev-tools README](https://github.com/stellarwp/harbor-dev-tools/blob/main/README.md).

In **harbor-dev-tools** (once per session):

```bash
composer install # first time only
composer harbor:watch # leave running — syncs this repo into WordPress
```

Leave `harbor:watch` running. It picks up PHP changes in `src/` automatically and re-runs Strauss. You do not need `composer install` in this repo for that workflow.

**When you change frontend code** (`resources/`), also in **this repo**:

```bash
bun install # first time only
npm run build # first time, after pulling frontend changes, or one-off
npm run start # leave running while editing — rebuilds on save
```

With `harbor:watch` and `npm run start` both running, each save rebuilds assets here and the sync delivers the new `build/` / `build-dev/` output to WordPress. PHP-only work needs only `harbor:watch`.

Run `npm run` or `composer` in this repo to list available scripts (`package.json` / `composer.json`).

---

## Prerequisites

| Tool | Minimum version | Notes |
| --------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Bun](https://bun.sh) | **1.3.x** | Versions before 1.3.x may not install platform-specific native binary packages (e.g. `lightningcss-linux-x64-gnu`) correctly — `npm run build` will fail with a `Cannot find module` error. Confirmed working on 1.3.14. Run `bun --version` and update if needed: `curl -fsSL https://bun.sh/install \| bash` |
| Node.js | 14+ | Managed by `nvm` or included with Bun. `wp-scripts` requires Node 14+ for optional chaining syntax |
| Composer | 2.x | For PHP dependency management |
| PHP | 7.4+ | Required for Composer scripts and static analysis |

---

## Documentation index

- [docs/harbor.md](docs/harbor.md) — architecture overview
- [docs/guides/integration.md](docs/guides/integration.md) — partner plugin integration
- [docs/guides/testing.md](docs/guides/testing.md) — PHP, E2E, and fixtures
- [docs/guides/partner-plugin-testing.md](docs/guides/partner-plugin-testing.md) — advanced: test local changes inside a real partner plugin (Composer path repo)
- [docs/subsystems/frontend.md](docs/subsystems/frontend.md) — React UI

---

## Release and PR expectations

Production asset bundles in `build/` are gitignored locally but committed by CI during release (`git add -f`). Do not commit local build output manually.

For version bumps and changelog prep, see `composer release:prep` in `composer.json`.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,11 @@ bunx @stellarwp/changelogger write --overwrite-version <version>
2. Review and merge the PR.
3. Create a GitHub Release with a new tag in the format `vX.X.X` targeting the merge commit.

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions, the scripts reference, and
how to test local Harbor changes against a partner plugin without publishing a new release.

## Documentation

Start with [Harbor Overview](/docs/harbor.md) for the full architecture.
Expand Down Expand Up @@ -142,6 +147,7 @@ Start with [Harbor Overview](/docs/harbor.md) for the full architecture.
### Guides

- [Integration Guide](/docs/guides/integration.md) — How to integrate your plugin with Harbor.
- [Partner plugin testing](/docs/guides/partner-plugin-testing.md) — Test local Harbor changes in a real partner plugin (Composer path repo).
- [CLI Commands](/docs/guides/cli.md) — WP-CLI commands for feature management.
- [Testing](/docs/guides/testing.md) — PHP tests with Codeception/`slic`; E2E tests with Playwright/wp-env.

Expand Down
2 changes: 1 addition & 1 deletion build-dev/index.asset.php
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<?php return array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '15d9bcfeaaf63bae053a');
<?php return array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '266733e066b91faca567');
141 changes: 83 additions & 58 deletions build-dev/index.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion build-dev/index.js.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion build/index.asset.php
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<?php return array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '24a939985ffe55bc7ead');
<?php return array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'bc5af93742d258096c66');
20 changes: 10 additions & 10 deletions build/index.js

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions docs/guides/integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ Because Harbor handles this, you should remove or suppress any existing license-

### Notifying users on the legacy license page

If your plugin has its own license settings page, display a notice on that page to inform users that licensing has moved to Liquid Web's unified system:
If your plugin has its own license settings page, display a notice on that page to inform users that licensing has moved to Nexcess's unified system:

```php
// With a product name (recommended)
Expand All @@ -166,7 +166,7 @@ lw_harbor_display_legacy_license_page_notice();

This outputs a standard WordPress info notice:

> GiveWP iss now part of Liquid Web\'s software offerings. This page is still available for managing legacy licenses from your previous GiveWP account. If you purchased a new plan through Liquid Web, your products are managed through the Liquid Web Software Manager.
> GiveWP is now part of Nexcess's software offerings. This page is still available for managing legacy licenses from your previous GiveWP account. If you purchased a new plan through Nexcess, your products are managed through the Nexcess Software Manager.

Call this function directly in the render callback for your legacy license page. Because it echoes immediately when called, no hook registration is needed — it renders wherever you place it.

Expand Down Expand Up @@ -254,13 +254,13 @@ The function always delegates to the highest-version Harbor instance on the site

### Hiding the Settings menu item

By default, Harbor registers a **Liquid Web Products** entry under the WordPress **Settings** menu. If your plugin surfaces the Feature Manager through its own submenu link (above) and you do not want the standalone Settings entry, hook the `lw-harbor/hide_menu_item` filter:
By default, Harbor registers a **Nexcess Products** entry under the WordPress **Settings** menu. If your plugin surfaces the Feature Manager through its own submenu link (above) and you do not want the standalone Settings entry, hook the `lw-harbor/hide_menu_item` filter:

```php
add_filter('lw-harbor/hide_menu_item', '__return_true');
```

The Feature Manager page itself remains registered, so direct URLs continue to work. The filter hides both the standalone **Settings → Liquid Web Products** entry and any submenu items added through `lw_harbor_register_submenu()`.
The Feature Manager page itself remains registered, so direct URLs continue to work. The filter hides both the standalone **Settings → Nexcess Products** entry and any submenu items added through `lw_harbor_register_submenu()`.

---

Expand All @@ -278,7 +278,7 @@ See [Section 2](#2-bundling-a-license-key). Bundling a key is done entirely thro
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `lw_harbor/premium_plugin_exists` | Announce that a premium plugin is present so `Harbor::init()` registers its providers. Receives and returns `bool`. **Must be attached before `Harbor::init()` runs**; see [Initialization](#1-initialization). |
| `lw-harbor/legacy_licenses` | Report pre-existing licenses to Harbor. Receives and returns `array $licenses`. |
| `lw-harbor/hide_menu_item` | Hide the **Liquid Web Products** Settings entry and any `lw_harbor_register_submenu()` items without unregistering the page itself. |
| `lw-harbor/hide_menu_item` | Hide the **Nexcess Products** Settings entry and any `lw_harbor_register_submenu()` items without unregistering the page itself. |

### Actions

Expand Down
Loading
Loading