Skip to content

Commit ae263f9

Browse files
bpamiricursoragent
andauthored
fix: advertise wheels packages add (not install) on docs and help
* fix: advertise wheels packages add on docs, help, and packages site LuCLI intercepts `packages install` before Module.cfc, so user-facing copy, --help, and the packages website now lead with `add`. The Basecoat chapter also copies the showcase from vendor/ after add, not GitHub. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Peter Amiri <peter@alurium.com> * chore(web): refresh packages-site visual baselines for add verb The packages index and wheels-sentry canaries now screenshot `wheels packages add` instead of the intercepted `install` verb. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Peter Amiri <peter@alurium.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com>
1 parent 7bef4ed commit ae263f9

15 files changed

Lines changed: 177 additions & 13 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Docs, `--help`, and the packages website now agree that the install verb is `wheels packages add``wheels packages install` is intercepted by LuCLI before the Wheels module runs and does not install anything. The Basecoat bonus chapter also says to copy the showcase from `vendor/` after `add`, not from the raw GitHub tree (#3378)

cli/lucli/Module.cfc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2615,7 +2615,7 @@ component extends="modules.BaseModule" {
26152615
// ─────────────────────────────────────────────────
26162616

26172617
/**
2618-
* hint: Install, update, and list Wheels packages — use `add` (not `install`) to install
2618+
* hint: Add, update, and list Wheels packages (verb is `add`, not `install`)
26192619
*
26202620
* The verb is `add`, NOT `install`. Typing `wheels packages install <name>`
26212621
* is intercepted by LuCLI's built-in extension installer before dispatch
@@ -2716,7 +2716,7 @@ component extends="modules.BaseModule" {
27162716
var regCli = new modules.wheels.services.packages.PackagesRegistryCli();
27172717
return invoke(regCli, regVerb, [opts]);
27182718
default:
2719-
throw(message="Unknown packages subcommand: #sub#");
2719+
throw(message="Unknown packages subcommand: #sub#. The install verb is `add` (not `install`): wheels packages add <name>");
27202720
}
27212721
}
27222722

vendor/wheels/tests/specs/cli/PackagesCommandHelpSpec.cfc

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,34 @@ component extends="wheels.WheelsTest" {
6363
}
6464
});
6565

66+
it("packages() hint metadata leads with `Add`, not the intercepted `Install` verb", () => {
67+
var source = fileRead(ctx.modulePath);
68+
69+
// LuCLI surfaces the `hint:` javadoc on the packages() function
70+
// in auto-introspected help. Leading with "Install" nudges
71+
// users toward `wheels packages install`, which never reaches
72+
// this module.
73+
expect(source contains "hint: Install, update, and list Wheels packages").toBeFalse(
74+
"packages() hint still leads with `Install`. Lead with `Add` "
75+
& "(the canonical verb) so auto-introspected help matches showHelp()."
76+
);
77+
expect(source contains "hint: Add, update, and list Wheels packages").toBeTrue(
78+
"packages() hint should lead with `Add, update, and list ...` "
79+
& "and mention that the verb is `add`, not `install`."
80+
);
81+
});
82+
83+
it("unknown-subcommand error points users at `wheels packages add`", () => {
84+
var source = fileRead(ctx.modulePath);
85+
86+
expect(source contains "Unknown packages subcommand").toBeTrue(
87+
"Expected the packages() default branch to throw an unknown-subcommand error."
88+
);
89+
expect(source contains "The install verb is `add` (not `install`): wheels packages add <name>").toBeTrue(
90+
"The unknown-subcommand error should tell users the install verb is `add`."
91+
);
92+
});
93+
6694
});
6795

6896
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/**
2+
* User-facing surfaces must advertise `wheels packages add`, not
3+
* `wheels packages install`. LuCLI intercepts the literal `install`
4+
* subcommand before Module.cfc runs (#2610, #2706, #3378).
5+
*
6+
* Mentions of `install` that explicitly say it is not the verb are fine;
7+
* copy-to-clipboard snippets and recommended commands are not.
8+
*/
9+
component extends="wheels.WheelsTest" {
10+
11+
function run() {
12+
13+
var ctx = {repoRoot: expandPath("/wheels/../..")};
14+
15+
describe("User-facing surfaces advertise `packages add`", () => {
16+
17+
it("the in-app packages page copies `wheels packages add`", () => {
18+
var path = expandPath("/wheels/public/views/packagelist.cfm");
19+
expect(fileExists(path)).toBeTrue("Missing file: " & path);
20+
var source = fileRead(path);
21+
22+
expect(source contains "wheels packages add ").toBeTrue(
23+
"packagelist.cfm copy snippet must use `wheels packages add`."
24+
);
25+
expect(source contains "wheels packages install ").toBeFalse(
26+
"packagelist.cfm must not put `wheels packages install` in a copy snippet. "
27+
& "LuCLI intercepts that verb before Module.cfc."
28+
);
29+
});
30+
31+
it("the packages website copy snippets use `add`, not `install`", () => {
32+
var files = [
33+
ctx.repoRoot & "/web/sites/packages/src/pages/index.astro",
34+
ctx.repoRoot & "/web/sites/packages/src/pages/[name].astro",
35+
ctx.repoRoot & "/web/sites/packages/src/components/PackageCard.astro"
36+
];
37+
var i = 0;
38+
var n = arrayLen(files);
39+
for (i = 1; i <= n; i++) {
40+
expect(fileExists(files[i])).toBeTrue("Missing file: " & files[i]);
41+
var source = fileRead(files[i]);
42+
43+
// Copy-to-clipboard / recommended command shapes.
44+
expect(find("wheels packages install {", source) > 0).toBeFalse(
45+
files[i] & " still has a copy snippet `wheels packages install {name}`. Use `add`."
46+
);
47+
expect(find("wheels packages install &lt;name&gt;", source) > 0).toBeFalse(
48+
files[i] & " still recommends `wheels packages install <name>`. Use `add`."
49+
);
50+
}
51+
});
52+
53+
it("the packages website index recommends `wheels packages add`", () => {
54+
var path = ctx.repoRoot & "/web/sites/packages/src/pages/index.astro";
55+
var source = fileRead(path);
56+
expect(source contains "wheels packages add &lt;name&gt;").toBeTrue(
57+
"packages site index should recommend `wheels packages add <name>`."
58+
);
59+
});
60+
61+
});
62+
63+
}
64+
65+
}

web/sites/guides/astro.config.mjs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,12 @@ export default defineConfig({
122122
'/v4-0-0/digging-deeper/security/https-detection': '/v4-0-0/deployment/security-hardening/',
123123
'/v4-0-0/configuration': '/v4-0-0/core-concepts/environments-and-configuration/',
124124
'/v4-0-0/troubleshooting/cross-engine-compatibility': '/v4-0-0/contributing/coding-standards/',
125+
// The `packages add` reference lived at .../packages/install/ while the
126+
// page title already said `add`. The old slug advertised the broken
127+
// LuCLI-intercepted verb. Keep the old URL working. One source only —
128+
// listing both `/install` and `/install/` made Astro warn that the
129+
// route was defined twice.
130+
'/v4-0-0/command-line-tools/commands/packages/install': '/v4-0-0/command-line-tools/commands/packages/add/',
125131
},
126132
integrations: [
127133
starlight({

web/sites/guides/src/content/docs/v4-0-0/command-line-tools/commands/packages/install.mdx renamed to web/sites/guides/src/content/docs/v4-0-0/command-line-tools/commands/packages/add.mdx

File renamed without changes.

web/sites/guides/src/content/docs/v4-0-0/command-line-tools/commands/packages/index.mdx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ sidebar:
88

99
`wheels packages` is the CLI surface for the [wheels-packages registry](https://github.com/wheels-dev/wheels-packages) — a curated, git-based distribution channel for Wheels ecosystem packages. Every verb talks to the registry over plain HTTPS and installs into `vendor/<name>/`, where `PackageLoader` picks it up on next reload.
1010

11+
The install verb is [`add`](./add). `wheels packages install <name>` never reaches this command — LuCLI's built-in extension installer intercepts the literal `install` subcommand and prints `No git or extension dependencies to install` without touching `vendor/`.
12+
1113
There is no ForgeBox and no CommandBox. The registry manifest is authoritative, tarballs live on the registry's GitHub Releases, and every tarball has a sha256 in the manifest that the installer verifies before extraction. Supply-chain attacks via force-pushed tags or drifted source archives are defeated by this design.
1214

1315
## Synopsis
@@ -31,7 +33,7 @@ wheels packages registry info
3133
| [`list`](./list) | Show every package in the registry, optionally filtered by `--tag`. |
3234
| [`search`](./search) | Substring match against name, description, and tags. |
3335
| [`show`](./show) | Detail page for a package: versions, homepage, license, install state. |
34-
| [`add`](./install) | Download, verify, extract into `vendor/<name>/`. |
36+
| [`add`](./add) | Download, verify, extract into `vendor/<name>/`. |
3537
| [`update`](./update) | Re-install the latest compatible version. Explicit: requires `--yes`. |
3638
| [`remove`](./remove) | Delete `vendor/<name>/`. Refuses dirs without a `package.json`. |
3739
| [`registry refresh`](./registry/refresh) | Bust the 24h cache. |

web/sites/guides/src/content/docs/v4-0-0/digging-deeper/packages.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ The reload re-runs `PackageLoader`, which rediscovers what's in `vendor/` and re
6464
Six packages are maintained as first-party modules under the `wheels-dev` GitHub org. All are optional; the framework core runs fine with none of them installed.
6565

6666
- **[`wheels-hotwire`](https://github.com/wheels-dev/wheels-hotwire)** — Turbo Drive, Turbo Frames, Turbo Streams, and Stimulus integration for server-rendered UI. Mixes into controllers (and therefore views). Used heavily in the tutorial app.
67-
- **[`wheels-basecoat`](https://github.com/wheels-dev/wheels-basecoat)** — UI component helpers styled with Tailwind CSS. shadcn/ui-quality forms, buttons, and cards without React. Mixes into controllers.
67+
- **[`wheels-basecoat`](https://github.com/wheels-dev/wheels-basecoat)** — UI component helpers styled with Tailwind CSS. shadcn/ui-quality forms, buttons, and cards without React. Mixes into controllers. Add it with `wheels packages add wheels-basecoat` (the verb is `add`, not `install`), then copy CSS and the optional showcase from `vendor/wheels-basecoat/` — not from the raw GitHub tree. The [bonus tutorial chapter](/v4-0-0/start-here/tutorial/08-bonus-basecoat/) walks through both.
6868
- **[`wheels-sentry`](https://github.com/wheels-dev/wheels-sentry)** — Sentry.io error tracking with framework-aware context enrichment. Captures exceptions with request, user, and route context. Mixes into controllers.
6969
- **[`wheels-legacy-adapter`](https://github.com/wheels-dev/wheels-legacy-adapter)** — Backward-compatibility shim for Wheels 3.x plugins. Deprecation logging, API adapters, and a scanner that flags 3.x patterns you should modernize. Mixes into controllers.
7070
- **[`wheels-i18n`](https://github.com/wheels-dev/wheels-i18n)** — Internationalization with JSON-file or database-backed translations, parameter interpolation, and pluralization. Mixes into controllers.

web/sites/guides/src/content/docs/v4-0-0/start-here/tutorial/08-bonus-basecoat.mdx

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,52 @@ Three things to verify:
304304

305305
**Card content is wrapped in a frame but no styling** — basecoat's JS bundle is failing to load. Check `public/assets/basecoat/basecoat.min.js` exists and look in the browser console for a network error on `/assets/basecoat/`.
306306

307+
## Optional: the Basecoat showcase
308+
309+
The package ships a full component gallery under `vendor/wheels-basecoat/examples/showcase/`. Use it to browse every helper (`uiBadge`, `uiAlert`, `uiDropdown`, …) against the version you just added.
310+
311+
<Aside type="caution">
312+
Copy the showcase from `vendor/wheels-basecoat/` after `wheels packages add` — not from the raw GitHub tree. The GitHub `main` branch can be newer than the tarball the registry served, so a view copied from GitHub may call helpers (for example `uiBadge`) that the installed package does not yet mix in.
313+
</Aside>
314+
315+
<Steps>
316+
317+
1. Add the package if you have not already:
318+
319+
```bash title="your shell"
320+
wheels packages add wheels-basecoat
321+
```
322+
323+
2. Copy the bundled CSS+JS (same step as [Publish the basecoat assets](#publish-the-basecoat-assets)) and the showcase controller + views from `vendor/`:
324+
325+
```bash title="macOS / Linux"
326+
cp -r vendor/wheels-basecoat/assets/basecoat public/assets/basecoat
327+
cp vendor/wheels-basecoat/examples/showcase/controllers/Showcase.cfc app/controllers/Showcase.cfc
328+
cp -r vendor/wheels-basecoat/examples/showcase/views/showcase app/views/showcase
329+
```
330+
331+
```bat title="Windows (cmd)"
332+
xcopy /E /I vendor\wheels-basecoat\assets\basecoat public\assets\basecoat
333+
copy vendor\wheels-basecoat\examples\showcase\controllers\Showcase.cfc app\controllers\Showcase.cfc
334+
xcopy /E /I vendor\wheels-basecoat\examples\showcase\views\showcase app\views\showcase
335+
```
336+
337+
3. Add a named route in `config/routes.cfm` (before `.wildcard()`):
338+
339+
```cfm title="config/routes.cfm"
340+
.get(name="basecoatShowcase", pattern="/basecoat-showcase", to="showcase##index")
341+
```
342+
343+
4. Reload and open the gallery:
344+
345+
```bash title="your shell"
346+
wheels reload
347+
```
348+
349+
Visit `/basecoat-showcase`. Always check `vendor/wheels-basecoat/INSTALL.md` for the version you added — the asset and showcase layout can change between majors.
350+
351+
</Steps>
352+
307353
## What's next
308354

309355
This chapter converted one view. The other views (`index.cfm`, `new.cfm`, `edit.cfm`, the comment partials, the auth screens from Part 6) are still on simple.css. Converting them is a mechanical exercise — the helpers are documented in the [wheels-basecoat README](https://github.com/wheels-dev/wheels-basecoat#component-reference).

web/sites/guides/src/sidebars/v4-0-0.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@
202202
{ "label": "packages list", "link": "/v4-0-0/command-line-tools/commands/packages/list/" },
203203
{ "label": "packages search", "link": "/v4-0-0/command-line-tools/commands/packages/search/" },
204204
{ "label": "packages show", "link": "/v4-0-0/command-line-tools/commands/packages/show/" },
205-
{ "label": "packages add", "link": "/v4-0-0/command-line-tools/commands/packages/install/" },
205+
{ "label": "packages add", "link": "/v4-0-0/command-line-tools/commands/packages/add/" },
206206
{ "label": "packages update", "link": "/v4-0-0/command-line-tools/commands/packages/update/" },
207207
{ "label": "packages remove", "link": "/v4-0-0/command-line-tools/commands/packages/remove/" },
208208
{

0 commit comments

Comments
 (0)