@onexeor/lumo 0.0.1 → 0.0.2
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 +2 -2
- package/package.json +2 -2
- package/skill/SKILL.md +10 -4
- 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.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onexeor/lumo",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
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": {
|
|
@@ -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
|
@@ -135,10 +135,16 @@ Layout JSON schema:
|
|
|
135
135
|
- `group` is a free-form string used by Hick (equal-weight overload) and
|
|
136
136
|
Gestalt proximity.
|
|
137
137
|
- `source` reports honesty: `measured` means the coordinates came from a
|
|
138
|
-
real device
|
|
139
|
-
SwiftUI `GeometryReader
|
|
140
|
-
|
|
141
|
-
|
|
138
|
+
real device or a snapshot-testing framework — Espresso, XCUITest,
|
|
139
|
+
Compose `onGloballyPositioned`, SwiftUI `GeometryReader`, **Paparazzi**
|
|
140
|
+
(Compose snapshot tests by Cash App / JetBrains), or
|
|
141
|
+
`xcodebuild test --only-testing` with `XCTAttachment` /
|
|
142
|
+
`swift-snapshot-testing`. `code-estimated` means the layout was parsed
|
|
143
|
+
from source code statically (theme tokens, `fillMaxWidth`, dynamic
|
|
144
|
+
type — anything that resolves at runtime — is a guess).
|
|
145
|
+
`description-estimated` means the layout was built from a screenshot
|
|
146
|
+
description or natural-language prompt. The tool propagates this value
|
|
147
|
+
to every finding so the user can weigh confidence.
|
|
142
148
|
|
|
143
149
|
When you (the model) construct a layout from a screenshot or from Compose
|
|
144
150
|
/ 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.2");
|
|
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
|
}
|