@onexeor/lumo 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -2
- package/package.json +3 -3
- package/skill/SKILL.md +19 -5
- package/src/commands/init.js +1 -1
- package/src/index.js +2 -2
- package/src/lib/python.js +5 -5
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# lumo — installer
|
|
2
2
|
|
|
3
|
-
One-command installer for [Lumo](https://github.com/OneXeor/lumo): mobile
|
|
3
|
+
One-command installer for [Lumo](https://github.com/OneXeor-Dev/lumo): mobile
|
|
4
4
|
UI/UX design intelligence for AI coding assistants.
|
|
5
5
|
|
|
6
6
|
```bash
|
|
@@ -31,7 +31,7 @@ Under the hood the installer:
|
|
|
31
31
|
|
|
32
32
|
1. Locates a Python 3.10+ interpreter and creates a Lumo-owned venv at
|
|
33
33
|
`~/.lumo/venv` so your system Python stays clean.
|
|
34
|
-
2. `pip install`s [`lumo-
|
|
34
|
+
2. `pip install`s [`lumo-mobile`](https://pypi.org/project/lumo-mobile/) into
|
|
35
35
|
that venv. The CLIs (`lumo-wcag`, `lumo-theory`, `lumo-parity`,
|
|
36
36
|
`lumo-mcp`) become available at absolute paths the MCP configs point to.
|
|
37
37
|
3. Copies the `SKILL.md` bundle into the chosen client's skill directory.
|
|
@@ -42,6 +42,24 @@ Under the hood the installer:
|
|
|
42
42
|
The installer never modifies anything outside `~/.lumo`, the chosen
|
|
43
43
|
client's skill directory, and the chosen client's MCP config file.
|
|
44
44
|
|
|
45
|
+
## Publishing (maintainers only)
|
|
46
|
+
|
|
47
|
+
The installer ships with no npm lifecycle scripts on purpose — Socket.dev
|
|
48
|
+
and similar supply-chain scanners penalise packages that auto-execute
|
|
49
|
+
code on install or pack, even when that code is benign. To publish a
|
|
50
|
+
new version:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
cd installer
|
|
54
|
+
bash scripts/release.sh --dry-run # bundles /skill into installer/skill, npm pack --dry-run
|
|
55
|
+
bash scripts/release.sh # same, but actually publishes
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`release.sh` is the only sanctioned way to build the tarball. Running
|
|
59
|
+
`npm pack` or `npm publish` directly will produce a broken tarball
|
|
60
|
+
without the bundled `SKILL.md`, so `lumo init` would fail
|
|
61
|
+
post-install. The script makes the bundling explicit and Socket-clean.
|
|
62
|
+
|
|
45
63
|
## License
|
|
46
64
|
|
|
47
65
|
MIT
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onexeor/lumo",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Install Lumo — mobile UI/UX design intelligence for AI coding assistants (Claude Code, Cursor, Codex, MCP clients).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"scripts": {
|
|
19
19
|
"start": "node src/index.js",
|
|
20
|
-
"
|
|
20
|
+
"bundle-skill": "node scripts/bundle-skill.js"
|
|
21
21
|
},
|
|
22
22
|
"keywords": [
|
|
23
23
|
"mobile",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"license": "MIT",
|
|
38
38
|
"repository": {
|
|
39
39
|
"type": "git",
|
|
40
|
-
"url": "https://github.com/OneXeor/lumo.git"
|
|
40
|
+
"url": "https://github.com/OneXeor-Dev/lumo.git"
|
|
41
41
|
},
|
|
42
42
|
"engines": {
|
|
43
43
|
"node": ">=18"
|
package/skill/SKILL.md
CHANGED
|
@@ -43,7 +43,15 @@ mobile UI concern, stay out.
|
|
|
43
43
|
|
|
44
44
|
Lumo ships with Python tools. Each tool has a single CLI entry-point with
|
|
45
45
|
deterministic output. Invoke via Bash. Tools live in `tools/lumo/<area>/cli.py`
|
|
46
|
-
and are exposed as console scripts after `pip install -e tools
|
|
46
|
+
and are exposed as console scripts after `pip install -e tools/` or
|
|
47
|
+
`pipx install lumo-mobile`.
|
|
48
|
+
|
|
49
|
+
When running inside an MCP-aware client (Cursor, Continue, Aider, Goose,
|
|
50
|
+
Zed, Codex, or Claude Code with MCP enabled), the same four tools are
|
|
51
|
+
also exposed as MCP functions: `lumo_wcag_check`, `lumo_wcag_fix`,
|
|
52
|
+
`lumo_theory_check`, `lumo_parity_diff`. Prefer the MCP function over
|
|
53
|
+
spawning a Bash subprocess when available — the structured response is
|
|
54
|
+
already JSON and the user does not see noisy command output.
|
|
47
55
|
|
|
48
56
|
### `lumo-wcag` — WCAG contrast validator + OKLCH auto-correct
|
|
49
57
|
|
|
@@ -135,10 +143,16 @@ Layout JSON schema:
|
|
|
135
143
|
- `group` is a free-form string used by Hick (equal-weight overload) and
|
|
136
144
|
Gestalt proximity.
|
|
137
145
|
- `source` reports honesty: `measured` means the coordinates came from a
|
|
138
|
-
real device
|
|
139
|
-
SwiftUI `GeometryReader
|
|
140
|
-
|
|
141
|
-
|
|
146
|
+
real device or a snapshot-testing framework — Espresso, XCUITest,
|
|
147
|
+
Compose `onGloballyPositioned`, SwiftUI `GeometryReader`, **Paparazzi**
|
|
148
|
+
(Compose snapshot tests by Cash App / JetBrains), or
|
|
149
|
+
`xcodebuild test --only-testing` with `XCTAttachment` /
|
|
150
|
+
`swift-snapshot-testing`. `code-estimated` means the layout was parsed
|
|
151
|
+
from source code statically (theme tokens, `fillMaxWidth`, dynamic
|
|
152
|
+
type — anything that resolves at runtime — is a guess).
|
|
153
|
+
`description-estimated` means the layout was built from a screenshot
|
|
154
|
+
description or natural-language prompt. The tool propagates this value
|
|
155
|
+
to every finding so the user can weigh confidence.
|
|
142
156
|
|
|
143
157
|
When you (the model) construct a layout from a screenshot or from Compose
|
|
144
158
|
/ SwiftUI source code, set `source` to the matching honest label. Do not
|
package/src/commands/init.js
CHANGED
|
@@ -40,7 +40,7 @@ export async function initCommand(opts) {
|
|
|
40
40
|
|
|
41
41
|
const targets = await pickClient(opts.ai, opts.all);
|
|
42
42
|
|
|
43
|
-
console.log(kleur.dim("→ installing Python tools (lumo-
|
|
43
|
+
console.log(kleur.dim("→ installing Python tools (lumo-mobile) into ~/.lumo/venv ..."));
|
|
44
44
|
try {
|
|
45
45
|
if (opts.dev) {
|
|
46
46
|
const dev = devSource();
|
package/src/index.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* uninstall [--ai <client>] Remove the Lumo skill (Python tools left intact).
|
|
9
9
|
*
|
|
10
10
|
* Supported AI clients in v0.1: claude, cursor, codex, generic.
|
|
11
|
-
* Other clients can still consume Lumo via `npx skills add OneXeor/lumo`
|
|
11
|
+
* Other clients can still consume Lumo via `npx skills add OneXeor-Dev/lumo`
|
|
12
12
|
* or by pointing their MCP config at `lumo-mcp`.
|
|
13
13
|
*/
|
|
14
14
|
|
|
@@ -27,7 +27,7 @@ program
|
|
|
27
27
|
"Mobile UI/UX design intelligence — WCAG / parity / cognitive-science checks " +
|
|
28
28
|
"for Jetpack Compose, Android XML, SwiftUI, UIKit."
|
|
29
29
|
)
|
|
30
|
-
.version("0.0.
|
|
30
|
+
.version("0.0.3");
|
|
31
31
|
|
|
32
32
|
program
|
|
33
33
|
.command("init")
|
package/src/lib/python.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Python detection and lumo-
|
|
2
|
+
* Python detection and lumo-mobile install helpers.
|
|
3
3
|
*
|
|
4
4
|
* Strategy:
|
|
5
5
|
* - Locate a Python ≥3.10 interpreter (python3, python, py -3 on Windows).
|
|
6
6
|
* - Maintain a Lumo-owned venv at ~/.lumo/venv so user system Python stays clean.
|
|
7
|
-
* - Install lumo-
|
|
7
|
+
* - Install lumo-mobile into that venv via pip — from PyPI by default,
|
|
8
8
|
* from a local git path when --dev was passed.
|
|
9
9
|
* - Expose absolute paths to each console script so SKILL.md and MCP configs
|
|
10
10
|
* can reference them without depending on PATH.
|
|
@@ -65,11 +65,11 @@ export async function ensureVenv() {
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
|
-
* Install lumo-
|
|
68
|
+
* Install lumo-mobile into the Lumo-owned venv.
|
|
69
69
|
*
|
|
70
70
|
* @param {object} opts
|
|
71
71
|
* @param {string} [opts.source] Local path to install from (used with --dev).
|
|
72
|
-
* When omitted, installs `lumo-
|
|
72
|
+
* When omitted, installs `lumo-mobile` from PyPI.
|
|
73
73
|
*/
|
|
74
74
|
export async function installLumoTools(opts = {}) {
|
|
75
75
|
await ensureVenv();
|
|
@@ -78,7 +78,7 @@ export async function installLumoTools(opts = {}) {
|
|
|
78
78
|
if (opts.source) {
|
|
79
79
|
args.push("-e", opts.source);
|
|
80
80
|
} else {
|
|
81
|
-
args.push("lumo-
|
|
81
|
+
args.push("lumo-mobile");
|
|
82
82
|
}
|
|
83
83
|
await execFileP(pip, args, { maxBuffer: 20 * 1024 * 1024 });
|
|
84
84
|
}
|