iobroker.eos-admin 7.9.97 → 7.9.99
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/{INSTALL_TEST_V7.9.97.md → INSTALL_TEST_V7.9.99.md} +2 -2
- package/{MERGE_UPDATE_README_V7.9.97.md → MERGE_UPDATE_README_V7.9.99.md} +1 -1
- package/NEXOWATT_EOS_BUILD_INFO.json +21 -20
- package/{PUBLISH_STABLE_V7.9.97.md → PUBLISH_STABLE_V7.9.99.md} +2 -2
- package/{README_STABILITY_V7.9.97.md → README_STABILITY_V7.9.99.md} +1 -1
- package/{RELEASE_ACCEPTANCE_V7.9.97.md → RELEASE_ACCEPTANCE_V7.9.99.md} +1 -1
- package/RELEASE_NOTES_V7.9.99.md +9 -0
- package/adminWww/assets/Intro-DkwRiz1n-v84.js +2 -2
- package/adminWww/css/eos-ems-overview.css +3 -5
- package/adminWww/css/nexowatt-native-shell.css +32 -1
- package/adminWww/index.html +19 -18
- package/adminWww/js/eos-account-management.js +13 -9
- package/adminWww/js/eos-assistant.js +1 -1
- package/adminWww/js/eos-ems-overview.js +2 -3
- package/adminWww/js/eos-release-watch.js +77 -0
- package/adminWww/js/eos-role-bootstrap.js +7 -4
- package/adminWww/js/eos-role-ui.js +2 -2
- package/adminWww/js/nexowatt-native-shell.js +1 -1
- package/adminWww/static/js/nexowatt-stable-login.js +3 -3
- package/adminWww/static/js/{nexowatt-stable-v97.js → nexowatt-stable-v99.js} +2 -2
- package/build/lib/eosPassword.js +62 -0
- package/build/lib/eosRequestSecurity.js +31 -0
- package/build/lib/web.js +99 -71
- package/build/main.js +2 -1
- package/io-package.json +5 -5
- package/package.json +18 -12
- package/tools/nexowatt-account-management-selftest.cjs +20 -57
- package/tools/nexowatt-apply-ems-overview.cjs +2 -4
- package/tools/nexowatt-cache-update-selftest.cjs +11 -0
- package/tools/nexowatt-clean-legacy-runtime.cjs +1 -1
- package/tools/nexowatt-ems-overview-selftest.cjs +1 -1
- package/tools/nexowatt-login-layout-selftest.cjs +11 -11
- package/tools/nexowatt-merge-update-selftest.cjs +1 -1
- package/tools/nexowatt-modern-ui-selftest.cjs +1 -1
- package/tools/nexowatt-password-write-selftest.cjs +46 -0
- package/tools/nexowatt-request-security-selftest.cjs +11 -0
- package/tools/nexowatt-runtime-cleanup-selftest.cjs +6 -6
- package/tools/nexowatt-stable-v99-selftest.cjs +25 -0
- package/tools/nexowatt-ui-overview-runtime-selftest.cjs +3 -1
- package/tools/nexowatt-validate-package.cjs +23 -14
- package/RELEASE_NOTES_V7.9.97.md +0 -19
- package/tools/nexowatt-stable-v97-selftest.cjs +0 -16
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
'use strict';
|
|
3
3
|
const fs=require('node:fs');const path=require('node:path');const root=path.resolve(__dirname,'..');
|
|
4
|
-
const read=rel=>fs.readFileSync(path.join(root,rel),'utf8');
|
|
5
|
-
const css=read('adminWww/css/nexowatt-native-shell.css')
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
4
|
+
const read=rel=>fs.readFileSync(path.join(root,rel),'utf8');const fail=m=>{console.error(`[NexoWatt EOS login layout] ${m}`);process.exit(1)};const must=(c,m)=>{if(!c)fail(m)};
|
|
5
|
+
const css=read('adminWww/css/nexowatt-native-shell.css'),sourceCss=read('src-admin/public/css/nexowatt-native-shell.css');
|
|
6
|
+
const login=read('src-admin/src/login/Login.tsx'),stableLogin=read('adminWww/static/js/nexowatt-stable-login.js'),stable=read('adminWww/static/js/nexowatt-stable-v99.js'),index=read('adminWww/index.html'),info=JSON.parse(read('NEXOWATT_EOS_BUILD_INFO.json'));
|
|
7
|
+
must(css===sourceCss,'login CSS source/build drift');
|
|
8
|
+
for(const marker of ['outer frame is decorative only','orderly login, moderately enlarged','width: min(440px, calc(100vw - 20px)) !important','height: min(580px, calc(100dvh - 20px)) !important','width: min(380px, calc(100vw - 52px)) !important','min-height: 510px !important','height: auto !important','overflow: visible !important'])must(css.includes(marker),`login marker missing: ${marker}`);
|
|
9
|
+
must(!css.includes('width: min(520px, calc(100vw - 24px))')&&!css.includes('width: min(460px, calc(100vw - 56px))'),'oversized v96 geometry remains');
|
|
10
|
+
must(!/data-nw-login-card|data-nw-login-shell|min-height:590px|width:min\(460px|createElement\(['"]style/.test(stableLogin),'stable-login runtime mutates geometry');
|
|
11
|
+
must(!/width:min\(460px|min-height:540px|createElement\(['"]style/.test(stable),'stable v99 runtime injects login geometry');
|
|
12
|
+
must(login.includes('minHeight: 510')&&login.includes("overflowY: 'visible'")&&login.includes("maxHeight: 'none'"),'native Login source does not match product contract');
|
|
13
|
+
must(index.includes(`nexowatt-native-shell.css?v=${info.shellCacheTag}`)&&index.includes('nexowatt-stable-v99.js?v=99'),'v99 login assets not active');
|
|
14
|
+
console.log('[NexoWatt EOS login layout] OK');
|
|
@@ -16,7 +16,7 @@ for (const file of [
|
|
|
16
16
|
'MERGE_UPDATE.ps1',
|
|
17
17
|
'MERGE_UPDATE.cmd',
|
|
18
18
|
'MERGE_UPDATE.sh',
|
|
19
|
-
'MERGE_UPDATE_README_V7.9.
|
|
19
|
+
'MERGE_UPDATE_README_V7.9.99.md',
|
|
20
20
|
'tools/nexowatt-apply-ems-overview.cjs',
|
|
21
21
|
'tools/nexowatt-sync-release-version.cjs',
|
|
22
22
|
'tools/nexowatt-version-sync-selftest.cjs',
|
|
@@ -29,7 +29,7 @@ for (const marker of ['eos-account-management.js','nexowatt-native-shell.css','e
|
|
|
29
29
|
for (const marker of ['NexoWatt EOS', 'Zugänge & Rollen', 'Endkunden-Zugänge', 'ensureEntrySurface']) {
|
|
30
30
|
if (!accountUi.includes(marker)) fail(`modern account surface missing label: ${marker}`);
|
|
31
31
|
}
|
|
32
|
-
for (const marker of ['installIntegratedFirstLogin','
|
|
32
|
+
for (const marker of ['installIntegratedFirstLogin','v99 normal-login first activation','eos-passwordless-card','Idempotent writes are essential here']) {
|
|
33
33
|
if (!bootstrap.includes(marker)) fail(`integrated first-activation surface missing: ${marker}`);
|
|
34
34
|
}
|
|
35
35
|
if (/data-eos-account=|selector\.innerHTML/.test(bootstrap)) fail('compact login still injects role buttons or a second panel');
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
const assert=require('node:assert/strict');
|
|
4
|
+
const fs=require('node:fs');
|
|
5
|
+
const path=require('node:path');
|
|
6
|
+
const {normalizeEosPasswordTarget,setEosUserPasswordWithVerification}=require('../build/lib/eosPassword.js');
|
|
7
|
+
const root=path.resolve(__dirname,'..');
|
|
8
|
+
const source=fs.readFileSync(path.join(root,'src/lib/eosPassword.ts'),'utf8');
|
|
9
|
+
const web=fs.readFileSync(path.join(root,'src/lib/web.ts'),'utf8');
|
|
10
|
+
|
|
11
|
+
function adapterFixture({verify=true,persist=true,callback=false}={}){
|
|
12
|
+
let password='old';
|
|
13
|
+
let hash=persist?'$old':'';
|
|
14
|
+
const calls=[];
|
|
15
|
+
const adapter={
|
|
16
|
+
calls,
|
|
17
|
+
getForeignObjectAsync:async id=>id==='system.user.user'?{_id:id,common:{password:hash},native:{}}:null,
|
|
18
|
+
checkPasswordAsync:async (user,value,options)=>{calls.push({kind:'check',user,value,options});return [verify&&user==='user'&&value===password,'system.user.user'];},
|
|
19
|
+
};
|
|
20
|
+
const set=async(user,value,options)=>{calls.push({kind:'set',user,value,options});if(user!=='user')throw new Error('shortUserNameRequired');if(persist){password=value;hash=`$hash:${value}`;}};
|
|
21
|
+
if(callback) adapter.setPassword=(user,value,options,cb)=>set(user,value,options).then(()=>cb(),cb);
|
|
22
|
+
else adapter.setPasswordAsync=set;
|
|
23
|
+
return adapter;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
(async()=>{
|
|
27
|
+
assert.deepEqual(normalizeEosPasswordTarget('user'),{userId:'system.user.user',userName:'user'});
|
|
28
|
+
assert.deepEqual(normalizeEosPasswordTarget('system.user.user'),{userId:'system.user.user',userName:'user'});
|
|
29
|
+
assert.throws(()=>normalizeEosPasswordTarget('system.user.bad.name'),/invalidPasswordTarget/);
|
|
30
|
+
for(const fixture of [adapterFixture(),adapterFixture({callback:true})]){
|
|
31
|
+
const result=await setEosUserPasswordWithVerification(fixture,'system.user.user','Strong!2026');
|
|
32
|
+
assert.equal(result.userName,'user');
|
|
33
|
+
assert.equal(fixture.calls.find(c=>c.kind==='set').user,'user','password API must receive short user name');
|
|
34
|
+
assert.deepEqual(fixture.calls.find(c=>c.kind==='set').options,{user:'system.user.admin'});
|
|
35
|
+
assert.equal(fixture.calls.find(c=>c.kind==='check').user,'user','password check must receive short user name');
|
|
36
|
+
}
|
|
37
|
+
const noCheck=adapterFixture();delete noCheck.checkPasswordAsync;
|
|
38
|
+
await setEosUserPasswordWithVerification(noCheck,'user','NoCheck!2026');
|
|
39
|
+
await assert.rejects(()=>setEosUserPasswordWithVerification(adapterFixture({persist:false}),'user','Missing!2026'),/passwordNotPersisted/);
|
|
40
|
+
await assert.rejects(()=>setEosUserPasswordWithVerification(adapterFixture({verify:false}),'user','Verify!2026'),/passwordVerificationFailed/);
|
|
41
|
+
for(const marker of ['setPasswordAsync(userName','checkPasswordAsync(userName','common?.password','userId.replace(/^system\\.user\\./']) assert(source.includes(marker),`source marker missing: ${marker}`);
|
|
42
|
+
assert(!/setForeignObject|common\.password\s*=/.test(source),'helper must never hash/write common.password itself');
|
|
43
|
+
assert(web.includes('extendForeignObjectAsync')&&web.includes('passwordMetadataNotPersisted'),'first-login metadata persistence guard missing');
|
|
44
|
+
assert(!web.includes('setForeignObjectAsync(access.userId, userObject)'),'stale full-user first-login write remains');
|
|
45
|
+
console.log('[NexoWatt EOS password write] OK (short name, persistence, credential and native-only metadata)');
|
|
46
|
+
})().catch(error=>{console.error(error?.stack||error);process.exit(1);});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
const assert=require('node:assert/strict');
|
|
4
|
+
const {isEosSameOriginRequest}=require('../build/lib/eosRequestSecurity.js');
|
|
5
|
+
assert.equal(isEosSameOriginRequest({host:'192.168.10.124:8081'}),true);
|
|
6
|
+
assert.equal(isEosSameOriginRequest({origin:'http://192.168.10.124:8081',host:'192.168.10.124:8081','sec-fetch-site':'same-origin'}),true);
|
|
7
|
+
assert.equal(isEosSameOriginRequest({origin:'https://eos.example.test',host:'proxy:443','x-forwarded-host':'eos.example.test','sec-fetch-site':'same-site'}),true);
|
|
8
|
+
assert.equal(isEosSameOriginRequest({origin:'http://192.168.10.125:8081',host:'192.168.10.124:8081','sec-fetch-site':'same-origin'}),false);
|
|
9
|
+
assert.equal(isEosSameOriginRequest({origin:'http://192.168.10.124:8081',host:'192.168.10.124:8081','sec-fetch-site':'cross-site'}),false);
|
|
10
|
+
assert.equal(isEosSameOriginRequest({origin:'file:///tmp/eos',host:'192.168.10.124:8081'}),false);
|
|
11
|
+
console.log('[NexoWatt EOS request security] OK (LAN, proxy and cross-site guard)');
|
|
@@ -15,15 +15,15 @@ try {
|
|
|
15
15
|
fs.mkdirSync(path.join(temp, 'src-admin', 'public', 'js'), { recursive: true });
|
|
16
16
|
fs.mkdirSync(path.join(temp, 'src-admin', 'public', 'static', 'js'), { recursive: true });
|
|
17
17
|
fs.mkdirSync(path.join(temp, 'adminWww', 'static', 'js'), { recursive: true });
|
|
18
|
-
fs.writeFileSync(path.join(temp, 'NEXOWATT_EOS_BUILD_INFO.json'), JSON.stringify({ runtimeEntry: 'v82', shellCacheVersion:
|
|
18
|
+
fs.writeFileSync(path.join(temp, 'NEXOWATT_EOS_BUILD_INFO.json'), JSON.stringify({ runtimeEntry: 'v82', shellCacheVersion: 99 }));
|
|
19
19
|
|
|
20
20
|
const keep = [
|
|
21
21
|
'adminWww/assets/bootstrap-current-v82.js',
|
|
22
22
|
'adminWww/assets/Objects-current-v82.js',
|
|
23
23
|
'adminWww/remoteEntry-v82.js',
|
|
24
24
|
'adminWww/remoteEntry.js',
|
|
25
|
-
'adminWww/static/js/nexowatt-stable-
|
|
26
|
-
'src-admin/public/static/js/nexowatt-stable-
|
|
25
|
+
'adminWww/static/js/nexowatt-stable-v99.js',
|
|
26
|
+
'src-admin/public/static/js/nexowatt-stable-v99.js',
|
|
27
27
|
'adminWww/static/js/nexowatt-stable-login.js',
|
|
28
28
|
];
|
|
29
29
|
const remove = [
|
|
@@ -34,8 +34,8 @@ try {
|
|
|
34
34
|
'adminWww/js/eos-branding.js',
|
|
35
35
|
'adminWww/css/eos-branding.css',
|
|
36
36
|
'src-admin/public/js/eos-security-ui.js',
|
|
37
|
-
'adminWww/static/js/nexowatt-stable-
|
|
38
|
-
'src-admin/public/static/js/nexowatt-stable-
|
|
37
|
+
'adminWww/static/js/nexowatt-stable-v98.js',
|
|
38
|
+
'src-admin/public/static/js/nexowatt-stable-v97.js',
|
|
39
39
|
];
|
|
40
40
|
for (const rel of [...keep, ...remove]) {
|
|
41
41
|
const file = path.join(temp, rel);
|
|
@@ -45,7 +45,7 @@ try {
|
|
|
45
45
|
|
|
46
46
|
const result = cleanLegacyRuntime({ root: temp, quiet: true, silent: true });
|
|
47
47
|
assert.strictEqual(result.activeRuntime, 82);
|
|
48
|
-
assert.strictEqual(result.activeShell,
|
|
48
|
+
assert.strictEqual(result.activeShell, 99);
|
|
49
49
|
assert.strictEqual(result.removed.length, remove.length);
|
|
50
50
|
for (const rel of keep) assert.ok(fs.existsSync(path.join(temp, rel)), `current runtime removed: ${rel}`);
|
|
51
51
|
for (const rel of remove) assert.ok(!fs.existsSync(path.join(temp, rel)), `legacy file remained: ${rel}`);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
const fs=require('node:fs');const path=require('node:path');const root=path.resolve(__dirname,'..');
|
|
4
|
+
const read=rel=>fs.readFileSync(path.join(root,rel),'utf8');const exists=rel=>fs.existsSync(path.join(root,rel));
|
|
5
|
+
const fail=m=>{console.error(`[NexoWatt EOS stable v99] ${m}`);process.exit(1)};const must=(c,m)=>{if(!c)fail(m)};
|
|
6
|
+
const pkg=JSON.parse(read('package.json')),io=JSON.parse(read('io-package.json')),info=JSON.parse(read('NEXOWATT_EOS_BUILD_INFO.json'));
|
|
7
|
+
const index=read('adminWww/index.html'),css=read('adminWww/css/nexowatt-native-shell.css'),stable=read('adminWww/static/js/nexowatt-stable-v99.js');
|
|
8
|
+
const ems=read('adminWww/js/eos-ems-overview.js'),emsSource=read('src-admin/src/components/Intro/NexoWattEmsOverview.tsx');
|
|
9
|
+
const intro=read('src-admin/src/tabs/Intro.tsx'),bundle=read('adminWww/assets/Intro-DkwRiz1n-v84.js');
|
|
10
|
+
const web=read('src/lib/web.ts'),built=read('build/lib/web.js'),password=read('src/lib/eosPassword.ts'),bootstrap=read('adminWww/js/eos-role-bootstrap.js');
|
|
11
|
+
must(pkg.version==='7.9.99'&&io.version==='7.9.99'&&io.common.version==='7.9.99'&&info.version==='7.9.99','version drift');
|
|
12
|
+
must(info.shellCacheVersion===99&&info.nativeShellVersion===99&&String(info.shellCacheTag)==='99','shell cache is not v99');
|
|
13
|
+
must(index.includes('nexowatt-stable-v99.js?v=99')&&index.includes('eos-release-watch.js?v=99'),'v99 runtime/watcher not loaded');
|
|
14
|
+
must(!exists('adminWww/static/js/nexowatt-stable-v97.js')&&!exists('src-admin/public/static/js/nexowatt-stable-v97.js'),'legacy v97 runtime remains');
|
|
15
|
+
must(!ems.includes('Vollständige EMS-Diagnose öffnen')&&!emsSource.includes('Vollständige EMS-Diagnose öffnen'),'unsupported EMS link remains');
|
|
16
|
+
must(intro.includes('className="eos-overview-edit-controls"')&&intro.includes('eos-native-intro-grid'),'source pencil is not in the card grid');
|
|
17
|
+
must(bundle.includes('className:"eos-overview-edit-controls"')&&bundle.includes('className:"eos-native-intro-grid"'),'productive pencil is not in the card grid');
|
|
18
|
+
must(css.includes('edit controls belong to the lowest Intro card grid')&&css.includes('.eos-overview-edit-controls .MuiFab-root'),'pencil placement CSS missing');
|
|
19
|
+
must(password.includes('setPasswordAsync(userName')&&password.includes('checkPasswordAsync(userName'),'password API does not use short name');
|
|
20
|
+
must(web.includes('passwordMetadataNotPersisted')&&built.includes('passwordMetadataNotPersisted'),'password metadata verification missing');
|
|
21
|
+
must(!web.includes('setForeignObjectAsync(access.userId, userObject)')&&!built.includes('setForeignObjectAsync(access.userId, userObject)'),'stale full-user password write remains');
|
|
22
|
+
must(bootstrap.includes("VERSION = 'v99-first-login-password-persisted'")&&bootstrap.includes('passwordVerificationFailed'),'v99 first-login UI missing');
|
|
23
|
+
must(stable.includes('NEXOWATT_EOS_STABLE_V99'),'stable v99 global marker missing');
|
|
24
|
+
for(const rel of ['tools/nexowatt-password-write-selftest.cjs','tools/nexowatt-request-security-selftest.cjs','tools/nexowatt-cache-update-selftest.cjs'])must(exists(rel),`${rel} missing`);
|
|
25
|
+
console.log('[NexoWatt EOS stable v99] OK');
|
|
@@ -5,7 +5,9 @@ const runtime=read('adminWww/js/eos-ems-overview.js');const source=read('src-adm
|
|
|
5
5
|
if(runtime!==source)fail('runtime source/build drift');
|
|
6
6
|
for(const marker of ['nexowatt-ems-overview-v1','nexowatt-ui.*.info.adminOverview.*','system.adapter.nexowatt-ui.*.alive','POLL_MS = 5000','STALE_MS = 20000',"REQUIRED_UI_VERSION = '0.8.198'",'getForeignStates','Keine Kachel besitzt Schreibhoheit','currentDecisions','§14a-Fallback','nexowatt-eos-admin-socket-ready','readUiAdapterInfo','socketFromReact'])if(!runtime.includes(marker))fail(`runtime marker missing: ${marker}`);
|
|
7
7
|
for(const forbidden of ['setForeignState','setState(','sendToHost','writeFile','extendObject'])if(runtime.includes(forbidden))fail(`read-only runtime contains ${forbidden}`);
|
|
8
|
-
for(const marker of ['eos-ems-overview.css?v=
|
|
8
|
+
for(const marker of ['eos-ems-overview.css?v=99','eos-ems-overview.js?v=99','nexowatt-stable-v99.js?v=99','eos-release-watch.js?v=99'])if(!index.includes(marker))fail(`index marker missing: ${marker}`);
|
|
9
|
+
if(runtime.includes('Vollständige EMS-Diagnose öffnen'))fail('unsupported EMS destination remains visible');
|
|
10
|
+
if(!intro.includes('eos-overview-edit-controls')||!introBundle.includes('eos-overview-edit-controls'))fail('edit control is not inside bottom card grid');
|
|
9
11
|
if(!css.includes('#eos-ems-overview-runtime')||!css.includes('.eos-ems-overview-metrics')||!css.includes('startup and compatibility messages stay compact'))fail('EMS card CSS incomplete');
|
|
10
12
|
if(role.includes('overview.innerHTML = `')||!role.includes('never cover the real Admin Intro'))fail('obsolete role overview still active');
|
|
11
13
|
if(!shell.includes("label: 'Installateur'")||!shell.includes("label: 'Endkunde'")||!shell.includes('eosNativeReactOverview'))fail('native overview role bridge incomplete');
|
|
@@ -41,7 +41,11 @@ if (pkg.scripts['test:eos-version-sync'] !== 'node tools/nexowatt-version-sync-s
|
|
|
41
41
|
if (pkg.scripts['verify:eos-merge'] !== 'node tools/nexowatt-merge-update-selftest.cjs') fail('merge update selftest script is missing or incorrect');
|
|
42
42
|
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-version-sync-selftest.cjs')) fail('version sync selftest is not part of check:eos-stability');
|
|
43
43
|
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-merge-update-selftest.cjs')) fail('merge update selftest is not part of check:eos-stability');
|
|
44
|
-
if (pkg.scripts['check:eos-stable-
|
|
44
|
+
if (pkg.scripts['check:eos-stable-v99'] !== 'node tools/nexowatt-stable-v99-selftest.cjs') fail('stable v99 selftest script is missing or incorrect');
|
|
45
|
+
if (pkg.scripts['test:eos-password-write'] !== 'node tools/nexowatt-password-write-selftest.cjs') fail('password write selftest script is missing');
|
|
46
|
+
if (pkg.scripts['test:eos-request-security'] !== 'node tools/nexowatt-request-security-selftest.cjs') fail('request security selftest script is missing');
|
|
47
|
+
if (pkg.scripts['test:eos-cache-update'] !== 'node tools/nexowatt-cache-update-selftest.cjs') fail('cache update selftest script is missing');
|
|
48
|
+
for (const marker of ['nexowatt-password-write-selftest.cjs','nexowatt-request-security-selftest.cjs','nexowatt-cache-update-selftest.cjs']) if (!pkg.scripts['check:eos-stability']?.includes(marker)) fail(`stability check must execute ${marker}`);
|
|
45
49
|
if (!pkg.scripts.prepublishOnly?.startsWith('npm run sync:eos-version && npm run prepare:eos-release-defaults && npm run check:eos-publish-channel')) fail('prepublishOnly must synchronize versions and normalize release defaults before the publish channel guard');
|
|
46
50
|
if (pkg.scripts['precheck:eos-package'] !== 'npm run sync:eos-version && npm run prepare:eos-release-defaults && npm run clean:eos-runtime') fail('precheck:eos-package must synchronize versions, normalize release defaults and clean stale runtime files');
|
|
47
51
|
if (pkg.scripts['precheck:eos-stability'] !== 'npm run sync:eos-version && npm run prepare:eos-release-defaults && npm run clean:eos-runtime') fail('precheck:eos-stability must synchronize versions, normalize release defaults and clean stale runtime files');
|
|
@@ -100,6 +104,7 @@ for (const file of [
|
|
|
100
104
|
'adminWww/js/eos-basic-settings.js',
|
|
101
105
|
'adminWww/js/eos-role-ui.js',
|
|
102
106
|
'adminWww/js/eos-account-management.js',
|
|
107
|
+
'adminWww/js/eos-release-watch.js',
|
|
103
108
|
'adminWww/js/eos-assistant.js',
|
|
104
109
|
'adminWww/css/nexowatt-native-shell.css',
|
|
105
110
|
'adminWww/img/eos/nexowatt-192.png',
|
|
@@ -110,14 +115,14 @@ for (const file of [
|
|
|
110
115
|
'LICENSE',
|
|
111
116
|
'NEXOWATT_PROPRIETARY_LICENSE.md',
|
|
112
117
|
'THIRD_PARTY_NOTICES.md',
|
|
113
|
-
'README_STABILITY_V7.9.
|
|
114
|
-
'RELEASE_NOTES_V7.9.
|
|
115
|
-
'PUBLISH_STABLE_V7.9.
|
|
116
|
-
'INSTALL_TEST_V7.9.
|
|
117
|
-
'RELEASE_ACCEPTANCE_V7.9.
|
|
118
|
+
'README_STABILITY_V7.9.99.md',
|
|
119
|
+
'RELEASE_NOTES_V7.9.99.md',
|
|
120
|
+
'PUBLISH_STABLE_V7.9.99.md',
|
|
121
|
+
'INSTALL_TEST_V7.9.99.md',
|
|
122
|
+
'RELEASE_ACCEPTANCE_V7.9.99.md',
|
|
118
123
|
'MERGE_UPDATE.ps1',
|
|
119
124
|
'MERGE_UPDATE.cmd',
|
|
120
|
-
'MERGE_UPDATE_README_V7.9.
|
|
125
|
+
'MERGE_UPDATE_README_V7.9.99.md',
|
|
121
126
|
'tools/nexowatt-patch-built-frontend.cjs',
|
|
122
127
|
'tools/nexowatt-native-shell-selftest.cjs',
|
|
123
128
|
'tools/nexowatt-clean-legacy-runtime.cjs',
|
|
@@ -128,6 +133,9 @@ for (const file of [
|
|
|
128
133
|
'tools/nexowatt-role-access-selftest.cjs',
|
|
129
134
|
'tools/nexowatt-first-login-selftest.cjs',
|
|
130
135
|
'tools/nexowatt-account-management-selftest.cjs',
|
|
136
|
+
'tools/nexowatt-password-write-selftest.cjs',
|
|
137
|
+
'tools/nexowatt-request-security-selftest.cjs',
|
|
138
|
+
'tools/nexowatt-cache-update-selftest.cjs',
|
|
131
139
|
'tools/nexowatt-modern-ui-selftest.cjs',
|
|
132
140
|
'tools/nexowatt-login-layout-selftest.cjs',
|
|
133
141
|
'tools/nexowatt-internal-reserve-selftest.cjs',
|
|
@@ -135,12 +143,12 @@ for (const file of [
|
|
|
135
143
|
'tools/nexowatt-sync-release-version.cjs',
|
|
136
144
|
'tools/nexowatt-version-sync-selftest.cjs',
|
|
137
145
|
'tools/nexowatt-merge-update-selftest.cjs',
|
|
138
|
-
'tools/nexowatt-stable-
|
|
146
|
+
'tools/nexowatt-stable-v99-selftest.cjs',
|
|
139
147
|
'tools/nexowatt-ems-overview-selftest.cjs',
|
|
140
148
|
'tools/nexowatt-ui-overview-runtime-selftest.cjs',
|
|
141
149
|
'adminWww/js/eos-ems-overview.js',
|
|
142
150
|
'adminWww/css/eos-ems-overview.css',
|
|
143
|
-
'adminWww/static/js/nexowatt-stable-
|
|
151
|
+
'adminWww/static/js/nexowatt-stable-v99.js',
|
|
144
152
|
'src-admin/src/components/Intro/NexoWattEmsOverview.tsx',
|
|
145
153
|
'tools/nexowatt-publish-channel-guard.cjs',
|
|
146
154
|
'tools/nexowatt-publish-channel-selftest.cjs',
|
|
@@ -168,8 +176,8 @@ const shellTag = String(buildInfo.shellCacheTag || shellCache);
|
|
|
168
176
|
if (!runtime || !Number.isFinite(runtimeNumber)) fail(`invalid runtimeEntry ${runtime}`);
|
|
169
177
|
if (!Number.isFinite(shellCache)) fail(`invalid shellCacheVersion ${buildInfo.shellCacheVersion}`);
|
|
170
178
|
for (const marker of [
|
|
171
|
-
`hostInit-${runtime}.js?v=${
|
|
172
|
-
`index-CQZugZ1z-${runtime}.js?v=${
|
|
179
|
+
`hostInit-${runtime}.js?v=${shellTag}`,
|
|
180
|
+
`index-CQZugZ1z-${runtime}.js?v=${shellTag}`,
|
|
173
181
|
`eos-manual-write-policy.js?v=${shellTag}`,
|
|
174
182
|
`nexowatt-native-shell.css?v=${shellTag}`,
|
|
175
183
|
`nexowatt-native-shell.js?v=${shellTag}`,
|
|
@@ -183,8 +191,9 @@ if (!index.includes(`eos-account-management.js?v=${shellTag}`)) fail('account ma
|
|
|
183
191
|
if (!index.includes(`eos-assistant.js?v=${shellTag}`)) fail('EOS Assist cache key mismatch');
|
|
184
192
|
if (!index.includes(`eos-ems-overview.js?v=${shellTag}`)) fail('EMS overview cache key mismatch');
|
|
185
193
|
if (!index.includes(`eos-ems-overview.css?v=${shellTag}`)) fail('EMS overview CSS cache key mismatch');
|
|
186
|
-
if (!index.includes(`nexowatt-stable-
|
|
187
|
-
if (index.
|
|
194
|
+
if (!index.includes(`nexowatt-stable-v99.js?v=${shellTag}`)) fail('stable v99 cache key mismatch');
|
|
195
|
+
if (!index.includes(`eos-release-watch.js?v=${shellTag}`)) fail('release watcher cache key mismatch');
|
|
196
|
+
if (index.indexOf(`eos-manual-write-policy.js?v=${shellTag}`) > index.indexOf(`hostInit-${runtime}.js?v=${shellTag}`)) fail('manual-write policy must load before the React runtime');
|
|
188
197
|
if (!index.includes('class="eos-native-shell"')) fail('native NexoWatt shell class missing');
|
|
189
198
|
for (const legacy of ['eos-branding.js', 'eos-security-ui.js', 'eos-console-quiet.js', 'eos-objects-state-tools.js']) {
|
|
190
199
|
if (index.includes(legacy)) fail(`legacy browser overlay still loaded: ${legacy}`);
|
|
@@ -232,7 +241,7 @@ if (accountManagement.includes("launcher.className = 'eos-account-management-lau
|
|
|
232
241
|
if (accountManagement.includes('new MutationObserver')) fail('account-management runtime adds a second broad DOM observer');
|
|
233
242
|
if (read('src-admin/public/js/eos-account-management.js') !== accountManagement) fail('account-management source/build drift');
|
|
234
243
|
const roleBootstrap = read('adminWww/js/eos-role-bootstrap.js');
|
|
235
|
-
if (!roleBootstrap.includes('installIntegratedFirstLogin') || !roleBootstrap.includes('
|
|
244
|
+
if (!roleBootstrap.includes('installIntegratedFirstLogin') || !roleBootstrap.includes('v99 normal-login first activation')) fail('compact integrated first-login is incomplete');
|
|
236
245
|
if (/data-eos-account=|selector\.innerHTML/.test(roleBootstrap)) fail('login role buttons must not enlarge the normal login card');
|
|
237
246
|
if (!roleBootstrap.includes('nexowatt/account/passwordless-status') || !roleBootstrap.includes('eligibility.allowed')) fail('server-checked first-login eligibility is incomplete');
|
|
238
247
|
if (roleBootstrap.includes('installPasswordlessFirstLoginLauncher')) fail('old first-login launcher remains active');
|
package/RELEASE_NOTES_V7.9.97.md
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# Release Notes 7.9.97
|
|
2
|
-
|
|
3
|
-
## Anmeldung
|
|
4
|
-
|
|
5
|
-
- Rückkehr zur bewährten kompakten Kartenstruktur.
|
|
6
|
-
- Außenrahmen und Formular sind nur ungefähr sieben Prozent größer als der frühere stabile Stand.
|
|
7
|
-
- Meldungen wachsen innerhalb der Karte, ohne Scrollleisten oder überlange Eingabefelder.
|
|
8
|
-
- Laufzeitskripte verändern keine Breite, Höhe oder Padding der Karte mehr.
|
|
9
|
-
|
|
10
|
-
## Übersicht und EMS
|
|
11
|
-
|
|
12
|
-
- Admin, Installateur und Endkunde nutzen dieselbe native Intro-Kartenkomponente.
|
|
13
|
-
- Die NexoWatt-UI-Karte bleibt für freigegebene Rollen sichtbar.
|
|
14
|
-
- Die EMS-Live-Diagnose übernimmt die produktive EOS-Admin-Verbindung und liest ausschließlich `info.adminOverview.*`.
|
|
15
|
-
- Mindestversion für den vollständigen Publisher: NexoWatt UI `0.8.198`.
|
|
16
|
-
|
|
17
|
-
## Sicherheit
|
|
18
|
-
|
|
19
|
-
Keine Änderung an Geräte-/Setpoint-Schreibwegen. Die Diagnose bleibt vollständig read-only.
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
'use strict';
|
|
3
|
-
const fs=require('node:fs');const path=require('node:path');const root=path.resolve(__dirname,'..');const read=rel=>fs.readFileSync(path.join(root,rel),'utf8');const must=(ok,msg)=>{if(!ok){console.error(`[NexoWatt EOS stable v97] ${msg}`);process.exit(1)}};
|
|
4
|
-
const pkg=JSON.parse(read('package.json'));const cleanup=read('tools/nexowatt-clean-legacy-runtime.cjs');const io=JSON.parse(read('io-package.json'));const info=JSON.parse(read('NEXOWATT_EOS_BUILD_INFO.json'));const css=read('adminWww/css/nexowatt-native-shell.css');const stable=read('adminWww/static/js/nexowatt-stable-v97.js');const login=read('adminWww/static/js/nexowatt-stable-login.js');const index=read('adminWww/index.html');const intro=read('src-admin/src/tabs/Intro.tsx');const introBundle=read('adminWww/assets/Intro-DkwRiz1n-v84.js');const bootstrap=read('adminWww/assets/bootstrap-COulQZax-v84.js');const generic=read('adminWww/assets/index-D2ymscJA-v84.js');const runtime=read('adminWww/js/eos-ems-overview.js');
|
|
5
|
-
must(pkg.version==='7.9.97'&&io.version==='7.9.97'&&io.common.version==='7.9.97'&&info.version==='7.9.97','version drift');
|
|
6
|
-
must(info.shellCacheVersion===97&&info.shellCacheTag==='97','shell cache is not v97');
|
|
7
|
-
must(css.includes('width: min(380px')&&css.includes('min-height: 510px')&&!css.includes('width: min(460px'),'compact login contract missing');
|
|
8
|
-
must(!login.includes('data-nw-login-card')&&!login.includes('min-height:590px')&&!stable.includes('width:min(460px'),'runtime still mutates login geometry');
|
|
9
|
-
must(stable.includes("VERSION = 'v97-compact-login-ems-connection'"),'stable v97 runtime incomplete');
|
|
10
|
-
must(index.includes('nexowatt-stable-v97.js?v=97')&&index.includes('nexowatt-native-shell.css?v=97'),'v97 assets not loaded');
|
|
11
|
-
must(intro.includes('NEXOWATT_EOS_ADMIN_SOCKET')&&introBundle.includes('nexowatt-eos-admin-socket-ready'),'Intro socket bridge missing');
|
|
12
|
-
must(bootstrap.includes('window.NEXOWATT_EOS_ADMIN_SOCKET=window.NEXOWATT_EOS_SOCKET=new AdminConnection'),'productive main socket exposure missing');
|
|
13
|
-
must(!generic.includes('this.socket=window.NEXOWATT_EOS_ADMIN_SOCKET=new M({'),'generic socket overwrite remains');
|
|
14
|
-
must(cleanup.includes('activeShell')&&cleanup.includes('nexowatt-stable-v')&&cleanup.includes("path.join(root, 'src-admin', 'public')"),'stale stable overlay cleanup missing');
|
|
15
|
-
must(runtime.includes('readUiAdapterInfo')&&runtime.includes('socketFromReact')&&runtime.includes("REQUIRED_UI_VERSION = '0.8.198'"),'EMS connection recovery missing');
|
|
16
|
-
console.log('[NexoWatt EOS stable v97] OK');
|