diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..48354a3 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,101 @@ +# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore + +# Built application files +*.apk +*.aar +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +# Uncomment the following line in case you need and you don't have the release build type files in your app +# release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ + +# Android Profiling +*.hprof + +# Cordova plugins for Capacitor +capacitor-cordova-android-plugins + +# Copied web assets +app/src/main/assets/public + +# Generated Config files +app/src/main/assets/capacitor.config.json +app/src/main/assets/capacitor.plugins.json +app/src/main/res/xml/config.xml diff --git a/android/app/.gitignore b/android/app/.gitignore new file mode 100644 index 0000000..043df80 --- /dev/null +++ b/android/app/.gitignore @@ -0,0 +1,2 @@ +/build/* +!/build/.npmkeep diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..af45439 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,54 @@ +apply plugin: 'com.android.application' + +android { + namespace = "it.humansafe.os" + compileSdk = rootProject.ext.compileSdkVersion + defaultConfig { + applicationId "it.humansafe.os" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + aaptOptions { + // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. + // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 + ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' + } + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +repositories { + flatDir{ + dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" + implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" + implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" + implementation project(':capacitor-android') + testImplementation "junit:junit:$junitVersion" + androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" + androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" + implementation project(':capacitor-cordova-android-plugins') +} + +apply from: 'capacitor.build.gradle' + +try { + def servicesJSON = file('google-services.json') + if (servicesJSON.text) { + apply plugin: 'com.google.gms.google-services' + } +} catch(Exception e) { + logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") +} diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle new file mode 100644 index 0000000..bbfb44f --- /dev/null +++ b/android/app/capacitor.build.gradle @@ -0,0 +1,19 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN + +android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 + } +} + +apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" +dependencies { + + +} + + +if (hasProperty('postBuildExtras')) { + postBuildExtras() +} diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java new file mode 100644 index 0000000..f2c2217 --- /dev/null +++ b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.getcapacitor.myapp; + +import static org.junit.Assert.*; + +import android.content.Context; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.getcapacitor.app", appContext.getPackageName()); + } +} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b06ddbf --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/java/it/humansafe/os/MainActivity.java b/android/app/src/main/java/it/humansafe/os/MainActivity.java new file mode 100644 index 0000000..599e387 --- /dev/null +++ b/android/app/src/main/java/it/humansafe/os/MainActivity.java @@ -0,0 +1,5 @@ +package it.humansafe.os; + +import com.getcapacitor.BridgeActivity; + +public class MainActivity extends BridgeActivity {} diff --git a/android/app/src/main/res/drawable-land-hdpi/splash.png b/android/app/src/main/res/drawable-land-hdpi/splash.png new file mode 100644 index 0000000..e31573b Binary files /dev/null and b/android/app/src/main/res/drawable-land-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-mdpi/splash.png b/android/app/src/main/res/drawable-land-mdpi/splash.png new file mode 100644 index 0000000..f7a6492 Binary files /dev/null and b/android/app/src/main/res/drawable-land-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-xhdpi/splash.png b/android/app/src/main/res/drawable-land-xhdpi/splash.png new file mode 100644 index 0000000..8077255 Binary files /dev/null and b/android/app/src/main/res/drawable-land-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxhdpi/splash.png new file mode 100644 index 0000000..14c6c8f Binary files /dev/null and b/android/app/src/main/res/drawable-land-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png new file mode 100644 index 0000000..244ca25 Binary files /dev/null and b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-hdpi/splash.png b/android/app/src/main/res/drawable-port-hdpi/splash.png new file mode 100644 index 0000000..74faaa5 Binary files /dev/null and b/android/app/src/main/res/drawable-port-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-mdpi/splash.png b/android/app/src/main/res/drawable-port-mdpi/splash.png new file mode 100644 index 0000000..e944f4a Binary files /dev/null and b/android/app/src/main/res/drawable-port-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-xhdpi/splash.png b/android/app/src/main/res/drawable-port-xhdpi/splash.png new file mode 100644 index 0000000..564a82f Binary files /dev/null and b/android/app/src/main/res/drawable-port-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxhdpi/splash.png new file mode 100644 index 0000000..bfabe68 Binary files /dev/null and b/android/app/src/main/res/drawable-port-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png new file mode 100644 index 0000000..6929071 Binary files /dev/null and b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..d5fccc5 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/splash.png b/android/app/src/main/res/drawable/splash.png new file mode 100644 index 0000000..f7a6492 Binary files /dev/null and b/android/app/src/main/res/drawable/splash.png differ diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..b5ad138 --- /dev/null +++ b/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..c023e50 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..2127973 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..b441f37 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..72905b8 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..8ed0605 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..9502e47 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..4d1e077 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..df0f158 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..853db04 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..6cdf97c Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..2960cbb Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..8e3093a Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..46de6e2 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..d2ea9ab Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..a40d73e Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..9e1e8a6 --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,7 @@ + + + HUMANSAFE OS + HUMANSAFE OS + it.humansafe.os + it.humansafe.os + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..be874e5 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/xml/file_paths.xml b/android/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..bd0c4d8 --- /dev/null +++ b/android/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java new file mode 100644 index 0000000..0297327 --- /dev/null +++ b/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java @@ -0,0 +1,18 @@ +package com.getcapacitor.myapp; + +import static org.junit.Assert.*; + +import org.junit.Test; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..f8f0e43 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,29 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:8.13.0' + classpath 'com.google.gms:google-services:4.4.4' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +apply from: "variables.gradle" + +allprojects { + repositories { + google() + mavenCentral() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle new file mode 100644 index 0000000..9a5fa87 --- /dev/null +++ b/android/capacitor.settings.gradle @@ -0,0 +1,3 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN +include ':capacitor-android' +project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..2e87c52 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,22 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..1b33c55 Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..7705927 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/android/gradlew b/android/gradlew new file mode 100644 index 0000000..23d15a9 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,251 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 0000000..db3a6ac --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..3b4431d --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,5 @@ +include ':app' +include ':capacitor-cordova-android-plugins' +project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') + +apply from: 'capacitor.settings.gradle' \ No newline at end of file diff --git a/android/variables.gradle b/android/variables.gradle new file mode 100644 index 0000000..ee4ba41 --- /dev/null +++ b/android/variables.gradle @@ -0,0 +1,16 @@ +ext { + minSdkVersion = 24 + compileSdkVersion = 36 + targetSdkVersion = 36 + androidxActivityVersion = '1.11.0' + androidxAppCompatVersion = '1.7.1' + androidxCoordinatorLayoutVersion = '1.3.0' + androidxCoreVersion = '1.17.0' + androidxFragmentVersion = '1.8.9' + coreSplashScreenVersion = '1.2.0' + androidxWebkitVersion = '1.14.0' + junitVersion = '4.13.2' + androidxJunitVersion = '1.3.0' + androidxEspressoCoreVersion = '3.7.0' + cordovaAndroidVersion = '14.0.1' +} \ No newline at end of file diff --git a/build-mobile.ps1 b/build-mobile.ps1 new file mode 100644 index 0000000..f02b6c2 --- /dev/null +++ b/build-mobile.ps1 @@ -0,0 +1,29 @@ +$dest = ".\dist-mobile" + +if (Test-Path $dest) { + Remove-Item $dest -Recurse -Force +} + +New-Item -ItemType Directory -Force -Path $dest | Out-Null + +# File HTML principali +Copy-Item .\index.html $dest +Copy-Item .\login.html $dest -ErrorAction SilentlyContinue +Copy-Item .\hsi.html $dest -ErrorAction SilentlyContinue +Copy-Item .\lifenet_game.html $dest +Copy-Item .\journal.html $dest +Copy-Item .\profile.html $dest -ErrorAction SilentlyContinue +Copy-Item .\social.html $dest + +# File app/PWA +Copy-Item .\manifest.json $dest -ErrorAction SilentlyContinue +Copy-Item .\service-worker.js $dest -ErrorAction SilentlyContinue +Copy-Item .\logo_humansafe.jpg $dest -ErrorAction SilentlyContinue + +# Cartelle runtime +Copy-Item .\assets $dest -Recurse -Force -ErrorAction SilentlyContinue +Copy-Item .\modules $dest -Recurse -Force +Copy-Item .\game-data $dest -Recurse -Force +Copy-Item .\user-data $dest -Recurse -Force -ErrorAction SilentlyContinue + +Write-Host "Build mobile completata in dist-mobile" diff --git a/capacitor.config.json b/capacitor.config.json new file mode 100644 index 0000000..658b104 --- /dev/null +++ b/capacitor.config.json @@ -0,0 +1,5 @@ +{ + "appId": "it.humansafe.os", + "appName": "HUMANSAFE OS", + "webDir": "dist-mobile" +} diff --git a/dist-mobile/assets/js/share-quiz.js b/dist-mobile/assets/js/share-quiz.js new file mode 100644 index 0000000..af4f46f --- /dev/null +++ b/dist-mobile/assets/js/share-quiz.js @@ -0,0 +1,147 @@ +(function () { + if (window.__HUMANSAFE_SHARE_PATCH__) return; + window.__HUMANSAFE_SHARE_PATCH__ = true; + + function injectStyle() { + if (document.getElementById("humansafe-share-style")) return; + + var style = document.createElement("style"); + style.id = "humansafe-share-style"; + style.textContent = + ".share-box{margin-top:24px;padding:18px;border:1px solid rgba(255,255,255,.12);border-radius:18px;background:rgba(255,255,255,.04)}" + + ".share-row{display:flex;gap:12px;flex-wrap:wrap;margin-top:12px}" + + ".btn-share{display:inline-block;text-decoration:none;padding:12px 16px;border-radius:12px;border:1px solid rgba(255,255,255,.12);background:#1b2a3a;color:#fff;cursor:pointer;font-weight:600}" + + ".btn-share:hover{opacity:.92}" + + ".share-hidden{display:none!important}"; + document.head.appendChild(style); + } + + function txt(selector) { + var el = document.querySelector(selector); + return el && el.textContent ? el.textContent.trim() : ""; + } + + function getHost() { + return document.querySelector("main") || document.body; + } + + function ensureShareUI() { + var box = document.getElementById("shareBox"); + if (box) return box; + + box = document.createElement("div"); + box.id = "shareBox"; + box.className = "share-box share-hidden"; + box.innerHTML = + '

Condividi il tuo risultato

' + + '

' + + '
' + + '' + + 'Condividi su X' + + '' + + '
'; + + getHost().appendChild(box); + return box; + } + + function readResult() { + var archetype = + txt("#archetypeName") || + txt("#archetype") || + txt("#profileName") || + txt("#resultArchetype") || + "Profilo Humansafe"; + + var hsi = + txt("#hsiValue") || + txt("#hsiScore") || + txt("#scoreValue") || + txt("#score"); + + return { archetype: archetype, hsi: hsi }; + } + + function buildLinks(data) { + var encodedText = encodeURIComponent(data.text); + var encodedUrl = encodeURIComponent(data.url); + + return { + native: { title: data.title, text: data.text, url: data.url }, + x: "https://twitter.com/intent/tweet?text=" + encodedText + "&url=" + encodedUrl + }; + } + + function renderShareBox(data) { + var box = ensureShareUI(); + var message = document.getElementById("shareMessage"); + var nativeBtn = document.getElementById("nativeShareBtn"); + var xBtn = document.getElementById("shareX"); + var copyBtn = document.getElementById("copyShareBtn"); + var links = buildLinks(data); + + box.classList.remove("share-hidden"); + message.textContent = data.text; + xBtn.href = links.x; + + nativeBtn.onclick = async function () { + try { + if (navigator.share && (!navigator.canShare || navigator.canShare(links.native))) { + await navigator.share(links.native); + } else { + window.open(links.x, "_blank", "width=600,height=500"); + } + } catch (err) { + console.log("Condivisione annullata o non disponibile:", err); + } + }; + + copyBtn.onclick = async function () { + try { + await navigator.clipboard.writeText(data.url); + copyBtn.textContent = "Link copiato"; + setTimeout(function () { + copyBtn.textContent = "Copia link"; + }, 1600); + } catch (err) { + console.log("Copia non disponibile:", err); + } + }; + } + + function mountShare() { + var data = readResult(); + var shareUrl = location.origin + location.pathname + "?type=quiz&archetipo=" + encodeURIComponent(data.archetype); + var shareText = data.hsi + ? 'Ho completato il test HUMANSAFE. Il mio profilo attuale è "' + data.archetype + '" con HSI ' + data.hsi + '.' + : 'Ho completato il test HUMANSAFE. Il mio profilo attuale è "' + data.archetype + '".'; + + renderShareBox({ + title: "HUMANSAFE | " + data.archetype, + text: shareText, + url: shareUrl + }); + } + + function hookShowResults() { + if (typeof window.showResults !== "function") { + console.warn("showResults() non trovata."); + return; + } + + var originalShowResults = window.showResults; + + window.showResults = function () { + var result = originalShowResults.apply(this, arguments); + try { + mountShare(); + } catch (err) { + console.error("Errore share patch:", err); + } + return result; + }; + } + + injectStyle(); + hookShowResults(); +})(); diff --git a/dist-mobile/game-data/README.md b/dist-mobile/game-data/README.md new file mode 100644 index 0000000..bfa3c74 --- /dev/null +++ b/dist-mobile/game-data/README.md @@ -0,0 +1,54 @@ +\# HUMANSAFE Game Data + + + +Questa cartella contiene i dati strutturati usati dai prototipi interattivi HUMANSAFE. + + + +\## Struttura + + + +\### `scenarios/` + +Scenari narrativi e situazioni interattive del sistema. + + + +\### `profiles/` + +Profili utente, archetipi, stati cognitivi e configurazioni identitarie. + + + +\### `missions/` + +Missioni, azioni guidate e compiti associati all’evoluzione dell’utente. + + + +\### `signals/` + +Segnali cognitivi, pattern comportamentali e indicatori simbolici usati nei moduli HUMANSAFE. + + + +\## Obiettivo + + + +Organizzare i dati del progetto in forma leggibile, espandibile e riutilizzabile per: + + + +\- quiz + +\- simulazioni + +\- moduli narrativi + +\- sistemi di coaching + +\- strumenti diagnostici etici + diff --git a/dist-mobile/game-data/missions/missions_01.json b/dist-mobile/game-data/missions/missions_01.json new file mode 100644 index 0000000..8cfb5aa --- /dev/null +++ b/dist-mobile/game-data/missions/missions_01.json @@ -0,0 +1,51 @@ +{ + "system": "HUMANSAFE Mission Layer", + "description": "Pacchetto iniziale di missioni etiche e reali per il primo MVP di HUMANSAFE OS.", + "missions": [ + { + "id": "missione_01", + "title": "10 minuti senza schermo", + "type": "offline", + "reward_xp": 5, + "reward_traits": ["presence", "reality"], + "description": "Resta per 10 minuti senza schermo, musica o distrazioni digitali.", + "ethical_value": "presenza" + }, + { + "id": "missione_02", + "title": "Una risposta non impulsiva", + "type": "behavioral", + "reward_xp": 8, + "reward_traits": ["clarity", "courage"], + "description": "Aspetta prima di rispondere a un messaggio o contenuto che ti attiva emotivamente.", + "ethical_value": "coraggio" + }, + { + "id": "missione_03", + "title": "Conversazione piena", + "type": "relational", + "reward_xp": 10, + "reward_traits": ["empathy", "presence"], + "description": "Fai una conversazione reale senza toccare il telefono.", + "ethical_value": "empatia" + }, + { + "id": "missione_04", + "title": "Camminata lucida", + "type": "offline", + "reward_xp": 6, + "reward_traits": ["reality", "clarity"], + "description": "Cammina per 15 minuti senza notifiche né contenuti in cuffia.", + "ethical_value": "realtà" + }, + { + "id": "missione_05", + "title": "Riflessione scritta", + "type": "reflective", + "reward_xp": 7, + "reward_traits": ["clarity", "presence"], + "description": "Scrivi tre righe vere su cosa usi per fuggire quando senti attrito o disagio.", + "ethical_value": "chiarezza" + } + ] +} \ No newline at end of file diff --git a/dist-mobile/game-data/profiles/archetypes.json b/dist-mobile/game-data/profiles/archetypes.json new file mode 100644 index 0000000..9352468 --- /dev/null +++ b/dist-mobile/game-data/profiles/archetypes.json @@ -0,0 +1,69 @@ +{ + "archetypes": [ + { + "id": "cellula_dormiente", + "name": "Cellula Dormiente", + "zone": "Zona Rossa", + "description": "Usa spesso il digitale come anestetico o rifugio automatico. Tende a fuggire il vuoto, la frizione e la presenza reale.", + "traits": [ + "alta distrazione", + "bassa regolazione", + "evasione automatica", + "fragile presenza mentale" + ], + "recommended_action": "Applica la Regola del Vuoto: 15 minuti al giorno senza schermo, senza musica, senza fuga." + }, + { + "id": "cellula_reattiva", + "name": "Cellula Reattiva", + "zone": "Zona Grigia", + "description": "Ha coscienza della manipolazione digitale, ma viene ancora trascinata da urgenza, controllo e attrito emotivo.", + "traits": [ + "impulsività", + "controllo compulsivo", + "sensibilità ai trigger", + "consapevolezza instabile" + ], + "recommended_action": "Applica la regola delle 24 ore prima di rispondere a contenuti o messaggi ad alta carica emotiva." + }, + { + "id": "cellula_osservatrice", + "name": "Cellula Osservatrice", + "zone": "Zona Grigia", + "description": "È più lucida della media e riconosce molti meccanismi, ma alterna osservazione e dispersione.", + "traits": [ + "auto-osservazione", + "lucidità intermittente", + "struttura fragile", + "buon potenziale evolutivo" + ], + "recommended_action": "Introduci un blocco quotidiano di 30 minuti di presenza reale senza notifiche." + }, + { + "id": "cellula_in_risveglio", + "name": "Cellula in Risveglio", + "zone": "Zona Verde", + "description": "Sta recuperando spazio mentale e usa la tecnologia con intenzione crescente.", + "traits": [ + "presenza crescente", + "migliore regolazione", + "autonomia in sviluppo", + "uso più consapevole del digitale" + ], + "recommended_action": "Trasforma una tua pratica sana in rituale stabile e condividila con almeno una persona." + }, + { + "id": "nucleo_sovrano", + "name": "Nucleo Sovrano", + "zone": "Zona Verde", + "description": "Ha una buona capacità di reggere vuoto, impulso e frizione. La tecnologia non domina il suo baricentro.", + "traits": [ + "alta presenza", + "regolazione forte", + "lucidità stabile", + "capacità di proteggere sé e gli altri" + ], + "recommended_action": "Diventa nodo attivo: crea contesti, conversazioni e micro-azioni che proteggano anche gli altri." + } + ] +} \ No newline at end of file diff --git a/dist-mobile/game-data/progression/levels.json b/dist-mobile/game-data/progression/levels.json new file mode 100644 index 0000000..47072d3 --- /dev/null +++ b/dist-mobile/game-data/progression/levels.json @@ -0,0 +1,41 @@ +{ + "system": "HUMANSAFE Progression Layer", + "description": "Sistema base di livelli per la gamification etica di HUMANSAFE OS.", + "levels": [ + { + "level": 1, + "id": "segnale_debole", + "name": "Segnale Debole", + "xp_required": 0, + "description": "L'utente inizia a osservare i propri automatismi senza ancora dominarli." + }, + { + "level": 2, + "id": "cellula_attiva", + "name": "Cellula Attiva", + "xp_required": 20, + "description": "L'utente ha iniziato a reagire con maggiore consapevolezza e presenza." + }, + { + "level": 3, + "id": "osservatore_lucido", + "name": "Osservatore Lucido", + "xp_required": 50, + "description": "L'utente sviluppa una capacità più stabile di auto-osservazione e regolazione." + }, + { + "level": 4, + "id": "nodo_consapevole", + "name": "Nodo Consapevole", + "xp_required": 90, + "description": "L'utente consolida il proprio baricentro mentale e diventa punto di riferimento." + }, + { + "level": 5, + "id": "custode_humansafe", + "name": "Custode Humansafe", + "xp_required": 140, + "description": "L'utente ha sviluppato una presenza forte e una capacità di protezione verso sé e gli altri." + } + ] +} \ No newline at end of file diff --git a/game-data/scenario_01.json b/dist-mobile/game-data/scenarios/scenario_01.json similarity index 100% rename from game-data/scenario_01.json rename to dist-mobile/game-data/scenarios/scenario_01.json diff --git a/game-data/scenario_02.json b/dist-mobile/game-data/scenarios/scenario_02.json similarity index 100% rename from game-data/scenario_02.json rename to dist-mobile/game-data/scenarios/scenario_02.json diff --git a/game-data/scenario_03.json b/dist-mobile/game-data/scenarios/scenario_03.json similarity index 100% rename from game-data/scenario_03.json rename to dist-mobile/game-data/scenarios/scenario_03.json diff --git a/game-data/scenario_04.json b/dist-mobile/game-data/scenarios/scenario_04.json similarity index 100% rename from game-data/scenario_04.json rename to dist-mobile/game-data/scenarios/scenario_04.json diff --git a/dist-mobile/game-data/signals/hsi_zones.json b/dist-mobile/game-data/signals/hsi_zones.json new file mode 100644 index 0000000..dd2022f --- /dev/null +++ b/dist-mobile/game-data/signals/hsi_zones.json @@ -0,0 +1,97 @@ +{ + "metric": "HSI", + "name": "Humansafe Signal Index", + "description": "Indice simbolico usato nei prototipi HUMANSAFE per rappresentare il livello di equilibrio tra attenzione, reattività, responsabilità e presenza mentale nel rapporto con il digitale.", + "scale": { + "min": 0, + "max": 100 + }, + "zones": [ + { + "id": "zona_rossa", + "name": "Zona Rossa", + "range": { + "min": 0, + "max": 35 + }, + "color": "red", + "meaning": "Il digitale tende a dominare il baricentro mentale dell'utente. La persona usa spesso lo schermo come fuga, anestesia o reazione impulsiva.", + "characteristics": [ + "alta distrazione", + "bassa presenza", + "reattività elevata", + "uso compensativo del digitale", + "fragilità nella regolazione" + ], + "priority": "Ridurre il rumore, interrompere gli automatismi e ricostruire spazio mentale reale." + }, + { + "id": "zona_grigia_bassa", + "name": "Zona Grigia Bassa", + "range": { + "min": 36, + "max": 55 + }, + "color": "amber", + "meaning": "L'utente comincia a riconoscere i meccanismi che lo influenzano, ma resta ancora spesso intrappolato in urgenza, controllo e dispersione.", + "characteristics": [ + "consapevolezza instabile", + "controllo compulsivo", + "oscillazione tra lucidità e ricaduta", + "vulnerabilità ai trigger emotivi" + ], + "priority": "Stabilizzare la consapevolezza e introdurre regole semplici ma costanti." + }, + { + "id": "zona_grigia_alta", + "name": "Zona Grigia Alta", + "range": { + "min": 56, + "max": 70 + }, + "color": "yellow", + "meaning": "L'utente possiede una buona capacità di osservazione, ma non ha ancora consolidato del tutto la propria struttura interna.", + "characteristics": [ + "buona lucidità", + "presenza intermittente", + "potenziale evolutivo alto", + "disciplina non ancora stabile" + ], + "priority": "Trasformare le intuizioni in pratiche quotidiane stabili." + }, + { + "id": "zona_verde_media", + "name": "Zona Verde", + "range": { + "min": 71, + "max": 85 + }, + "color": "green", + "meaning": "L'utente sta recuperando baricentro mentale e usa la tecnologia con intenzione crescente e maggiore responsabilità.", + "characteristics": [ + "presenza crescente", + "regolazione migliore", + "uso più consapevole del digitale", + "maggiore autonomia" + ], + "priority": "Consolidare le pratiche sane e iniziare a diventare punto di riferimento per altri." + }, + { + "id": "zona_verde_alta", + "name": "Zona Verde Alta", + "range": { + "min": 86, + "max": 100 + }, + "color": "emerald", + "meaning": "L'utente mantiene un buon equilibrio tra impulso, attenzione e presenza. La tecnologia non domina il suo centro decisionale.", + "characteristics": [ + "alta lucidità", + "forte presenza mentale", + "buona capacità di regolazione", + "attitudine protettiva verso sé e altri" + ], + "priority": "Diffondere cultura di presenza, protezione e lucidità nella propria rete umana." + } + ] +} \ No newline at end of file diff --git a/dist-mobile/hsi.html b/dist-mobile/hsi.html new file mode 100644 index 0000000..5ccea0b --- /dev/null +++ b/dist-mobile/hsi.html @@ -0,0 +1,126 @@ +@' + + + + + + HUMANSAFE | HSI Diagnostic + + + +
+
+

HSI Diagnostic

+

Una prima scansione per comprendere il tuo orientamento cognitivo, emotivo ed etico nel sistema HUMANSAFE.

+

Diagnosis → Simulation → Reflection → Mission → Memory → Evolution → Community

+
+ +
+

+ Rispondi con sincerità. Non è un test clinico, ma una mappa iniziale + per personalizzare simulazione, riflessione e missioni. +

+
+ +
+
+ +
+ + +
+ + + + +'@ | Set-Content .\hsi.html -Encoding UTF8 diff --git a/dist-mobile/index.html b/dist-mobile/index.html new file mode 100644 index 0000000..50791ae --- /dev/null +++ b/dist-mobile/index.html @@ -0,0 +1,427 @@ + + + + + + HUMANSAFE OS | Home Hub + + + + + + +
+ +
+
+
HUMANSAFE OS · Home Hub
+ Accesso → +
+ +

Tecnologia etica per lucidità, memoria, comunità e crescita umana.

+ +

+ HUMANSAFE OS è un ecosistema che unisce simulazione narrativa, riflessione, missioni reali, + diario evolutivo e community etica per aiutare l’utente a sviluppare più presenza e più sovranità cognitiva. +

+ +

+ Non è un social classico. Non è solo un quiz. Non è solo un gioco. + È un sistema unico che trasforma l’esperienza digitale in percorso. +

+ + + +
+ Formula del sistema +

+ diagnosi → simulazione → missione → memoria → evoluzione → comunità +

+
+
+ +
+

Perché esiste HUMANSAFE

+
+
+

Il problema

+

+ Gli ecosistemi digitali spingono spesso reattività, distrazione e frammentazione. + L’essere umano si ritrova connesso ovunque, ma poco presente a sé stesso. +

+
+
+

La risposta

+

+ HUMANSAFE usa il digitale come infrastruttura etica: uno specchio, un laboratorio + e una memoria del percorso, non una macchina che divora attenzione. +

+
+
+
+ +
+

I moduli del sistema

+
+ +
+
Access Layer
+

Login

+

Porta di ingresso al sistema e ponte verso community esterne.

+ Apri login +
+ +
+
Simulation Layer
+

LIFENET

+

Scenari, scelte, XP, missioni, ORACLE e progressione etica.

+ Apri LIFENET +
+ +
+
Journal Layer
+

Journal

+

Missioni, riflessioni, timeline e continuità del percorso.

+ Apri Journal +
+ +
+
Profile Layer
+

Profilo

+

Centro identitario con XP, archetipo, badge e stato utente.

+ Apri Profilo +
+ +
+
Community Layer
+

Circle

+

Condivisione etica, supporto reciproco e community non tossica.

+ Apri Circle +
+ +
+
Data Layer
+

Game Data

+

Scenari, missioni, livelli, segnali e archetipi del sistema.

+
+ +
+
Core Layer
+

Profile Engine

+

Motore unico che collega profilo, timeline, missioni e badge.

+
+ +
+
PWA Layer
+

App installabile

+

Manifest e service worker preparano HUMANSAFE come app mobile.

+
+ +
+
+ +
+

Stato attuale del prototipo

+

+ Il nucleo di HUMANSAFE OS è già attivo come prototipo coerente e navigabile. +

+ +
+ Profile Engine attivo + LIFENET attivo + Journal attivo + Profile attivo + Circle attivo + Auth reale da completare + Packaging Android da completare +
+ + +
+ +
+

Ingresso rapido

+

+ Se vuoi iniziare subito, entra nel simulatore oppure apri il profilo centrale del percorso. +

+ + +
+ +
+ + + + diff --git a/dist-mobile/journal.html b/dist-mobile/journal.html new file mode 100644 index 0000000..55451b5 --- /dev/null +++ b/dist-mobile/journal.html @@ -0,0 +1,438 @@ + + + + + + + HUMANSAFE Journal | Diario di Bordo + + + + +
+
+
+
HUMANSAFE Journal Layer
+ ← Torna a HUMANSAFE CORE +
+ +

Diario di bordo del percorso

+

+ Il Journal trasforma eventi, missioni, riflessioni e passaggi evolutivi + in memoria leggibile. Non serve a giudicarti: serve a darti continuità. +

+ + +
+ +
+
+

Stato sintetico

+
+
+ Nome profilo + Caricamento... +
+
+ Archetipo + Caricamento... +
+
+ Zona HSI + Caricamento... +
+
+ XP Totale + 0 +
+
+ +
+

Badge attivi

+
+
+ +
+

Missioni completate

+
+
+
+ +
+

Memoria del percorso

+ +
+

Riflessioni recenti

+
+
+ +
+

Timeline evolutiva

+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist-mobile/lifenet_game.html b/dist-mobile/lifenet_game.html new file mode 100644 index 0000000..babdbc7 --- /dev/null +++ b/dist-mobile/lifenet_game.html @@ -0,0 +1,660 @@ + + + + + + HUMANSAFE LIFENET | Simulation Layer + + + + +
+
+
+
HUMANSAFE LIFENET · Simulation Layer
+ ← Torna a HUMANSAFE CORE +
+ +

Allenamento alla sovranità cognitiva

+

+ LIFENET è il simulatore narrativo di HUMANSAFE OS. Qui attraversi scenari, + fai scelte, ricevi riflessioni ORACLE e trasformi l’esperienza in progresso reale. +

+ + +
+ +
+
+
+
Scenario 1
+

Caricamento...

+

+ +
+ +

+
+ + + + + +
+ + Apri Journal + Apri Profilo +
+
+
+ + +
+
+ + + + diff --git a/dist-mobile/login.html b/dist-mobile/login.html new file mode 100644 index 0000000..3b05a90 --- /dev/null +++ b/dist-mobile/login.html @@ -0,0 +1,271 @@ + + + + + + HUMANSAFE OS | Access Layer + + + + +
+ +
+
+
HUMANSAFE OS · Access Layer
+ ← Torna alla Home +
+ +

Entra nell’ecosistema HUMANSAFE

+ +

+ Questa è la porta di ingresso al sistema: simulazione, profilo, diario, community e crescita etica. +

+ +

+ Per ora l’accesso è un gateway demo coerente con il prototipo. + Nei prossimi aggiornamenti potrà essere collegato ad autenticazione reale. +

+ + + +
+ Il cuore dell’identità utente resta interno a HUMANSAFE. + I provider esterni sono solo porte di ingresso, non il centro del sistema. +
+
+ +
+

Ingressi rapidi

+ +
+
+

Comunità esterna

+

+ Usa i nodi esterni per diffusione, contatto e community iniziale. +

+ +
+ +
+

Moduli interni

+

+ Accedi direttamente ai moduli centrali già attivi nel prototipo. +

+ +
+
+ +

+ Futuri step: autenticazione reale, sincronizzazione cloud, onboarding guidato, account persistente multi-dispositivo. +

+
+ +
+ + + diff --git a/dist-mobile/logo_humansafe.jpg b/dist-mobile/logo_humansafe.jpg new file mode 100644 index 0000000..80320c2 Binary files /dev/null and b/dist-mobile/logo_humansafe.jpg differ diff --git a/dist-mobile/manifest.json b/dist-mobile/manifest.json new file mode 100644 index 0000000..2ad7583 --- /dev/null +++ b/dist-mobile/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "HUMANSAFE OS", + "short_name": "HUMANSAFE", + "start_url": "index.html", + "display": "standalone", + "background_color": "#0d1117", + "theme_color": "#4ea1ff", + "orientation": "portrait", + "icons": [ + { + "src": "logo_humansafe.jpg", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "logo_humansafe.jpg", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/franchising-sociale/README.md b/dist-mobile/modules/franchising-sociale/README.md similarity index 100% rename from franchising-sociale/README.md rename to dist-mobile/modules/franchising-sociale/README.md diff --git a/franchising-sociale/roi_ambassador_calculator.py b/dist-mobile/modules/franchising-sociale/roi_ambassador_calculator.py similarity index 100% rename from franchising-sociale/roi_ambassador_calculator.py rename to dist-mobile/modules/franchising-sociale/roi_ambassador_calculator.py diff --git a/dist-mobile/modules/hsi-engine.js b/dist-mobile/modules/hsi-engine.js new file mode 100644 index 0000000..e46ff7b --- /dev/null +++ b/dist-mobile/modules/hsi-engine.js @@ -0,0 +1,179 @@ +@' +import { + updateHSIProfile, + addTimelineEvent, + addBadge, + addMission +} from "./profile-engine.js"; + +const HSI_QUESTIONS = [ + { id: "awareness_1", text: "Riesco a riconoscere con chiarezza ciò che provo prima di reagire.", axis: "awareness" }, + { id: "awareness_2", text: "Mi fermo a riflettere prima di prendere decisioni importanti.", axis: "awareness" }, + { id: "awareness_3", text: "Mi accorgo quando sto vivendo in automatico.", axis: "awareness" }, + + { id: "sovereignty_1", text: "So distinguere tra ciò che penso davvero e ciò che assorbo dall’esterno.", axis: "sovereignty" }, + { id: "sovereignty_2", text: "Resisto alla pressione di conformarmi digitalmente o socialmente.", axis: "sovereignty" }, + { id: "sovereignty_3", text: "Metto in discussione contenuti e stimoli prima di accettarli.", axis: "sovereignty" }, + + { id: "resilience_1", text: "Riesco a regolare le emozioni senza esserne travolto.", axis: "resilience" }, + { id: "resilience_2", text: "Costruisco relazioni che mi fanno crescere invece di svuotarmi.", axis: "resilience" }, + { id: "resilience_3", text: "Cerco di agire in modo coerente con i miei valori.", axis: "resilience" } +]; + +const form = document.getElementById("hsi-form"); +const submitBtn = document.getElementById("submit-hsi"); +const resultBox = document.getElementById("hsi-result"); +const resultContent = document.getElementById("hsi-result-content"); +const continueBtn = document.getElementById("continue-btn"); + +function renderQuestions() { + form.innerHTML = HSI_QUESTIONS.map((q, index) => ` +
+

${index + 1}. ${q.text}

+
+ ${[1, 2, 3, 4, 5].map(value => ` + + `).join("")} +
+
+ `).join(""); +} + +function collectAnswers() { + const answers = []; + + for (const question of HSI_QUESTIONS) { + const checked = document.querySelector(`input[name="${question.id}"]:checked`); + if (!checked) return null; + + answers.push({ + id: question.id, + axis: question.axis, + value: Number(checked.value) + }); + } + + return answers; +} + +function normalizeScore(rawScore, min = 9, max = 45) { + return Math.round(((rawScore - min) / (max - min)) * 100); +} + +function getHSIZone(score) { + if (score <= 25) return "grey"; + if (score <= 50) return "amber"; + if (score <= 75) return "blue"; + return "gold"; +} + +function getAxisScores(answers) { + return { + awareness: answers.filter(a => a.axis === "awareness").reduce((sum, a) => sum + a.value, 0), + sovereignty: answers.filter(a => a.axis === "sovereignty").reduce((sum, a) => sum + a.value, 0), + resilience: answers.filter(a => a.axis === "resilience").reduce((sum, a) => sum + a.value, 0) + }; +} + +function getArchetype(axisScores) { + const dominantAxis = Object.entries(axisScores).sort((a, b) => b[1] - a[1])[0][0]; + + switch (dominantAxis) { + case "awareness": + return "observer"; + case "sovereignty": + return "guardian"; + case "resilience": + return "builder"; + default: + return "explorer"; + } +} + +function buildDiagnosticSummary(zone, archetype) { + const zoneText = { + grey: "Ti trovi in una fase di possibile dispersione o automatismo.", + amber: "Sei in una soglia di transizione che richiede consolidamento.", + blue: "Hai una buona base di lucidità e presenza.", + gold: "Mostri una forte integrazione tra visione, etica e presenza." + }; + + const archetypeText = { + observer: "Il tuo archetipo iniziale è Observer.", + guardian: "Il tuo archetipo iniziale è Guardian.", + builder: "Il tuo archetipo iniziale è Builder.", + explorer: "Il tuo archetipo iniziale è Explorer." + }; + + return `${zoneText[zone]} ${archetypeText[archetype]}`; +} + +function showResult(data) { + resultContent.innerHTML = ` +

HSI Score: ${data.hsi_value}

+

Zona: ${data.hsi_zone}

+

Archetipo: ${data.archetype}

+

${data.diagnostic_summary}

+ `; + resultBox.classList.remove("hidden"); +} + +submitBtn?.addEventListener("click", () => { + const answers = collectAnswers(); + + if (!answers) { + alert("Compila tutte le domande prima di continuare."); + return; + } + + const rawScore = answers.reduce((sum, answer) => sum + answer.value, 0); + const hsi_value = normalizeScore(rawScore); + const hsi_zone = getHSIZone(hsi_value); + const axisScores = getAxisScores(answers); + const archetype = getArchetype(axisScores); + const diagnostic_summary = buildDiagnosticSummary(hsi_zone, archetype); + const diagnostic_completed_at = new Date().toISOString(); + + updateHSIProfile({ + hsi_value, + hsi_zone, + archetype, + diagnostic_summary, + diagnostic_completed_at + }); + + addTimelineEvent({ + type: "diagnostic_completed", + title: "HSI completato", + description: `Zona ${hsi_zone}, archetipo ${archetype}, score ${hsi_value}.` + }); + + addBadge({ + id: "first_scan", + name: "Prima Scansione", + description: "Hai completato il tuo primo orientamento HSI." + }); + + addMission({ + id: "observe_automation", + title: "Osserva il tuo automatismo", + description: "Per 12 ore, nota un momento in cui reagisci senza riflettere e annotalo nel Journal." + }); + + showResult({ + hsi_value, + hsi_zone, + archetype, + diagnostic_summary + }); +}); + +continueBtn?.addEventListener("click", () => { + window.location.href = "./lifenet_game.html"; +}); + +renderQuestions(); +'@ | Set-Content .\modules\hsi-engine.js -Encoding UTF8 diff --git a/iself-smart-contract/ISELF_Token.sol b/dist-mobile/modules/iself-smart-contract/ISELF_Token.sol similarity index 100% rename from iself-smart-contract/ISELF_Token.sol rename to dist-mobile/modules/iself-smart-contract/ISELF_Token.sol diff --git a/dist-mobile/modules/profile-engine.js b/dist-mobile/modules/profile-engine.js new file mode 100644 index 0000000..f1df4b9 --- /dev/null +++ b/dist-mobile/modules/profile-engine.js @@ -0,0 +1,179 @@ +@' +const STORAGE_KEY = "humansafe_user_profile"; + +const DEFAULT_PROFILE = { + name: "Explorer", + provider: "demo", + archetype: "observer", + hsi_zone: "grey", + hsi_value: 50, + xp_total: 0, + level_name: "seed", + badges: [], + completed_missions: [], + reflections: [], + timeline: [], + community_posts: [], + diagnostic_summary: "", + diagnostic_completed_at: null, + schema_version: "1.1.0", + created_at: null, + updated_at: null +}; + +export function getDefaultProfile() { + const now = new Date().toISOString(); + return { + ...DEFAULT_PROFILE, + created_at: now, + updated_at: now + }; +} + +export function getUserProfile() { + const raw = localStorage.getItem(STORAGE_KEY); + + if (!raw) { + const profile = getDefaultProfile(); + saveUserProfile(profile); + return profile; + } + + try { + const parsed = JSON.parse(raw); + + return { + ...getDefaultProfile(), + ...parsed + }; + } catch (error) { + console.error("Errore parsing profilo:", error); + const fallback = getDefaultProfile(); + saveUserProfile(fallback); + return fallback; + } +} + +export function saveUserProfile(profile) { + const updatedProfile = { + ...profile, + updated_at: new Date().toISOString() + }; + + localStorage.setItem(STORAGE_KEY, JSON.stringify(updatedProfile)); + return updatedProfile; +} + +export function resetUserProfile() { + const profile = getDefaultProfile(); + saveUserProfile(profile); + return profile; +} + +export function updateUserProfile(partialData) { + const profile = getUserProfile(); + + const updated = { + ...profile, + ...partialData, + updated_at: new Date().toISOString() + }; + + saveUserProfile(updated); + return updated; +} + +export function updateHSIProfile(data) { + return updateUserProfile({ + hsi_value: data.hsi_value, + hsi_zone: data.hsi_zone, + archetype: data.archetype, + diagnostic_summary: data.diagnostic_summary, + diagnostic_completed_at: data.diagnostic_completed_at + }); +} + +export function addTimelineEvent(event) { + const profile = getUserProfile(); + + const timelineEvent = { + id: `evt_${Date.now()}`, + type: event.type || "generic", + title: event.title || "Evento", + description: event.description || "", + created_at: new Date().toISOString() + }; + + const updatedTimeline = [timelineEvent, ...(profile.timeline || [])]; + + return updateUserProfile({ + timeline: updatedTimeline + }); +} + +export function addBadge(badge) { + const profile = getUserProfile(); + const badges = profile.badges || []; + + const exists = badges.some(b => b.id === badge.id); + if (exists) return profile; + + const newBadge = { + id: badge.id, + name: badge.name, + description: badge.description || "", + created_at: new Date().toISOString() + }; + + return updateUserProfile({ + badges: [newBadge, ...badges] + }); +} + +export function addMission(mission) { + const profile = getUserProfile(); + const missions = profile.completed_missions || []; + + const exists = missions.some(m => m.id === mission.id); + if (exists) return profile; + + const newMission = { + id: mission.id, + title: mission.title, + description: mission.description || "", + created_at: new Date().toISOString() + }; + + return updateUserProfile({ + completed_missions: [newMission, ...missions] + }); +} + +export function addReflection(reflectionText) { + const profile = getUserProfile(); + + const reflection = { + id: `refl_${Date.now()}`, + text: reflectionText, + created_at: new Date().toISOString() + }; + + return updateUserProfile({ + reflections: [reflection, ...(profile.reflections || [])] + }); +} + +export function addCommunityPost(post) { + const profile = getUserProfile(); + + const communityPost = { + id: `post_${Date.now()}`, + text: post.text || "", + created_at: new Date().toISOString() + }; + + return updateUserProfile({ + community_posts: [communityPost, ...(profile.community_posts || [])] + }); +} +'@ | Set-Content .\modules\profile-engine.js -Encoding UTF8 diff --git a/dist-mobile/profile.html b/dist-mobile/profile.html new file mode 100644 index 0000000..8111c56 --- /dev/null +++ b/dist-mobile/profile.html @@ -0,0 +1,435 @@ + + + + + + HUMANSAFE Profile | Profile Layer + + + + +
+
+
+
HUMANSAFE Profile Layer
+ ← Torna a HUMANSAFE CORE +
+ +

Centro identitario del percorso

+

+ Il Profile Layer raccoglie lo stato evolutivo complessivo dell’utente: + identità, livello, badge, missioni, riflessioni e segnali principali. +

+ + + +
+ Prossimi upgrade del Profile Layer +

+ Nome modificabile, reset percorso, avatar, statistiche avanzate, + sincronizzazione cloud, autenticazione reale, livelli globali e dashboard completa. +

+
+
+ +
+
+

Stato utente

+
+
+ Nome profilo + Caricamento... +
+
+ Archetipo + Caricamento... +
+
+ Zona HSI + Caricamento... +
+
+ HSI + Caricamento... +
+
+ XP Totale + 0 +
+
+ Livello + Caricamento... +
+
+ Provider + Caricamento... +
+
+ Ultimo aggiornamento + Caricamento... +
+
+ +
+

Badge globali

+
+
+ +
+

Missioni completate

+
+
+
+ +
+

Attività recente

+ +
+

Ultime riflessioni

+
+
+ +
+

Eventi recenti

+
+
+
+
+
+ + + + diff --git a/dist-mobile/service-worker.js b/dist-mobile/service-worker.js new file mode 100644 index 0000000..868d38e --- /dev/null +++ b/dist-mobile/service-worker.js @@ -0,0 +1,23 @@ +const CACHE_NAME = "humansafe-cache-v1"; + +const urlsToCache = [ + "/", + "/index.html", + "/lifenet_game.html", + "/journal.html", + "/social.html" +]; + +self.addEventListener("install", event => { + event.waitUntil( + caches.open(CACHE_NAME) + .then(cache => cache.addAll(urlsToCache)) + ); +}); + +self.addEventListener("fetch", event => { + event.respondWith( + caches.match(event.request) + .then(response => response || fetch(event.request)) + ); +}); diff --git a/dist-mobile/social.html b/dist-mobile/social.html new file mode 100644 index 0000000..342a6b6 --- /dev/null +++ b/dist-mobile/social.html @@ -0,0 +1,518 @@ + + + + + + HUMANSAFE Circle | Community Layer + + + + +
+
+
+
HUMANSAFE Circle Layer
+ ← Torna a HUMANSAFE CORE +
+ +

Condivisione etica del percorso

+

+ HUMANSAFE Circle non è un social classico. È uno spazio per condividere missioni, + riflessioni, checkpoint e richieste di aiuto senza trasformare tutto in rumore o gara. +

+ + +
+ +
+
+

Condividi nel Circle

+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ +
+
+ + +
+
+ + + + diff --git a/dist-mobile/user-data/demo_profile.json b/dist-mobile/user-data/demo_profile.json new file mode 100644 index 0000000..24ddccf --- /dev/null +++ b/dist-mobile/user-data/demo_profile.json @@ -0,0 +1,56 @@ +{ + "name": "Messoud Demo Profile", + "archetype": "Cellula in Risveglio", + "hsi_zone": "Zona Verde", + "xp_total": 64, + "level_name": "Osservatore Lucido", + "last_update": "2026-03-11", + "badges": [ + "Primo Risveglio", + "Specchio Pulito", + "Presenza Reale" + ], + "completed_missions": [ + { + "id": "missione_01", + "title": "10 minuti senza schermo", + "description": "Resta per 10 minuti senza schermo, musica o distrazioni digitali.", + "reward_xp": 5, + "ethical_value": "presenza" + }, + { + "id": "missione_03", + "title": "Conversazione piena", + "description": "Fai una conversazione reale senza toccare il telefono.", + "reward_xp": 10, + "ethical_value": "empatia" + } + ], + "reflections": [ + { + "date": "2026-03-10", + "text": "Quando sento attrito, la tentazione di rifugiarmi nel telefono arriva prima del pensiero. Ma adesso riesco a vederla." + }, + { + "date": "2026-03-11", + "text": "La presenza reale non è assenza di caos. È capacità di restare anche quando vorrei fuggire." + } + ], + "timeline": [ + { + "date": "2026-03-09", + "title": "Prima scansione HSI", + "description": "Avvio del percorso con lettura iniziale del profilo cognitivo." + }, + { + "date": "2026-03-10", + "title": "Ingresso in LIFENET", + "description": "Primi scenari completati e primo contatto con HUMANSAFE ORACLE." + }, + { + "date": "2026-03-11", + "title": "Missione reale completata", + "description": "Prima azione offline registrata nel Diario di Bordo." + } + ] +} \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index e39af6b..4f0f9a3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,48 +1,84 @@ -# HUMANSAFE OFFICIAL DOCUMENTATION +# HUMANSAFE Documentation -Benvenuto nell'archivio centrale dell'ecosistema HUMANSAFE. -Questa cartella raccoglie i **6 asset fondativi** del progetto, depositati e organizzati come base filosofica, strategica, metodologica e istituzionale. +Questa cartella è l'archivio documentale di riferimento di `Humansafe-Core`. -> Nota di ordine: in alcune versioni precedenti del progetto si parlava di “5 pilastri”. -> Per chiarezza operativa, in questo repository adottiamo la formula corretta: **6 asset fondativi**. +Serve a tenere insieme tre piani diversi ma collegati: -## I 6 asset fondativi +- documenti fondativi dell'identità HUMANSAFE +- architettura reale del repository e del prototipo HUMANSAFE OS +- strategia di convergenza verso MVP, PWA e futura espansione ecosistemica -### 1. [HUMANSAFE MANIFESTO](01_Manifesto.md) -La costituzione etica del Nuovo Umanesimo. +## 1. Asset fondativi -### 2. [HUMANSAFE GLOBAL CHARTER](02_Global_Charter.md) -La carta dei diritti cognitivi dell'essere umano. +I 6 asset fondativi restano il nucleo culturale e istituzionale del progetto: -### 3. [HUMANSAFE STANDARD (B2B)](03_B2B_Standard.md) -Il protocollo di medicina organizzativa per aziende, enti e reti professionali. +1. `manifesto/01_Manifesto.md` +2. `legal/02_Global_Charter.md` +3. `strategy/03_B2B_Standard.md` +4. `architecture/04_Cognitive_Framework.md` +5. `pitch/05_Public_Report.md` +6. `architecture/06_Lifenet_Game_Design.md` -### 4. [HUMANSAFE COGNITIVE FRAMEWORK](04_Cognitive_Framework.md) -Il manuale tecnico sugli archetipi, le micro-azioni e la metodologia di attivazione. +Nota di coerenza: -### 5. [HUMANSAFE PUBLIC REPORT](05_Public_Report.md) -Il libro bianco istituzionale per scuole, comuni, sanità pubblica e terzo settore. +- `6 asset fondativi` = corpus documentale +- `5 archetipi` = modello umano -### 6. [LIFENET: THE HUMANSAFE SIMULATOR](06_Lifenet_Game_Design.md) -Il Game Design Document del simulatore narrativo HUMANSAFE. +## 2. Documenti architetturali e strategici aggiornati -## Uso della cartella +### Manifesto -Questa directory serve a tre scopi: +- [HUMANSAFE Identity System](./manifesto/HUMANSAFE_IDENTITY_SYSTEM.md) -1. **Fondazione** → chiarisce la visione del progetto -2. **Validazione** → rende leggibile il metodo verso partner e istituzioni -3. **Produzione** → alimenta sito, pitch, certificazioni, training e sviluppi software +### Architecture -## Regola di coerenza +- [HUMANSAFE Ecosystem Master](./architecture/HUMANSAFE_ECOSYSTEM_MASTER.md) +- [HUMANSAFE Core Real State](./architecture/HUMANSAFE_CORE_REAL_STATE.md) +- [HUMANSAFE Module Map](./architecture/HUMANSAFE_MODULE_MAP.md) +- [HUMANSAFE Data Flow](./architecture/HUMANSAFE_DATA_FLOW.md) +- [HUMANSAFE Onboarding Flow](./architecture/HUMANSAFE_ONBOARDING_FLOW.md) -Nel progetto HUMANSAFE distinguiamo chiaramente: +### Strategy -- **6 asset fondativi** → documenti del repository -- **5 archetipi** → modello umano del framework cognitivo +- [HUMANSAFE MVP Roadmap](./strategy/HUMANSAFE_MVP_ROADMAP.md) +- [HUMANSAFE Future Expansion](./strategy/HUMANSAFE_FUTURE_EXPANSION.md) -Tenere separate queste due cose evita confusione strategica e comunicativa. +## 3. Struttura della cartella ---- +### `manifesto/` -Per partnership, documenti formali, impaginati o versioni PDF istituzionali, usare questa cartella come sorgente madre. +Visione, missione, identità e principi etici. + +### `architecture/` + +Architettura dichiarata e architettura realmente implementata del core. + +### `strategy/` + +Roadmap, priorità, stato MVP e traiettoria di espansione. + +### `pitch/` + +Materiali di presentazione e public narrative per istituzioni e partner. + +### `legal/` + +Charter, principi di tutela e standard etico-politici del progetto. + +## 4. Scopo di questa documentazione + +Questa documentazione deve rendere HUMANSAFE: + +- leggibile per nuovi contributori +- credibile per partner e stakeholder +- sviluppabile senza rifare da zero il progetto +- coerente fra visione, codice e roadmap + +## 5. Regola editoriale + +Quando visione e codice divergono, i documenti di questa cartella devono dichiararlo esplicitamente usando quattro stati: + +- implementato +- parziale +- pianificato +- concettuale diff --git a/docs/04_Cognitive_Framework.md b/docs/architecture/04_Cognitive_Framework.md similarity index 100% rename from docs/04_Cognitive_Framework.md rename to docs/architecture/04_Cognitive_Framework.md diff --git a/docs/06_Lifenet_Game_Design.md b/docs/architecture/06_Lifenet_Game_Design.md similarity index 100% rename from docs/06_Lifenet_Game_Design.md rename to docs/architecture/06_Lifenet_Game_Design.md diff --git a/docs/architecture/HUMANSAFE_CORE_REAL_STATE.md b/docs/architecture/HUMANSAFE_CORE_REAL_STATE.md new file mode 100644 index 0000000..514c662 --- /dev/null +++ b/docs/architecture/HUMANSAFE_CORE_REAL_STATE.md @@ -0,0 +1,268 @@ +# HUMANSAFE Core Real State + +Ultimo aggiornamento: 2026-03-15 + +Vedi anche: +- [HUMANSAFE Ecosystem Master](./HUMANSAFE_ECOSYSTEM_MASTER.md) +- [HUMANSAFE Module Map](./HUMANSAFE_MODULE_MAP.md) +- [HUMANSAFE Data Flow](./HUMANSAFE_DATA_FLOW.md) +- [HUMANSAFE MVP Roadmap](../strategy/HUMANSAFE_MVP_ROADMAP.md) + +## 1. Sintesi + +`Humansafe-Core` è oggi un repository ibrido: + +- documentazione fondativa molto sviluppata +- prototipo web statico navigabile +- data layer JSON riusabile +- moduli JS ancora in convergenza +- espansioni territoriali e blockchain solo come seme concettuale o proof of concept + +## 2. Struttura reale del repository + +| Percorso | Ruolo reale | Stato | +|---|---|---| +| `index.html` | Home Hub / landing del prototipo | Implementato | +| `login.html` | Access Layer demo | Implementato | +| `hsi.html` | HSI Diagnostic page | Presente ma work in progress | +| `lifenet_game.html` | Simulation Layer | Implementato | +| `journal.html` | Journal Layer | Implementato | +| `profile.html` | Profile Layer | Implementato | +| `social.html` | Circle / Community Layer | Implementato | +| `modules/profile-engine.js` | Motore profilo condiviso | Presente ma incoerente | +| `modules/hsi-engine.js` | Motore HSI web | Presente ma work in progress | +| `game-data/` | Dati di scenari, livelli, missioni, archetipi, zone | Implementato | +| `core-algorithm/` | Modello HSI Python e documento formula | Implementato come riferimento tecnico | +| `interactive-simulation/` | CLI diagnostica più vecchia | Legacy/prototipo | +| `user-data/demo_profile.json` | Profilo demo offline/documentale | Non usato dal frontend live | +| `manifest.json` | Manifest PWA | Abbozzato | +| `service-worker.js` | Cache offline base | Abbozzato | +| `modules/franchising-sociale/` | Radici Umane | Concettuale + script | +| `modules/iself-smart-contract/` | Proof of concept ISELF | Concettuale/POC | +| `tools/generate_scenarios.py` | Generatore scenari AI | Utility sperimentale | +| `docs/` | Base documentale fondativa e strategica | Ricca ma disallineata in punti chiave | + +## 3. Stato del worktree corrente + +Il repository non è in uno stato neutro. + +Il worktree corrente mostra modifiche non ancora consolidate proprio sui moduli più centrali: + +- `hsi.html` è presente come file aggiunto +- `modules/hsi-engine.js` è presente come file aggiunto +- `modules/profile-engine.js` contiene marker di merge non risolti + +Questa informazione è importante perché influenza la fotografia architetturale: + +- l'idea del nuovo onboarding HSI esiste +- ma non è ancora una base stabile da considerare "implementata" + +## 4. Architettura implementata oggi + +### Home Hub + +`index.html` funge da hub principale e presenta HUMANSAFE OS come sistema composto da: + +- login +- LIFENET +- journal +- profile +- circle +- data layer +- profile engine +- PWA + +Valutazione reale: + +- la navigazione esiste +- la rappresentazione dello stato è più ottimistica della realtà runtime + +### Access Layer + +`login.html` è un gateway demo: + +- nessuna autenticazione reale +- provider esterni simulati come pulsanti verso `profile.html` +- link a Telegram e HUMANSYNC Facebook + +Valutazione reale: + +- modulo utile come placeholder di visione +- non è ancora un vero auth layer + +### LIFENET + +`lifenet_game.html` è il modulo software più solido del prototipo. + +Fa realmente queste cose: + +- carica scenari da `game-data/scenarios/*.json` +- carica livelli da `game-data/progression/levels.json` +- carica missioni da `game-data/missions/missions_01.json` +- aggiorna XP sessione +- aggiorna badge, missioni, riflessioni e timeline tramite profile engine + +Limiti: + +- dipende dal motore profilo instabile +- non usa ancora un motore scenari separato +- non salva ancora statistiche invisibili come entità persistenti canoniche + +### Journal, Profile, Circle + +Questi tre moduli esistono come interfacce leggibili e coerenti con la visione. + +Dipendono però tutti dallo stesso motore profilo. + +Conseguenza: + +- sono moduli concettualmente centrati +- ma tecnicamente fragili finché il contratto dati del profilo non viene stabilizzato + +### HSI Diagnostic + +Il modulo HSI esiste in forma emergente con `hsi.html` e `modules/hsi-engine.js`, ma il suo stato attuale non è stabile per tre motivi: + +1. non è integrato nel flusso principale della home +2. il file HTML contiene artefatti di scrittura shell nel worktree attuale +3. il motore profilo da cui dipende è in conflitto + +## 5. Divergenze architetturali principali + +### 5.1 Profile Engine non canonico + +È il problema più serio. + +Nel file `modules/profile-engine.js` convivono due versioni incompatibili: + +- una API "storica" usata da `lifenet_game.html`, `journal.html`, `profile.html` e `social.html` +- una API "nuova" pensata per HSI, con schema diverso e nomi funzione diversi + +Differenze concrete: + +- `loadProfile` vs `getUserProfile` +- `saveProfile` vs `saveUserProfile` +- badge come stringhe vs badge come oggetti +- riflessioni con `date` vs `created_at` +- timeline con `date/title/description` vs `id/type/title/description/created_at` +- zone e archetipi italiani vs inglesi + +### 5.2 HSI non allineato in tutto il repository + +Esistono almeno tre versioni del modello HSI: + +- `core-algorithm/hsi_calculator.py`: formula B2B con zone rosso/grigio/verde +- `game-data/signals/hsi_zones.json`: cinque zone più granulari +- `modules/hsi-engine.js`: zone `grey/amber/blue/gold` e archetipi `observer/guardian/builder/explorer` + +Conclusione: + +- HSI è concettualmente centrale +- ma non esiste ancora un'unica semantica condivisa + +### 5.3 Onboarding reale diverso da onboarding dichiarato + +La formula ufficiale del sistema parte dalla diagnosi. + +Il flusso realmente esposto dalla home invece privilegia: + +- accesso demo +- LIFENET +- journal +- profile +- circle + +Risultato: + +- la diagnosi esiste come idea e pagina +- ma non è ancora la porta principale del sistema + +### 5.4 Documentazione e codice non sempre coincidono + +Esempi: + +- `docs/architecture/06_Lifenet_Game_Design.md` parla di React Native / Expo, mentre il prodotto reale è oggi una web app statica +- `docs/architecture/HUMANSAFE_OS.md` marca journal/profile come futuri, ma oggi esistono +- `README.md` e `struttura-humansafe.txt` riportano strutture cartella non più aggiornate +- `docs/README.md` conteneva testo duplicato e livelli di documentazione sovrapposti + +### 5.5 Tooling non allineato al repository corrente + +`tools/generate_scenarios.py` scrive e legge `game-data/scenario_*.json`, ma gli scenari attuali risiedono in `game-data/scenarios/`. + +Quindi: + +- l'idea del generatore è utile +- l'utility non è allineata al path reale del dataset + +### 5.6 PWA solo nominalmente pronta + +`manifest.json` e `service-worker.js` esistono, ma: + +- il manifest usa `logo_humansafe.jpg` dichiarandolo come `image/png` +- il service worker cachea solo alcune pagine +- non include moduli JS, JSON, login/profile/hsi o risorse dati +- usa percorsi assoluti che possono essere fragili in deploy sotto sottopath + +## 6. Stato MVP reale + +### Ciò che già qualifica il progetto come MVP concettualmente leggibile + +- identità forte e differenziata +- hub navigabile +- simulazione narrativa funzionante +- data pack iniziale di scenari, missioni, livelli, archetipi e zone +- journal/profile/circle come estensioni del percorso + +### Ciò che blocca un MVP stabile + +- profile engine non risolto +- contratto dati non canonico +- HSI non integrato e semanticamente incoerente +- PWA incompleta +- assenza di auth reale e sync + +## 7. Moduli classificati per stato + +### Implementato + +- Home Hub +- Access demo +- LIFENET +- Journal UI +- Profile UI +- Circle UI +- Data packs JSON +- HSI Python reference + +### Parziale + +- Profile Engine +- HSI web diagnostic +- PWA +- community persistence +- scenario generation tooling + +### Concettuale + +- HUMANSAFE LIFE come prodotto separato +- backend +- mobile app +- centri HUMANSAFE +- Quaderno di Sessione +- rivista e collane editoriali +- moduli terze parti AI-guided + +## 8. Lettura architetturale finale + +La realtà del repository non smentisce la visione HUMANSAFE. + +La conferma però in una forma molto precisa: + +- la visione è più avanti del software +- il software ha già un nucleo autentico +- il punto da consolidare non è la creatività del progetto, ma la sua convergenza tecnica + +Il repository non va rifatto da zero. + +Va portato da "prototipo identitariamente forte ma incoerente nei contratti" a "MVP coerente con una fonte dati canonica". diff --git a/docs/architecture/HUMANSAFE_DATA_FLOW.md b/docs/architecture/HUMANSAFE_DATA_FLOW.md new file mode 100644 index 0000000..b7c6b2b --- /dev/null +++ b/docs/architecture/HUMANSAFE_DATA_FLOW.md @@ -0,0 +1,226 @@ +# HUMANSAFE Data Flow + +Ultimo aggiornamento: 2026-03-15 + +Vedi anche: +- [HUMANSAFE Module Map](./HUMANSAFE_MODULE_MAP.md) +- [HUMANSAFE Core Real State](./HUMANSAFE_CORE_REAL_STATE.md) +- [HUMANSAFE MVP Roadmap](../strategy/HUMANSAFE_MVP_ROADMAP.md) + +## 1. Flusso dati reale oggi + +Il prototipo HUMANSAFE usa due famiglie di dati: + +### Dati strutturali di sistema + +Provengono da file statici in `game-data/`. + +Esempi: + +- scenari +- missioni +- livelli +- archetipi +- zone HSI + +### Dati utente runtime + +Sono pensati per vivere nel browser, soprattutto in `localStorage`, attraverso `modules/profile-engine.js`. + +Esempi: + +- nome profilo +- archetipo +- zona HSI +- HSI value +- XP totale +- livello +- badge +- missioni completate +- riflessioni +- timeline +- community posts + +## 2. Diagramma del flusso attuale + +```text +game-data/*.json +|- scenarios ------> lifenet_game.html +|- missions -------^ +|- levels ----------^ +|- archetypes ------> reference only / partial integration +`- hsi_zones -------> reference only / partial integration + +hsi.html ---------> hsi-engine.js ---------\ +lifenet_game.html --------------------------> profile-engine.js -> localStorage +journal.html -------------------------------/ +profile.html ------------------------------/ +social.html -------------------------------/ +``` + +## 3. Origine dei dati per modulo + +| Modulo | Input principali | Output principali | +|---|---|---| +| `hsi.html` | risposte utente | HSI, zona, archetipo, badge, missione, timeline | +| `lifenet_game.html` | scenari, missioni, livelli, scelte utente | XP, badge, missioni, riflessione, timeline | +| `journal.html` | profilo centralizzato | render di missioni, riflessioni, timeline | +| `profile.html` | profilo centralizzato | render di stato, badge, missioni | +| `social.html` | profilo centralizzato, input utente | community posts, riflessioni, timeline, badge | + +## 4. Stato attuale della "single source of truth" + +In teoria la fonte unica dei dati utente dovrebbe essere `modules/profile-engine.js`. + +In pratica non è ancora una single source of truth affidabile perché contiene due modelli concorrenti. + +### Modello A: storico, compatibile con UI attuale + +Campi principali: + +- `name` +- `provider` +- `archetype` +- `hsi_zone` +- `hsi_value` +- `xp_total` +- `level_name` +- `last_update` +- `badges` come array di stringhe +- `completed_missions` +- `reflections` con `{ date, text }` +- `timeline` con `{ date, title, description }` +- `community_posts` + +Compatibilità: + +- coerente con `profile.html` +- coerente con `journal.html` +- coerente con `social.html` +- coerente con `lifenet_game.html` + +### Modello B: nuovo, pensato per HSI evoluto + +Campi aggiuntivi o differenti: + +- `diagnostic_summary` +- `diagnostic_completed_at` +- `schema_version` +- `created_at` +- `updated_at` +- badge come oggetti +- riflessioni con `created_at` +- timeline con `type` e `created_at` + +Compatibilità: + +- coerente con il nuovo `modules/hsi-engine.js` +- non coerente con le UI attuali senza adapter + +## 5. Incoerenze dati principali + +### 5.1 Badge + +- UI attuali: stringhe semplici +- nuova branch HSI: oggetti con `id`, `name`, `description` + +### 5.2 Riflessioni + +- UI attuali: `{ date, text }` +- nuovo HSI: `{ id, text, created_at }` + +### 5.3 Timeline + +- UI attuali: `{ date, title, description }` +- nuovo HSI: `{ id, type, title, description, created_at }` + +### 5.4 HSI zone + +Nel repository convivono: + +- `Zona Rossa / Zona Grigia / Zona Verde` +- cinque zone granulari in `hsi_zones.json` +- `grey / amber / blue / gold` + +### 5.5 Archetipi + +Nel repository convivono: + +- `Cellula Dormiente`, `Cellula Reattiva`, `Cellula Osservatrice`, `Cellula in Risveglio`, `Nucleo Sovrano` +- `observer`, `guardian`, `builder`, `explorer` +- versione CLI a tre archetipi + +## 6. `user-data/demo_profile.json`: cosa rappresenta davvero + +`user-data/demo_profile.json` è utile come: + +- esempio di shape dati desiderata +- materiale documentale +- possibile seed manuale + +Non è però la fonte runtime dei moduli web attuali. + +Il frontend non lo carica. + +## 7. Valutazione per entità + +| Entità | Stato | Fonte reale | +|---|---|---| +| Scenari | Coerente | `game-data/scenarios/*.json` | +| Missioni | Coerente | `game-data/missions/missions_01.json` | +| Livelli | Coerente | `game-data/progression/levels.json` | +| HSI formula | Non canonica | Python/docs/JS in disaccordo | +| Profilo utente | Centrale ma non canonico | `localStorage` via `profile-engine.js` | +| Timeline | Presente ma non standardizzata | `profile-engine.js` | +| Badge | Presenti ma non standardizzati | `profile-engine.js` | +| Community posts | Demo locale | `profile-engine.js` | + +## 8. Contratto dati consigliato per la convergenza + +Il passo più sicuro non è reinventare la struttura, ma stabilizzare il modello storico e arricchirlo gradualmente. + +Direzione consigliata: + +- mantenere i campi usati dalle UI attuali +- aggiungere metadati nuovi in modo backward compatible +- introdurre adapter, non rotture + +Esempio di direzione sicura: + +```text +profile +|- id +|- name +|- provider +|- archetype_id +|- archetype_label +|- hsi_zone_id +|- hsi_zone_label +|- hsi_value +|- xp_total +|- level_id +|- level_name +|- badges[] +|- completed_missions[] +|- reflections[] +|- timeline[] +|- community_posts[] +|- diagnostic_summary +|- created_at +`- updated_at +``` + +Nota importante: + +- `badges`, `missions`, `reflections` e `timeline` dovrebbero diventare oggetti strutturati +- ma con rendering compatibile anche con il formato legacy + +## 9. Prima del backend + +Prima di introdurre API o sync cloud, il progetto deve chiudere tre punti: + +1. schema profilo unico +2. vocabolario HSI unico +3. passaggio dati unico fra HSI, LIFENET, journal, profile e circle + +Se questo non avviene prima del backend, la complessità verrà solo spostata lato server. diff --git a/docs/architecture/HUMANSAFE_ECOSYSTEM_MASTER.md b/docs/architecture/HUMANSAFE_ECOSYSTEM_MASTER.md new file mode 100644 index 0000000..aec5b33 --- /dev/null +++ b/docs/architecture/HUMANSAFE_ECOSYSTEM_MASTER.md @@ -0,0 +1,168 @@ +# HUMANSAFE Ecosystem Master + +Ultimo aggiornamento: 2026-03-15 + +Vedi anche: +- [HUMANSAFE Identity System](../manifesto/HUMANSAFE_IDENTITY_SYSTEM.md) +- [HUMANSAFE Core Real State](./HUMANSAFE_CORE_REAL_STATE.md) +- [HUMANSAFE Module Map](./HUMANSAFE_MODULE_MAP.md) +- [HUMANSAFE MVP Roadmap](../strategy/HUMANSAFE_MVP_ROADMAP.md) + +## 1. Executive summary + +Il repository `Humansafe-Core` contiene un ecosistema in cui la visione è già ampia, ma il software implementato è ancora un prototipo locale e modulare. + +Il progetto reale si può leggere così: + +```text +HUMANSAFE +|- HUMANSAFE LIFE +| |- orientamento +| |- layer editoriale e culturale +| |- relazioni, rivista, quaderni, supporto umano +| +|- HUMANSAFE OS +| |- accesso +| |- diagnosi HSI +| |- simulazione LIFENET +| |- journal +| |- profile +| |- circle/community +| |- PWA +| |- futuro backend/mobile +| +`- Nodi di espansione + |- Radici Umane + |- ISELF accountability layer + |- futuri centri HUMANSAFE + `- moduli per enti allineati +``` + +## 2. Filosofia di sistema + +La formula che il repository esprime con maggiore coerenza è: + +```text +diagnosi -> simulazione -> riflessione -> missione -> memoria -> evoluzione -> community +``` + +Non è solo una sequenza UX. È la definizione operativa del prodotto. + +### Perché HUMANSAFE non è un game o un social tradizionale + +- La diagnosi non serve a segmentare per advertising ma a orientare il percorso. +- La simulazione non serve a intrattenere all'infinito ma a rendere leggibili automatismi e scelte. +- Le missioni spingono fuori dallo schermo, non dentro. +- Il journal serve come memoria evolutiva, non come feed. +- La community è progettata come Circle etico, non come arena di status. + +## 3. Stato per layer + +| Layer | Ruolo | Stato nel repo | +|---|---|---| +| HUMANSAFE identity | Visione, etica, narrazione madre | Forte e documentata | +| HUMANSAFE LIFE | Editoriale, orientamento, rivista, supporto | Concettuale, non separato come prodotto | +| HUMANSAFE OS | Sistema software web/PWA | Parzialmente implementato | +| Access Layer | Porta di ingresso | Implementato come demo gateway | +| HSI Diagnostic | Lettura iniziale | Presente ma instabile e non integrato nel flusso principale | +| LIFENET | Simulazione narrativa | Implementato e funzionante come modulo più maturo | +| Journal | Memoria e riflessioni | Implementato come viewer del profilo | +| Profile | Centro identitario | Implementato come viewer del profilo | +| Circle | Community etica | Implementato in forma locale demo | +| Profile/Data Engine | Fonte unica dei dati utente | Parziale e attualmente incoerente | +| PWA Layer | Installabilità e cache | Abbozzato | +| Backend | Sync, auth, cloud, multi-device | Non implementato | +| Mobile packaging | Android/native bridge | Non implementato | +| Radici Umane | Nodo territoriale | Concettuale con script di supporto | +| ISELF | Accountability layer | Proof of concept non integrato | + +## 4. Dove il repository è forte + +Il repository è forte in quattro aree: + +- identità culturale e posizione etica +- qualità del linguaggio di prodotto +- struttura modulare per pagine e dataset +- chiarezza della direzione futura + +## 5. Dove il repository è fragile + +Il repository è fragile in quattro aree: + +- assenza di un contratto dati canonico fra HSI, profilo, journal, circle e livelli +- drift tra documentazione concettuale e codice eseguibile +- onboarding reale non allineato alla formula diagnosi-prima +- PWA e stato utente non ancora pronti per esperienza stabile multipagina + +## 6. Perimetro reale di `Humansafe-Core` + +Il repository oggi copre tre categorie diverse, che è essenziale non confondere: + +### A. Implementato + +- pagine web statiche navigabili +- caricamento dati da JSON +- persistenza locale browser-side prevista tramite `localStorage` +- prime logiche di XP, badge, missioni, riflessioni e timeline + +### B. Parziale + +- HSI web diagnostic +- profile engine +- PWA installabile e offline +- accesso reale +- community persistente + +### C. Concettuale o futuro + +- HUMANSAFE LIFE come prodotto distinto +- rivista "La Solita Attesa" +- serie letteraria "La Cellula di Messoud Sebbahi" +- Quaderno di Sessione / Session Report PDF +- centri HUMANSAFE +- moduli per associazioni o enti allineati +- backend e mobile app completi + +## 7. Modello ecosistemico consigliato + +Per mantenere il progetto leggibile anche quando crescerà, HUMANSAFE va pensato come sistema a cerchi concentrici: + +### Cerchio 1: Core experience + +- accesso +- HSI +- LIFENET +- journal +- profile +- circle + +### Cerchio 2: Infrastructure and trust + +- profile engine +- data contracts +- PWA +- futuro backend +- futuro auth layer + +### Cerchio 3: Cultural and territorial expansion + +- HUMANSAFE LIFE +- magazine +- quaderni +- centri +- partnership +- moduli white-label o AI-guided per realtà allineate + +## 8. Conclusione architetturale + +HUMANSAFE non va ripensato come app generica. + +Va invece consolidato come: + +- ecosistema etico con identità forte +- prototipo software già leggibile +- piattaforma modulare ancora in convergenza + +La priorità non è aggiungere altro. + +La priorità è far convergere il software attuale sulla promessa già espressa dalla visione. diff --git a/docs/architecture/HUMANSAFE_MODULE_MAP.md b/docs/architecture/HUMANSAFE_MODULE_MAP.md new file mode 100644 index 0000000..b879173 --- /dev/null +++ b/docs/architecture/HUMANSAFE_MODULE_MAP.md @@ -0,0 +1,153 @@ +# HUMANSAFE Module Map + +Ultimo aggiornamento: 2026-03-15 + +Vedi anche: +- [HUMANSAFE Core Real State](./HUMANSAFE_CORE_REAL_STATE.md) +- [HUMANSAFE Data Flow](./HUMANSAFE_DATA_FLOW.md) +- [HUMANSAFE Onboarding Flow](./HUMANSAFE_ONBOARDING_FLOW.md) + +## 1. Mappa dei moduli live nel repository + +| Modulo | File principali | Funzione | Stato | Note | +|---|---|---|---|---| +| Home Hub | `index.html` | Hub di ingresso e mappa del sistema | Implementato | Non espone ancora HSI come entry primaria | +| Access Layer | `login.html` | Gateway demo e ponte verso community esterne | Implementato | Nessuna auth reale | +| HSI Diagnostic | `hsi.html`, `modules/hsi-engine.js` | Diagnosi iniziale e aggiornamento profilo | Parziale | Worktree sporco e non integrato | +| LIFENET | `lifenet_game.html` | Simulazione narrativa con XP, missioni, ORACLE | Implementato | Modulo più vicino al cuore MVP | +| Journal Layer | `journal.html` | Memoria del percorso, riflessioni, timeline | Implementato | Viewer dipendente dal profilo | +| Profile Layer | `profile.html` | Identità evolutiva, livelli, badge, stato utente | Implementato | Viewer dipendente dal profilo | +| Circle Layer | `social.html` | Community etica locale/demo | Implementato | Persistenza locale, nessun backend | +| Profile Engine | `modules/profile-engine.js` | Stato utente condiviso | Parziale/critico | Merge conflict e schema non canonico | +| PWA Layer | `manifest.json`, `service-worker.js` | Installabilità e cache offline | Abbozzato | Copertura incompleta | +| Core Algorithm | `core-algorithm/*` | Riferimento matematico HSI | Implementato | Non ancora allineato al JS | +| Game Data | `game-data/*` | Scenari, missioni, livelli, archetipi, zone | Implementato | Buona base contenutistica | +| Demo User Data | `user-data/demo_profile.json` | Profilo dimostrativo | Documentale | Non usato dai moduli live | + +## 2. Data packs + +### Scenari + +File: + +- `game-data/scenarios/scenario_01.json` +- `game-data/scenarios/scenario_02.json` +- `game-data/scenarios/scenario_03.json` +- `game-data/scenarios/scenario_04.json` + +Uso reale: + +- caricati in `lifenet_game.html` +- ogni scenario contiene `setup`, `question`, `choices`, `oracle_intervention`, `stat_changes` + +Valutazione: + +- dataset coerente con l'identità HUMANSAFE +- base già riutilizzabile per espansione + +### Missioni + +File: + +- `game-data/missions/missions_01.json` + +Uso reale: + +- missioni suggerite da LIFENET +- collegate a reward XP e valore etico + +### Livelli + +File: + +- `game-data/progression/levels.json` + +Uso reale: + +- progression symbolica dal livello 1 al 5 +- integrata nella UI di LIFENET e Profile + +### Archetipi + +File: + +- `game-data/profiles/archetypes.json` + +Uso reale: + +- dataset di riferimento concettuale +- non ancora integrato in modo consistente con il nuovo HSI web + +### Zone HSI + +File: + +- `game-data/signals/hsi_zones.json` + +Uso reale: + +- base semantica importante +- non ancora la fonte canonica del motore HSI web + +## 3. Moduli concettuali o satelliti + +| Modulo | File | Stato | Ruolo | +|---|---|---|---| +| Radici Umane | `modules/franchising-sociale/*` | Concettuale + script | Nodo territoriale, peace business, ambassador model | +| ISELF | `modules/iself-smart-contract/ISELF_Token.sol` | Proof of concept | Accountability layer non speculativo | +| Interactive Simulation CLI | `interactive-simulation/cell_awakening.py` | Legacy/prototipo | Primo test diagnostico da terminale | +| Scenario Generator | `tools/generate_scenarios.py` | Sperimentale | Futuro authoring assistito da AI | + +## 4. Moduli orfani o legacy + +### `assets/js/share-quiz.js` + +È un asset legacy che aggancia una funzione `showResults()` non presente nei moduli correnti. + +Interpretazione: + +- probabile residuo di una versione precedente del quiz +- non parte del percorso principale attuale + +### `manifest.json.save` + +È un backup o artefatto manuale, non una parte del runtime. + +### `struttura-humansafe.txt` + +È una fotografia vecchia della struttura repo e non corrisponde più all'albero reale. + +## 5. Moduli futuri già leggibili nella visione + +Anche se non hanno ancora file dedicati, la repo rende già evidente la futura necessità di questi moduli: + +- HUMANSAFE LIFE come layer editoriale e relazionale +- Quaderno di Sessione / Session Report PDF +- rivista "La Solita Attesa" +- collana "La Cellula di Messoud Sebbahi" +- backend sync/auth +- packaging Android o native bridge +- moduli esterni per enti e associazioni allineate + +## 6. Relazioni operative tra i moduli live + +```text +index +|- login +|- lifenet_game -> profile-engine -> localStorage +|- journal -> profile-engine -> localStorage +|- profile -> profile-engine -> localStorage +`- social -> profile-engine -> localStorage + +hsi -> hsi-engine -> profile-engine -> localStorage + +lifenet_game -> fetch(game-data/scenarios, missions, levels) +``` + +## 7. Lettura finale + +Il repository non è un insieme casuale di pagine. È già una mappa modulare credibile. + +La criticità non è la mancanza di moduli. + +La criticità è che i moduli software centrali esistono, ma non sono ancora tutti connessi a una grammatica dati unica. diff --git a/docs/architecture/HUMANSAFE_ONBOARDING_FLOW.md b/docs/architecture/HUMANSAFE_ONBOARDING_FLOW.md new file mode 100644 index 0000000..99e18d0 --- /dev/null +++ b/docs/architecture/HUMANSAFE_ONBOARDING_FLOW.md @@ -0,0 +1,144 @@ +# HUMANSAFE Onboarding Flow + +Ultimo aggiornamento: 2026-03-15 + +Vedi anche: +- [HUMANSAFE Identity System](../manifesto/HUMANSAFE_IDENTITY_SYSTEM.md) +- [HUMANSAFE Data Flow](./HUMANSAFE_DATA_FLOW.md) +- [HUMANSAFE MVP Roadmap](../strategy/HUMANSAFE_MVP_ROADMAP.md) + +## 1. Flusso ideale dichiarato dal progetto + +La formula madre del progetto è: + +```text +diagnosi -> simulazione -> riflessione -> missione -> memoria -> evoluzione -> community +``` + +Tradotta in journey: + +1. l'utente entra +2. completa una prima lettura HSI +3. riceve un orientamento +4. entra in LIFENET +5. riceve missioni e riflessioni +6. ritrova tutto nel journal e nel profilo +7. se vuole, condivide nel Circle + +## 2. Flusso reale esposto oggi dal repository + +```text +index.html +|- login.html +|- lifenet_game.html +|- journal.html +|- profile.html +`- social.html + +login.html +|- profile.html +|- lifenet_game.html +|- journal.html +`- social.html + +hsi.html +`- lifenet_game.html +``` + +Conclusione: + +- il modulo HSI esiste +- ma non è ancora il primo passo del percorso pubblico + +## 3. Cosa succede davvero oggi + +### Ingresso + +L'utente atterra su `index.html`, legge la promessa del sistema e può: + +- accedere +- aprire direttamente LIFENET +- aprire direttamente journal, profile o circle + +### Accesso + +`login.html` non crea identità reale. + +Serve piuttosto come: + +- gateway demo +- simulazione di futuro accesso federato +- ponte verso community esterne + +### Diagnosi + +`hsi.html` potrebbe essere la vera fase iniziale del sistema, ma oggi non è collegata in modo forte dal percorso principale. + +### Simulazione + +LIFENET è il punto in cui la promessa HUMANSAFE diventa più concreta: + +- scenari +- scelte +- ORACLE +- missioni suggerite +- XP +- aggiornamento del profilo + +### Memoria + +Journal e Profile visualizzano la memoria accumulata. + +### Community + +Circle permette una forma di condivisione etica locale, ma ancora senza rete sociale reale o backend. + +## 4. Gap fra onboarding ideale e onboarding reale + +| Fase | Ideale | Stato reale | +|---|---|---| +| Accesso | account persistente | demo gateway | +| Diagnosi iniziale | primo step obbligatorio o fortemente consigliato | pagina esistente ma laterale | +| Simulazione | subito dopo la diagnosi | accessibile anche senza diagnosi | +| Missione | generata e tracciata | suggerita da LIFENET, tracciata localmente | +| Memoria | profilo continuo | esiste ma dipende dal motore profilo instabile | +| Community | condivisione etica persistente | demo locale | + +## 5. Onboarding minimo raccomandato prima del backend + +Il flusso più sicuro da portare a coerenza, senza rifare il progetto, è questo: + +```text +index -> login/demo access -> hsi -> lifenet -> journal -> profile -> circle +``` + +Perché è il flusso più sicuro: + +- rispetta la filosofia già dichiarata +- riusa tutti i moduli esistenti +- non richiede ancora backend reale +- rafforza il ruolo del profile engine come centro del sistema + +## 6. Cosa manca per renderlo stabile + +Mancano soprattutto: + +- un contratto dati unico per HSI e profilo +- un entrypoint chiaro da home verso HSI +- uno stato profilo coerente anche senza login reale +- una gestione robusta di primo avvio / utente demo / ripresa sessione + +## 7. Decisione architetturale suggerita + +HUMANSAFE dovrebbe considerare l'onboarding non come "login first", ma come "orientation first". + +Formula: + +- accesso leggero +- diagnosi significativa +- simulazione contestuale +- memoria crescente + +In questo modo il login smette di essere il centro. + +Il centro torna a essere il percorso umano. diff --git a/docs/architecture/HUMANSAFE_OS.md b/docs/architecture/HUMANSAFE_OS.md new file mode 100644 index 0000000..0238ee2 --- /dev/null +++ b/docs/architecture/HUMANSAFE_OS.md @@ -0,0 +1,584 @@ +\# HUMANSAFE OS + + + +\## Definizione + + + +HUMANSAFE OS è l’architettura centrale dell’ecosistema HUMANSAFE. + + + +Non è un sistema operativo nel senso tradizionale del termine, ma un sistema coordinato di strumenti, dati, percorsi e protezioni progettato per aiutare l’essere umano a vivere con maggiore lucidità, sicurezza, continuità e consapevolezza nell’era digitale. + + + +HUMANSAFE OS unisce: + + + +\- diagnosi cognitiva + +\- simulazione narrativa + +\- gamification etica + +\- missioni reali + +\- diario di bordo + +\- profilo evolutivo + +\- community + +\- supporto AI + + + +L’obiettivo non è intrattenere o trattenere l’utente il più a lungo possibile, ma accompagnarlo in un percorso di crescita, auto-osservazione e responsabilità. + + + +--- + + + +\## Visione + + + +HUMANSAFE OS nasce per trasformare la tecnologia da ambiente dispersivo a infrastruttura di protezione e sviluppo umano. + + + +La sua funzione è creare un ecosistema dove il digitale: + + + +\- non anestetizza, ma chiarisce + +\- non frammenta, ma orienta + +\- non isola, ma connette in modo sano + +\- non assorbe la vita reale, ma la rafforza + + + +--- + + + +\## Missione + + + +La missione di HUMANSAFE OS è offrire un sistema pratico e progressivo che aiuti persone, comunità e futuri collaboratori a: + + + +\- comprendere il proprio stato cognitivo e relazionale + +\- allenare presenza, lucidità e responsabilità + +\- tradurre intuizioni digitali in azioni reali + +\- crescere attraverso un percorso etico e cooperativo + +\- costruire continuità tra sé, gli altri e il mondo + + + +--- + + + +\## Moduli principali + + + +\### 1. HSI Scan + +Modulo iniziale di diagnosi simbolica e cognitiva. + + + +Funzioni: + +\- valutazione dello stato di attenzione e reattività + +\- assegnazione della zona HSI + +\- identificazione dell’archetipo iniziale + +\- suggerimento di una micro-azione concreta + + + +Implementazione attuale: + +\- `index.html` + + + +--- + + + +\### 2. LIFENET + +Simulatore narrativo basato su scenari, scelte e conseguenze. + + + +Funzioni: + +\- presentare situazioni ad attrito emotivo e cognitivo + +\- osservare il comportamento dell’utente nelle scelte + +\- aggiornare i parametri del profilo invisibile + +\- attivare interventi dell’HUMANSAFE ORACLE + + + +Implementazione attuale: + +\- `lifenet\_game.html` + + + +--- + + + +\### 3. Scenario Engine + +Motore che gestisce scenari e conseguenze. + + + +Funzioni: + +\- caricare scenari JSON + +\- applicare cambiamenti ai parametri + +\- aggiornare l’esperienza narrativa + +\- supportare la progressione del percorso + + + +Implementazione attuale: + +\- `game-data/scenarios/` + + + +--- + + + +\### 4. Archetype Engine + +Motore che gestisce gli archetipi evolutivi dell’utente. + + + +Funzioni: + +\- descrivere il profilo simbolico dell’utente + +\- collegare i risultati diagnostici a una forma leggibile + +\- orientare l’esperienza successiva + +\- rendere visibile il cambiamento del percorso + + + +Implementazione attuale: + +\- `game-data/profiles/archetypes.json` + + + +--- + + + +\### 5. Signal Engine + +Motore che interpreta zone e segnali cognitivi. + + + +Funzioni: + +\- classificare l’HSI + +\- definire zone di lettura + +\- fornire significato ai punteggi + +\- trasformare i dati in linguaggio umano + + + +Implementazione attuale: + +\- `game-data/signals/hsi\_zones.json` + + + +--- + + + +\### 6. Mission Layer + +Ponte tra esperienza digitale e realtà vissuta. + + + +Funzioni: + +\- proporre missioni offline, relazionali e riflessive + +\- trasformare il gioco in comportamento + +\- premiare azioni concrete + +\- rinforzare la continuità del percorso + + + +Implementazione prevista: + +\- `game-data/missions/` + + + +--- + + + +\### 7. Progression Layer + +Motore di gamification etica. + + + +Funzioni: + +\- gestire XP simbolici + +\- definire livelli + +\- assegnare badge + +\- rendere visibile il progresso senza creare dipendenza tossica + + + +Implementazione prevista: + +\- `game-data/progression/` + + + +--- + + + +\### 8. Journal Layer + +Sistema di memoria ed evoluzione personale. + + + +Funzioni: + +\- salvare scelte, missioni e progressi + +\- costruire una timeline personale + +\- trasformare l’esperienza in continuità + +\- rendere il cambiamento osservabile nel tempo + + + +Implementazione prevista: + +\- `user-data/` + +\- future pagine `journal.html` e `profile.html` + + + +--- + + + +\### 9. AI Coach / ORACLE Layer + +Livello di accompagnamento e interpretazione. + + + +Funzioni: + +\- rileggere il percorso + +\- suggerire missioni o riflessioni + +\- spiegare pattern comportamentali + +\- supportare lucidità e orientamento + + + +Vincoli: + +\- non sostituisce terapeuti o medici + +\- non manipola l’utente + +\- non deve creare dipendenza + +\- agisce come guida, non come padrone + + + +--- + + + +\### 10. Community Layer + +Spazio cooperativo dell’ecosistema. + + + +Funzioni: + +\- creare continuità tra utenti + +\- sostenere missioni collettive + +\- rendere possibile la cooperazione + +\- creare nodi umani locali e digitali + + + +Prime forme realistiche: + +\- canale Telegram + +\- gruppo Telegram + +\- future stanze cooperative HUMANSAFE + + + +--- + + + +\## Flusso utente + + + +\### Fase 1 — Ingresso + +L’utente entra in HUMANSAFE tramite il modulo diagnostico. + + + +\### Fase 2 — Lettura iniziale + +Il sistema restituisce: + +\- HSI + +\- zona + +\- archetipo + +\- micro-azione iniziale + + + +\### Fase 3 — Simulazione + +L’utente entra in LIFENET e affronta scenari. + + + +\### Fase 4 — Aggiornamento profilo + +Il sistema aggiorna: + +\- parametri interni + +\- XP + +\- livello + +\- eventuali badge + +\- missioni consigliate + + + +\### Fase 5 — Azione reale + +L’utente esegue una missione nella vita reale. + + + +\### Fase 6 — Diario + +Il sistema registra il percorso e la sua evoluzione. + + + +\### Fase 7 — Community + +L’utente può entrare in una rete cooperativa e condividere il proprio cammino. + + + +--- + + + +\## Principi di design + + + +HUMANSAFE OS deve essere: + + + +\- etico + +\- non manipolativo + +\- cooperativo + +\- progressivo + +\- leggibile + +\- modulare + +\- sicuro + +\- orientato alla realtà + + + +Il sistema non deve funzionare come una piattaforma che assorbe attenzione, ma come una struttura che restituisce capacità di scelta. + + + +--- + + + +\## Gamification etica + + + +La gamification di HUMANSAFE OS non è competitiva ma cooperativa. + + + +Elementi principali: + +\- stelline + +\- badge etici + +\- livelli + +\- XP simbolici + +\- missioni reali + +\- avanzamento per maturazione, non per ossessione + + + +Valori premiati: + +\- empatia + +\- coraggio + +\- collaborazione + +\- cura + +\- presenza + +\- chiarezza + +\- responsabilità + +\- contatto con la realtà + + + +--- + + + +\## Struttura del repository collegata a HUMANSAFE OS + + + +```text + +Humansafe-Core/ + +├── index.html + +├── lifenet\_game.html + +├── docs/ + +│ └── architecture/ + +│ └── HUMANSAFE\_OS.md + +├── game-data/ + +│ ├── scenarios/ + +│ ├── profiles/ + +│ ├── signals/ + +│ ├── missions/ + +│ ├── progression/ + +│ └── journal-templates/ + +├── user-data/ + +├── assets/ + +├── tools/ + +├── core-algorithm/ + +└── modules/ + diff --git a/docs/architecture/README.md b/docs/architecture/README.md new file mode 100644 index 0000000..8c39a1e --- /dev/null +++ b/docs/architecture/README.md @@ -0,0 +1,28 @@ +# Architettura HUMANSAFE + +Questa sezione tiene insieme due cose: + +- l'architettura concettuale del progetto +- la fotografia reale di ciò che il repository implementa oggi + +## Documenti principali + +- [HUMANSAFE Ecosystem Master](./HUMANSAFE_ECOSYSTEM_MASTER.md) +- [HUMANSAFE Core Real State](./HUMANSAFE_CORE_REAL_STATE.md) +- [HUMANSAFE Module Map](./HUMANSAFE_MODULE_MAP.md) +- [HUMANSAFE Data Flow](./HUMANSAFE_DATA_FLOW.md) +- [HUMANSAFE Onboarding Flow](./HUMANSAFE_ONBOARDING_FLOW.md) + +## Documenti fondativi collegati + +- `04_Cognitive_Framework.md` -> impianto cognitivo e modello umano +- `06_Lifenet_Game_Design.md` -> visione storica del modulo LIFENET +- `HUMANSAFE_OS.md` -> definizione concettuale del sistema operativo HUMANSAFE + +## Regola di lettura + +Per capire il progetto senza confondere visione e runtime: + +1. leggere `HUMANSAFE_ECOSYSTEM_MASTER.md` +2. verificare `HUMANSAFE_CORE_REAL_STATE.md` +3. usare `HUMANSAFE_DATA_FLOW.md` e `HUMANSAFE_MODULE_MAP.md` come riferimento operativo diff --git a/docs/02_Global_Charter.md b/docs/legal/02_Global_Charter.md similarity index 100% rename from docs/02_Global_Charter.md rename to docs/legal/02_Global_Charter.md diff --git a/docs/legal/README.md b/docs/legal/README.md new file mode 100644 index 0000000..607b499 --- /dev/null +++ b/docs/legal/README.md @@ -0,0 +1,30 @@ +\# Area Legale HUMANSAFE + + + +Questa sezione raccoglie i materiali legati alla tutela, alla governance e alla struttura etica del progetto. + + + +\## Contenuti + + + +\- charter globale + +\- tutela del progetto + +\- governance + +\- principi normativi + +\- struttura etica e regolativa + + + +\## File presenti + + + +\- `02\_Global\_Charter.md` → carta globale e principi fondativi di tutela + diff --git a/docs/01_Manifesto.md b/docs/manifesto/01_Manifesto.md similarity index 100% rename from docs/01_Manifesto.md rename to docs/manifesto/01_Manifesto.md diff --git a/docs/manifesto/HUMANSAFE_IDENTITY_SYSTEM.md b/docs/manifesto/HUMANSAFE_IDENTITY_SYSTEM.md new file mode 100644 index 0000000..d9d213d --- /dev/null +++ b/docs/manifesto/HUMANSAFE_IDENTITY_SYSTEM.md @@ -0,0 +1,183 @@ +# HUMANSAFE Identity System + +Ultimo aggiornamento: 2026-03-15 + +Vedi anche: +- [HUMANSAFE Ecosystem Master](../architecture/HUMANSAFE_ECOSYSTEM_MASTER.md) +- [HUMANSAFE Core Real State](../architecture/HUMANSAFE_CORE_REAL_STATE.md) +- [HUMANSAFE Future Expansion](../strategy/HUMANSAFE_FUTURE_EXPANSION.md) + +## 1. Identità madre + +HUMANSAFE è un ecosistema etico e umano-centrico progettato per sviluppare: + +- awareness +- sovranità cognitiva +- resilienza emotiva +- comportamento digitale etico +- relazioni reali significative + +HUMANSAFE non nasce come prodotto single-purpose. È una matrice comune che tiene insieme tecnologia, cultura, orientamento, infrastrutture territoriali e futuri nodi modulari. + +Principio interno: + +> One soul, many possible nodes. + +Nel linguaggio HUMANSAFE questo significa: + +- una sola identità etica e simbolica +- più formati operativi +- più moduli +- più contesti di utilizzo +- più nodi territoriali o non territoriali + +## 2. Cosa HUMANSAFE è + +HUMANSAFE è: + +- un ecosistema di diagnosi, simulazione, riflessione, missione, memoria, evoluzione e community +- una tecnologia orientativa, non anestetica +- una piattaforma di educazione alla presenza e alla responsabilità +- un sistema modulare che può vivere come web app, PWA, prodotto editoriale, toolkit territoriale e futura infrastruttura per partner allineati + +## 3. Cosa HUMANSAFE non è + +HUMANSAFE non è: + +- un social network classico basato su engagement tossico +- un gioco dopaminico fondato su compulsione, ranking o dipendenza +- una semplice piattaforma di quiz +- un sostituto di supporto clinico, psicologico o medico +- una tech company che monetizza paura, sorveglianza o fragilità umana + +## 4. HUMANSAFE vs HUMANSAFE LIFE vs HUMANSAFE OS + +### HUMANSAFE + +È l'identità madre. + +Funzione: + +- custodire missione, filosofia, coerenza etica e visione di lungo periodo +- rendere riconoscibile l'ecosistema a utenti, partner, centri e collaboratori + +Nel repository attuale HUMANSAFE esiste in modo trasversale: + +- nel manifesto +- nella charter +- nella terminologia di interfaccia +- nella logica anti-social, anti-dipendenza e orientata alla presenza + +### HUMANSAFE LIFE + +È il layer editoriale, relazionale e orientativo. + +Funzione: + +- introdurre le persone al senso del progetto +- offrire linguaggio, contenuti, supporto e orientamento culturale +- collegare il software alla vita reale, alla rivista, ai quaderni, alla comunità e ai futuri centri + +Stato nel repository: + +- non esiste ancora come modulo software separato +- è presente solo in forma implicita nella scrittura dei testi, nei documenti fondativi, nel tono delle pagine e nella direzione strategica + +Conclusione: + +- HUMANSAFE LIFE è concettualmente forte +- è debolmente implementato come prodotto distinto + +### HUMANSAFE OS + +È il layer software e sistemico. + +Funzione: + +- trasformare la visione in esperienza interattiva +- coordinare diagnosi, simulazione, memoria, missioni, profilo e community + +Stato nel repository: + +- è il nucleo più chiaramente rappresentato +- vive nelle pagine HTML, nei moduli JS, nel data layer JSON, nel manifest e nel service worker + +## 5. Missione e stance etica + +Missione operativa: + +- restituire lucidità a persone immerse in ecosistemi digitali dispersivi +- allenare la capacità di non reagire automaticamente +- trasformare il digitale da macchina di consumo a infrastruttura di orientamento +- rafforzare relazioni vive, reali e non filtrate + +Stance etica: + +- privacy-first come direzione, anche se non ancora implementata con backend reale +- anti-manipolazione +- anti-dipendenza progettata +- cooperazione invece di competizione tossica +- continuità tra vita digitale e vita reale + +## 6. Filosofia sistemica + +La sequenza madre di HUMANSAFE è: + +1. diagnosi +2. simulazione +3. riflessione +4. missione +5. memoria +6. evoluzione +7. community + +Questa sequenza è il motivo per cui HUMANSAFE non coincide né con un quiz né con un gioco né con un social. + +Il valore del sistema non sta nel singolo touchpoint, ma nella continuità fra: + +- lettura iniziale di sé +- stress test narrativo +- interpretazione +- micro-azione reale +- tracciamento del percorso +- relazione con altri nodi umani + +## 7. Identità del repository rispetto all'ecosistema + +`Humansafe-Core` non contiene ancora tutto l'ecosistema HUMANSAFE in forma completa. + +Contiene però: + +- il nucleo documentale fondativo +- il primo prototipo di HUMANSAFE OS +- i semi di espansione verso infrastruttura territoriale e accountability layer + +In pratica il repository oggi rappresenta soprattutto: + +- HUMANSAFE OS come prototipo locale browser-based +- HUMANSAFE come visione e cornice etica +- HUMANSAFE LIFE come layer concettuale ancora da strutturare in prodotto + +## 8. Regole di coerenza identitaria + +Per preservare l'identità del progetto nelle prossime iterazioni, ogni modulo futuro dovrebbe rispettare queste regole: + +- non premiare l'uso compulsivo +- non trattare l'utente come merce +- non separare esperienza digitale e realtà vissuta +- non ridurre HUMANSAFE a wellness generico o startup app indistinta +- mantenere leggibile il passaggio da individuo a nodo +- far emergere il principio di responsabilità senza moralismo punitivo + +## 9. Implicazioni pratiche per i contributori + +Chi contribuisce al progetto deve leggere HUMANSAFE non come una singola app ma come un sistema a tre livelli: + +- identità madre: HUMANSAFE +- layer editoriale/relazionale: HUMANSAFE LIFE +- layer software/simulativo: HUMANSAFE OS + +Il repository attuale chiede quindi due tipi di disciplina: + +- disciplina architetturale, per non rompere il nucleo modulare +- disciplina identitaria, per non appiattire HUMANSAFE in un prodotto generico diff --git a/docs/manifesto/README.md b/docs/manifesto/README.md new file mode 100644 index 0000000..19367dd --- /dev/null +++ b/docs/manifesto/README.md @@ -0,0 +1,15 @@ +# Manifesto HUMANSAFE + +Questa sezione raccoglie il nucleo identitario e valoriale del progetto. + +## Documenti principali + +- `01_Manifesto.md` -> testo fondativo del progetto +- [HUMANSAFE Identity System](./HUMANSAFE_IDENTITY_SYSTEM.md) -> distinzione fra HUMANSAFE, HUMANSAFE LIFE e HUMANSAFE OS + +## Focus della sezione + +- missione +- principi etici +- postura verso tecnologia, dati e relazioni +- coerenza dell'identità madre nel tempo diff --git a/docs/05_Public_Report.md b/docs/pitch/05_Public_Report.md similarity index 100% rename from docs/05_Public_Report.md rename to docs/pitch/05_Public_Report.md diff --git a/docs/pitch/README.md b/docs/pitch/README.md new file mode 100644 index 0000000..2428b98 --- /dev/null +++ b/docs/pitch/README.md @@ -0,0 +1,30 @@ +\# Pitch HUMANSAFE + + + +Questa sezione raccoglie i materiali di presentazione pubblica del progetto. + + + +\## Contenuti + + + +\- report sintetici + +\- materiali introduttivi + +\- presentazioni per partner + +\- documenti per enti e collaboratori + +\- strumenti di comunicazione pubblica + + + +\## File presenti + + + +\- `05\_Public\_Report.md` → report pubblico sintetico del progetto + diff --git a/docs/03_B2B_Standard.md b/docs/strategy/03_B2B_Standard.md similarity index 100% rename from docs/03_B2B_Standard.md rename to docs/strategy/03_B2B_Standard.md diff --git a/docs/strategy/HUMANSAFE_FUTURE_EXPANSION.md b/docs/strategy/HUMANSAFE_FUTURE_EXPANSION.md new file mode 100644 index 0000000..c304182 --- /dev/null +++ b/docs/strategy/HUMANSAFE_FUTURE_EXPANSION.md @@ -0,0 +1,221 @@ +# HUMANSAFE Future Expansion + +Ultimo aggiornamento: 2026-03-15 + +Vedi anche: +- [HUMANSAFE Identity System](../manifesto/HUMANSAFE_IDENTITY_SYSTEM.md) +- [HUMANSAFE Ecosystem Master](../architecture/HUMANSAFE_ECOSYSTEM_MASTER.md) +- [HUMANSAFE MVP Roadmap](./HUMANSAFE_MVP_ROADMAP.md) + +## 1. Obiettivo di questo documento + +Questo documento non descrive feature già implementate. + +Descrive invece il perimetro di espansione che il repository rende plausibile e coerente con la visione HUMANSAFE, distinguendo fra: + +- semi già presenti nel repo +- elementi pianificabili a medio termine +- livelli ancora concettuali + +## 2. Espansione HUMANSAFE LIFE + +HUMANSAFE LIFE è il layer editoriale, relazionale e orientativo dell'ecosistema. + +Nel repository non esiste ancora come prodotto separato, ma è chiaramente implicato da: + +- tono e copy del sistema +- documenti manifesto/charter/report +- idea di accompagnamento umano e culturale + +### Componenti consigliate + +- sito editoriale e orientativo +- pagina di presentazione dei percorsi +- area supporto e accompagnamento +- accesso a rivista, quaderni, materiali formativi + +## 3. Magazine: "La Solita Attesa" + +Stato: + +- concettuale +- non presente con file dedicati nel repository attuale + +Ruolo ecosistemico: + +- dare voce al layer HUMANSAFE LIFE +- creare continuità editoriale +- offrire un ponte fra cultura, testimonianza e software + +Uso futuro consigliato: + +- formato web magazine +- raccolta trimestrale +- innesto con journal, percorsi e nodi territoriali + +## 4. Collana: "La Cellula di Messoud Sebbahi" + +Stato: + +- concettuale, ma simbolicamente preparata dal manifesto e dal lessico della "cellula" + +Ruolo: + +- consolidare la base filosofica e narrativa del progetto +- offrire profondità culturale ai nodi HUMANSAFE +- sostenere la coerenza identitaria del sistema + +## 5. Quaderno di Sessione / Session Report PDF + +Stato: + +- non implementato +- fortemente coerente con l'attuale architettura dati + +Perché è un'estensione naturale: + +- il sistema già genera timeline, riflessioni, missioni, badge, livelli, HSI +- questi elementi possono essere composti in un report umano leggibile + +Valore: + +- restituzione personale del percorso +- materiale per facilitatori, centri o percorsi formativi +- ponte fra esperienza digitale e documentazione concreta + +## 6. Centri HUMANSAFE + +Stato: + +- concettuale, ma supportato da documenti strategici e dal modulo Radici Umane + +Funzione prevista: + +- creare nodi fisici di presenza, prevenzione e relazione +- ospitare laboratori, sessioni, orientamento, attività territoriali +- trasformare HUMANSAFE da software a infrastruttura culturale e sociale + +## 7. Radici Umane come primo nodo territoriale + +Il repository contiene già un seme concreto in `modules/franchising-sociale/`. + +Questo modulo suggerisce: + +- modello ambassador +- economia etica "peace business" +- raccolta fondi per infrastruttura umana e tecnologica +- replica territoriale per centri o presidi + +Stato: + +- non è integrato nel software core +- ma è una vera estensione strategica del sistema + +## 8. ISELF come accountability layer + +Il modulo `modules/iself-smart-contract/ISELF_Token.sol` mostra una direzione chiara: + +- token soulbound +- funzione non speculativa +- valore come certificazione o tracciabilità + +Stato: + +- proof of concept +- non integrato nel percorso utente corrente + +Uso futuro prudente: + +- solo se serve davvero come layer di accountability o certificazione +- mai come gimmick crypto o leva di crescita artificiale + +## 9. Moduli per enti, associazioni e organizzazioni allineate + +Il repository contiene abbastanza materiale per immaginare una futura offerta modulare HUMANSAFE verso terzi: + +- audit HSI +- simulazioni verticali +- reportistica +- moduli di orientamento etico +- toolkit per scuole, comuni, APS, reti territoriali o organizzazioni culturali + +Stato: + +- concettuale, ma coerente con `03_B2B_Standard.md` e `05_Public_Report.md` + +## 10. AI-guided web modules per realtà allineate + +Direzione possibile: + +- moduli web verticali basati su HUMANSAFE OS +- adattati a contesti specifici +- con guida AI etica e non sostitutiva dell'umano + +Vincoli: + +- niente manipolazione +- niente pseudo-terapia automatica +- niente estrazione opaca di dati intimi +- centralità della presenza umana e della responsabilità + +## 11. Evoluzione tecnica: backend e mobile + +### Backend + +Ruolo futuro: + +- sync multi-device +- autenticazione reale +- persistenza cloud +- reportistica +- gestione nodi o facilitatori + +Condizione per partire: + +- schema dati unico già chiuso a livello locale + +### Mobile + +Ruolo futuro: + +- packaging PWA +- eventuale native bridge +- eventuale app dedicata + +Condizione per partire: + +- PWA già coerente +- onboarding chiuso +- stato utente affidabile + +## 12. Modello di espansione consigliato + +L'espansione più sicura di HUMANSAFE non è "aggiungere feature ovunque". + +È costruire quattro cerchi coerenti: + +### Cerchio 1 + +Core OS stabile + +### Cerchio 2 + +HUMANSAFE LIFE come layer editoriale e relazionale + +### Cerchio 3 + +Session Report, centri, facilitatori, nodi territoriali + +### Cerchio 4 + +moduli partner, AI-guided web modules, account federati, ecosystem platform + +## 13. Regola di espansione + +Ogni futura estensione deve poter rispondere a tre domande: + +1. rafforza la sovranità cognitiva o la diluisce? +2. spinge verso la realtà o verso altro rumore? +3. appartiene a HUMANSAFE LIFE, HUMANSAFE OS o a un nodo ecosistemico? + +Se queste tre risposte non sono chiare, l'espansione è prematura. diff --git a/docs/strategy/HUMANSAFE_MVP_ROADMAP.md b/docs/strategy/HUMANSAFE_MVP_ROADMAP.md new file mode 100644 index 0000000..459f263 --- /dev/null +++ b/docs/strategy/HUMANSAFE_MVP_ROADMAP.md @@ -0,0 +1,195 @@ +# HUMANSAFE MVP Roadmap + +Ultimo aggiornamento: 2026-03-15 + +Vedi anche: +- [HUMANSAFE Core Real State](../architecture/HUMANSAFE_CORE_REAL_STATE.md) +- [HUMANSAFE Data Flow](../architecture/HUMANSAFE_DATA_FLOW.md) +- [HUMANSAFE Onboarding Flow](../architecture/HUMANSAFE_ONBOARDING_FLOW.md) +- [HUMANSAFE Future Expansion](./HUMANSAFE_FUTURE_EXPANSION.md) + +## 1. Definizione di MVP per HUMANSAFE + +Per questo repository, MVP non significa "app completa". + +Significa: + +- percorso coerente da orientamento iniziale a simulazione e memoria +- profilo utente locale stabile +- moduli principali navigabili senza rotture +- identità HUMANSAFE leggibile senza riduzione a quiz o social +- base PWA abbastanza solida da essere installabile in modo credibile + +## 2. Cosa è già MVP-capable + +Questi elementi sono già abbastanza maturi da appartenere a un MVP: + +- Home Hub come presentazione del sistema +- LIFENET come simulatore narrativo +- data pack iniziale di scenari, missioni e livelli +- Journal e Profile come memoria leggibile +- Circle come mock realistico di community etica + +## 3. Cosa blocca un MVP stabile + +### Blocco 1: schema profilo non canonico + +È il blocco principale. + +Senza un profilo unico e stabile: + +- HSI non converge +- journal/profile/circle restano fragili +- il backend futuro partirebbe da fondamenta incoerenti + +### Blocco 2: onboarding non chiuso + +Oggi il percorso dichiarato è più coerente del percorso effettivamente esposto. + +### Blocco 3: HSI semanticamente frammentato + +Python, JSON e JS non descrivono ancora la stessa grammatica diagnostica. + +### Blocco 4: PWA incompleta + +Il progetto è installabile solo a livello nominale, non come esperienza coerente offline o quasi-offline. + +## 4. Cosa fare prima del backend + +Ordine consigliato: + +1. fissare lo schema profilo unico +2. risolvere il merge e le API del profile engine +3. allineare HSI data contract e vocabolario +4. chiudere il flusso onboarding +5. rifinire PWA e deploy statico + +Motivo: + +- il backend deve amplificare un modello già chiaro +- non deve diventare il luogo in cui si nascondono incoerenze locali + +## 5. Cosa fare prima del packaging Android + +Prima di qualsiasi bridge mobile o packaging Android, il progetto deve avere: + +- manifest e icone corretti +- service worker robusto +- caching coerente delle risorse chiave +- navigazione stabile fra i moduli +- stato utente persistente affidabile + +Se si confeziona troppo presto: + +- si porta su mobile un prototipo ancora non convergente + +## 6. Roadmap pratica + +### Fase immediata + +- convergenza del profile engine +- definizione del contratto dati +- pulizia del worktree HSI/Profile + +### Breve termine + +- integrazione HSI nel flusso home/login +- adapter dati per journal/profile/circle +- revisione PWA minima + +### Medio termine + +- auth reale opzionale +- sync cloud +- export Session Report / Quaderno di Sessione +- stabilizzazione di HUMANSAFE LIFE come layer editoriale separato ma integrato + +## 7. Strategia di migrazione sicura + +La migrazione più sicura è incrementale. + +### Regola 1 + +Non rifare i moduli UI da zero. + +### Regola 2 + +Stabilizzare prima il modello dati e poi gli adapter. + +### Regola 3 + +Usare LIFENET come driver di test del profilo centrale. + +### Regola 4 + +Rendere HSI un entrypoint, non una branch parallela incompatibile. + +## 8. Rischi da evitare + +### Errore 1 + +Introdurre backend o database prima di aver chiuso il contratto dati locale. + +### Errore 2 + +Rifare l'intero prodotto come app mobile generica perdendo il layering HUMANSAFE/HUMANSAFE LIFE/HUMANSAFE OS. + +### Errore 3 + +Moltiplicare feature editoriali o community senza avere una memoria profilo stabile. + +## 9. Recommended Next Build Sequence + +### Step 1 + +Rendere `modules/profile-engine.js` la fonte unica di verità, risolvendo il merge e definendo uno schema profilo backward compatible con le UI attuali. + +### Step 2 + +Allineare il vocabolario HSI fra Python, JSON e JS, scegliendo una sola tassonomia per: + +- zone +- archetipi +- campi profilo +- payload timeline/reflections/badges + +### Step 3 + +Chiudere l'onboarding reale nel percorso: + +`index -> login/demo -> hsi -> lifenet -> journal/profile -> circle` + +senza introdurre ancora backend. + +### Step 4 + +Rendere la PWA coerente: + +- manifest corretto +- icone corrette +- cache completa delle risorse essenziali +- percorsi deploy-safe + +### Step 5 + +Solo dopo la stabilizzazione locale, introdurre: + +- sync cloud / backend +- account reale +- Session Report PDF +- packaging mobile +- moduli ecosistemici aggiuntivi + +## 10. Priorità finali + +### Singolo problema architetturale più urgente + +L'assenza di un contratto dati canonico per il profilo utente e per HSI. + +### Target di implementazione più sicuro + +Stabilizzare il profile engine e adattare a esso HSI, LIFENET, Journal, Profile e Circle. + +### Errore a più alto rischio da evitare + +Costruire backend, Android packaging o nuove feature editoriali sopra un modello profilo ancora diviso in due semantiche incompatibili. diff --git a/docs/strategy/README.md b/docs/strategy/README.md new file mode 100644 index 0000000..7305179 --- /dev/null +++ b/docs/strategy/README.md @@ -0,0 +1,20 @@ +# Strategia HUMANSAFE + +Questa sezione raccoglie la traiettoria operativa del progetto: cosa consolidare adesso, cosa espandere dopo e in quale ordine farlo senza snaturare HUMANSAFE. + +## Documenti principali + +- [HUMANSAFE MVP Roadmap](./HUMANSAFE_MVP_ROADMAP.md) +- [HUMANSAFE Future Expansion](./HUMANSAFE_FUTURE_EXPANSION.md) + +## Documento fondativo collegato + +- `03_B2B_Standard.md` -> standard strategico e direzione organizzativa/B2B + +## Focus della sezione + +- stato MVP reale +- sequenza di build sicura +- migrazione verso PWA coerente +- condizioni per backend e mobile +- espansione editoriale, territoriale e partner ecosystem diff --git a/game-data/README.md b/game-data/README.md new file mode 100644 index 0000000..bfa3c74 --- /dev/null +++ b/game-data/README.md @@ -0,0 +1,54 @@ +\# HUMANSAFE Game Data + + + +Questa cartella contiene i dati strutturati usati dai prototipi interattivi HUMANSAFE. + + + +\## Struttura + + + +\### `scenarios/` + +Scenari narrativi e situazioni interattive del sistema. + + + +\### `profiles/` + +Profili utente, archetipi, stati cognitivi e configurazioni identitarie. + + + +\### `missions/` + +Missioni, azioni guidate e compiti associati all’evoluzione dell’utente. + + + +\### `signals/` + +Segnali cognitivi, pattern comportamentali e indicatori simbolici usati nei moduli HUMANSAFE. + + + +\## Obiettivo + + + +Organizzare i dati del progetto in forma leggibile, espandibile e riutilizzabile per: + + + +\- quiz + +\- simulazioni + +\- moduli narrativi + +\- sistemi di coaching + +\- strumenti diagnostici etici + diff --git a/game-data/missions/missions_01.json b/game-data/missions/missions_01.json new file mode 100644 index 0000000..8cfb5aa --- /dev/null +++ b/game-data/missions/missions_01.json @@ -0,0 +1,51 @@ +{ + "system": "HUMANSAFE Mission Layer", + "description": "Pacchetto iniziale di missioni etiche e reali per il primo MVP di HUMANSAFE OS.", + "missions": [ + { + "id": "missione_01", + "title": "10 minuti senza schermo", + "type": "offline", + "reward_xp": 5, + "reward_traits": ["presence", "reality"], + "description": "Resta per 10 minuti senza schermo, musica o distrazioni digitali.", + "ethical_value": "presenza" + }, + { + "id": "missione_02", + "title": "Una risposta non impulsiva", + "type": "behavioral", + "reward_xp": 8, + "reward_traits": ["clarity", "courage"], + "description": "Aspetta prima di rispondere a un messaggio o contenuto che ti attiva emotivamente.", + "ethical_value": "coraggio" + }, + { + "id": "missione_03", + "title": "Conversazione piena", + "type": "relational", + "reward_xp": 10, + "reward_traits": ["empathy", "presence"], + "description": "Fai una conversazione reale senza toccare il telefono.", + "ethical_value": "empatia" + }, + { + "id": "missione_04", + "title": "Camminata lucida", + "type": "offline", + "reward_xp": 6, + "reward_traits": ["reality", "clarity"], + "description": "Cammina per 15 minuti senza notifiche né contenuti in cuffia.", + "ethical_value": "realtà" + }, + { + "id": "missione_05", + "title": "Riflessione scritta", + "type": "reflective", + "reward_xp": 7, + "reward_traits": ["clarity", "presence"], + "description": "Scrivi tre righe vere su cosa usi per fuggire quando senti attrito o disagio.", + "ethical_value": "chiarezza" + } + ] +} \ No newline at end of file diff --git a/game-data/profiles/archetypes.json b/game-data/profiles/archetypes.json new file mode 100644 index 0000000..9352468 --- /dev/null +++ b/game-data/profiles/archetypes.json @@ -0,0 +1,69 @@ +{ + "archetypes": [ + { + "id": "cellula_dormiente", + "name": "Cellula Dormiente", + "zone": "Zona Rossa", + "description": "Usa spesso il digitale come anestetico o rifugio automatico. Tende a fuggire il vuoto, la frizione e la presenza reale.", + "traits": [ + "alta distrazione", + "bassa regolazione", + "evasione automatica", + "fragile presenza mentale" + ], + "recommended_action": "Applica la Regola del Vuoto: 15 minuti al giorno senza schermo, senza musica, senza fuga." + }, + { + "id": "cellula_reattiva", + "name": "Cellula Reattiva", + "zone": "Zona Grigia", + "description": "Ha coscienza della manipolazione digitale, ma viene ancora trascinata da urgenza, controllo e attrito emotivo.", + "traits": [ + "impulsività", + "controllo compulsivo", + "sensibilità ai trigger", + "consapevolezza instabile" + ], + "recommended_action": "Applica la regola delle 24 ore prima di rispondere a contenuti o messaggi ad alta carica emotiva." + }, + { + "id": "cellula_osservatrice", + "name": "Cellula Osservatrice", + "zone": "Zona Grigia", + "description": "È più lucida della media e riconosce molti meccanismi, ma alterna osservazione e dispersione.", + "traits": [ + "auto-osservazione", + "lucidità intermittente", + "struttura fragile", + "buon potenziale evolutivo" + ], + "recommended_action": "Introduci un blocco quotidiano di 30 minuti di presenza reale senza notifiche." + }, + { + "id": "cellula_in_risveglio", + "name": "Cellula in Risveglio", + "zone": "Zona Verde", + "description": "Sta recuperando spazio mentale e usa la tecnologia con intenzione crescente.", + "traits": [ + "presenza crescente", + "migliore regolazione", + "autonomia in sviluppo", + "uso più consapevole del digitale" + ], + "recommended_action": "Trasforma una tua pratica sana in rituale stabile e condividila con almeno una persona." + }, + { + "id": "nucleo_sovrano", + "name": "Nucleo Sovrano", + "zone": "Zona Verde", + "description": "Ha una buona capacità di reggere vuoto, impulso e frizione. La tecnologia non domina il suo baricentro.", + "traits": [ + "alta presenza", + "regolazione forte", + "lucidità stabile", + "capacità di proteggere sé e gli altri" + ], + "recommended_action": "Diventa nodo attivo: crea contesti, conversazioni e micro-azioni che proteggano anche gli altri." + } + ] +} \ No newline at end of file diff --git a/game-data/progression/levels.json b/game-data/progression/levels.json new file mode 100644 index 0000000..47072d3 --- /dev/null +++ b/game-data/progression/levels.json @@ -0,0 +1,41 @@ +{ + "system": "HUMANSAFE Progression Layer", + "description": "Sistema base di livelli per la gamification etica di HUMANSAFE OS.", + "levels": [ + { + "level": 1, + "id": "segnale_debole", + "name": "Segnale Debole", + "xp_required": 0, + "description": "L'utente inizia a osservare i propri automatismi senza ancora dominarli." + }, + { + "level": 2, + "id": "cellula_attiva", + "name": "Cellula Attiva", + "xp_required": 20, + "description": "L'utente ha iniziato a reagire con maggiore consapevolezza e presenza." + }, + { + "level": 3, + "id": "osservatore_lucido", + "name": "Osservatore Lucido", + "xp_required": 50, + "description": "L'utente sviluppa una capacità più stabile di auto-osservazione e regolazione." + }, + { + "level": 4, + "id": "nodo_consapevole", + "name": "Nodo Consapevole", + "xp_required": 90, + "description": "L'utente consolida il proprio baricentro mentale e diventa punto di riferimento." + }, + { + "level": 5, + "id": "custode_humansafe", + "name": "Custode Humansafe", + "xp_required": 140, + "description": "L'utente ha sviluppato una presenza forte e una capacità di protezione verso sé e gli altri." + } + ] +} \ No newline at end of file diff --git a/game-data/scenarios/scenario_01.json b/game-data/scenarios/scenario_01.json new file mode 100644 index 0000000..119f909 --- /dev/null +++ b/game-data/scenarios/scenario_01.json @@ -0,0 +1,60 @@ +{ + "scenario_id": "01", + "title": "Il Silenzio Rombante", + "theme": "Dipendenza da validazione, ansia digitale, gestione del rifiuto.", + "trigger": "Vulnerabilità esposta.", + "setup": [ + "Sono le 22:15. Tre ore fa hai inviato un messaggio vocale molto personale a una persona a cui tieni.", + "Apri la chat. Sotto il tuo messaggio ci sono le due spunte blu. Visualizzato alle 19:30.", + "In alto, sotto il suo nome, c'è scritto 'Online'.", + "Fissi lo schermo. Per un secondo appare la scritta 'sta scrivendo...', ma poi scompare. Di nuovo, solo 'Online'.", + "Il tuo stomaco si stringe in una morsa di imbarazzo e rabbia. Senti di aver sbagliato a esporti." + ], + "question": "Cosa fai?", + "choices": [ + { + "id": "A", + "action_name": "L'Attacco Passivo-Aggressivo", + "text": "Gli scrivi: 'Tutto bene? Vedo che leggi ma non rispondi. Se disturbavo potevi dirlo.'", + "stat_changes": { + "impulsivita": 2, + "resilienza_emotiva": -1, + "empatia": -1 + }, + "oracle_intervention": "Hai trasformato la tua vulnerabilità in rabbia. Pretendere una risposta immediata non nasce dalla tua forza, ma dalla paura dell'abbandono. L'altro è diventato un ostaggio della tua ansia. Ricorda: il tempo degli altri non ti appartiene." + }, + { + "id": "B", + "action_name": "La Cancellazione", + "text": "Usi 'Elimina per tutti' sul vocale, cancellando la tua vulnerabilità.", + "stat_changes": { + "fiducia_in_se": -2, + "capacita_comunicativa": -1, + "consapevolezza": 0 + }, + "oracle_intervention": "Hai cancellato le tue parole per proteggerti dalla vergogna. Ma nascondendo la tua fragilità, hai cancellato anche la tua autenticità. Chi non ha il coraggio di esporsi al silenzio dell'altro, non conoscerà mai la profondità di un legame reale." + }, + { + "id": "C", + "action_name": "L'Anestesia Algoritmica", + "text": "Chiudi la chat. Apri TikTok/Instagram e scorri velocemente per non sentire il nodo allo stomaco.", + "stat_changes": { + "fuga_realta": 2, + "consapevolezza": -2, + "resilienza_emotiva": -1 + }, + "oracle_intervention": "Hai sentito dolore e hai subito cercato l'anestetico. L'algoritmo ti ha accolto a braccia aperte. Ma il nodo allo stomaco è ancora lì, solo sepolto. Finché fuggirai dal vuoto, sarai sempre schiavo di chi promette di riempirlo." + }, + { + "id": "D", + "action_name": "La Sospensione (La Sovranità)", + "text": "Riconosci il bruciore dell'ansia. Spegni lo schermo, metti il telefono a faccia in giù e vai a bere un bicchiere d'acqua.", + "stat_changes": { + "resilienza_emotiva": 2, + "consapevolezza": 2, + "sovranita_cognitiva": 3 + }, + "oracle_intervention": "Il silenzio fa male, e tu hai scelto di sentirlo. Non hai attaccato, non sei fuggito. Hai restituito all'altro il suo tempo e a te stesso il tuo spazio. Questa è la Sovranità Cognitiva. Ti stai rafforzando." + } + ] +} diff --git a/game-data/scenarios/scenario_02.json b/game-data/scenarios/scenario_02.json new file mode 100644 index 0000000..97ab52d --- /dev/null +++ b/game-data/scenarios/scenario_02.json @@ -0,0 +1,60 @@ +{"share_title": "Ho affrontato il contesto Ghosting", +"share_text": "Su LIFENET ho osservato come reagisco al silenzio digitale.", + "scenario_id": "02", + "title": "La Frattura del Turno", + "theme": "Burnout, reperibilità continua, confini lavoro-vita.", + "trigger": "Richiesta urgente fuori orario.", + "setup": [ + "Sono le 22:47. Hai finito da poco una giornata pesante.", + "Il telefono vibra: un responsabile scrive nel gruppo lavoro 'Serve questa cosa per stanotte'.", + "Sai che domani dovrai alzarti presto, ma senti anche paura di sembrare poco disponibile.", + "Apri la chat. Tutti hanno visualizzato. Nessuno risponde." + ], + "question": "Come reagisci?", + "choices": [ + { + "id": "A", + "action_name": "La Sottomissione Silenziosa", + "text": "Ti rimetti al computer anche se sei esausto e fai il lavoro in risentimento.", + "stat_changes": { + "resilienza_emotiva": -1, + "sovranita_cognitiva": -2, + "fiducia_in_se": -1 + }, + "oracle_intervention": "Hai confuso disponibilità con auto-abbandono. Quando non metti confini, il sistema impara che può consumarti." + }, + { + "id": "B", + "action_name": "Lo Scoppio Passivo", + "text": "Rispondi in modo secco e aggressivo nel gruppo, facendo uscire tutta la frustrazione accumulata.", + "stat_changes": { + "impulsivita": 2, + "capacita_comunicativa": -1, + "resilienza_emotiva": -1 + }, + "oracle_intervention": "Hai trasformato un confine necessario in una detonazione. Il confine senza forma diventa solo attrito." + }, + { + "id": "C", + "action_name": "La Fuga Nascosta", + "text": "Non rispondi e spegni tutto, ma passi la notte in colpa e agitazione.", + "stat_changes": { + "fuga_realta": 1, + "fiducia_in_se": -1, + "consapevolezza": 0 + }, + "oracle_intervention": "Se sparisci senza decidere, il tuo corpo resta comunque al lavoro. Il silenzio non sempre è riposo." + }, + { + "id": "D", + "action_name": "Il Confine Sovrano", + "text": "Rispondi con rispetto: confermi presa visione, dichiari che interverrai domani in orario utile e chiudi il telefono.", + "stat_changes": { + "sovranita_cognitiva": 3, + "capacita_comunicativa": 2, + "resilienza_emotiva": 2 + }, + "oracle_intervention": "Hai protetto il tuo sistema senza umiliare nessuno. Il vero professionismo include la custodia dei limiti." + } + ] +} diff --git a/game-data/scenarios/scenario_03.json b/game-data/scenarios/scenario_03.json new file mode 100644 index 0000000..097a2dc --- /dev/null +++ b/game-data/scenarios/scenario_03.json @@ -0,0 +1,59 @@ +{ + "scenario_id": "03", + "title": "Il Pozzo Senza Fondo", + "theme": "Doomscrolling, ansia sociale, dipendenza da informazione tossica.", + "trigger": "Notizia disturbante + scroll compulsivo.", + "setup": [ + "Apri il telefono per controllare un messaggio e ti ritrovi davanti a una notizia scioccante.", + "Scorri i commenti. Poi altri contenuti. Poi altri ancora.", + "Ti senti sempre più agitato, ma il pollice continua a muoversi da solo.", + "Il tuo corpo è fermo. La tua mente no." + ], + "question": "Cosa fai?", + "choices": [ + { + "id": "A", + "action_name": "L'Immersione Totale", + "text": "Continui a scrollare per 'capire meglio', anche se stai peggio di minuto in minuto.", + "stat_changes": { + "fuga_realta": 2, + "consapevolezza": -2, + "resilienza_emotiva": -1 + }, + "oracle_intervention": "Hai chiamato informazione ciò che in realtà era esposizione continua al veleno. Capire non significa saturarsi." + }, + { + "id": "B", + "action_name": "La Condivisione Reattiva", + "text": "Rilanci subito la notizia a tutti, senza verificare davvero, per scaricare l'ansia.", + "stat_changes": { + "impulsivita": 2, + "empatia": -1, + "consapevolezza": -1 + }, + "oracle_intervention": "L'ansia condivisa senza filtro diventa contagio. Non ogni allarme diffuso è responsabilità: spesso è solo eco." + }, + { + "id": "C", + "action_name": "La Sospensione Critica", + "text": "Chiudi il flusso, fai tre respiri, verifichi una sola fonte affidabile e poi esci.", + "stat_changes": { + "consapevolezza": 2, + "sovranita_cognitiva": 2, + "resilienza_emotiva": 1 + }, + "oracle_intervention": "Hai ridotto il rumore e recuperato criterio. Il cervello non guarisce dall'overload con altro overload." + }, + { + "id": "D", + "action_name": "Il Ritorno al Corpo", + "text": "Posi il telefono, fai due minuti di camminata lenta e torni alla realtà sensibile.", + "stat_changes": { + "sovranita_cognitiva": 3, + "resilienza_emotiva": 2, + "fuga_realta": -1 + }, + "oracle_intervention": "Hai ricordato al tuo sistema nervoso che il mondo non è solo lo schermo. Il corpo è una tecnologia antica e ancora superiore." + } + ] +} diff --git a/game-data/scenarios/scenario_04.json b/game-data/scenarios/scenario_04.json new file mode 100644 index 0000000..3414396 --- /dev/null +++ b/game-data/scenarios/scenario_04.json @@ -0,0 +1,60 @@ +{ + "scenario_id": "04", + "title": "Il Branco Silenzioso", + "theme": "Esclusione sociale, conformismo digitale, responsabilità relazionale.", + "trigger": "Derisione in chat di gruppo.", + "setup": [ + "Sei in una chat di gruppo. Un ragazzo del gruppo viene preso in giro con meme e allusioni.", + "Nessuno interviene davvero. Alcuni mettono reaction divertite.", + "Tu senti disagio, ma anche la paura di esporti e diventare il prossimo bersaglio.", + "Lo schermo aspetta il tuo piccolo voto morale." + ], + "question": "Cosa scegli?", + "choices": [ + { + "id": "A", + "action_name": "La Complicità Leggera", + "text": "Metti una reaction ironica per non esporti troppo ma restare dentro il gruppo.", + "stat_changes": { + "empatia": -2, + "fiducia_in_se": -1, + "sovranita_cognitiva": -1 + }, + "oracle_intervention": "Hai barattato integrità con appartenenza. A volte la crudeltà moderna indossa la maschera della leggerezza." + }, + { + "id": "B", + "action_name": "Il Silenzio Vigliacco", + "text": "Non fai nulla. Resti a guardare e aspetti che passi.", + "stat_changes": { + "empatia": -1, + "consapevolezza": 0, + "fiducia_in_se": -1 + }, + "oracle_intervention": "Non colpire non basta sempre. Quando il danno è davanti a te, anche l'inerzia educa il gruppo." + }, + { + "id": "C", + "action_name": "La Difesa Privata", + "text": "Scrivi in privato alla persona esclusa, ma non intervieni pubblicamente.", + "stat_changes": { + "empatia": 2, + "capacita_comunicativa": 1, + "sovranita_cognitiva": 0 + }, + "oracle_intervention": "Hai protetto la ferita ma non hai toccato il meccanismo. È un gesto umano, ma ancora incompleto." + }, + { + "id": "D", + "action_name": "L'Intervento Sobrio", + "text": "Intervieni nella chat con tono fermo e semplice: fermi il gioco e riporti il gruppo alla realtà.", + "stat_changes": { + "empatia": 3, + "sovranita_cognitiva": 3, + "capacita_comunicativa": 2, + "fiducia_in_se": 1 + }, + "oracle_intervention": "Hai rischiato disapprovazione per difendere dignità. È così che una cellula smette di adattarsi al danno e inizia a guarire l'organismo." + } + ] +} diff --git a/game-data/signals/hsi_zones.json b/game-data/signals/hsi_zones.json new file mode 100644 index 0000000..dd2022f --- /dev/null +++ b/game-data/signals/hsi_zones.json @@ -0,0 +1,97 @@ +{ + "metric": "HSI", + "name": "Humansafe Signal Index", + "description": "Indice simbolico usato nei prototipi HUMANSAFE per rappresentare il livello di equilibrio tra attenzione, reattività, responsabilità e presenza mentale nel rapporto con il digitale.", + "scale": { + "min": 0, + "max": 100 + }, + "zones": [ + { + "id": "zona_rossa", + "name": "Zona Rossa", + "range": { + "min": 0, + "max": 35 + }, + "color": "red", + "meaning": "Il digitale tende a dominare il baricentro mentale dell'utente. La persona usa spesso lo schermo come fuga, anestesia o reazione impulsiva.", + "characteristics": [ + "alta distrazione", + "bassa presenza", + "reattività elevata", + "uso compensativo del digitale", + "fragilità nella regolazione" + ], + "priority": "Ridurre il rumore, interrompere gli automatismi e ricostruire spazio mentale reale." + }, + { + "id": "zona_grigia_bassa", + "name": "Zona Grigia Bassa", + "range": { + "min": 36, + "max": 55 + }, + "color": "amber", + "meaning": "L'utente comincia a riconoscere i meccanismi che lo influenzano, ma resta ancora spesso intrappolato in urgenza, controllo e dispersione.", + "characteristics": [ + "consapevolezza instabile", + "controllo compulsivo", + "oscillazione tra lucidità e ricaduta", + "vulnerabilità ai trigger emotivi" + ], + "priority": "Stabilizzare la consapevolezza e introdurre regole semplici ma costanti." + }, + { + "id": "zona_grigia_alta", + "name": "Zona Grigia Alta", + "range": { + "min": 56, + "max": 70 + }, + "color": "yellow", + "meaning": "L'utente possiede una buona capacità di osservazione, ma non ha ancora consolidato del tutto la propria struttura interna.", + "characteristics": [ + "buona lucidità", + "presenza intermittente", + "potenziale evolutivo alto", + "disciplina non ancora stabile" + ], + "priority": "Trasformare le intuizioni in pratiche quotidiane stabili." + }, + { + "id": "zona_verde_media", + "name": "Zona Verde", + "range": { + "min": 71, + "max": 85 + }, + "color": "green", + "meaning": "L'utente sta recuperando baricentro mentale e usa la tecnologia con intenzione crescente e maggiore responsabilità.", + "characteristics": [ + "presenza crescente", + "regolazione migliore", + "uso più consapevole del digitale", + "maggiore autonomia" + ], + "priority": "Consolidare le pratiche sane e iniziare a diventare punto di riferimento per altri." + }, + { + "id": "zona_verde_alta", + "name": "Zona Verde Alta", + "range": { + "min": 86, + "max": 100 + }, + "color": "emerald", + "meaning": "L'utente mantiene un buon equilibrio tra impulso, attenzione e presenza. La tecnologia non domina il suo centro decisionale.", + "characteristics": [ + "alta lucidità", + "forte presenza mentale", + "buona capacità di regolazione", + "attitudine protettiva verso sé e altri" + ], + "priority": "Diffondere cultura di presenza, protezione e lucidità nella propria rete umana." + } + ] +} \ No newline at end of file diff --git a/hsi.html b/hsi.html new file mode 100644 index 0000000..5ccea0b --- /dev/null +++ b/hsi.html @@ -0,0 +1,126 @@ +@' + + + + + + HUMANSAFE | HSI Diagnostic + + + +
+
+

HSI Diagnostic

+

Una prima scansione per comprendere il tuo orientamento cognitivo, emotivo ed etico nel sistema HUMANSAFE.

+

Diagnosis → Simulation → Reflection → Mission → Memory → Evolution → Community

+
+ +
+

+ Rispondi con sincerità. Non è un test clinico, ma una mappa iniziale + per personalizzare simulazione, riflessione e missioni. +

+
+ +
+
+ +
+ + +
+ + + + +'@ | Set-Content .\hsi.html -Encoding UTF8 diff --git a/index.html b/index.html index 74ae473..50791ae 100644 --- a/index.html +++ b/index.html @@ -1,410 +1,427 @@ - + - HUMANSAFE CORE | Simulatore Diagnostico + HUMANSAFE OS | Home Hub + + +
+
-
HUMANSAFE CORE · Nodo Zero
-

Simulatore Diagnostico di Sicurezza Cognitiva

+
+
HUMANSAFE OS · Home Hub
+ Accesso → +
+ +

Tecnologia etica per lucidità, memoria, comunità e crescita umana.

+ +

+ HUMANSAFE OS è un ecosistema che unisce simulazione narrativa, riflessione, missioni reali, + diario evolutivo e community etica per aiutare l’utente a sviluppare più presenza e più sovranità cognitiva. +

+

- Questo prototipo rileva pattern di distrazione, reattività e lucidità. - Non è un oracolo magico, per fortuna: è uno strumento di auto-osservazione strutturata. + Non è un social classico. Non è solo un quiz. Non è solo un gioco. + È un sistema unico che trasforma l’esperienza digitale in percorso.

+ + + +
+ Formula del sistema +

+ diagnosi → simulazione → missione → memoria → evoluzione → comunità +

+
+
+ +
+

Perché esiste HUMANSAFE

+
+
+

Il problema

+

+ Gli ecosistemi digitali spingono spesso reattività, distrazione e frammentazione. + L’essere umano si ritrova connesso ovunque, ma poco presente a sé stesso. +

+
+
+

La risposta

+

+ HUMANSAFE usa il digitale come infrastruttura etica: uno specchio, un laboratorio + e una memoria del percorso, non una macchina che divora attenzione. +

+
+
-
-
-
-
-
Domanda 1 di 7
-
-

Caricamento domanda...

-

-
-
+
+

I moduli del sistema

+
+ +
+
Access Layer
+

Login

+

Porta di ingresso al sistema e ponte verso community esterne.

+ Apri login
-
- - -
-
- - - diff --git a/journal.html b/journal.html new file mode 100644 index 0000000..55451b5 --- /dev/null +++ b/journal.html @@ -0,0 +1,438 @@ + + + + + + + HUMANSAFE Journal | Diario di Bordo + + + + +
+
+
+
HUMANSAFE Journal Layer
+ ← Torna a HUMANSAFE CORE +
+ +

Diario di bordo del percorso

+

+ Il Journal trasforma eventi, missioni, riflessioni e passaggi evolutivi + in memoria leggibile. Non serve a giudicarti: serve a darti continuità. +

+ + +
+ +
+
+

Stato sintetico

+
+
+ Nome profilo + Caricamento... +
+
+ Archetipo + Caricamento... +
+
+ Zona HSI + Caricamento... +
+
+ XP Totale + 0 +
+
+ +
+

Badge attivi

+
+
+ +
+

Missioni completate

+
+
+
+ +
+

Memoria del percorso

+ +
+

Riflessioni recenti

+
+
+ +
+

Timeline evolutiva

+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lifenet_game.html b/lifenet_game.html index 583cf02..babdbc7 100644 --- a/lifenet_game.html +++ b/lifenet_game.html @@ -3,7 +3,11 @@ - LIFENET | The Humansafe Simulator + HUMANSAFE LIFENET | Simulation Layer +
-
LIFENET · Simulatore Narrativo
-

Allenamento alla Sovranità Cognitiva

+
+
HUMANSAFE LIFENET · Simulation Layer
+ ← Torna a HUMANSAFE CORE +
+ +

Allenamento alla sovranità cognitiva

- LIFENET non misura solo ciò che pensi. Misura come reagisci quando il mondo ti pizzica i nervi. - Ogni scenario aggiorna parametri invisibili e attiva l'HUMANSAFE ORACLE. + LIFENET è il simulatore narrativo di HUMANSAFE OS. Qui attraversi scenari, + fai scelte, ricevi riflessioni ORACLE e trasformi l’esperienza in progresso reale.

+ +
Scenario 1
-

Caricamento...

+

Caricamento...

+
+

+ + + +
- - Torna al simulatore diagnostico + + Apri Journal + Apri Profilo
@@ -154,23 +318,56 @@

- diff --git a/login.html b/login.html new file mode 100644 index 0000000..3b05a90 --- /dev/null +++ b/login.html @@ -0,0 +1,271 @@ + + + + + + HUMANSAFE OS | Access Layer + + + + +
+ +
+
+
HUMANSAFE OS · Access Layer
+ ← Torna alla Home +
+ +

Entra nell’ecosistema HUMANSAFE

+ +

+ Questa è la porta di ingresso al sistema: simulazione, profilo, diario, community e crescita etica. +

+ +

+ Per ora l’accesso è un gateway demo coerente con il prototipo. + Nei prossimi aggiornamenti potrà essere collegato ad autenticazione reale. +

+ + + +
+ Il cuore dell’identità utente resta interno a HUMANSAFE. + I provider esterni sono solo porte di ingresso, non il centro del sistema. +
+
+ +
+

Ingressi rapidi

+ +
+
+

Comunità esterna

+

+ Usa i nodi esterni per diffusione, contatto e community iniziale. +

+ +
+ +
+

Moduli interni

+

+ Accedi direttamente ai moduli centrali già attivi nel prototipo. +

+ +
+
+ +

+ Futuri step: autenticazione reale, sincronizzazione cloud, onboarding guidato, account persistente multi-dispositivo. +

+
+ +
+ + + diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..2ad7583 --- /dev/null +++ b/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "HUMANSAFE OS", + "short_name": "HUMANSAFE", + "start_url": "index.html", + "display": "standalone", + "background_color": "#0d1117", + "theme_color": "#4ea1ff", + "orientation": "portrait", + "icons": [ + { + "src": "logo_humansafe.jpg", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "logo_humansafe.jpg", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/manifest.json.save b/manifest.json.save new file mode 100644 index 0000000..45b988c --- /dev/null +++ b/manifest.json.save @@ -0,0 +1,23 @@ +{ + "name": "HUMANSAFE OS", + "short_name": "HUMANSAFE", + "start_url": "index.html", + "display": "standalone", + "background_color": "#0d1117", + "theme_color": "#4ea1ff", + "orientation": "portrait", + "icons": [ + { + "src": "logo_humansafe.jpg", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "logo_humansafe.jpg", + "sizes": "512x512", + "type": "image/png" + } + ] + +} + diff --git a/modules/franchising-sociale/README.md b/modules/franchising-sociale/README.md new file mode 100644 index 0000000..d6500ad --- /dev/null +++ b/modules/franchising-sociale/README.md @@ -0,0 +1,25 @@ +# 🌱 PROGETTO "RADICI UMANE" (Franchising Etico) +### Il Peace Business applicato al Territorio + +Il progetto **Radici Umane** è il braccio operativo territoriale di Humansafe. Unisce l'inclusione lavorativa (aiutare chi è in difficoltà a garantirsi una remunerazione dignitosa) con la diffusione capillare della Sicurezza Cognitiva. + +## 1. La Filosofia del Simbolo +Per finanziare l'apertura dei Centri Humansafe (le "Palestre Emotive"), i nostri Ambasciatori distribuiscono sul territorio **piante e oggetti ornamentali vivi**. + +**Perché una pianta?** +Una pianta è l'antitesi dello smartphone: non ha uno schermo, non genera picchi di dopamina sintetica, ma richiede cura, tempo, pazienza e attenzione reale. Rappresenta la Cellula viva che torna a respirare. Chi acquista una pianta Humansafe per la propria casa o negozio, finanzia direttamente la disintossicazione digitale della propria città. + +## 2. Il Modello di Franchising Sociale (Ambasciatori) +Non cerchiamo "venditori", ma **Ambasciatori di Consapevolezza**. +Il sistema permette a chiunque (disoccupati, studenti, pensionati) di formarsi sui principi Humansafe e di operare come franchisee sul proprio territorio. + +* **Dignità Lavorativa:** L'Ambasciatore trattiene una percentuale equa sui contributi raccolti, remunerando la propria giornata in modo etico. +* **Sostegno all'Ecosistema:** La restante parte finanzia l'associazione Humansafe APS per l'apertura di presidi fisici e l'implementazione tecnologica. +* **Diffusione del Network:** Insieme alla pianta, viene consegnato un "Tag" con QR Code che invita l'acquirente a effettuare l'Audit Cognitivo Gratuito (*Humansafe Interactive Simulation*), espandendo l'Organismo. + +## 3. Lo Script Operativo dell'Ambasciatore +*(Copione standard approvato dal Comitato Etico Humansafe per la sensibilizzazione pubblica)* + +> "Buongiorno. Sono un Ambasciatore di HUMANSAFE, un'infrastruttura sociale che si occupa di prevenire la dipendenza digitale e l'isolamento dei giovani. +> Oggi siamo tutti schiavi degli schermi, e stiamo perdendo la capacità di guardarci negli occhi. Per finanziare l'apertura dei nostri centri fisici e creare lavoro locale, stiamo distribuendo queste piante. +> Una pianta è l'opposto di un telefono: ha bisogno di cura e attenzione reale. Prendendo questa pianta, lei finanzia i laboratori per i ragazzi della nostra città e mi aiuta a sostenermi onestamente. Troverà anche un QR code per testare il suo livello di ansia digitale gratuitamente. Posso contare sul suo supporto per questa rivoluzione?" diff --git a/modules/franchising-sociale/roi_ambassador_calculator.py b/modules/franchising-sociale/roi_ambassador_calculator.py new file mode 100644 index 0000000..14cb5b1 --- /dev/null +++ b/modules/franchising-sociale/roi_ambassador_calculator.py @@ -0,0 +1,40 @@ +def calcola_distribuzione_fondi(prezzo_pianta, quantita_vendute, costo_ingrosso_singolo): + """ + Calcola in totale trasparenza la distribuzione dei fondi + generati dalla campagna territoriale "Radici Umane". + """ + # 1. Calcolo del ricavo totale e dei costi vivi + ricavo_totale = prezzo_pianta * quantita_vendute + costi_totali = costo_ingrosso_singolo * quantita_vendute + margine_netto = ricavo_totale - costi_totali + + # 2. Modello Peace Business (Distribuzione Etica 50/50) + # Il 50% va all'Ambasciatore per il suo lavoro e la sua dignità + compenso_ambasciatore = margine_netto * 0.50 + # Il 50% va all'ecosistema Humansafe (APS) per aprire i centri e gestire la tech + fondo_humansafe = margine_netto * 0.50 + + return { + "Ricavo Totale": ricavo_totale, + "Costi Vivi (Piante/Vasi)": costi_totali, + "Margine Netto Generato": margine_netto, + "Compenso Ambasciatore": compenso_ambasciatore, + "Fondo Ecosistema Humansafe": fondo_humansafe + } + +# --- SIMULAZIONE DELLA GIORNATA DI UN AMBASCIATORE --- +if __name__ == "__main__": + print("=== SIMULATORE PEACE BUSINESS: RADICI UMANE ===") + + # Esempio: L'ambasciatore distribuisce 20 piante a 15€ l'una. Costo all'ingrosso 4€. + risultato = calcola_distribuzione_fondi(prezzo_pianta=15, quantita_vendute=20, costo_ingrosso_singolo=4) + + print(f"Piante distribuite: 20") + print(f"Ricavo Totale: € {risultato['Ricavo Totale']:.2f}") + print(f"Costi Vivi (Materiale): € {risultato['Costi Vivi (Piante/Vasi)']:.2f}") + print("-" * 40) + print(f"MARGINE NETTO: € {risultato['Margine Netto Generato']:.2f}") + print("-" * 40) + print(f"💰 Compenso Ambasciatore (Dignità): € {risultato['Compenso Ambasciatore']:.2f}") + print(f"🏛️ Fondo Humansafe APS (Strutture): € {risultato['Fondo Ecosistema Humansafe']:.2f}") + print("\n[SISTEMA]: Modello economico sostenibile. Il Peace Business è attivo.") diff --git a/modules/hsi-engine.js b/modules/hsi-engine.js new file mode 100644 index 0000000..e46ff7b --- /dev/null +++ b/modules/hsi-engine.js @@ -0,0 +1,179 @@ +@' +import { + updateHSIProfile, + addTimelineEvent, + addBadge, + addMission +} from "./profile-engine.js"; + +const HSI_QUESTIONS = [ + { id: "awareness_1", text: "Riesco a riconoscere con chiarezza ciò che provo prima di reagire.", axis: "awareness" }, + { id: "awareness_2", text: "Mi fermo a riflettere prima di prendere decisioni importanti.", axis: "awareness" }, + { id: "awareness_3", text: "Mi accorgo quando sto vivendo in automatico.", axis: "awareness" }, + + { id: "sovereignty_1", text: "So distinguere tra ciò che penso davvero e ciò che assorbo dall’esterno.", axis: "sovereignty" }, + { id: "sovereignty_2", text: "Resisto alla pressione di conformarmi digitalmente o socialmente.", axis: "sovereignty" }, + { id: "sovereignty_3", text: "Metto in discussione contenuti e stimoli prima di accettarli.", axis: "sovereignty" }, + + { id: "resilience_1", text: "Riesco a regolare le emozioni senza esserne travolto.", axis: "resilience" }, + { id: "resilience_2", text: "Costruisco relazioni che mi fanno crescere invece di svuotarmi.", axis: "resilience" }, + { id: "resilience_3", text: "Cerco di agire in modo coerente con i miei valori.", axis: "resilience" } +]; + +const form = document.getElementById("hsi-form"); +const submitBtn = document.getElementById("submit-hsi"); +const resultBox = document.getElementById("hsi-result"); +const resultContent = document.getElementById("hsi-result-content"); +const continueBtn = document.getElementById("continue-btn"); + +function renderQuestions() { + form.innerHTML = HSI_QUESTIONS.map((q, index) => ` +
+

${index + 1}. ${q.text}

+
+ ${[1, 2, 3, 4, 5].map(value => ` + + `).join("")} +
+
+ `).join(""); +} + +function collectAnswers() { + const answers = []; + + for (const question of HSI_QUESTIONS) { + const checked = document.querySelector(`input[name="${question.id}"]:checked`); + if (!checked) return null; + + answers.push({ + id: question.id, + axis: question.axis, + value: Number(checked.value) + }); + } + + return answers; +} + +function normalizeScore(rawScore, min = 9, max = 45) { + return Math.round(((rawScore - min) / (max - min)) * 100); +} + +function getHSIZone(score) { + if (score <= 25) return "grey"; + if (score <= 50) return "amber"; + if (score <= 75) return "blue"; + return "gold"; +} + +function getAxisScores(answers) { + return { + awareness: answers.filter(a => a.axis === "awareness").reduce((sum, a) => sum + a.value, 0), + sovereignty: answers.filter(a => a.axis === "sovereignty").reduce((sum, a) => sum + a.value, 0), + resilience: answers.filter(a => a.axis === "resilience").reduce((sum, a) => sum + a.value, 0) + }; +} + +function getArchetype(axisScores) { + const dominantAxis = Object.entries(axisScores).sort((a, b) => b[1] - a[1])[0][0]; + + switch (dominantAxis) { + case "awareness": + return "observer"; + case "sovereignty": + return "guardian"; + case "resilience": + return "builder"; + default: + return "explorer"; + } +} + +function buildDiagnosticSummary(zone, archetype) { + const zoneText = { + grey: "Ti trovi in una fase di possibile dispersione o automatismo.", + amber: "Sei in una soglia di transizione che richiede consolidamento.", + blue: "Hai una buona base di lucidità e presenza.", + gold: "Mostri una forte integrazione tra visione, etica e presenza." + }; + + const archetypeText = { + observer: "Il tuo archetipo iniziale è Observer.", + guardian: "Il tuo archetipo iniziale è Guardian.", + builder: "Il tuo archetipo iniziale è Builder.", + explorer: "Il tuo archetipo iniziale è Explorer." + }; + + return `${zoneText[zone]} ${archetypeText[archetype]}`; +} + +function showResult(data) { + resultContent.innerHTML = ` +

HSI Score: ${data.hsi_value}

+

Zona: ${data.hsi_zone}

+

Archetipo: ${data.archetype}

+

${data.diagnostic_summary}

+ `; + resultBox.classList.remove("hidden"); +} + +submitBtn?.addEventListener("click", () => { + const answers = collectAnswers(); + + if (!answers) { + alert("Compila tutte le domande prima di continuare."); + return; + } + + const rawScore = answers.reduce((sum, answer) => sum + answer.value, 0); + const hsi_value = normalizeScore(rawScore); + const hsi_zone = getHSIZone(hsi_value); + const axisScores = getAxisScores(answers); + const archetype = getArchetype(axisScores); + const diagnostic_summary = buildDiagnosticSummary(hsi_zone, archetype); + const diagnostic_completed_at = new Date().toISOString(); + + updateHSIProfile({ + hsi_value, + hsi_zone, + archetype, + diagnostic_summary, + diagnostic_completed_at + }); + + addTimelineEvent({ + type: "diagnostic_completed", + title: "HSI completato", + description: `Zona ${hsi_zone}, archetipo ${archetype}, score ${hsi_value}.` + }); + + addBadge({ + id: "first_scan", + name: "Prima Scansione", + description: "Hai completato il tuo primo orientamento HSI." + }); + + addMission({ + id: "observe_automation", + title: "Osserva il tuo automatismo", + description: "Per 12 ore, nota un momento in cui reagisci senza riflettere e annotalo nel Journal." + }); + + showResult({ + hsi_value, + hsi_zone, + archetype, + diagnostic_summary + }); +}); + +continueBtn?.addEventListener("click", () => { + window.location.href = "./lifenet_game.html"; +}); + +renderQuestions(); +'@ | Set-Content .\modules\hsi-engine.js -Encoding UTF8 diff --git a/modules/iself-smart-contract/ISELF_Token.sol b/modules/iself-smart-contract/ISELF_Token.sol new file mode 100644 index 0000000..adec351 --- /dev/null +++ b/modules/iself-smart-contract/ISELF_Token.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title HUMANSELF (ISELF) - Accountability Token + * @dev Questo è un "Soulbound Token" (SBT). Non è trasferibile né vendibile. + * Serve esclusivamente come layer di tracciabilità per l'ecosistema Humansafe. + * Certifica: Azioni preventive, superamento audit cognitivi, empatia sociale. + */ + +contract ISELF_Token { + string public name = "Humanself Accountability Token"; + string public symbol = "ISELF"; + + address public humansafeSystemAdmin; + + // Mappatura che associa l'indirizzo dell'utente al suo "Credito Formativo" + mapping(address => uint256) public preventiveCredits; + + // Eventi registrati pubblicamente e in modo immutabile sulla blockchain + event EvolutionRewarded(address indexed user, uint256 amount, string reason); + event TransferAttemptBlocked(address indexed from, address indexed to); + + constructor() { + humansafeSystemAdmin = msg.sender; // Il sistema Humansafe governa l'emissione + } + + // Solo i facilitatori certificati Humansafe possono validare e coniare il token + modifier onlyAdmin() { + require(msg.sender == humansafeSystemAdmin, "Azione non autorizzata. Solo Humansafe puo certificare l'evoluzione."); + _; + } + + /** + * @dev Eroga ISELF a una "Cellula" che ha completato un'azione di disintossicazione + * o ha superato un Audit B2B. + */ + function rewardCell(address _cellAddress, uint256 _amount, string memory _reason) public onlyAdmin { + preventiveCredits[_cellAddress] += _amount; + emit EvolutionRewarded(_cellAddress, _amount, _reason); + } + + /** + * @dev FUNZIONE SOULBOUND: Blocca qualsiasi tentativo di vendita o trasferimento. + * La consapevolezza e la sicurezza cognitiva non si possono comprare, si conquistano. + */ + function transfer(address _to, uint256 _amount) public returns (bool) { + emit TransferAttemptBlocked(msg.sender, _to); + revert("Trasferimento negato: ISELF e' un token legato alla tua identita' (Soulbound). Non ha valore speculativo."); + } +} diff --git a/modules/profile-engine.js b/modules/profile-engine.js new file mode 100644 index 0000000..f1df4b9 --- /dev/null +++ b/modules/profile-engine.js @@ -0,0 +1,179 @@ +@' +const STORAGE_KEY = "humansafe_user_profile"; + +const DEFAULT_PROFILE = { + name: "Explorer", + provider: "demo", + archetype: "observer", + hsi_zone: "grey", + hsi_value: 50, + xp_total: 0, + level_name: "seed", + badges: [], + completed_missions: [], + reflections: [], + timeline: [], + community_posts: [], + diagnostic_summary: "", + diagnostic_completed_at: null, + schema_version: "1.1.0", + created_at: null, + updated_at: null +}; + +export function getDefaultProfile() { + const now = new Date().toISOString(); + return { + ...DEFAULT_PROFILE, + created_at: now, + updated_at: now + }; +} + +export function getUserProfile() { + const raw = localStorage.getItem(STORAGE_KEY); + + if (!raw) { + const profile = getDefaultProfile(); + saveUserProfile(profile); + return profile; + } + + try { + const parsed = JSON.parse(raw); + + return { + ...getDefaultProfile(), + ...parsed + }; + } catch (error) { + console.error("Errore parsing profilo:", error); + const fallback = getDefaultProfile(); + saveUserProfile(fallback); + return fallback; + } +} + +export function saveUserProfile(profile) { + const updatedProfile = { + ...profile, + updated_at: new Date().toISOString() + }; + + localStorage.setItem(STORAGE_KEY, JSON.stringify(updatedProfile)); + return updatedProfile; +} + +export function resetUserProfile() { + const profile = getDefaultProfile(); + saveUserProfile(profile); + return profile; +} + +export function updateUserProfile(partialData) { + const profile = getUserProfile(); + + const updated = { + ...profile, + ...partialData, + updated_at: new Date().toISOString() + }; + + saveUserProfile(updated); + return updated; +} + +export function updateHSIProfile(data) { + return updateUserProfile({ + hsi_value: data.hsi_value, + hsi_zone: data.hsi_zone, + archetype: data.archetype, + diagnostic_summary: data.diagnostic_summary, + diagnostic_completed_at: data.diagnostic_completed_at + }); +} + +export function addTimelineEvent(event) { + const profile = getUserProfile(); + + const timelineEvent = { + id: `evt_${Date.now()}`, + type: event.type || "generic", + title: event.title || "Evento", + description: event.description || "", + created_at: new Date().toISOString() + }; + + const updatedTimeline = [timelineEvent, ...(profile.timeline || [])]; + + return updateUserProfile({ + timeline: updatedTimeline + }); +} + +export function addBadge(badge) { + const profile = getUserProfile(); + const badges = profile.badges || []; + + const exists = badges.some(b => b.id === badge.id); + if (exists) return profile; + + const newBadge = { + id: badge.id, + name: badge.name, + description: badge.description || "", + created_at: new Date().toISOString() + }; + + return updateUserProfile({ + badges: [newBadge, ...badges] + }); +} + +export function addMission(mission) { + const profile = getUserProfile(); + const missions = profile.completed_missions || []; + + const exists = missions.some(m => m.id === mission.id); + if (exists) return profile; + + const newMission = { + id: mission.id, + title: mission.title, + description: mission.description || "", + created_at: new Date().toISOString() + }; + + return updateUserProfile({ + completed_missions: [newMission, ...missions] + }); +} + +export function addReflection(reflectionText) { + const profile = getUserProfile(); + + const reflection = { + id: `refl_${Date.now()}`, + text: reflectionText, + created_at: new Date().toISOString() + }; + + return updateUserProfile({ + reflections: [reflection, ...(profile.reflections || [])] + }); +} + +export function addCommunityPost(post) { + const profile = getUserProfile(); + + const communityPost = { + id: `post_${Date.now()}`, + text: post.text || "", + created_at: new Date().toISOString() + }; + + return updateUserProfile({ + community_posts: [communityPost, ...(profile.community_posts || [])] + }); +} +'@ | Set-Content .\modules\profile-engine.js -Encoding UTF8 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..fccb158 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1074 @@ +{ + "name": "humansafe-core", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "humansafe-core", + "version": "1.0.0", + "dependencies": { + "@capacitor/android": "^7.0.0", + "@capacitor/cli": "^7.0.0", + "@capacitor/core": "^7.0.0" + } + }, + "node_modules/@capacitor/android": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-7.6.0.tgz", + "integrity": "sha512-xpfAOGcgeQnTw8C0E9nLjW15lQ6TL2ccieZks93hNiQYknnQT8FQaH2paMYkLYrQ0JfRImdBXbQ1u6sZ4kVa3w==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^7.6.0" + } + }, + "node_modules/@capacitor/cli": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-7.6.0.tgz", + "integrity": "sha512-3PL8xIgXLj1037NqmuzoKXNOi80AdY7eSCnX6/A7RfjFqT8TEiCL+PlHsHtg6/BSZGSmmxGGBjH3nXrNCRoFhw==", + "license": "MIT", + "dependencies": { + "@ionic/cli-framework-output": "^2.2.8", + "@ionic/utils-subprocess": "^3.0.1", + "@ionic/utils-terminal": "^2.3.5", + "commander": "^12.1.0", + "debug": "^4.4.0", + "env-paths": "^2.2.0", + "fs-extra": "^11.2.0", + "kleur": "^4.1.5", + "native-run": "^2.0.3", + "open": "^8.4.0", + "plist": "^3.1.0", + "prompts": "^2.4.2", + "rimraf": "^6.0.1", + "semver": "^7.6.3", + "tar": "^7.5.3", + "tslib": "^2.8.1", + "xml2js": "^0.6.2" + }, + "bin": { + "cap": "bin/capacitor", + "capacitor": "bin/capacitor" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@capacitor/core": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-7.6.0.tgz", + "integrity": "sha512-K6LEvgxW6Nd6uNWHj3U512hUtB4kln71TvVgdvwJRFMLySpUrWwb/A8Q7c3QGogvPvgOjN1U65onkyRTihPGwA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@ionic/cli-framework-output": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", + "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", + "license": "MIT", + "dependencies": { + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-array": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", + "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-fs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", + "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-fs/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ionic/utils-object": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", + "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-process": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz", + "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", + "license": "MIT", + "dependencies": { + "@ionic/utils-object": "2.1.6", + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.7.tgz", + "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==", + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-subprocess": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", + "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", + "license": "MIT", + "dependencies": { + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-process": "2.1.12", + "@ionic/utils-stream": "3.1.7", + "@ionic/utils-terminal": "2.3.5", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", + "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", + "license": "MIT", + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "license": "MIT" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "license": "Apache-2.0", + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/native-run": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.3.tgz", + "integrity": "sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==", + "license": "MIT", + "dependencies": { + "@ionic/utils-fs": "^3.1.7", + "@ionic/utils-terminal": "^2.3.4", + "bplist-parser": "^0.3.2", + "debug": "^4.3.4", + "elementtree": "^0.1.7", + "ini": "^4.1.1", + "plist": "^3.1.0", + "split2": "^4.2.0", + "through2": "^4.0.2", + "tslib": "^2.6.2", + "yauzl": "^2.10.0" + }, + "bin": { + "native-run": "bin/native-run" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rimraf": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "license": "ISC" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", + "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..dbd76b8 --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "humansafe-core", + "version": "1.0.0", + "private": true, + "description": "HUMANSAFE OS mobile wrapper and build tools", + "scripts": { + "build:mobile": "powershell -ExecutionPolicy Bypass -File .\\build-mobile.ps1", + "cap:sync": "npx cap sync android", + "mobile:prepare": "npm run build:mobile && npm run cap:sync" + }, + "dependencies": { + "@capacitor/android": "^7.0.0", + "@capacitor/cli": "^7.0.0", + "@capacitor/core": "^7.0.0" + } +} diff --git a/profile.html b/profile.html new file mode 100644 index 0000000..8111c56 --- /dev/null +++ b/profile.html @@ -0,0 +1,435 @@ + + + + + + HUMANSAFE Profile | Profile Layer + + + + +
+
+
+
HUMANSAFE Profile Layer
+ ← Torna a HUMANSAFE CORE +
+ +

Centro identitario del percorso

+

+ Il Profile Layer raccoglie lo stato evolutivo complessivo dell’utente: + identità, livello, badge, missioni, riflessioni e segnali principali. +

+ + + +
+ Prossimi upgrade del Profile Layer +

+ Nome modificabile, reset percorso, avatar, statistiche avanzate, + sincronizzazione cloud, autenticazione reale, livelli globali e dashboard completa. +

+
+
+ +
+
+

Stato utente

+
+
+ Nome profilo + Caricamento... +
+
+ Archetipo + Caricamento... +
+
+ Zona HSI + Caricamento... +
+
+ HSI + Caricamento... +
+
+ XP Totale + 0 +
+
+ Livello + Caricamento... +
+
+ Provider + Caricamento... +
+
+ Ultimo aggiornamento + Caricamento... +
+
+ +
+

Badge globali

+
+
+ +
+

Missioni completate

+
+
+
+ +
+

Attività recente

+ +
+

Ultime riflessioni

+
+
+ +
+

Eventi recenti

+
+
+
+
+
+ + + + diff --git a/service-worker.js b/service-worker.js new file mode 100644 index 0000000..868d38e --- /dev/null +++ b/service-worker.js @@ -0,0 +1,23 @@ +const CACHE_NAME = "humansafe-cache-v1"; + +const urlsToCache = [ + "/", + "/index.html", + "/lifenet_game.html", + "/journal.html", + "/social.html" +]; + +self.addEventListener("install", event => { + event.waitUntil( + caches.open(CACHE_NAME) + .then(cache => cache.addAll(urlsToCache)) + ); +}); + +self.addEventListener("fetch", event => { + event.respondWith( + caches.match(event.request) + .then(response => response || fetch(event.request)) + ); +}); diff --git a/social.html b/social.html new file mode 100644 index 0000000..342a6b6 --- /dev/null +++ b/social.html @@ -0,0 +1,518 @@ + + + + + + HUMANSAFE Circle | Community Layer + + + + +
+
+
+
HUMANSAFE Circle Layer
+ ← Torna a HUMANSAFE CORE +
+ +

Condivisione etica del percorso

+

+ HUMANSAFE Circle non è un social classico. È uno spazio per condividere missioni, + riflessioni, checkpoint e richieste di aiuto senza trasformare tutto in rumore o gara. +

+ + +
+ +
+
+

Condividi nel Circle

+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ +
+
+ + +
+
+ + + + diff --git a/struttura-humansafe.txt b/struttura-humansafe.txt new file mode 100644 index 0000000..a5b2131 Binary files /dev/null and b/struttura-humansafe.txt differ diff --git a/user-data/demo_profile.json b/user-data/demo_profile.json new file mode 100644 index 0000000..24ddccf --- /dev/null +++ b/user-data/demo_profile.json @@ -0,0 +1,56 @@ +{ + "name": "Messoud Demo Profile", + "archetype": "Cellula in Risveglio", + "hsi_zone": "Zona Verde", + "xp_total": 64, + "level_name": "Osservatore Lucido", + "last_update": "2026-03-11", + "badges": [ + "Primo Risveglio", + "Specchio Pulito", + "Presenza Reale" + ], + "completed_missions": [ + { + "id": "missione_01", + "title": "10 minuti senza schermo", + "description": "Resta per 10 minuti senza schermo, musica o distrazioni digitali.", + "reward_xp": 5, + "ethical_value": "presenza" + }, + { + "id": "missione_03", + "title": "Conversazione piena", + "description": "Fai una conversazione reale senza toccare il telefono.", + "reward_xp": 10, + "ethical_value": "empatia" + } + ], + "reflections": [ + { + "date": "2026-03-10", + "text": "Quando sento attrito, la tentazione di rifugiarmi nel telefono arriva prima del pensiero. Ma adesso riesco a vederla." + }, + { + "date": "2026-03-11", + "text": "La presenza reale non è assenza di caos. È capacità di restare anche quando vorrei fuggire." + } + ], + "timeline": [ + { + "date": "2026-03-09", + "title": "Prima scansione HSI", + "description": "Avvio del percorso con lettura iniziale del profilo cognitivo." + }, + { + "date": "2026-03-10", + "title": "Ingresso in LIFENET", + "description": "Primi scenari completati e primo contatto con HUMANSAFE ORACLE." + }, + { + "date": "2026-03-11", + "title": "Missione reale completata", + "description": "Prima azione offline registrata nel Diario di Bordo." + } + ] +} \ No newline at end of file