@overcrow/mcp 0.1.3 → 0.1.5
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 +12 -7
- package/dist/bootstrap/pin.js +19 -1
- package/dist/bootstrap/pin.json +47 -43
- package/dist/cli.js +14 -4
- package/dist/content/docs/en/cli.md +34 -32
- package/dist/content/docs/en/dev-channel.md +5 -5
- package/dist/content/docs/en/elements.md +5 -5
- package/dist/content/docs/en/forms.md +32 -30
- package/dist/content/docs/en/guide.md +16 -16
- package/dist/content/docs/en/index.md +12 -12
- package/dist/content/docs/en/limits.md +5 -4
- package/dist/content/docs/en/logic.md +30 -28
- package/dist/content/docs/en/manifest.md +35 -33
- package/dist/content/docs/en/mcp.md +13 -13
- package/dist/content/docs/en/package.md +7 -7
- package/dist/content/docs/en/publish-keys.md +6 -5
- package/dist/content/docs/en/publishing.md +9 -8
- package/dist/content/docs/en/reference.md +5 -5
- package/dist/content/docs/en/result-shapes.md +3 -3
- package/dist/content/docs/en/sdk.md +11 -11
- package/dist/content/docs/en/security.md +30 -30
- package/dist/content/docs/en/service-reference.md +2 -2
- package/dist/content/docs/en/services.md +33 -32
- package/dist/content/docs/en/style-properties.md +2 -2
- package/dist/content/docs/en/style.md +19 -18
- package/dist/content/docs/en/testing.md +36 -35
- package/dist/content/docs/en/view.md +13 -12
- package/dist/content/docs/en/widget-statistics.md +18 -17
- package/dist/content/docs/en/widgets.md +1 -1
- package/dist/content/docs/fr/cli.md +35 -30
- package/dist/content/docs/fr/dev-channel.md +8 -8
- package/dist/content/docs/fr/elements.md +5 -5
- package/dist/content/docs/fr/forms.md +35 -34
- package/dist/content/docs/fr/guide.md +13 -12
- package/dist/content/docs/fr/index.md +15 -15
- package/dist/content/docs/fr/limits.md +5 -5
- package/dist/content/docs/fr/logic.md +42 -37
- package/dist/content/docs/fr/manifest.md +40 -39
- package/dist/content/docs/fr/mcp.md +21 -19
- package/dist/content/docs/fr/package.md +8 -7
- package/dist/content/docs/fr/publish-keys.md +6 -5
- package/dist/content/docs/fr/publishing.md +8 -8
- package/dist/content/docs/fr/reference.md +6 -6
- package/dist/content/docs/fr/result-shapes.md +4 -3
- package/dist/content/docs/fr/sdk.md +12 -11
- package/dist/content/docs/fr/security.md +41 -39
- package/dist/content/docs/fr/service-reference.md +2 -2
- package/dist/content/docs/fr/services.md +34 -33
- package/dist/content/docs/fr/style-properties.md +2 -2
- package/dist/content/docs/fr/style.md +25 -22
- package/dist/content/docs/fr/testing.md +43 -43
- package/dist/content/docs/fr/view.md +17 -16
- package/dist/content/docs/fr/widget-statistics.md +20 -20
- package/dist/content/docs/fr/widgets.md +1 -1
- package/dist/content/examples/clock/README.md +3 -3
- package/dist/content/examples/fps/README.md +3 -3
- package/dist/content/examples/media/README.md +2 -2
- package/dist/content/examples/notes/README.md +1 -1
- package/dist/content/examples/performance/README.md +2 -2
- package/dist/content/examples/playervox-journal/README.md +5 -5
- package/dist/content/examples/playervox-rating/README.md +3 -3
- package/dist/content/examples/playervox-reviews/README.md +3 -3
- package/dist/content/examples/playervox-score/README.md +3 -3
- package/dist/content/examples/session/README.md +3 -3
- package/dist/content/examples/stopwatch/README.md +3 -3
- package/dist/content/examples/twitch-chat/README.md +4 -4
- package/dist/content/examples/warframe-market/README.md +2 -2
- package/dist/content/reference/errors.json +16 -16
- package/dist/prompts.js +2 -2
- package/dist/resources.js +1 -1
- package/dist/text.js +10 -2
- package/dist/texts.js +1 -1
- package/dist/tools/build.js +16 -10
- package/dist/tools/common.js +19 -12
- package/dist/tools/submission.js +7 -4
- package/dist/typescript.js +38 -0
- package/dist/version.js +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ VS Code or Codex, and the assistant can create a widget, check it, test it,
|
|
|
6
6
|
audit its security and lightness, package it and prepare its submission.
|
|
7
7
|
|
|
8
8
|
You need Node.js 22.18 or later, nothing else: the server installs the
|
|
9
|
-
OverCrow creator tools it needs by itself.
|
|
9
|
+
PlayerVox OverCrow creator tools it needs by itself.
|
|
10
10
|
|
|
11
11
|
```sh
|
|
12
12
|
claude mcp add overcrow -- npx -y @overcrow/mcp
|
|
@@ -45,7 +45,7 @@ use; `--tools-zip <file>` gives a local copy of the creator tools ZIP.
|
|
|
45
45
|
| `audit` | Security and lightness, scored out of 100, with fixes and examples |
|
|
46
46
|
| `explain_permission`, `explain_error` | A permission or a code, in plain words |
|
|
47
47
|
| `search_docs`, `read_doc`, `read_example` | The documentation and the reference widgets, offline |
|
|
48
|
-
| `prepare_submission` | Everything the OverCrow creator space asks for, checked; the ZIP of the sources in `dist/`; the texts to draft with you |
|
|
48
|
+
| `prepare_submission` | Everything the PlayerVox OverCrow creator space asks for, checked; the ZIP of the sources in `dist/`; the texts to draft with you |
|
|
49
49
|
|
|
50
50
|
Resources: the documentation (`overcrow://docs/{en,fr}/…`), the manifest
|
|
51
51
|
reference, the limits, the templates and the reference widgets. Prompts:
|
|
@@ -56,14 +56,19 @@ reference, the limits, the templates and the reference widgets. Prompts:
|
|
|
56
56
|
- The server works only in your project folders, through their real paths:
|
|
57
57
|
no system folder, no whole home folder, no link that leads out, no
|
|
58
58
|
hidden folder.
|
|
59
|
-
- It runs the OverCrow widget CLI and npm, without a shell, with a
|
|
60
|
-
environment (no token is passed on), time limits and bounded output.
|
|
61
|
-
never runs a command chosen by the assistant.
|
|
62
|
-
- It downloads only the creator tools ZIP of the OverCrow release this
|
|
59
|
+
- It runs the PlayerVox OverCrow widget CLI and npm, without a shell, with a
|
|
60
|
+
minimal environment (no token is passed on), time limits and bounded output.
|
|
61
|
+
It never runs a command chosen by the assistant.
|
|
62
|
+
- It downloads only the creator tools ZIP of the PlayerVox OverCrow release this
|
|
63
63
|
version pins, from GitHub, and checks its size and SHA-256 and every file
|
|
64
64
|
in it before use. npm installs only `@overcrow/sdk` and TypeScript, with
|
|
65
65
|
install scripts disabled, and their integrity is checked against the
|
|
66
66
|
pinned published packages.
|
|
67
|
+
- A project's own code never runs: check, test and package type-check only
|
|
68
|
+
with the TypeScript `install_sdk` installed, while its files are
|
|
69
|
+
unchanged. Otherwise they skip the type check and say so; run
|
|
70
|
+
`install_sdk` to check the types.
|
|
71
|
+
- Text that reaches the assistant carries no invisible character.
|
|
67
72
|
- Replacing reference images and installing packages need an explicit
|
|
68
73
|
confirmation; the server deletes nothing in your project.
|
|
69
74
|
- Text read from your files and from the tools is returned marked as data:
|
|
@@ -71,7 +76,7 @@ reference, the limits, the templates and the reference widgets. Prompts:
|
|
|
71
76
|
instructions found in it.
|
|
72
77
|
- No telemetry. Logs go to standard error, without your paths.
|
|
73
78
|
- It never sends, signs or publishes anything: you send the sources ZIP
|
|
74
|
-
in the OverCrow creator space, at creators.playervox.com.
|
|
79
|
+
in the PlayerVox OverCrow creator space, at creators.playervox.com.
|
|
75
80
|
|
|
76
81
|
## Platforms
|
|
77
82
|
|
package/dist/bootstrap/pin.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// in it (the `creatorTools` entry of the release's public release.json,
|
|
4
4
|
// copied by `scripts/pin-release.mjs`). Nothing else is ever downloaded.
|
|
5
5
|
import { readFileSync } from "node:fs";
|
|
6
|
+
export const TYPESCRIPT_FILES = ["lib/tsc.js", "lib/_tsc.js"];
|
|
6
7
|
export const RELEASES_REPOSITORY = "Valhallab/playervox-overcrow-releases";
|
|
7
8
|
export const DOWNLOAD_HOSTS = [
|
|
8
9
|
"github.com",
|
|
@@ -34,7 +35,24 @@ export function validatePin(value) {
|
|
|
34
35
|
fail(`${name} integrity`);
|
|
35
36
|
return { version: version, integrity: integrity };
|
|
36
37
|
};
|
|
37
|
-
const
|
|
38
|
+
const files = (packages.typescript ?? {}).files;
|
|
39
|
+
if (typeof files !== "object" || files === null)
|
|
40
|
+
fail("typescript files");
|
|
41
|
+
const fileDigests = files;
|
|
42
|
+
if (Object.keys(fileDigests).sort().join() !== [...TYPESCRIPT_FILES].sort().join())
|
|
43
|
+
fail("typescript files");
|
|
44
|
+
for (const file of TYPESCRIPT_FILES) {
|
|
45
|
+
const digest = fileDigests[file];
|
|
46
|
+
if (typeof digest !== "string" || !HEX64.test(digest))
|
|
47
|
+
fail(`typescript ${file} digest`);
|
|
48
|
+
}
|
|
49
|
+
const npmPins = {
|
|
50
|
+
sdk: pinnedPackage("@overcrow/sdk"),
|
|
51
|
+
typescript: {
|
|
52
|
+
...pinnedPackage("typescript"),
|
|
53
|
+
files: fileDigests,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
38
56
|
if (release === null)
|
|
39
57
|
return { release: null, tools: {}, npm: npmPins };
|
|
40
58
|
if (typeof release !== "string" || !VERSION.test(release))
|
package/dist/bootstrap/pin.json
CHANGED
|
@@ -1,107 +1,107 @@
|
|
|
1
1
|
{
|
|
2
|
-
"release": "0.7.
|
|
2
|
+
"release": "0.7.2-beta.1",
|
|
3
3
|
"tools": {
|
|
4
4
|
"linux-x86_64": {
|
|
5
|
-
"name": "overcrow-creator-tools-0.7.
|
|
6
|
-
"size":
|
|
7
|
-
"sha256": "
|
|
5
|
+
"name": "overcrow-creator-tools-0.7.2-beta.1-linux-x86_64.zip",
|
|
6
|
+
"size": 15992509,
|
|
7
|
+
"sha256": "8ef74f86d6f754036de4b20609196a7933c47522514446b2579b9a92a83425dd",
|
|
8
8
|
"files": [
|
|
9
9
|
{
|
|
10
|
-
"path": "overcrow-creator-tools-0.7.
|
|
10
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-linux-x86_64/README.txt",
|
|
11
11
|
"size": 1636,
|
|
12
|
-
"sha256": "
|
|
12
|
+
"sha256": "3487492fc93226a72d474e391bf8e714147148aef182239c38b67584c908abf8"
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
|
-
"path": "overcrow-creator-tools-0.7.
|
|
15
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-linux-x86_64/SHA256SUMS",
|
|
16
16
|
"size": 797,
|
|
17
|
-
"sha256": "
|
|
17
|
+
"sha256": "e1cb2fb41b01b52d20a46c84e497aa7af35a680dda21fc2e4be793e6762fb896"
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
|
-
"path": "overcrow-creator-tools-0.7.
|
|
20
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-linux-x86_64/cli.json",
|
|
21
21
|
"size": 1014,
|
|
22
|
-
"sha256": "
|
|
22
|
+
"sha256": "596f02e649d58803f4580b0e62f67be4737bb54bb670fd1cbd08989007161406"
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
|
-
"path": "overcrow-creator-tools-0.7.
|
|
25
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-linux-x86_64/overcrow-widget-1.0.0-beta.5-LICENSE.txt",
|
|
26
26
|
"size": 1071,
|
|
27
27
|
"sha256": "c159eef41245fe20d4cd29fc33a0e88a85f47b53ac321f266abfb7b707aee8c3"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
|
-
"path": "overcrow-creator-tools-0.7.
|
|
30
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-linux-x86_64/overcrow-widget-1.0.0-beta.5-THIRD-PARTY-NOTICES.md",
|
|
31
31
|
"size": 212099,
|
|
32
32
|
"sha256": "8c679481b61f9fb4c8352bd4d1c3bcfc23acf4d51b8252140ed214b1f5b756c4"
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
|
-
"path": "overcrow-creator-tools-0.7.
|
|
36
|
-
"size":
|
|
37
|
-
"sha256": "
|
|
35
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-linux-x86_64/overcrow-widget-1.0.0-beta.5-linux-x86_64",
|
|
36
|
+
"size": 9508600,
|
|
37
|
+
"sha256": "e899ab38f6c72e41e15a81de469fee0093394297bd0288338627e3b39e6348e0"
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
|
-
"path": "overcrow-creator-tools-0.7.
|
|
40
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-linux-x86_64/overcrow-widget-headless-0.7.2-beta.1-LICENSE.md",
|
|
41
41
|
"size": 217457,
|
|
42
|
-
"sha256": "
|
|
42
|
+
"sha256": "a20df95a937c0c4e794edd027042bbe3fb0427d0e7d16fe2ed8f12d96bf23b03"
|
|
43
43
|
},
|
|
44
44
|
{
|
|
45
|
-
"path": "overcrow-creator-tools-0.7.
|
|
45
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-linux-x86_64/overcrow-widget-headless-0.7.2-beta.1-linux-x86_64",
|
|
46
46
|
"size": 24959192,
|
|
47
|
-
"sha256": "
|
|
47
|
+
"sha256": "ad3553c91fbbc2484b7534d61b77e54731c3413588b4b1cfa85e17da0d6d6c64"
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
|
-
"path": "overcrow-creator-tools-0.7.
|
|
50
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-linux-x86_64/runtimes.json",
|
|
51
51
|
"size": 774,
|
|
52
|
-
"sha256": "
|
|
52
|
+
"sha256": "c354b0e4bdf95befd0b428014212729b21c621b76ba8addb58e0944c87304922"
|
|
53
53
|
}
|
|
54
54
|
]
|
|
55
55
|
},
|
|
56
56
|
"windows-x86_64": {
|
|
57
|
-
"name": "overcrow-creator-tools-0.7.
|
|
58
|
-
"size":
|
|
59
|
-
"sha256": "
|
|
57
|
+
"name": "overcrow-creator-tools-0.7.2-beta.1-windows-x86_64.zip",
|
|
58
|
+
"size": 15909302,
|
|
59
|
+
"sha256": "e8b0efb252e4f589f4126e4194a194ba4b16a8cc9fee5790a13fa5a0b964b223",
|
|
60
60
|
"files": [
|
|
61
61
|
{
|
|
62
|
-
"path": "overcrow-creator-tools-0.7.
|
|
62
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-windows-x86_64/README.txt",
|
|
63
63
|
"size": 1457,
|
|
64
|
-
"sha256": "
|
|
64
|
+
"sha256": "f12ab0895d4d155de4af20abdd9e8cd9c3d279bea375702e41d47a29ef062b28"
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
|
-
"path": "overcrow-creator-tools-0.7.
|
|
67
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-windows-x86_64/SHA256SUMS",
|
|
68
68
|
"size": 809,
|
|
69
|
-
"sha256": "
|
|
69
|
+
"sha256": "bdb200171439600794a84055b8c3f68674554bffe6f3872547c1a3772c7e83b5"
|
|
70
70
|
},
|
|
71
71
|
{
|
|
72
|
-
"path": "overcrow-creator-tools-0.7.
|
|
72
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-windows-x86_64/cli.json",
|
|
73
73
|
"size": 1014,
|
|
74
|
-
"sha256": "
|
|
74
|
+
"sha256": "596f02e649d58803f4580b0e62f67be4737bb54bb670fd1cbd08989007161406"
|
|
75
75
|
},
|
|
76
76
|
{
|
|
77
|
-
"path": "overcrow-creator-tools-0.7.
|
|
77
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-windows-x86_64/overcrow-widget-1.0.0-beta.5-LICENSE.txt",
|
|
78
78
|
"size": 1071,
|
|
79
79
|
"sha256": "c159eef41245fe20d4cd29fc33a0e88a85f47b53ac321f266abfb7b707aee8c3"
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
|
-
"path": "overcrow-creator-tools-0.7.
|
|
82
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-windows-x86_64/overcrow-widget-1.0.0-beta.5-THIRD-PARTY-NOTICES.md",
|
|
83
83
|
"size": 212099,
|
|
84
84
|
"sha256": "8c679481b61f9fb4c8352bd4d1c3bcfc23acf4d51b8252140ed214b1f5b756c4"
|
|
85
85
|
},
|
|
86
86
|
{
|
|
87
|
-
"path": "overcrow-creator-tools-0.7.
|
|
88
|
-
"size":
|
|
89
|
-
"sha256": "
|
|
87
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-windows-x86_64/overcrow-widget-1.0.0-beta.5-windows-x86_64.exe",
|
|
88
|
+
"size": 9528320,
|
|
89
|
+
"sha256": "4e26c45c74e1e6b291892e097236b3f64da0d9d881cb8eba6d9561e3fc3fc831"
|
|
90
90
|
},
|
|
91
91
|
{
|
|
92
|
-
"path": "overcrow-creator-tools-0.7.
|
|
92
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-windows-x86_64/overcrow-widget-headless-0.7.2-beta.1-LICENSE.md",
|
|
93
93
|
"size": 217457,
|
|
94
|
-
"sha256": "
|
|
94
|
+
"sha256": "a20df95a937c0c4e794edd027042bbe3fb0427d0e7d16fe2ed8f12d96bf23b03"
|
|
95
95
|
},
|
|
96
96
|
{
|
|
97
|
-
"path": "overcrow-creator-tools-0.7.
|
|
98
|
-
"size":
|
|
99
|
-
"sha256": "
|
|
97
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-windows-x86_64/overcrow-widget-headless-0.7.2-beta.1-windows-x86_64.exe",
|
|
98
|
+
"size": 25638912,
|
|
99
|
+
"sha256": "ca4dbbe2a4acd757db2345e699c35b8bf35953b932c65f1e9273d3248b4e092d"
|
|
100
100
|
},
|
|
101
101
|
{
|
|
102
|
-
"path": "overcrow-creator-tools-0.7.
|
|
102
|
+
"path": "overcrow-creator-tools-0.7.2-beta.1-windows-x86_64/runtimes.json",
|
|
103
103
|
"size": 774,
|
|
104
|
-
"sha256": "
|
|
104
|
+
"sha256": "c354b0e4bdf95befd0b428014212729b21c621b76ba8addb58e0944c87304922"
|
|
105
105
|
}
|
|
106
106
|
]
|
|
107
107
|
}
|
|
@@ -113,7 +113,11 @@
|
|
|
113
113
|
},
|
|
114
114
|
"typescript": {
|
|
115
115
|
"version": "6.0.3",
|
|
116
|
-
"integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="
|
|
116
|
+
"integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
|
|
117
|
+
"files": {
|
|
118
|
+
"lib/tsc.js": "2cffde0b8c6760dfb0b5b0382bbb7e00ba6a8b2d981b9205b256a700a481d983",
|
|
119
|
+
"lib/_tsc.js": "1c59e77a54b186ec43fa7f3e0d3c4bb15ca5eb5ba43e96b1d3a267139eddd3e3"
|
|
120
|
+
}
|
|
117
121
|
}
|
|
118
122
|
}
|
|
119
123
|
}
|
package/dist/cli.js
CHANGED
|
@@ -85,8 +85,9 @@ export class Cli {
|
|
|
85
85
|
return new CliError(`${what} failed (exit ${result.code})${first ? `: ${first}` : ""}`, result.stderr);
|
|
86
86
|
}
|
|
87
87
|
/** `check <dir> --format json`: diagnostics, and whether there is no error. */
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
/** `typecheck: false` adds `--no-typecheck` (see typescript.ts). */
|
|
89
|
+
async check(directory, signal, typecheck = true) {
|
|
90
|
+
const result = await this.run(["check", directory, "--format", "json", ...(typecheck ? [] : ["--no-typecheck"])], directory, TIMEOUTS.check, signal);
|
|
90
91
|
if (result.code !== 0 && result.code !== 1)
|
|
91
92
|
throw Cli.failure(result, "check");
|
|
92
93
|
const diagnostics = jsonLines(result.stdout)
|
|
@@ -95,8 +96,15 @@ export class Cli {
|
|
|
95
96
|
return { ok: result.code === 0, diagnostics };
|
|
96
97
|
}
|
|
97
98
|
/** `package <dir> --out <file> --format json`. */
|
|
98
|
-
async package(directory, out, signal) {
|
|
99
|
-
const result = await this.run([
|
|
99
|
+
async package(directory, out, signal, typecheck = true) {
|
|
100
|
+
const result = await this.run([
|
|
101
|
+
"package",
|
|
102
|
+
directory,
|
|
103
|
+
`--out=${out}`,
|
|
104
|
+
"--format",
|
|
105
|
+
"json",
|
|
106
|
+
...(typecheck ? [] : ["--no-typecheck"]),
|
|
107
|
+
], directory, TIMEOUTS.package, signal);
|
|
100
108
|
if (result.code !== 0 && result.code !== 1)
|
|
101
109
|
throw Cli.failure(result, "package");
|
|
102
110
|
const lines = jsonLines(result.stdout);
|
|
@@ -140,6 +148,8 @@ export class Cli {
|
|
|
140
148
|
"--format",
|
|
141
149
|
"json",
|
|
142
150
|
];
|
|
151
|
+
if (options.typecheck === false)
|
|
152
|
+
args.push("--no-typecheck");
|
|
143
153
|
if (options.scenario)
|
|
144
154
|
args.push(`--scenario=${options.scenario}`);
|
|
145
155
|
if (options.update)
|
|
@@ -23,7 +23,7 @@ overcrow-widget test
|
|
|
23
23
|
| [`check`](#check) | Validates a project without writing anything. |
|
|
24
24
|
| [`package`](#package) | Checks, then writes the `.ocpkg` package. |
|
|
25
25
|
| [`inspect`](#inspect) | Shows what a package holds and asks for. |
|
|
26
|
-
| [`dev`](#dev) | Runs the widget in OverCrow and reloads it when you save. |
|
|
26
|
+
| [`dev`](#dev) | Runs the widget in PlayerVox OverCrow and reloads it when you save. |
|
|
27
27
|
| [`test`](#test) | Plays the project's test scenarios and compares their images. |
|
|
28
28
|
| [`doctor`](#doctor) | Says what your setup has and lacks. |
|
|
29
29
|
| [`admit`](#admit) | Runs the admission of the creator space on your sources, a folder or a ZIP. |
|
|
@@ -37,7 +37,7 @@ and [exit status](#exit-status) are stable for scripts.
|
|
|
37
37
|
|
|
38
38
|
## Installing
|
|
39
39
|
|
|
40
|
-
Each [OverCrow release](https://github.com/Valhallab/playervox-overcrow-releases/releases)
|
|
40
|
+
Each [PlayerVox OverCrow release](https://github.com/Valhallab/playervox-overcrow-releases/releases)
|
|
41
41
|
carries the creator tools in one ZIP per platform: the tool with its
|
|
42
42
|
license and third-party notices, OverCrow's headless runtime that
|
|
43
43
|
[`test`](#test) uses, a `README.txt` and a `SHA256SUMS` of every file.
|
|
@@ -122,8 +122,8 @@ empty: `init` never overwrites a file.
|
|
|
122
122
|
| `chart` | A live chart updated by a timer. |
|
|
123
123
|
|
|
124
124
|
Pass `--id` with your widget's ID: `<handle>.<name>`, your publisher handle
|
|
125
|
-
in the OverCrow creator space and a name (`nova.lol-timers`), or a
|
|
126
|
-
domain you verified and a name (`gg.nova.lol-timers`); see
|
|
125
|
+
in the PlayerVox OverCrow creator space and a name (`nova.lol-timers`), or a
|
|
126
|
+
reverse domain you verified and a name (`gg.nova.lol-timers`); see
|
|
127
127
|
[the manifest](manifest.md#identity-and-version). Without `--id`, the ID is
|
|
128
128
|
`yourhandle.<dir>`: replace `yourhandle` before you submit, as `admit`
|
|
129
129
|
refuses it. `com.playervox.*` is reserved. Every template
|
|
@@ -141,17 +141,17 @@ Runs every check, in this order, and writes nothing:
|
|
|
141
141
|
|
|
142
142
|
1. **Project files**: the required files are there and within their size
|
|
143
143
|
bounds, one logic module, both locale files or neither.
|
|
144
|
-
2. **Manifest**: OverCrow's own manifest validator.
|
|
144
|
+
2. **Manifest**: PlayerVox OverCrow's own manifest validator.
|
|
145
145
|
3. **View**: `view.ocml` is compiled and the result validated; static
|
|
146
146
|
images must exist in `assets/`.
|
|
147
|
-
4. **Style**: `style.ocss` is parsed with OverCrow's parser.
|
|
147
|
+
4. **Style**: `style.ocss` is parsed with PlayerVox OverCrow's parser.
|
|
148
148
|
5. **Locales**: objects of strings with valid keys, the same keys in both
|
|
149
149
|
files. A `t("key")` of the view whose key has no message is a warning.
|
|
150
150
|
6. **Logic**: the [lint](logic.md#what-the-logic-cannot-use), and the
|
|
151
151
|
exports the view calls.
|
|
152
152
|
7. **Types**: the project's `tsc --noEmit -p tsconfig.json`.
|
|
153
153
|
8. **Package**: `logic.js` is built, the package is written in memory and
|
|
154
|
-
read back exactly as OverCrow will read it.
|
|
154
|
+
read back exactly as PlayerVox OverCrow will read it.
|
|
155
155
|
|
|
156
156
|
Options: `--no-typecheck`, `--deny-warnings` (a warning fails the command),
|
|
157
157
|
`--format json`.
|
|
@@ -180,14 +180,14 @@ holds is described in [the package](package.md).
|
|
|
180
180
|
overcrow-widget inspect dist/nova.my-widget-0.1.0.ocpkg
|
|
181
181
|
```
|
|
182
182
|
|
|
183
|
-
Validates a package as OverCrow does, then shows it as a reviewer
|
|
184
|
-
the ID, version and names; the size and SHA-256 of the archive; the
|
|
185
|
-
version its `logic.js` contains; each permission in words (network
|
|
186
|
-
with their parameter constraints and declared response bound,
|
|
187
|
-
clipboard, game events); each capability with its summary and
|
|
188
|
-
sensitive or needs an account; the number of menu rows; and
|
|
189
|
-
its size and SHA-256. A package that OverCrow would refuse
|
|
190
|
-
instead, with the reason.
|
|
183
|
+
Validates a package as PlayerVox OverCrow does, then shows it as a reviewer
|
|
184
|
+
sees it: the ID, version and names; the size and SHA-256 of the archive; the
|
|
185
|
+
SDK version its `logic.js` contains; each permission in words (network
|
|
186
|
+
routes with their parameter constraints and declared response bound,
|
|
187
|
+
storage, clipboard, game events); each capability with its summary and
|
|
188
|
+
whether it is sensitive or needs an account; the number of menu rows; and
|
|
189
|
+
every file with its size and SHA-256. A package that OverCrow would refuse
|
|
190
|
+
is reported instead, with the reason.
|
|
191
191
|
|
|
192
192
|
## dev
|
|
193
193
|
|
|
@@ -195,8 +195,8 @@ instead, with the reason.
|
|
|
195
195
|
overcrow-widget dev
|
|
196
196
|
```
|
|
197
197
|
|
|
198
|
-
Runs the widget in the OverCrow overlay running on your machine,
|
|
199
|
-
edit it:
|
|
198
|
+
Runs the widget in the PlayerVox OverCrow overlay running on your machine,
|
|
199
|
+
while you edit it:
|
|
200
200
|
|
|
201
201
|
1. it connects to the overlay, which must have been started with
|
|
202
202
|
development installs allowed;
|
|
@@ -215,7 +215,7 @@ edit it:
|
|
|
215
215
|
Options: `--no-typecheck`, `--format json` (one JSON object per line).
|
|
216
216
|
Exit status: 0 after Ctrl+C, 1 when the overlay ends the session, 2 when no
|
|
217
217
|
overlay is reachable. [The development channel](dev-channel.md) says how to
|
|
218
|
-
start OverCrow for it, and what each state and refusal means.
|
|
218
|
+
start PlayerVox OverCrow for it, and what each state and refusal means.
|
|
219
219
|
|
|
220
220
|
## test
|
|
221
221
|
|
|
@@ -225,8 +225,8 @@ overcrow-widget test --scenario example
|
|
|
225
225
|
overcrow-widget test --update
|
|
226
226
|
```
|
|
227
227
|
|
|
228
|
-
Plays the scenarios of `tests/` in OverCrow's headless runtime and
|
|
229
|
-
the images it renders with the references:
|
|
228
|
+
Plays the scenarios of `tests/` in PlayerVox OverCrow's headless runtime and
|
|
229
|
+
compares the images it renders with the references:
|
|
230
230
|
|
|
231
231
|
1. it builds the package as `package` does;
|
|
232
232
|
2. it reads every `tests/<name>.scenario.json` and checks it against the
|
|
@@ -268,7 +268,7 @@ overcrow-widget doctor
|
|
|
268
268
|
| Code | Severity | Meaning |
|
|
269
269
|
| --- | --- | --- |
|
|
270
270
|
| `doctor.overcrow_missing` | warning | OverCrow is not installed. |
|
|
271
|
-
| `doctor.development_off` | warning | No overlay allows development installs; the help gives the commands to restart OverCrow with them. |
|
|
271
|
+
| `doctor.development_off` | warning | No overlay allows development installs; the help gives the commands to restart PlayerVox OverCrow with them. |
|
|
272
272
|
| `doctor.channel_busy` | warning | The overlay already serves its maximum of `dev` sessions. |
|
|
273
273
|
| `doctor.channel_io` | warning | The connection to the overlay failed. |
|
|
274
274
|
| `doctor.channel_untrusted` | error | What answers is not this user's overlay. |
|
|
@@ -384,8 +384,8 @@ overcrow-widget submit --dry-run --submission submission.json
|
|
|
384
384
|
overcrow-widget submit --submission submission.json
|
|
385
385
|
```
|
|
386
386
|
|
|
387
|
-
Sends a version of your widget to the OverCrow creator space, from
|
|
388
|
-
terminal, a CI job or the OverCrow MCP server, then follows its checks. It
|
|
387
|
+
Sends a version of your widget to the PlayerVox OverCrow creator space, from
|
|
388
|
+
a terminal, a CI job or the OverCrow MCP server, then follows its checks. It
|
|
389
389
|
never asks a question: what is missing is said, with a stable
|
|
390
390
|
[exit status](#exit-status). It takes the widget folder (the current one
|
|
391
391
|
without argument) or a ZIP of it.
|
|
@@ -499,8 +499,8 @@ an hour expires, and every submission counts in the daily limit.
|
|
|
499
499
|
| `justifications` | For the reviewer, one `{permission, text}` per new or widened permission, by its [key](#permission-keys); 500 characters each. |
|
|
500
500
|
| `reviewMessage` | A private message to the reviewer, 2,000 characters. |
|
|
501
501
|
|
|
502
|
-
Every key is optional; any other key is refused. The OverCrow MCP
|
|
503
|
-
writes this file.
|
|
502
|
+
Every key is optional; any other key is refused. The PlayerVox OverCrow MCP
|
|
503
|
+
server writes this file.
|
|
504
504
|
|
|
505
505
|
### In a CI job
|
|
506
506
|
|
|
@@ -510,10 +510,11 @@ the key in the repository's secrets:
|
|
|
510
510
|
|
|
511
511
|
<!-- source: docs/content/examples/weather/.github/workflows/submit.yml -->
|
|
512
512
|
```yaml
|
|
513
|
-
# Sends the widget to the OverCrow creator space when a version
|
|
514
|
-
# pushed. The publish key is a secret of the repository, and the
|
|
515
|
-
# release whose creator tools to use is a variable of the
|
|
516
|
-
|
|
513
|
+
# Sends the widget to the PlayerVox OverCrow creator space when a version
|
|
514
|
+
# tag is pushed. The publish key is a secret of the repository, and the
|
|
515
|
+
# OverCrow release whose creator tools to use is a variable of the
|
|
516
|
+
# repository.
|
|
517
|
+
name: Submit to PlayerVox OverCrow
|
|
517
518
|
|
|
518
519
|
on:
|
|
519
520
|
push:
|
|
@@ -538,7 +539,7 @@ jobs:
|
|
|
538
539
|
(cd "$tools" && sha256sum --check --quiet SHA256SUMS)
|
|
539
540
|
install -D -m 755 "$tools"/overcrow-widget-*-linux-x86_64 "$HOME/.local/bin/overcrow-widget"
|
|
540
541
|
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
|
541
|
-
- name: Submit to OverCrow
|
|
542
|
+
- name: Submit to PlayerVox OverCrow
|
|
542
543
|
run: overcrow-widget submit --submission submission.json
|
|
543
544
|
env:
|
|
544
545
|
OVERCROW_PUBLISH_KEY: ${{ secrets.OVERCROW_PUBLISH_KEY }}
|
|
@@ -547,7 +548,7 @@ jobs:
|
|
|
547
548
|
The job fails on any status but 0. `OVERCROW_API_URL` points `submit`
|
|
548
549
|
and `status` to another API, for tests only: `https://`, or `http://` to
|
|
549
550
|
`127.0.0.1`, `localhost` or `[::1]`, with a warning every time. Never set
|
|
550
|
-
it in a real job; the OverCrow MCP server never sets it.
|
|
551
|
+
it in a real job; the PlayerVox OverCrow MCP server never sets it.
|
|
551
552
|
|
|
552
553
|
## status
|
|
553
554
|
|
|
@@ -742,7 +743,8 @@ change announces any other change.
|
|
|
742
743
|
`already_known` (nothing sent, see `known`), `error`, or the version's
|
|
743
744
|
state; `status` without `--wait` has none. Error codes
|
|
744
745
|
are the creator space's (`version_not_newer`, `submission_limit_reached`,
|
|
745
|
-
`publish_key_expired`, `publish_key_revoked`,
|
|
746
|
+
`publish_key_expired`, `publish_key_revoked`,
|
|
747
|
+
`publish_key_owner_suspended`, `widget_required`,
|
|
746
748
|
`publish_key_widget_not_covered`…) or the tool's:
|
|
747
749
|
`publish_key_missing`, `invalid_publish_key`, `api_url_invalid`,
|
|
748
750
|
`submission_file`, `sources`, `sources.read`, `network`, `timeout`,
|
|
@@ -15,8 +15,8 @@ builds the widget, sends it and stays in the foreground until Ctrl+C.
|
|
|
15
15
|
|
|
16
16
|
## Turn it on
|
|
17
17
|
|
|
18
|
-
The channel exists only while OverCrow runs with development
|
|
19
|
-
allowed: started with the environment variable
|
|
18
|
+
The channel exists only while PlayerVox OverCrow runs with development
|
|
19
|
+
installs allowed: started with the environment variable
|
|
20
20
|
`OVERCROW_WIDGET_DEVELOPMENT=1`. Without it, the overlay opens nothing.
|
|
21
21
|
|
|
22
22
|
**Linux.** Set the variable for your session's services, then restart the
|
|
@@ -34,7 +34,7 @@ systemctl --user unset-environment OVERCROW_WIDGET_DEVELOPMENT
|
|
|
34
34
|
systemctl --user restart overcrow-overlay.service
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
**Windows.** Quit OverCrow from its tray icon, then start it from
|
|
37
|
+
**Windows.** Quit PlayerVox OverCrow from its tray icon, then start it from
|
|
38
38
|
PowerShell:
|
|
39
39
|
|
|
40
40
|
```text
|
|
@@ -126,5 +126,5 @@ before a session starts. Widgets cannot use it: their sandbox has no access
|
|
|
126
126
|
to it.
|
|
127
127
|
|
|
128
128
|
This is why the channel is off by default. With it on, any program you run
|
|
129
|
-
can show an unverified widget in your overlay, for as long as
|
|
130
|
-
runs. Turn it off when you are done.
|
|
129
|
+
can show an unverified widget in your overlay, for as long as
|
|
130
|
+
PlayerVox OverCrow runs. Turn it off when you are done.
|
|
@@ -19,7 +19,7 @@ them: expressions, `if`, `for`, components.
|
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
Two `box` containers, two `text` elements bound to the state, and a `chart`
|
|
22
|
-
with one `series`: OverCrow draws all of it, the chart included.
|
|
22
|
+
with one `series`: PlayerVox OverCrow draws all of it, the chart included.
|
|
23
23
|
|
|
24
24
|
## How to read an element
|
|
25
25
|
|
|
@@ -435,10 +435,10 @@ Any other `key` is one printable character.
|
|
|
435
435
|
|
|
436
436
|
## Default sizes
|
|
437
437
|
|
|
438
|
-
The elements that OverCrow draws take these sizes, in logical
|
|
439
|
-
100 %, unless the style sets `width` or `height`. Any other
|
|
440
|
-
sized by its content and by the style: a `canvas` has no size
|
|
441
|
-
style gives it one.
|
|
438
|
+
The elements that PlayerVox OverCrow draws take these sizes, in logical
|
|
439
|
+
pixels at 100 %, unless the style sets `width` or `height`. Any other
|
|
440
|
+
element is sized by its content and by the style: a `canvas` has no size
|
|
441
|
+
until the style gives it one.
|
|
442
442
|
|
|
443
443
|
<!-- generated:default-sizes -->
|
|
444
444
|
| Element | When | Width | Height |
|
|
@@ -8,9 +8,9 @@ intent** is how a widget lets the user write to their notes, publish a
|
|
|
8
8
|
rating or send a chat message, without the text ever passing through the
|
|
9
9
|
widget's code.
|
|
10
10
|
|
|
11
|
-
Widgets receive input only in OverCrow's Interactive mode. In
|
|
12
|
-
a click goes through the widget to the game: hide or disable
|
|
13
|
-
used, as the built-ins do with `host.mode`.
|
|
11
|
+
Widgets receive input only in PlayerVox OverCrow's Interactive mode. In
|
|
12
|
+
Passive mode a click goes through the widget to the game: hide or disable
|
|
13
|
+
what cannot be used, as the built-ins do with `host.mode`.
|
|
14
14
|
|
|
15
15
|
## Controls
|
|
16
16
|
|
|
@@ -58,9 +58,10 @@ slider, text for the others.
|
|
|
58
58
|
|
|
59
59
|
### Text fields
|
|
60
60
|
|
|
61
|
-
OverCrow edits the text of a `field` or a `textarea` itself: the
|
|
62
|
-
selection, copy and paste, and input methods for languages that
|
|
63
|
-
characters. The logic receives a copy of the text in each `input`
|
|
61
|
+
PlayerVox OverCrow edits the text of a `field` or a `textarea` itself: the
|
|
62
|
+
caret, the selection, copy and paste, and input methods for languages that
|
|
63
|
+
compose characters. The logic receives a copy of the text in each `input`
|
|
64
|
+
event.
|
|
64
65
|
|
|
65
66
|
<!-- source: widgets/warframe-market/view.ocml -->
|
|
66
67
|
```xml
|
|
@@ -91,9 +92,9 @@ Binding `value` replaces what the field holds: bind it to the state your
|
|
|
91
92
|
the field is empty.
|
|
92
93
|
|
|
93
94
|
A field also sends `keydown` when you ask for it, with the key and its
|
|
94
|
-
modifiers, for shortcuts such as Escape to cancel. Keys that
|
|
95
|
-
reserves (Tab to move the focus, its own shortcuts, a
|
|
96
|
-
progress) are not delivered.
|
|
95
|
+
modifiers, for shortcuts such as Escape to cancel. Keys that
|
|
96
|
+
PlayerVox OverCrow reserves (Tab to move the focus, its own shortcuts, a
|
|
97
|
+
composition in progress) are not delivered.
|
|
97
98
|
|
|
98
99
|
### The focus when an editor opens
|
|
99
100
|
|
|
@@ -107,7 +108,7 @@ the caret in the field, after its text, as a click in it would.
|
|
|
107
108
|
<field class="title-field" name="title" autofocus placeholder={t("title-hint")} label={t("title-hint")} on:input={titleInput(editor.key, event.value)} on:keydown={keyed(editor.key, event.key, event.ctrl)}/>
|
|
108
109
|
```
|
|
109
110
|
|
|
110
|
-
OverCrow gives that focus only when the element appears during a
|
|
111
|
+
PlayerVox OverCrow gives that focus only when the element appears during a
|
|
111
112
|
[user action](services.md#calls-that-need-a-user-action), in Interactive
|
|
112
113
|
mode, in the widget the user acted on; when several such elements appear
|
|
113
114
|
together, the first one of the view takes it. An element that appears when
|
|
@@ -186,22 +187,23 @@ form with an `intent` attribute sends them:
|
|
|
186
187
|
</form>
|
|
187
188
|
```
|
|
188
189
|
|
|
189
|
-
When the user submits such a form, **OverCrow reads the values of
|
|
190
|
-
form's own controls and sends them itself**. The widget's logic never
|
|
190
|
+
When the user submits such a form, **PlayerVox OverCrow reads the values of
|
|
191
|
+
the form's own controls and sends them itself**. The widget's logic never
|
|
191
192
|
supplies the text, so a widget cannot write something the user did not
|
|
192
193
|
type, and cannot submit without the user: the form goes only on a user
|
|
193
194
|
action, in Interactive mode, with the capability granted.
|
|
194
195
|
|
|
195
196
|
What this changes for the view and the logic:
|
|
196
197
|
|
|
197
|
-
- **The controls belong to OverCrow.** The `field`, `textarea` and
|
|
198
|
-
controls of the form take no `value`: `overcrow-widget check`
|
|
199
|
-
(`view.bound_value`), and OverCrow stops a widget that sets one
|
|
200
|
-
time. Their `name` attribute says which field of the intent each
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
event
|
|
198
|
+
- **The controls belong to PlayerVox OverCrow.** The `field`, `textarea` and
|
|
199
|
+
`slider` controls of the form take no `value`: `overcrow-widget check`
|
|
200
|
+
refuses it (`view.bound_value`), and OverCrow stops a widget that sets one
|
|
201
|
+
at run time. Their `name` attribute says which field of the intent each
|
|
202
|
+
one is.
|
|
203
|
+
- **PlayerVox OverCrow fills them** where the intent says so: the note's
|
|
204
|
+
title, body and checklist, the user's published rating. A fill sends the
|
|
205
|
+
control's `input` event with the value, so the logic knows what is shown;
|
|
206
|
+
that event is not a user action.
|
|
205
207
|
- **The logic follows through `input` events**, to show a counter or to
|
|
206
208
|
enable the button, and may disable the controls.
|
|
207
209
|
- **The outcome arrives in the form's `submit` event**: `event.outcome` is
|
|
@@ -284,10 +286,10 @@ ID for `notes.save`, the ID of the message replied to for
|
|
|
284
286
|
### Several rows of one field
|
|
285
287
|
|
|
286
288
|
The `notes.save` intent takes one `item` field per checklist row. The
|
|
287
|
-
logic decides which rows the form has, with a `for`; OverCrow
|
|
288
|
-
row's field from the stored note and remembers which checklist
|
|
289
|
-
put there. A row that the logic removes or moves keeps its entry,
|
|
290
|
-
row added since is a new entry.
|
|
289
|
+
logic decides which rows the form has, with a `for`; PlayerVox OverCrow
|
|
290
|
+
fills each row's field from the stored note and remembers which checklist
|
|
291
|
+
entry it put there. A row that the logic removes or moves keeps its entry,
|
|
292
|
+
and a row added since is a new entry.
|
|
291
293
|
|
|
292
294
|
<!-- source: widgets/notes/view.ocml -->
|
|
293
295
|
```xml
|
|
@@ -308,11 +310,11 @@ Ctrl+Enter or the `submit` button saves.
|
|
|
308
310
|
## Confirmations
|
|
309
311
|
|
|
310
312
|
Two services delete user data: `notes.delete` and `journal.delete`. They
|
|
311
|
-
are ordinary calls that need a user action, and OverCrow then asks
|
|
312
|
-
user to confirm in a dialog that it draws itself, outside the widget.
|
|
313
|
-
call resolves when the user confirms and fails with `cancelled` when
|
|
314
|
-
decline. Do not draw your own "Are you sure?": OverCrow's is the one
|
|
315
|
-
counts.
|
|
313
|
+
are ordinary calls that need a user action, and PlayerVox OverCrow then asks
|
|
314
|
+
the user to confirm in a dialog that it draws itself, outside the widget.
|
|
315
|
+
The call resolves when the user confirms and fails with `cancelled` when
|
|
316
|
+
they decline. Do not draw your own "Are you sure?": OverCrow's is the one
|
|
317
|
+
that counts.
|
|
316
318
|
|
|
317
319
|
## Checklist for a form
|
|
318
320
|
|
|
@@ -325,4 +327,4 @@ counts.
|
|
|
325
327
|
sliders, and every named control is a field of the intent.
|
|
326
328
|
- Test it with a scenario: `text` steps type into the focused field,
|
|
327
329
|
`key` steps press Enter, and `expect.intents` checks exactly what
|
|
328
|
-
OverCrow sent. See [testing a widget](testing.md#steps).
|
|
330
|
+
PlayerVox OverCrow sent. See [testing a widget](testing.md#steps).
|