kryptheon 0.1.32 → 0.1.34
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/bin/kryptheon.js +43 -1
- package/kryptheon-autostart.js +148 -0
- package/kryptheon-dashboard-page.js +42 -2
- package/kryptheon-dashboard.html +9 -0
- package/kryptheon-dashboard.js +7 -0
- package/package.json +5 -3
package/bin/kryptheon.js
CHANGED
|
@@ -2321,7 +2321,9 @@ function recheckCommand(id) {
|
|
|
2321
2321
|
// One page on this machine for everything Kryptheon knows about this project
|
|
2322
2322
|
// (kryptheon-dashboard.js). Runs until Ctrl+C.
|
|
2323
2323
|
|
|
2324
|
-
|
|
2324
|
+
// KRYPTHEON_DASHBOARD_PORT is for the checks, which must not use the port of
|
|
2325
|
+
// a dashboard the person has open.
|
|
2326
|
+
const DASHBOARD_PORT = Number(process.env.KRYPTHEON_DASHBOARD_PORT) || 4789;
|
|
2325
2327
|
|
|
2326
2328
|
/**
|
|
2327
2329
|
* Runs a command and hands every line it prints to `say`, as it prints it -
|
|
@@ -2511,12 +2513,52 @@ function openInBrowser(url) {
|
|
|
2511
2513
|
}
|
|
2512
2514
|
}
|
|
2513
2515
|
|
|
2516
|
+
/**
|
|
2517
|
+
* Whether this project's dashboard is already running on the usual port -
|
|
2518
|
+
* started at sign-in, most likely - by asking it which project it shows.
|
|
2519
|
+
* Never fatal: no answer, a slow one, or another project's means no.
|
|
2520
|
+
*/
|
|
2521
|
+
function dashboardAlreadyRunning(port) {
|
|
2522
|
+
return new Promise((resolve) => {
|
|
2523
|
+
const req = require('http').get({ host: '127.0.0.1', port: port, path: '/api/state', headers: { host: '127.0.0.1:' + port }, timeout: 2000 }, (res) => {
|
|
2524
|
+
let body = '';
|
|
2525
|
+
res.setEncoding('utf8');
|
|
2526
|
+
res.on('data', (chunk) => { if (body.length < 5000000) body += chunk; });
|
|
2527
|
+
res.on('end', () => {
|
|
2528
|
+
try {
|
|
2529
|
+
const root = JSON.parse(body).project.root;
|
|
2530
|
+
const same = (a) => (process.platform === 'win32' ? path.resolve(a).toLowerCase() : path.resolve(a));
|
|
2531
|
+
resolve(res.statusCode === 200 && typeof root === 'string' && same(root) === same(USER_DIR));
|
|
2532
|
+
} catch (err) {
|
|
2533
|
+
resolve(false);
|
|
2534
|
+
}
|
|
2535
|
+
});
|
|
2536
|
+
});
|
|
2537
|
+
req.on('timeout', () => req.destroy());
|
|
2538
|
+
req.on('error', () => resolve(false));
|
|
2539
|
+
});
|
|
2540
|
+
}
|
|
2541
|
+
|
|
2514
2542
|
async function dashboardCommand() {
|
|
2515
2543
|
const here = project.inspectProject(USER_DIR);
|
|
2516
2544
|
if (!here.ok) {
|
|
2517
2545
|
for (const line of project.noProjectLines(here)) console.error(line);
|
|
2518
2546
|
return 1;
|
|
2519
2547
|
}
|
|
2548
|
+
// Running already: open that one rather than a second, which would watch
|
|
2549
|
+
// the same project twice. Exit code 0 is how the launcher knows.
|
|
2550
|
+
if (await dashboardAlreadyRunning(DASHBOARD_PORT)) {
|
|
2551
|
+
const address = 'http://127.0.0.1:' + DASHBOARD_PORT + '/';
|
|
2552
|
+
const shown = openInBrowser(address);
|
|
2553
|
+
console.log('');
|
|
2554
|
+
console.log(' The Kryptheon dashboard for ' + path.basename(USER_DIR) + ' is already running:');
|
|
2555
|
+
console.log('');
|
|
2556
|
+
console.log(' ' + address);
|
|
2557
|
+
console.log('');
|
|
2558
|
+
console.log(shown ? ' It is opening in your browser.' : ' Open that address in your browser.');
|
|
2559
|
+
console.log('');
|
|
2560
|
+
return 0;
|
|
2561
|
+
}
|
|
2520
2562
|
const opened = openStore();
|
|
2521
2563
|
if (!opened) return 1;
|
|
2522
2564
|
const dash = require(path.join(PACKAGE_DIR, 'kryptheon-dashboard.js'));
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Start with Windows: the dashboard for one project, started when the person
|
|
5
|
+
* signs in, so it is watching whenever the laptop is on.
|
|
6
|
+
*
|
|
7
|
+
* It is one small .cmd file in the person's own Startup folder - the plainest
|
|
8
|
+
* way Windows has, seen and removable in Task Manager's Startup apps and in
|
|
9
|
+
* the folder itself. The file says what it is and runs one thing:
|
|
10
|
+
* npx kryptheon@latest dashboard, in a minimized window on the taskbar. A
|
|
11
|
+
* window, not a hidden process: something that starts by itself at sign-in
|
|
12
|
+
* should be seen, and closing it stops it.
|
|
13
|
+
*
|
|
14
|
+
* Only the file this module wrote is ever removed: it is recognised by its
|
|
15
|
+
* first lines, never by its name alone.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const fs = require('fs');
|
|
19
|
+
const path = require('path');
|
|
20
|
+
const crypto = require('crypto');
|
|
21
|
+
|
|
22
|
+
const MARK = 'rem Kryptheon - starts the Kryptheon dashboard for this project when you sign in to Windows.';
|
|
23
|
+
const CRLF = '\r\n';
|
|
24
|
+
|
|
25
|
+
/** The Startup folder, or null where there is none (not Windows). */
|
|
26
|
+
function startupDir(env, platform) {
|
|
27
|
+
const e = env || process.env;
|
|
28
|
+
// For the checks: a folder of their own, never the real Startup folder.
|
|
29
|
+
if (e.KRYPTHEON_STARTUP_DIR) return e.KRYPTHEON_STARTUP_DIR;
|
|
30
|
+
if ((platform || process.platform) !== 'win32' || !e.APPDATA) return null;
|
|
31
|
+
return path.join(e.APPDATA, 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** The folder's name as it may be shown in a file name and a window title. */
|
|
35
|
+
function plainName(root) {
|
|
36
|
+
return path.basename(root).replace(/[^A-Za-z0-9 ._-]/g, '_').slice(0, 40) || 'project';
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* One file per project, named after the folder and told apart by its full
|
|
41
|
+
* path - two projects called "app" get two files. Windows paths are compared
|
|
42
|
+
* without regard to case, so the same folder spelled two ways is one file.
|
|
43
|
+
*/
|
|
44
|
+
function fileFor(root, env, platform) {
|
|
45
|
+
const dir = startupDir(env, platform);
|
|
46
|
+
if (!dir) return null;
|
|
47
|
+
const full = path.resolve(root);
|
|
48
|
+
const key = (platform || process.platform) === 'win32' ? full.toLowerCase() : full;
|
|
49
|
+
const id = crypto.createHash('sha256').update(key).digest('hex').slice(0, 8);
|
|
50
|
+
return path.join(dir, 'Kryptheon dashboard - ' + plainName(root) + ' ' + id + '.cmd');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The file's text. The project's path appears only inside double quotes, so
|
|
55
|
+
* & ^ ( ) and spaces in it are read as themselves; % is doubled, the one
|
|
56
|
+
* character cmd still reads inside quotes. The file is UTF-8 and switches
|
|
57
|
+
* the window to UTF-8 before the path is read, for folder names in any
|
|
58
|
+
* language.
|
|
59
|
+
*/
|
|
60
|
+
function script(root) {
|
|
61
|
+
const full = path.resolve(root);
|
|
62
|
+
const quoted = '"' + full.replace(/%/g, '%%') + '"';
|
|
63
|
+
const name = plainName(root);
|
|
64
|
+
return [
|
|
65
|
+
'@echo off',
|
|
66
|
+
'chcp 65001 >nul',
|
|
67
|
+
MARK,
|
|
68
|
+
'rem ' + quoted,
|
|
69
|
+
'rem Put here by "Start with Windows" on the Kryptheon dashboard. To stop it, switch',
|
|
70
|
+
'rem that off on the dashboard, or delete this file. What it runs:',
|
|
71
|
+
'rem npx kryptheon@latest dashboard - nothing else, in a small window on the taskbar.',
|
|
72
|
+
'if "%~1"=="run" goto run',
|
|
73
|
+
// cmd /c, not start's own cmd /k: a window whose file was removed while it
|
|
74
|
+
// ran - switched off on the dashboard - closes instead of waiting at a prompt.
|
|
75
|
+
'start "Kryptheon dashboard - ' + name + '" /min cmd /d /c ""%~f0" run"',
|
|
76
|
+
'exit /b',
|
|
77
|
+
':run',
|
|
78
|
+
'title Kryptheon dashboard - ' + name,
|
|
79
|
+
'rem npx starts the command "kryptheon": never look for it in the current folder,',
|
|
80
|
+
'rem where a Kryptheon.cmd launcher may sit, and the browser is not opened at sign-in.',
|
|
81
|
+
'set NoDefaultCurrentDirectoryInExePath=1',
|
|
82
|
+
'set KRYPTHEON_LAUNCHER=1',
|
|
83
|
+
'set KRYPTHEON_NO_OPEN=1',
|
|
84
|
+
'cd /d ' + quoted + ' || goto gone',
|
|
85
|
+
'echo.',
|
|
86
|
+
'echo Kryptheon dashboard, started when you signed in, for:',
|
|
87
|
+
'echo ' + quoted,
|
|
88
|
+
'echo Closing this window stops it until you sign in again.',
|
|
89
|
+
'echo.',
|
|
90
|
+
'call npx --yes kryptheon@latest dashboard',
|
|
91
|
+
'if not errorlevel 1 exit',
|
|
92
|
+
'rem At sign-in the network may not be up yet: then the copy npx already has.',
|
|
93
|
+
'echo Trying again with the copy already on this computer...',
|
|
94
|
+
'call npx --yes --offline kryptheon@latest dashboard',
|
|
95
|
+
'if not errorlevel 1 exit',
|
|
96
|
+
'echo.',
|
|
97
|
+
'echo The Kryptheon dashboard stopped. The reason, if any, is above.',
|
|
98
|
+
'pause',
|
|
99
|
+
'exit',
|
|
100
|
+
':gone',
|
|
101
|
+
'echo.',
|
|
102
|
+
'echo This project folder is gone, so its dashboard cannot start:',
|
|
103
|
+
'echo ' + quoted,
|
|
104
|
+
'echo To stop this message, delete this file:',
|
|
105
|
+
'echo "%~f0"',
|
|
106
|
+
'pause',
|
|
107
|
+
'exit',
|
|
108
|
+
'',
|
|
109
|
+
].join(CRLF);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Whether it is on for this project, and whether it can be at all. */
|
|
113
|
+
function status(root, env, platform) {
|
|
114
|
+
const file = fileFor(root, env, platform);
|
|
115
|
+
if (!file) return { available: false, on: false, why: 'Starting with the computer is only on Windows for now.' };
|
|
116
|
+
let on = false;
|
|
117
|
+
try {
|
|
118
|
+
on = fs.readFileSync(file, 'utf8').indexOf(MARK) !== -1;
|
|
119
|
+
} catch (err) {
|
|
120
|
+
on = false;
|
|
121
|
+
}
|
|
122
|
+
return { available: true, on: on, file: file };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Switches it on (writes the file) or off (removes only a file it wrote). */
|
|
126
|
+
function setAutostart(root, on, env, platform) {
|
|
127
|
+
if (typeof on !== 'boolean') return { ok: false, why: 'on must be true or false' };
|
|
128
|
+
const file = fileFor(root, env, platform);
|
|
129
|
+
if (!file) return { ok: false, why: 'Starting with the computer is only on Windows for now.' };
|
|
130
|
+
try {
|
|
131
|
+
if (on) {
|
|
132
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
133
|
+
fs.writeFileSync(file, script(root), 'utf8');
|
|
134
|
+
} else {
|
|
135
|
+
let text = null;
|
|
136
|
+
try { text = fs.readFileSync(file, 'utf8'); } catch (err) { text = null; }
|
|
137
|
+
if (text !== null) {
|
|
138
|
+
if (text.indexOf(MARK) === -1) return { ok: false, why: 'the file there was not written by Kryptheon, so it was left alone: ' + file };
|
|
139
|
+
fs.unlinkSync(file);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
} catch (err) {
|
|
143
|
+
return { ok: false, why: 'could not ' + (on ? 'write' : 'remove') + ' ' + file + ': ' + err.message };
|
|
144
|
+
}
|
|
145
|
+
return Object.assign({ ok: true }, status(root, env, platform));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
module.exports = { startupDir, fileFor, script, status, setAutostart, MARK };
|
|
@@ -616,8 +616,11 @@
|
|
|
616
616
|
steps: ['Run this once, in any terminal. That is the whole set-up.'],
|
|
617
617
|
code: 'claude mcp add kryptheon -- npx -y kryptheon-mcp', file: 'terminal' },
|
|
618
618
|
{ id: 'cursor', name: 'Cursor', tested: false,
|
|
619
|
-
|
|
620
|
-
|
|
619
|
+
// Cursor's own install page, as on kryptheon.tech: it opens Cursor, and
|
|
620
|
+
// where Cursor does not open - not installed, or blocked - it shows the
|
|
621
|
+
// config to paste, rather than a click that does nothing at all.
|
|
622
|
+
oneClick: { href: 'https://cursor.com/en/install-mcp?name=kryptheon&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsImtyeXB0aGVvbi1tY3AiXX0=', label: 'Add to Cursor' },
|
|
623
|
+
steps: ['Press Add to Cursor. Cursor\'s page opens and hands it to Cursor, which asks you to confirm - say yes. Cursor has to be installed on this computer.', 'Or by hand: paste the config into mcp.json in the .cursor folder of your home folder.'],
|
|
621
624
|
code: MCP_JSON, file: '~/.cursor/mcp.json' },
|
|
622
625
|
{ id: 'vscode', name: 'VS Code', tested: false,
|
|
623
626
|
oneClick: { href: 'vscode:mcp/install?' + encodeURIComponent(JSON.stringify({ name: 'kryptheon', command: 'npx', args: ['-y', 'kryptheon-mcp'] })), label: 'Install in VS Code' },
|
|
@@ -663,6 +666,7 @@
|
|
|
663
666
|
var oc = el('div', 'ai-oneclick');
|
|
664
667
|
var link = el('a', 'btn sun', tool.oneClick.label + ' →');
|
|
665
668
|
link.href = tool.oneClick.href;
|
|
669
|
+
if (/^https:/.test(tool.oneClick.href)) { link.target = '_blank'; link.rel = 'noopener noreferrer'; }
|
|
666
670
|
oc.appendChild(link);
|
|
667
671
|
oc.appendChild(el('small', null, 'or by hand, below'));
|
|
668
672
|
panel.appendChild(oc);
|
|
@@ -1036,6 +1040,41 @@
|
|
|
1036
1040
|
}, function () {});
|
|
1037
1041
|
}
|
|
1038
1042
|
|
|
1043
|
+
// Start with Windows, and what still runs when the laptop is off.
|
|
1044
|
+
function renderKeep() {
|
|
1045
|
+
var box = byId('keep');
|
|
1046
|
+
clear(box);
|
|
1047
|
+
var a = state.autostart || { available: false, on: false, why: '' };
|
|
1048
|
+
var row = el('div', 'keep-row');
|
|
1049
|
+
if (a.available) {
|
|
1050
|
+
var sw = el('label', 'switch');
|
|
1051
|
+
var input = el('input');
|
|
1052
|
+
input.type = 'checkbox';
|
|
1053
|
+
input.checked = !!a.on;
|
|
1054
|
+
input.setAttribute('aria-label', 'Start with Windows');
|
|
1055
|
+
input.addEventListener('change', function () { setAutostart(input.checked, input); });
|
|
1056
|
+
sw.appendChild(input);
|
|
1057
|
+
sw.appendChild(el('span', 'track'));
|
|
1058
|
+
row.appendChild(sw);
|
|
1059
|
+
}
|
|
1060
|
+
var text = el('div', 'keep-text');
|
|
1061
|
+
var title = el('b', null, 'Start with Windows ');
|
|
1062
|
+
if (a.available) title.appendChild(el('span', 'tag ' + (a.on ? 'leaf' : ''), a.on ? 'on' : 'off'));
|
|
1063
|
+
text.appendChild(title);
|
|
1064
|
+
text.appendChild(el('span', null, !a.available ? (a.why || 'Not on this computer.')
|
|
1065
|
+
: a.on ? 'When you sign in to Windows, this dashboard starts by itself in a small window on the taskbar, with nothing opened. To see it, double-click Kryptheon.cmd as always - it opens the one already running. Closing that taskbar window stops it until you sign in again.'
|
|
1066
|
+
: 'Switch it on and this dashboard starts by itself every time you sign in to Windows, in a small window on the taskbar. Nothing opens - it just watches for changes. Switch it off here any time.'));
|
|
1067
|
+
row.appendChild(text);
|
|
1068
|
+
box.appendChild(row);
|
|
1069
|
+
box.appendChild(el('div', 'keep-off', 'With the laptop off, nothing on it can run. The nightly database check is different: once set up in Start here, it runs inside your database itself, and its result is waiting the next time you open this page.'));
|
|
1070
|
+
}
|
|
1071
|
+
function setAutostart(on, input) {
|
|
1072
|
+
post('/api/autostart', { on: on }).then(function () {
|
|
1073
|
+
toast(on ? 'On: it starts by itself when you sign in to Windows' : 'Off: it no longer starts by itself');
|
|
1074
|
+
return load();
|
|
1075
|
+
}).catch(function (err) { input.checked = !on; toast('Not saved: ' + err.message); });
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1039
1078
|
function setCheck(id, on, input) {
|
|
1040
1079
|
post('/api/check', { id: id, on: on }).then(function () {
|
|
1041
1080
|
toast((on ? 'Switched on: ' : 'Switched off: ') + (CHECK_NAME[id] || id));
|
|
@@ -1064,6 +1103,7 @@
|
|
|
1064
1103
|
renderTop();
|
|
1065
1104
|
renderNow();
|
|
1066
1105
|
renderSteps();
|
|
1106
|
+
renderKeep();
|
|
1067
1107
|
renderStatusFilter();
|
|
1068
1108
|
renderFindings();
|
|
1069
1109
|
renderTimeline();
|
package/kryptheon-dashboard.html
CHANGED
|
@@ -301,6 +301,11 @@
|
|
|
301
301
|
.fallback { font: 10.5px/1.4 var(--mono); color: var(--muted); overflow-wrap: anywhere; }
|
|
302
302
|
.tag.when { color: var(--on-light); border-style: dotted; }
|
|
303
303
|
.f-quick { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 10px; padding: 0 8px 16px 20px; margin-top: -6px; }
|
|
304
|
+
.keep-row { display: flex; align-items: flex-start; gap: 16px; padding: 18px 8px 18px 0; }
|
|
305
|
+
.keep-row .switch { margin-top: 2px; }
|
|
306
|
+
.keep-text { display: grid; gap: 6px; min-width: 0; font-size: 14px; }
|
|
307
|
+
.keep-text b { font-weight: 800; }
|
|
308
|
+
.keep-off { padding-top: 14px; border-top: 1px solid var(--line); font-size: 14px; opacity: 0.8; }
|
|
304
309
|
.fix-all { display: flex; flex-wrap: wrap; align-items: center; gap: 14px 20px; padding: 16px 8px 16px 20px; border-bottom: 1px solid var(--line); box-shadow: inset 3px 0 0 var(--orange); }
|
|
305
310
|
.fix-all-words { flex: 1 1 260px; display: grid; gap: 4px; font-size: 14px; }
|
|
306
311
|
.fix-all-words b { font-weight: 800; font-stretch: 74%; font-size: 1.05rem; text-transform: uppercase; }
|
|
@@ -359,6 +364,10 @@
|
|
|
359
364
|
<div class="card-head"><div><h3>Start here</h3><div class="c-sub">Do these in order. A step is done only once it has actually run.</div></div></div>
|
|
360
365
|
<div class="steps" id="steps"></div>
|
|
361
366
|
</div>
|
|
367
|
+
<div class="card gap" id="keepCard">
|
|
368
|
+
<div class="card-head"><div><h3>Keep it running</h3><div class="c-sub">So it is watching whenever your laptop is on - without opening anything</div></div></div>
|
|
369
|
+
<div class="keep" id="keep"></div>
|
|
370
|
+
</div>
|
|
362
371
|
<div class="card gap">
|
|
363
372
|
<div class="card-head"><div><h3>Connect your AI tool</h3><div class="c-sub">Optional - your assistant then checks its own work, and does not call a change done until the check passes</div></div></div>
|
|
364
373
|
<div class="ai">
|
package/kryptheon-dashboard.js
CHANGED
|
@@ -24,6 +24,7 @@ const crypto = require('crypto');
|
|
|
24
24
|
const { spawnSync } = require('child_process');
|
|
25
25
|
const store = require('./kryptheon-store.js');
|
|
26
26
|
const changes = require('./kryptheon-changes.js');
|
|
27
|
+
const autostart = require('./kryptheon-autostart.js');
|
|
27
28
|
|
|
28
29
|
/**
|
|
29
30
|
* Every check the dashboard knows the name of, in the order the person asked
|
|
@@ -547,6 +548,8 @@ function buildState(root, env) {
|
|
|
547
548
|
// Part 3 is where a version gets verified. Until then this says so,
|
|
548
549
|
// rather than leaving a blank that could be read either way.
|
|
549
550
|
verification: { state: 'not verified', why: 'Kryptheon Verified is not built yet. No version of this project has been verified.' },
|
|
551
|
+
// Whether this dashboard starts by itself when the person signs in.
|
|
552
|
+
autostart: (() => { const s = autostart.status(root, env); return { available: s.available, on: s.on, why: s.why || '' }; })(),
|
|
550
553
|
};
|
|
551
554
|
}
|
|
552
555
|
|
|
@@ -792,6 +795,10 @@ function createServer(root, options) {
|
|
|
792
795
|
const r = setCheck(store.pathsFor(root, env), String(input.id || ''), input.on);
|
|
793
796
|
return json(res, r.ok ? 200 : 400, r);
|
|
794
797
|
}
|
|
798
|
+
if (url.pathname === '/api/autostart') {
|
|
799
|
+
const r = autostart.setAutostart(root, input.on, env);
|
|
800
|
+
return json(res, r.ok ? 200 : 400, { ok: r.ok, on: !!r.on, why: r.why || '' });
|
|
801
|
+
}
|
|
795
802
|
// Everything below starts a job: it answers at once with the job, and
|
|
796
803
|
// the page follows it on /api/job. One at a time - two browsers
|
|
797
804
|
// replaying against one app, or two attacks on one database, would
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kryptheon",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.34",
|
|
4
4
|
"description": "Record what you do in your app and get plain-language reports when it breaks.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -42,7 +42,8 @@
|
|
|
42
42
|
"kryptheon-spacemono.woff2",
|
|
43
43
|
"kryptheon-archivo.woff2",
|
|
44
44
|
"kryptheon-changes.js",
|
|
45
|
-
"kryptheon-look.js"
|
|
45
|
+
"kryptheon-look.js",
|
|
46
|
+
"kryptheon-autostart.js"
|
|
46
47
|
],
|
|
47
48
|
"engines": {
|
|
48
49
|
"node": ">=20.6.0"
|
|
@@ -51,11 +52,12 @@
|
|
|
51
52
|
"@playwright/test": "^1.62.1"
|
|
52
53
|
},
|
|
53
54
|
"scripts": {
|
|
54
|
-
"check": "node kryptheon-store.check.js && node kryptheon-code.check.js && node kryptheon-constdata.check.js && node kryptheon-accept.check.js && node kryptheon-keys.check.js && node kryptheon-dashboard.check.js && node kryptheon-changes.check.js && node kryptheon-look.check.js && node kryptheon-verify.check.js && node kryptheon-recheck.check.js && node kryptheon-reporter.check.js && node kryptheon-signature.check.js && node kryptheon-signature.stream.check.js && node kryptheon-signature.baseline.check.js && node kryptheon-signature.settle.check.js && node kryptheon-signature.number.check.js && node kryptheon-env.check.js && node kryptheon-watchdog.check.js && node kryptheon-record.check.js && node kryptheon-selectors.check.js && node kryptheon-recordings.check.js && node kryptheon-cleanup.check.js && node kryptheon-orphan.check.js && node kryptheon-project.check.js && node kryptheon-setup.check.js && node kryptheon-browser.check.js && node kryptheon-heal.check.js && node kryptheon-load.check.js && node kryptheon-package.check.js",
|
|
55
|
+
"check": "node kryptheon-store.check.js && node kryptheon-code.check.js && node kryptheon-constdata.check.js && node kryptheon-accept.check.js && node kryptheon-keys.check.js && node kryptheon-dashboard.check.js && node kryptheon-autostart.check.js && node kryptheon-changes.check.js && node kryptheon-look.check.js && node kryptheon-verify.check.js && node kryptheon-recheck.check.js && node kryptheon-reporter.check.js && node kryptheon-signature.check.js && node kryptheon-signature.stream.check.js && node kryptheon-signature.baseline.check.js && node kryptheon-signature.settle.check.js && node kryptheon-signature.number.check.js && node kryptheon-env.check.js && node kryptheon-watchdog.check.js && node kryptheon-record.check.js && node kryptheon-selectors.check.js && node kryptheon-recordings.check.js && node kryptheon-cleanup.check.js && node kryptheon-orphan.check.js && node kryptheon-project.check.js && node kryptheon-setup.check.js && node kryptheon-browser.check.js && node kryptheon-heal.check.js && node kryptheon-load.check.js && node kryptheon-package.check.js",
|
|
55
56
|
"check:store": "node kryptheon-store.check.js",
|
|
56
57
|
"check:code": "node kryptheon-code.check.js",
|
|
57
58
|
"check:constdata": "node kryptheon-constdata.check.js",
|
|
58
59
|
"check:dashboard": "node kryptheon-dashboard.check.js",
|
|
60
|
+
"check:autostart": "node kryptheon-autostart.check.js",
|
|
59
61
|
"check:changes": "node kryptheon-changes.check.js",
|
|
60
62
|
"check:look": "node kryptheon-look.check.js",
|
|
61
63
|
"check:verify": "node kryptheon-verify.check.js",
|