From 4cd5b51085a4ea2d8bd02cca4f78dcc3bfbad985 Mon Sep 17 00:00:00 2001 From: despiegk Date: Tue, 12 Aug 2025 10:33:29 +0200 Subject: [PATCH] ... --- lib/code/reprompt/.heroscript | 8 + lib/code/reprompt/readme.md | 30 + lib/code/reprompt/reprompt_do.v | 12 + lib/code/reprompt/reprompt_factory_.v | 102 ++ lib/code/reprompt/reprompt_model.v | 49 + .../templates/heroscript_template.hero | 10 + lib/code/reprompt/templates/prompt.md | 1 + lib/code/reprompt/templates/prompt_example.md | 1607 +++++++++++++++++ lib/core/playcmds/play_core.v | 6 +- 9 files changed, 1821 insertions(+), 4 deletions(-) create mode 100644 lib/code/reprompt/.heroscript create mode 100644 lib/code/reprompt/readme.md create mode 100644 lib/code/reprompt/reprompt_do.v create mode 100644 lib/code/reprompt/reprompt_factory_.v create mode 100644 lib/code/reprompt/reprompt_model.v create mode 100644 lib/code/reprompt/templates/heroscript_template.hero create mode 100644 lib/code/reprompt/templates/prompt.md create mode 100644 lib/code/reprompt/templates/prompt_example.md diff --git a/lib/code/reprompt/.heroscript b/lib/code/reprompt/.heroscript new file mode 100644 index 00000000..d1c37d8b --- /dev/null +++ b/lib/code/reprompt/.heroscript @@ -0,0 +1,8 @@ + +!!hero_code.generate_client + name:'reprompt' + classname:'RepromptWorkspace' + singleton:0 + default:1 + hasconfig:1 + reset:0 \ No newline at end of file diff --git a/lib/code/reprompt/readme.md b/lib/code/reprompt/readme.md new file mode 100644 index 00000000..9e4d3817 --- /dev/null +++ b/lib/code/reprompt/readme.md @@ -0,0 +1,30 @@ +# reprompt + + + +To get started + +```vlang + + +import freeflowuniverse.herolib.clients. reprompt + +mut client:= reprompt.get()! + +client... + + + + +``` + +## example heroscript + +```hero +!!reprompt.configure + secret: '...' + host: 'localhost' + port: 8888 +``` + + diff --git a/lib/code/reprompt/reprompt_do.v b/lib/code/reprompt/reprompt_do.v new file mode 100644 index 00000000..70bcf737 --- /dev/null +++ b/lib/code/reprompt/reprompt_do.v @@ -0,0 +1,12 @@ +module reprompt + +import freeflowuniverse.herolib.data.paramsparser +import freeflowuniverse.herolib.data.encoderhero +import freeflowuniverse.herolib.core.pathlib +import os + +// your checking & initialization code if needed +fn (mut ws RepromptWorkspace) reprompt() !string { + //TODO: fill in template based on selection + return "" +} diff --git a/lib/code/reprompt/reprompt_factory_.v b/lib/code/reprompt/reprompt_factory_.v new file mode 100644 index 00000000..82dd36ec --- /dev/null +++ b/lib/code/reprompt/reprompt_factory_.v @@ -0,0 +1,102 @@ +module reprompt + +import freeflowuniverse.herolib.core.base +import freeflowuniverse.herolib.core.playbook { PlayBook } +import freeflowuniverse.herolib.ui.console + +__global ( + reprompt_global map[string]&RepromptWorkspace + reprompt_default string +) + +/////////FACTORY + +@[params] +pub struct ArgsGet { +pub mut: + name string +} + +fn args_get(args_ ArgsGet) ArgsGet { + mut args := args_ + if args.name == '' { + args.name = 'default' + } + return args +} + +pub fn get(args_ ArgsGet) !&RepromptWorkspace { + mut context := base.context()! + mut args := args_get(args_) + mut obj := RepromptWorkspace{ + name: args.name + } + if args.name !in reprompt_global { + if !exists(args)! { + set(obj)! + } else { + heroscript := context.hero_config_get('reprompt', args.name)! + mut obj_ := heroscript_loads(heroscript)! + set_in_mem(obj_)! + } + } + return reprompt_global[args.name] or { + println(reprompt_global) + // bug if we get here because should be in globals + panic('could not get config for reprompt with name, is bug:${args.name}') + } +} + +// register the config for the future +pub fn set(o RepromptWorkspace) ! { + set_in_mem(o)! + mut context := base.context()! + heroscript := heroscript_dumps(o)! + context.hero_config_set('reprompt', o.name, heroscript)! +} + +// does the config exists? +pub fn exists(args_ ArgsGet) !bool { + mut context := base.context()! + mut args := args_get(args_) + return context.hero_config_exists('reprompt', args.name) +} + +pub fn delete(args_ ArgsGet) ! { + mut args := args_get(args_) + mut context := base.context()! + context.hero_config_delete('reprompt', args.name)! + if args.name in reprompt_global { + // del reprompt_global[args.name] + } +} + +// only sets in mem, does not set as config +fn set_in_mem(o RepromptWorkspace) ! { + mut o2 := obj_init(o)! + reprompt_global[o.name] = &o2 + reprompt_default = o.name +} + +pub fn play(mut plbook PlayBook) ! { + mut install_actions := plbook.find(filter: 'reprompt.configure')! + if install_actions.len > 0 { + for install_action in install_actions { + heroscript := install_action.heroscript() + mut obj2 := heroscript_loads(heroscript)! + set(obj2)! + } + } +} + +// switch instance to be used for reprompt +pub fn switch(name string) { + reprompt_default = name +} + +// helpers + +@[params] +pub struct DefaultConfigArgs { + instance string = 'default' +} diff --git a/lib/code/reprompt/reprompt_model.v b/lib/code/reprompt/reprompt_model.v new file mode 100644 index 00000000..2c68fc41 --- /dev/null +++ b/lib/code/reprompt/reprompt_model.v @@ -0,0 +1,49 @@ +module reprompt + +import freeflowuniverse.herolib.data.paramsparser +import freeflowuniverse.herolib.data.encoderhero +import freeflowuniverse.herolib.core.pathlib +import os + +pub const version = '0.0.0' +const singleton = false +const default = true + +// THIS THE THE SOURCE OF THE INFORMATION OF THIS FILE, HERE WE HAVE THE CONFIG OBJECT CONFIGURED AND MODELLED + +@[heap] +pub struct RepromptWorkspace { +pub mut: + name string = 'default' + dirs []RepromptDir +} + +pub struct RepromptDir { +pub mut: + path pathlib.Path + selections []string // paths selected in the RepromptDir +} + + +// your checking & initialization code if needed +fn obj_init(mycfg_ RepromptWorkspace) !RepromptWorkspace { + mut mycfg := mycfg_ + if mycfg.password == '' && mycfg.secret == '' { + return error('password or secret needs to be filled in for ${mycfg.name}') + } + return mycfg +} + +/////////////NORMALLY NO NEED TO TOUCH + +pub fn heroscript_dumps(obj RepromptWorkspace) !string { + //create heroscript following template + //check for our homedir on our machine and replace in the heroscript to @HOME in path + return encoderhero.encode[RepromptWorkspace](obj)! +} + +pub fn heroscript_loads(heroscript string) !RepromptWorkspace { + //TODO: parse heroscript populate RepromptWorkspace + mut obj := encoderhero.decode[RepromptWorkspace](heroscript)! + return obj +} diff --git a/lib/code/reprompt/templates/heroscript_template.hero b/lib/code/reprompt/templates/heroscript_template.hero new file mode 100644 index 00000000..2490f3ba --- /dev/null +++ b/lib/code/reprompt/templates/heroscript_template.hero @@ -0,0 +1,10 @@ + +!!reprompt.configure name:"default" + +!!reprompt.workspace_dir name:"default" + path:"@HOME/code/github/freeflowuniverse/herolib/lib/builder" + selection:"path1,path2" //paths are relative in the path of workspace + filter_exclude:"," + filter_include:"," + + diff --git a/lib/code/reprompt/templates/prompt.md b/lib/code/reprompt/templates/prompt.md new file mode 100644 index 00000000..6fdcc7e2 --- /dev/null +++ b/lib/code/reprompt/templates/prompt.md @@ -0,0 +1 @@ +TODO:... \ No newline at end of file diff --git a/lib/code/reprompt/templates/prompt_example.md b/lib/code/reprompt/templates/prompt_example.md new file mode 100644 index 00000000..94615eef --- /dev/null +++ b/lib/code/reprompt/templates/prompt_example.md @@ -0,0 +1,1607 @@ + +/Users/despiegk/code/github/freeflowuniverse/herolib +├── .gitignore +├── .vdocignore +├── compile.sh +├── CONTRIBUTING.md +├── doc.vsh +├── generate.vsh +├── herolib.code-workspace +├── install_hero.sh +├── install_herolib.vsh +├── install_v.sh +├── LICENSE +├── README.md +├── release_OLD.sh +├── release.vsh +├── specs.md +├── test_basic.vsh +└── test_runner.vsh +├── .github +│ └── workflows +│ ├── documentation.yml +│ ├── hero_build.yml +│ └── test.yml +├── aiprompts +│ └── herolib_start_here.md +│ ├── .openhands +│ │ └── setup.sh +│ ├── ai_instruct +│ │ ├── documentation_from_v_md.md +│ │ ├── documentation_from_v.md +│ │ ├── prompt_processing_instructions.md +│ │ ├── prompt_processing_openrpc_like.md +│ │ └── what_is_a_hero_twin.md +│ │ ├── models_from_v +│ ├── bizmodel +│ │ ├── bizmodel_cost.md +│ │ ├── bizmodel_funding.md +│ │ ├── bizmodel_generation_prompt.md +│ │ ├── bizmodel_hr.md +│ │ ├── bizmodel_revenue.md +│ │ └── costs.heroscript +│ ├── documentor +│ │ └── generate_v_doc_readable_md_files.md +│ ├── docusaurus +│ │ └── docusaurus_ebook_manual.md +│ ├── herolib_advanced +│ │ ├── advanced_paths.md +│ │ ├── builder.md +│ │ ├── cmdline_argument_parsing_example.vsh +│ │ ├── datatypes.md +│ │ ├── osal.md +│ │ ├── ourdb.md +│ │ ├── redis.md +│ │ ├── spreadsheet.md +│ │ └── ui console chalk.md +│ ├── herolib_core +│ │ ├── core_curdir_example.md +│ │ ├── core_globals.md +│ │ ├── core_heroscript_basics.md +│ │ ├── core_heroscript_playbook.md +│ │ ├── core_http_client.md +│ │ ├── core_osal.md +│ │ ├── core_ourtime.md +│ │ ├── core_params.md +│ │ ├── core_paths.md +│ │ ├── core_text.md +│ │ ├── core_ui_console.md +│ │ └── core_vshell.md +│ ├── v_advanced +│ │ ├── advanced_topics.md +│ │ ├── compress.md +│ │ ├── generics.md +│ │ ├── html_parser.md +│ │ ├── io.md +│ │ ├── net.md +│ │ ├── reflection.md +│ │ ├── regex.md +│ │ ├── smtp.md +│ │ └── time instructions.md +│ ├── v_core +│ │ └── v_manual.md +│ ├── v_veb_webserver +│ │ ├── veb_assets.md +│ │ ├── veb_auth.md +│ │ ├── veb_csrf.md +│ │ ├── veb_sse.md +│ │ ├── veb.md +│ │ └── vtemplates.md +├── cli +│ ├── .gitignore +│ ├── compile +│ ├── compile_upload.vsh +│ ├── compile_vdo.vsh +│ ├── compile.vsh +│ ├── hero.v +│ └── vdo.v +├── docker +│ └── docker_ubuntu_install.sh +│ ├── herolib +│ │ ├── .gitignore +│ │ ├── build.sh +│ │ ├── debug.sh +│ │ ├── docker-compose.yml +│ │ ├── Dockerfile +│ │ ├── export.sh +│ │ ├── README.md +│ │ ├── shell.sh +│ │ ├── ssh_init.sh +│ │ ├── ssh.sh +│ │ └── start.sh +│ │ ├── scripts +│ ├── postgresql +│ │ ├── docker-compose.yml +│ │ ├── readme.md +│ │ └── start.sh +├── examples +│ ├── README.md +│ └── sync_do.sh +│ ├── aiexamples +│ │ ├── groq.vsh +│ │ ├── jetconvertor.vsh +│ │ ├── jina.vsh +│ │ └── qdrant.vsh +│ ├── baobab +│ │ ├── generator +│ │ └── specification +│ ├── biztools +│ │ ├── bizmodel_complete.vsh +│ │ ├── bizmodel_export.vsh +│ │ ├── bizmodel_full.vsh +│ │ ├── bizmodel.vsh +│ │ ├── bizmodel1.vsh +│ │ ├── bizmodel2.vsh +│ │ ├── costs.vsh +│ │ ├── funding.vsh +│ │ ├── hr.vsh +│ │ └── notworking.md +│ │ ├── _archive +│ │ ├── bizmodel_docusaurus +│ │ ├── examples +│ ├── builder +│ │ ├── simple_ip4.vsh +│ │ ├── simple_ip6.vsh +│ │ └── simple.vsh +│ │ ├── remote_executor +│ ├── clients +│ │ ├── aiclient_example.vsh +│ │ ├── jina_example.vsh +│ │ ├── mail.vsh +│ │ ├── mycelium_rpc.vsh +│ │ ├── mycelium.vsh +│ │ ├── psql.vsh +│ │ └── zinit_rpc_example.vsh +│ ├── core +│ │ ├── agent_encoding.vsh +│ │ ├── generate.vsh +│ │ └── secrets_example.vsh +│ │ ├── base +│ │ ├── db +│ │ ├── dbfs +│ │ ├── openapi +│ │ ├── openrpc +│ │ ├── pathlib +│ ├── data +│ │ ├── .gitignore +│ │ ├── cache.vsh +│ │ ├── compress_gzip_example.vsh +│ │ ├── deduped_mycelium_master.vsh +│ │ ├── deduped_mycelium_worker.vsh +│ │ ├── encoder.vsh +│ │ ├── encrypt_decrypt.vsh +│ │ ├── graphdb.vsh +│ │ ├── heroencoder_example.vsh +│ │ ├── heroencoder_simple.vsh +│ │ ├── jsonexample.vsh +│ │ ├── ourdb_client.vsh +│ │ ├── ourdb_example.vsh +│ │ ├── ourdb_server.vsh +│ │ ├── radixtree.vsh +│ │ └── regex_example.vsh +│ │ ├── location +│ │ ├── ourdb_syncer +│ │ ├── params +│ │ ├── resp +│ ├── develop +│ │ ├── gittools +│ │ ├── ipapi +│ │ ├── juggler +│ │ ├── luadns +│ │ ├── openai +│ │ ├── runpod +│ │ ├── vastai +│ │ └── wireguard +│ ├── hero +│ │ └── alpine_example.vsh +│ │ ├── db +│ │ ├── generation +│ │ ├── openapi +│ ├── installers +│ │ ├── .gitignore +│ │ ├── cometbft.vsh +│ │ ├── conduit.vsh +│ │ ├── coredns.vsh +│ │ ├── hero_install.vsh +│ │ ├── installers.vsh +│ │ ├── traefik.vsh +│ │ └── youki.vsh +│ │ ├── db +│ │ ├── infra +│ │ ├── lang +│ │ ├── net +│ │ ├── sysadmintools +│ │ ├── threefold +│ │ ├── virt +│ ├── jobs +│ │ └── vfs_jobs_example.vsh +│ ├── lang +│ │ └── python +│ ├── mcp +│ │ ├── http_demo +│ │ ├── http_server +│ │ ├── inspector +│ │ └── simple_http +│ ├── osal +│ │ ├── .gitignore +│ │ ├── notifier.vsh +│ │ ├── startup_manager.vsh +│ │ ├── systemd.vsh +│ │ ├── tun.vsh +│ │ ├── ufw_play.vsh +│ │ └── ufw.vsh +│ │ ├── coredns +│ │ ├── download +│ │ ├── ping +│ │ ├── process +│ │ ├── rsync +│ │ ├── sandbox +│ │ ├── sshagent +│ │ ├── zinit +│ ├── schemas +│ │ ├── openapi +│ │ └── openrpc +│ ├── threefold +│ │ └── .gitignore +│ │ ├── grid +│ │ ├── gridproxy +│ │ ├── holochain +│ │ ├── solana +│ │ ├── tfgrid3deployer +│ ├── tools +│ │ ├── imagemagick +│ │ ├── tmux +│ │ └── vault +│ ├── ui +│ │ ├── flow1.v +│ │ └── silence.vsh +│ │ ├── console +│ │ ├── telegram +│ ├── vfs +│ │ └── vfs_db +│ ├── virt +│ │ ├── daguserver +│ │ ├── docker +│ │ ├── hetzner +│ │ ├── lima +│ │ ├── podman_buildah +│ │ ├── runc +│ │ └── windows +│ ├── web +│ │ ├── .gitignore +│ │ ├── docusaurus_example.vsh +│ │ ├── starllight_example.vsh +│ │ └── ui_demo.vsh +│ │ ├── doctree +│ │ ├── markdown_renderer +│ ├── webdav +│ │ ├── .gitignore +│ │ └── webdav_vfs.vsh +├── lib +│ ├── readme.md +│ └── v.mod +│ ├── ai +│ │ ├── escalayer +│ │ ├── mcp +│ │ └── utils +│ ├── baobab +│ │ └── README.md +│ │ ├── actor +│ │ ├── generator +│ │ ├── osis +│ │ ├── specification +│ │ ├── stage +│ ├── biz +│ │ ├── bizmodel +│ │ ├── investortool +│ │ ├── planner +│ │ └── spreadsheet +│ ├── builder +│ │ ├── bootstrapper.v +│ │ ├── builder_factory.v +│ │ ├── done.v +│ │ ├── executor_local_test.v +│ │ ├── executor_local.v +│ │ ├── executor_ssh_test.v +│ │ ├── executor_ssh.v +│ │ ├── executor.v +│ │ ├── model_package.v +│ │ ├── node_commands.v +│ │ ├── node_executor.v +│ │ ├── node_factory.v +│ │ ├── node.v +│ │ ├── nodedb_test.v +│ │ ├── portforward_lib.v +│ │ ├── readme.md +│ │ └── this_remote.v +│ ├── clients +│ │ ├── ipapi +│ │ ├── jina +│ │ ├── livekit +│ │ ├── mailclient +│ │ ├── meilisearch +│ │ ├── mycelium +│ │ ├── mycelium_rpc +│ │ ├── openai +│ │ ├── postgresql_client +│ │ ├── qdrant +│ │ ├── rclone +│ │ ├── runpod +│ │ ├── sendgrid +│ │ ├── vastai +│ │ ├── wireguard +│ │ ├── zerodb_client +│ │ ├── zinit +│ │ └── zinit_rpc +│ ├── code +│ │ └── generator +│ ├── conversiontools +│ │ └── tools.v +│ │ ├── docsorter +│ │ ├── imagemagick +│ │ ├── pdftotext +│ │ ├── text_extractor +│ ├── core +│ │ ├── interactive.v +│ │ ├── memdb_test.v +│ │ ├── memdb.v +│ │ ├── platform_test.v +│ │ ├── platform.v +│ │ ├── readme.md +│ │ ├── sudo_test.v +│ │ └── sudo.v +│ │ ├── base +│ │ ├── code +│ │ ├── generator +│ │ ├── herocmds +│ │ ├── httpconnection +│ │ ├── logger +│ │ ├── openrpc_remove +│ │ ├── pathlib +│ │ ├── playbook +│ │ ├── playcmds +│ │ ├── playmacros +│ │ ├── redisclient +│ │ ├── rootpath +│ │ ├── smartid +│ │ ├── texttools +│ │ ├── vexecutor +│ ├── crypt +│ │ └── crypt.v +│ │ ├── aes_symmetric +│ │ ├── crpgp +│ │ ├── ed25519 +│ │ ├── keychain +│ │ ├── keysafe +│ │ ├── openssl +│ │ ├── pgp +│ │ ├── secp256k1 +│ │ ├── secrets +│ ├── data +│ │ ├── cache +│ │ ├── currency +│ │ ├── dbfs +│ │ ├── dedupestor +│ │ ├── doctree +│ │ ├── encoder +│ │ ├── encoderhero +│ │ ├── flist +│ │ ├── gid +│ │ ├── graphdb +│ │ ├── ipaddress +│ │ ├── location +│ │ ├── markdown +│ │ ├── markdownparser2 +│ │ ├── markdownrenderer +│ │ ├── mnemonic +│ │ ├── models +│ │ ├── ourdb +│ │ ├── ourdb_syncer +│ │ ├── ourjson +│ │ ├── ourtime +│ │ ├── paramsparser +│ │ ├── radixtree +│ │ ├── resp +│ │ ├── serializers +│ │ ├── tst +│ │ ├── verasure +│ │ └── vstor +│ ├── dav +│ │ └── webdav +│ ├── develop +│ │ ├── gittools +│ │ ├── luadns +│ │ ├── performance +│ │ ├── sourcetree +│ │ ├── vscode +│ │ └── vscode_extensions +│ ├── hero +│ │ └── models +│ │ ├── db +│ ├── installers +│ │ ├── install_multi.v +│ │ └── upload.v +│ │ ├── base +│ │ ├── db +│ │ ├── develapps +│ │ ├── infra +│ │ ├── lang +│ │ ├── net +│ │ ├── sysadmintools +│ │ ├── threefold +│ │ ├── ulist +│ │ ├── virt +│ │ ├── web +│ ├── lang +│ │ ├── python +│ │ └── rust +│ ├── mcp +│ │ ├── backend_interface.v +│ │ ├── backend_memory.v +│ │ ├── factory.v +│ │ ├── generics.v +│ │ ├── handler_initialize_test.v +│ │ ├── handler_initialize.v +│ │ ├── handler_prompts.v +│ │ ├── handler_resources.v +│ │ ├── handler_tools.v +│ │ ├── model_configuration_test.v +│ │ ├── model_configuration.v +│ │ ├── model_error.v +│ │ ├── README.md +│ │ └── server.v +│ │ ├── baobab +│ │ ├── cmd +│ │ ├── mcpgen +│ │ ├── pugconvert +│ │ ├── rhai +│ │ ├── transport +│ │ ├── vcode +│ ├── osal +│ │ ├── core +│ │ ├── coredns +│ │ ├── hostsfile +│ │ ├── notifier +│ │ ├── osinstaller +│ │ ├── rsync +│ │ ├── screen +│ │ ├── sshagent +│ │ ├── startupmanager +│ │ ├── systemd +│ │ ├── tmux +│ │ ├── traefik +│ │ ├── tun +│ │ ├── ufw +│ │ └── zinit +│ ├── schemas +│ │ ├── jsonrpc +│ │ ├── jsonschema +│ │ ├── openapi +│ │ └── openrpc +│ ├── security +│ │ ├── authentication +│ │ └── jwt +│ ├── threefold +│ │ ├── grid3 +│ │ └── grid4 +│ ├── ui +│ │ ├── factory.v +│ │ └── readme.md +│ │ ├── console +│ │ ├── generic +│ │ ├── logger +│ │ ├── telegram +│ │ ├── template +│ │ ├── uimodel +│ ├── vfs +│ │ ├── interface.v +│ │ ├── metadata.v +│ │ └── README.md +│ │ ├── vfs_calendar +│ │ ├── vfs_contacts +│ │ ├── vfs_db +│ │ ├── vfs_local +│ │ ├── vfs_mail +│ │ ├── vfs_nested +│ ├── virt +│ │ ├── cloudhypervisor +│ │ ├── docker +│ │ ├── herocontainers +│ │ ├── hetzner +│ │ ├── lima +│ │ ├── qemu +│ │ ├── runc +│ │ └── utils +│ ├── web +│ │ ├── doctreeclient +│ │ ├── docusaurus +│ │ ├── echarts +│ │ ├── site +│ │ └── ui +├── libarchive +│ ├── installers +│ │ └── web +│ ├── rhai +│ │ ├── generate_rhai_example.v +│ │ ├── generate_wrapper_module.v +│ │ ├── register_functions.v +│ │ ├── register_types_test.v +│ │ ├── register_types.v +│ │ ├── rhai_test.v +│ │ ├── rhai.v +│ │ └── verify.v +│ │ ├── prompts +│ │ ├── templates +│ │ ├── testdata +│ └── starlight +│ ├── clean.v +│ ├── config.v +│ ├── factory.v +│ ├── model.v +│ ├── site_get.v +│ ├── site.v +│ ├── template.v +│ └── watcher.v +│ ├── templates +├── manual +│ ├── config.json +│ ├── create_tag.md +│ └── serve_wiki.sh +│ ├── best_practices +│ │ └── using_args_in_function.md +│ │ ├── osal +│ │ ├── scripts +│ ├── core +│ │ ├── base.md +│ │ ├── context_session_job.md +│ │ ├── context.md +│ │ ├── play.md +│ │ └── session.md +│ │ ├── concepts +│ ├── documentation +│ │ └── docextractor.md +├── research +│ └── globals +│ ├── globals_example_inplace.vsh +│ ├── globals_example_reference.vsh +│ ├── globals_example.vsh +│ └── ubuntu_partition.sh +├── vscodeplugin +│ ├── install_ubuntu.sh +│ ├── package.sh +│ └── readme.md +│ ├── heroscrypt-syntax +│ │ ├── heroscript-syntax-0.0.1.vsix +│ │ ├── language-configuration.json +│ │ └── package.json +│ │ ├── syntaxes + + + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/_archive/bizmodel.v +```v +module playcmds + +// import freeflowuniverse.herolib.core.playbook + +// fn git(mut actions playbook.Actions, action playbook.Action) ! { +// if action.name == 'init' { +// // means we support initialization afterwards +// c.bizmodel_init(mut actions, action)! +// } + +// // if action.name == 'get' { +// // mut gs := gittools.get()! +// // url := action.params.get('url')! +// // branch := action.params.get_default('branch', '')! +// // reset := action.params.get_default_false('reset')! +// // pull := action.params.get_default_false('pull')! +// // mut gr := gs.repo_get_from_url(url: url, branch: branch, pull: pull, reset: reset)! +// // } +// } + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/_archive/currency.v +```v +module playcmds + +// fn currency_actions(actions_ []playbook.Action) ! { +// mut actions2 := actions.filtersort(actions: actions_, actor: 'currency', book: '*')! +// if actions2.len == 0 { +// return +// } + +// mut cs := currency.new()! + +// for action in actions2 { +// // TODO: set the currencies +// if action.name == 'default_set' { +// cur := action.params.get('cur')! +// usdval := action.params.get_int('usdval')! +// cs.default_set(cur, usdval)! +// } +// } + +// // TODO: add the currency metainfo, do a test +// } + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/_archive/dagu.v +```v +module playcmds + +// import freeflowuniverse.herolib.installers.sysadmintools.daguserver + +// pub fn scheduler(heroscript string) ! { +// daguserver.play( +// heroscript: heroscript +// )! +// } + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/_archive/downloader.v +```v +module playcmds + +// import freeflowuniverse.herolib.core.playbook +// import freeflowuniverse.herolib.sysadmin.downloader + +// can start with sal, dal, ... the 2nd name is typicall the actor (or topic) +// do this function public and then it breaches out to detail functionality + +// pub fn sal_downloader(action playbook.Action) ! { +// match action.actor { +// 'downloader' { +// match action.name { +// 'get' { +// downloader_get(action: action)! +// } +// else { +// return error('actions not supported yet') +// } +// } +// } +// else { +// return error('actor not supported yet') +// } +// } +// } + +// fn downloader_get(args ActionExecArgs) ! { +// action := args.action +// // session:=args.action or {panic("no context")} //if we need it here +// mut name := action.params.get_default('name', '')! +// mut downloadpath := action.params.get_default('downloadpath', '')! +// mut url := action.params.get_default('url', '')! +// mut reset := action.params.get_default_false('reset') +// mut gitpull := action.params.get_default_false('gitpull') + +// mut minsize_kb := action.params.get_u32_default('minsize_kb', 0)! +// mut maxsize_kb := action.params.get_u32_default('maxsize_kb', 0)! + +// mut destlink := action.params.get_default_false('destlink') + +// mut dest := action.params.get_default('dest', '')! +// mut hash := action.params.get_default('hash', '')! +// mut metapath := action.params.get_default('metapath', '')! + +// mut meta := downloader.download( +// name: name +// downloadpath: downloadpath +// url: url +// reset: reset +// gitpull: gitpull +// minsize_kb: minsize_kb +// maxsize_kb: maxsize_kb +// destlink: destlink +// dest: dest +// hash: hash +// metapath: metapath +// // session:session // TODO IMPLEMENT (also optional) +// )! +// } + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/_archive/play_caddy.v +```v +module playcmds + +// import freeflowuniverse.herolib.installers.web.caddy as caddy_installer +// import freeflowuniverse.herolib.servers.caddy { CaddyFile } +// import freeflowuniverse.herolib.core.playbook +// import os +// // import net.urllib + +// pub fn play_caddy(mut plbook playbook.PlayBook) ! { +// play_caddy_basic(mut plbook)! +// play_caddy_configure(mut plbook)! +// } + +// pub fn play_caddy_configure(mut plbook playbook.PlayBook) ! { +// mut caddy_actions := plbook.find(filter: 'caddy_configure')! +// if caddy_actions.len == 0 { +// return +// } +// } + +// pub fn play_caddy_basic(mut plbook playbook.PlayBook) ! { +// caddy_actions := plbook.find(filter: 'caddy.')! +// if caddy_actions.len == 0 { +// return +// } + +// mut install_actions := plbook.find(filter: 'caddy.install')! + +// if install_actions.len > 0 { +// for install_action in install_actions { +// mut p := install_action.params +// xcaddy := p.get_default_false('xcaddy') +// file_path := p.get_default('file_path', '/etc/caddy')! +// file_url := p.get_default('file_url', '')! +// reset := p.get_default_false('reset') +// start := p.get_default_false('start') +// restart := p.get_default_false('restart') +// stop := p.get_default_false('stop') +// homedir := p.get_default('file_url', '')! +// plugins := p.get_list_default('plugins', []string{})! + +// caddy_installer.install( +// xcaddy: xcaddy +// file_path: file_path +// file_url: file_url +// reset: reset +// start: start +// restart: restart +// stop: stop +// homedir: homedir +// plugins: plugins +// )! +// } +// } + +// mut config_actions := plbook.find(filter: 'caddy.configure')! +// if config_actions.len > 0 { +// mut coderoot := '' +// mut reset := false +// mut pull := false + +// mut public_ip := '' + +// mut c := caddy.get('')! +// // that to me seems to be wrong, not generic enough +// if config_actions.len > 1 { +// return error('can only have 1 config action for books') +// } else if config_actions.len == 1 { +// mut p := config_actions[0].params +// path := p.get_default('path', '/etc/caddy')! +// url := p.get_default('url', '')! +// public_ip = p.get_default('public_ip', '')! +// c = caddy.configure('', homedir: path)! +// config_actions[0].done = true +// } + +// mut caddyfile := CaddyFile{} +// for mut action in plbook.find(filter: 'caddy.add_reverse_proxy')! { +// mut p := action.params +// mut from := p.get_default('from', '')! +// mut to := p.get_default('to', '')! + +// if from == '' || to == '' { +// return error('from & to cannot be empty') +// } + +// caddyfile.add_reverse_proxy( +// from: from +// to: to +// )! +// action.done = true +// } + +// for mut action in plbook.find(filter: 'caddy.add_file_server')! { +// mut p := action.params +// mut domain := p.get_default('domain', '')! +// mut root := p.get_default('root', '')! + +// if root.starts_with('~') { +// root = '${os.home_dir()}${root.trim_string_left('~')}' +// } + +// if domain == '' || root == '' { +// return error('domain & root cannot be empty') +// } + +// caddyfile.add_file_server( +// domain: domain +// root: root +// )! +// action.done = true +// } + +// for mut action in plbook.find(filter: 'caddy.add_basic_auth')! { +// mut p := action.params +// mut domain := p.get_default('domain', '')! +// mut username := p.get_default('username', '')! +// mut password := p.get_default('password', '')! + +// if domain == '' || username == '' || password == '' { +// return error('domain & root cannot be empty') +// } + +// caddyfile.add_basic_auth( +// domain: domain +// username: username +// password: password +// )! +// action.done = true +// } + +// for mut action in plbook.find(filter: 'caddy.generate')! { +// c.set_caddyfile(caddyfile)! +// action.done = true +// } + +// for mut action in plbook.find(filter: 'caddy.start')! { +// c.start()! +// action.done = true +// } +// c.reload()! +// } +// } + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/_archive/play_dagu_test.v +```v +module playcmds + +import freeflowuniverse.herolib.core.playbook + +const dagu_script = " +!!dagu.configure + instance: 'test' + username: 'admin' + password: 'testpassword' + +!!dagu.new_dag + name: 'test_dag' + +!!dagu.add_step + dag: 'test_dag' + name: 'hello_world' + command: 'echo hello world' + +!!dagu.add_step + dag: 'test_dag' + name: 'last_step' + command: 'echo last step' + + +" + +fn test_play_dagu() ! { + mut plbook := playbook.new(text: dagu_script)! + play_dagu(mut plbook)! + // panic('s') +} + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/_archive/play_dagu.v +```v +module playcmds + +// import freeflowuniverse.herolib.clients.daguclient +// import freeflowuniverse.herolib.installers.sysadmintools.daguserver +// import freeflowuniverse.herolib.installers.sysadmintools.daguserver +import freeflowuniverse.herolib.core.playbook +import freeflowuniverse.herolib.ui.console +import os + +// pub fn play_dagu(mut plbook playbook.PlayBook) ! { +// // dagu_actions := plbook.find(filter: 'dagu.')! +// // if dagu_actions.len == 0 { +// // return +// // } + +// // play_dagu_basic(mut plbook)! +// // play_dagu_configure(mut plbook)! +// } + +// // play_dagu plays the dagu play commands +// pub fn play_dagu_basic(mut plbook playbook.PlayBook) ! { +// // mut install_actions := plbook.find(filter: 'daguserver.configure')! + +// // if install_actions.len > 0 { +// // for install_action in install_actions { +// // mut p := install_action.params +// // panic("daguinstall play") +// // } +// // } + +// // dagu_actions := plbook.find(filter: 'daguserver.install')! +// // if dagu_actions.len > 0 { +// // panic("daguinstall play") +// // return +// // } + +// // mut config_actions := plbook.find(filter: 'dagu.configure')! +// // mut d := if config_actions.len > 1 { +// // return error('can only have 1 config action for dagu') +// // } else if config_actions.len == 1 { +// // mut p := config_actions[0].params +// // instance := p.get_default('instance', 'default')! +// // port := p.get_int_default('port', 8888)! +// // username := p.get_default('username', '')! +// // password := p.get_default('password', '')! +// // config_actions[0].done = true +// // mut server := daguserver.configure(instance, +// // port: port +// // username: username +// // password: password +// // )! +// // server.start()! +// // console.print_debug('Dagu server is running at http://localhost:${port}') +// // console.print_debug('Username: ${username} password: ${password}') + +// // // configure dagu client with server url and api secret +// // server_cfg := server.config()! +// // daguclient.get(instance, +// // url: 'http://localhost:${port}' +// // apisecret: server_cfg.secret +// // )! +// // } else { +// // mut server := daguserver.get('')! +// // server.start()! +// // daguclient.get('')! +// // } + +// // mut dags := map[string]DAG{} + +// // for mut action in plbook.find(filter: 'dagu.new_dag')! { +// // mut p := action.params +// // name := p.get_default('name', '')! +// // dags[name] = DAG{} +// // action.done = true +// // } + +// // for mut action in plbook.find(filter: 'dagu.add_step')! { +// // mut p := action.params +// // dag := p.get_default('dag', 'default')! +// // name := p.get_default('name', 'default')! +// // command := p.get_default('command', '')! +// // dags[dag].step_add( +// // nr: dags.len +// // name: name +// // command: command +// // )! +// // } + +// // for mut action in plbook.find(filter: 'dagu.run')! { +// // mut p := action.params +// // dag := p.get_default('dag', 'default')! +// // // d.new_dag(dags[dag])! +// // panic('to implement') +// // } +// } + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/_archive/play_juggler.v +```v +module playcmds + +import freeflowuniverse.herolib.data.doctree +import freeflowuniverse.herolib.ui.console +import freeflowuniverse.herolib.core.playbook +import freeflowuniverse.herolib.develop.juggler +import os + +pub fn play_juggler(mut plbook playbook.PlayBook) ! { + mut coderoot := '' + // mut install := false + mut reset := false + mut pull := false + + mut config_actions := plbook.find(filter: 'juggler.configure')! + + mut j := juggler.Juggler{} + + if config_actions.len > 1 { + return error('can only have 1 config action for juggler') + } else if config_actions.len == 1 { + mut p := config_actions[0].params + path := p.get_default('path', '/etc/juggler')! + url := p.get_default('url', '')! + username := p.get_default('username', '')! + password := p.get_default('password', '')! + port := p.get_int_default('port', 8000)! + + j = juggler.configure( + url: 'https://git.threefold.info/projectmycelium/itenv' + username: username + password: password + reset: true + )! + config_actions[0].done = true + } + + for mut action in plbook.find(filter: 'juggler.start')! { + j.start()! + action.done = true + } + + for mut action in plbook.find(filter: 'juggler.restart')! { + j.restart()! + action.done = true + } +} + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/_archive/play_publisher_test.v +```v +module playcmds + +import freeflowuniverse.herolib.core.playbook +import freeflowuniverse.herolib.core.playcmds +import freeflowuniverse.herolib.core.pathlib +import os + +fn test_play_publisher() { + mut p := pathlib.get_file(path: '/tmp/heroscript/do.hero', create: true)! + + s2 := " + +!!publisher.new_collection + url:'https://git.threefold.info/tfgrid/info_tfgrid/src/branch/main/collections' + reset: false + pull: true + + +!!book.define + name:'info_tfgrid' + summary_url:'https://git.threefold.info/tfgrid/info_tfgrid/src/branch/development/books/tech/SUMMARY.md' + title:'ThreeFold Technology' + collections: 'about,dashboard,farmers,library,partners_utilization,tech,p2p' + + +!!book.publish + name:'tech' + production: false +" + p.write(s2)! + + mut plbook := playbook.new(path: '/tmp/heroscript')! + playcmds.play_publisher(mut plbook)! +} + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/_archive/play_publisher.v +```v +module playcmds + +import freeflowuniverse.herolib.core.playbook +// import freeflowuniverse.herolib.hero.publishing + +// pub fn play_publisher(mut plbook playbook.PlayBook) ! { +// publishing.play(mut plbook)! +// } + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/_archive/play_threefold.v +```v +module playcmds + +import freeflowuniverse.herolib.core.playbook +// import freeflowuniverse.herolib.threefold.grid +// import freeflowuniverse.herolib.threefold.tfrobot +// import os + +// pub fn play_threefold(mut plbook playbook.PlayBook) ! { +// panic('fix tfrobot module') +// // mut config_actions := plbook.find(filter: 'threefold.configure')! + +// // mnemonics_ := os.getenv_opt('TFGRID_MNEMONIC') or { '' } +// // mut ssh_key := os.getenv_opt('SSH_KEY') or { '' } + +// // tfrobot.configure('play', network: 'main', mnemonics: mnemonics_)! + +// // mut robot := tfrobot.get('play')! + +// // if config_actions.len > 1 { +// // return error('can only have 1 config action for threefold') +// // } else if config_actions.len == 1 { +// // mut a := config_actions[0] +// // mut p := a.params +// // mut network := p.get_default('network', 'main')! +// // mnemonics := p.get_default('mnemonics', '')! +// // ssh_key = p.get_default('ssh_key', '')! + +// // network = network.to_lower() + +// // // mnemonics string +// // // network string = 'main' +// // tfrobot.configure('play', network: network, mnemonics: mnemonics)! + +// // robot = tfrobot.get('play')! + +// // config_actions[0].done = true +// // } +// // cfg := robot.config()! +// // if cfg.mnemonics == '' { +// // return error('TFGRID_MNEMONIC should be specified as env variable') +// // } + +// // if ssh_key == '' { +// // return error('SSHKey should be specified as env variable') +// // } + +// // panic('implement') + +// // for mut action in plbook.find(filter: 'threefold.deploy_vm')! { +// // mut p := action.params +// // deployment_name := p.get_default('deployment_name', 'deployment')! +// // name := p.get_default('name', 'vm')! +// // ssh_key := p.get_default('ssh_key', '')! +// // cores := p.get_int_default('cores', 1)! +// // memory := p.get_int_default('memory', 20)! +// // panic("implement") +// // action.done = true +// // } + +// // for mut action in plbook.find(filter: 'threefold.deploy_zdb')! { +// // panic("implement") +// // action.done = true +// // } +// } + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/_archive/play_zola.v +```v +module playcmds + +// import freeflowuniverse.herolib.ui.console +// import freeflowuniverse.herolib.web.zola +// import freeflowuniverse.herolib.core.playbook + +// struct WebsiteItem { +// mut: +// name string +// site ?&zola.ZolaSite +// } + +// pub fn play_zola(mut plbook playbook.PlayBook) ! { +// // mut coderoot := '' +// mut buildroot := '' +// mut publishroot := '' +// mut install := true +// mut reset := false + +// wsactions := plbook.find(filter: 'website.')! +// if wsactions.len == 0 { +// return +// } + +// mut config_actions := plbook.find(filter: 'websites:configure')! +// if config_actions.len > 1 { +// return error('can only have 1 config action for websites') +// } else if config_actions.len == 1 { +// mut p := config_actions[0].params +// buildroot = p.get_default('buildroot', '')! +// publishroot = p.get_default('publishroot', '')! +// // coderoot = p.get_default('coderoot', '')! +// install = p.get_default_true('install') +// reset = p.get_default_false('reset') +// config_actions[0].done = true +// } +// mut websites := zola.new( +// path_build: buildroot +// path_publish: publishroot +// install: install +// reset: reset +// )! + +// mut ws := WebsiteItem{} + +// for mut action in plbook.find(filter: 'website.')! { +// if action.name == 'define' { +// console.print_debug('website.define') +// mut p := action.params +// ws.name = p.get('name')! +// title := p.get_default('title', '')! +// description := p.get_default('description', '')! +// ws.site = websites.new(name: ws.name, title: title, description: description)! +// } else if action.name == 'template_add' { +// console.print_debug('website.template_add') +// mut p := action.params +// url := p.get_default('url', '')! +// mut site_ := ws.site or { +// return error("can't find website for template_add, should have been defined before with !!website.define") +// } + +// site_.template_add(url: url)! +// } else if action.name == 'content_add' { +// console.print_debug('website.content_add') +// mut p := action.params +// url := p.get_default('url', '')! +// mut site_ := ws.site or { +// return error("can't find website for content_add, should have been defined before with !!website.define") +// } + +// site_.content_add(url: url)! +// } else if action.name == 'doctree_add' { +// console.print_debug('website.doctree_add') +// mut p := action.params +// url := p.get_default('url', '')! +// pull := p.get_default_false('pull') +// mut site_ := ws.site or { +// return error("can't find website for doctree_add, should have been defined before with !!website.define") +// } + +// site_.doctree_add(url: url, pull: pull)! +// } else if action.name == 'post_add' { +// console.print_debug('website.post_add') +// mut p := action.params +// name := p.get_default('name', '')! +// collection := p.get_default('collection', '')! +// file := p.get_default('file', '')! +// page := p.get_default('page', '')! +// pointer := p.get_default('pointer', '')! +// mut site_ := ws.site or { +// return error("can't find website for doctree_add, should have been defined before with !!website.define") +// } + +// site_.post_add(name: name, collection: collection, file: file, pointer: pointer)! +// } else if action.name == 'blog_add' { +// console.print_debug('website.blog_add') +// mut p := action.params +// name := p.get_default('name', '')! +// collection := p.get_default('collection', '')! +// file := p.get_default('file', '')! +// page := p.get_default('page', '')! +// pointer := p.get_default('pointer', '')! +// mut site_ := ws.site or { +// return error("can't find website for doctree_add, should have been defined before with !!website.define") +// } + +// site_.blog_add(name: name)! +// } else if action.name == 'person_add' { +// console.print_debug('website.person_add') +// mut p := action.params +// name := p.get_default('name', '')! +// page := p.get_default('page', '')! +// collection := p.get_default('collection', '')! +// file := p.get_default('file', '')! +// pointer := p.get_default('pointer', '')! +// mut site_ := ws.site or { +// return error("can't find website for doctree_add, should have been defined before with !!website.define") +// } + +// site_.person_add( +// name: name +// collection: collection +// file: file +// page: page +// pointer: pointer +// )! +// } else if action.name == 'people_add' { +// console.print_debug('website.people_add') +// mut p := action.params +// name := p.get_default('name', '')! +// description := p.get_default('description', '')! +// sort_by_ := p.get_default('sort_by', '')! +// mut site_ := ws.site or { +// return error("can't find website for people_add, should have been defined before with !!website.define") +// } + +// sort_by := zola.SortBy.from(sort_by_)! +// site_.people_add( +// name: name +// title: p.get_default('title', '')! +// sort_by: sort_by +// description: description +// )! +// } else if action.name == 'blog_add' { +// console.print_debug('website.blog_add') +// mut p := action.params +// name := p.get_default('name', '')! +// description := p.get_default('description', '')! +// sort_by_ := p.get_default('sort_by', '')! +// mut site_ := ws.site or { +// return error("can't find website for people_add, should have been defined before with !!website.define") +// } + +// sort_by := zola.SortBy.from(sort_by_)! +// site_.blog_add( +// name: name +// title: p.get_default('title', '')! +// sort_by: sort_by +// description: description +// )! +// } else if action.name == 'news_add' { +// console.print_debug('website.news_add') +// mut p := action.params +// name := p.get_default('name', '')! +// collection := p.get_default('collection', '')! +// pointer := p.get_default('pointer', '')! +// file := p.get_default('file', '')! +// mut site_ := ws.site or { +// return error("can't find website for news_add, should have been defined before with !!website.define") +// } + +// site_.article_add(name: name, collection: collection, file: file, pointer: pointer)! +// } else if action.name == 'header_add' { +// console.print_debug('website.header_add') +// mut p := action.params +// template := p.get_default('template', '')! +// logo := p.get_default('logo', '')! +// mut site_ := ws.site or { +// return error("can't find website for doctree_add, should have been defined before with !!website.define") +// } + +// site_.header_add(template: template, logo: logo)! +// } else if action.name == 'header_link_add' { +// console.print_debug('website.header_link_add') +// mut p := action.params +// page := p.get_default('page', '')! +// label := p.get_default('label', '')! +// mut site_ := ws.site or { +// return error("can't find website for header_link_add, should have been defined before with !!website.define") +// } + +// site_.header_link_add(page: page, label: label)! +// } else if action.name == 'footer_add' { +// console.print_debug('website.footer_add') +// mut p := action.params +// template := p.get_default('template', '')! +// mut site_ := ws.site or { +// return error("can't find website for doctree_add, should have been defined before with !!website.define") +// } + +// site_.footer_add(template: template)! +// } else if action.name == 'page_add' { +// console.print_debug('website.page_add') +// mut p := action.params +// name := p.get_default('name', '')! +// collection := p.get_default('collection', '')! +// file := p.get_default('file', '')! +// homepage := p.get_default_false('homepage') +// mut site_ := ws.site or { +// return error("can't find website for doctree_add, should have been defined before with !!website.define") +// } + +// site_.page_add(name: name, collection: collection, file: file, homepage: homepage)! + +// // }else if action.name=="pull"{ +// // mut site_:=ws.site or { return error("can't find website for pull, should have been defined before with !!website.define")} +// // site_.pull()! +// } else if action.name == 'section_add' { +// console.print_debug('website.section_add') +// // mut p := action.params +// // name := p.get_default('name', '')! +// // // collection := p.get_default('collection', '')! +// // // file := p.get_default('file', '')! +// // // homepage := p.get_default_false('homepage') +// // mut site_ := ws.site or { +// // return error("can't find website for doctree_add, should have been defined before with !!website.define") +// // } + +// // site_.add_section(name: name)! + +// // }else if action.name=="pull"{ +// // mut site_:=ws.site or { return error("can't find website for pull, should have been defined before with !!website.define")} +// // site_.pull()! +// } else if action.name == 'generate' { +// mut site_ := ws.site or { +// return error("can't find website for generate, should have been defined before with !!website.define") +// } + +// site_.generate()! +// // site_.serve()! +// } else { +// return error("Cannot find right action for website. Found '${action.name}' which is a non understood action for !!website.") +// } +// action.done = true +// } +// } + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/factory.v +```v +module playcmds + +import freeflowuniverse.herolib.core.playbook { PlayBook } +import freeflowuniverse.herolib.data.doctree +import freeflowuniverse.herolib.biz.bizmodel +import freeflowuniverse.herolib.web.site +import freeflowuniverse.herolib.web.docusaurus +import freeflowuniverse.herolib.clients.openai + +// ------------------------------------------------------------------- +// run – entry point for all HeroScript play‑commands +// ------------------------------------------------------------------- + +@[params] +pub struct PlayArgs { +pub mut: + heroscript string + heroscript_path string + plbook ?PlayBook + reset bool +} + +pub fn run(args_ PlayArgs) ! { + mut args := args_ + mut plbook := args.plbook or { + playbook.new(text: args.heroscript, path: args.heroscript_path)! + } + + // Core actions + play_core(mut plbook)! + // Git actions + play_git(mut plbook)! + + // Business model (e.g. currency, bizmodel) + bizmodel.play(mut plbook)! + + // OpenAI client + openai.play(mut plbook)! + + // Website / docs + site.play(mut plbook)! + doctree.play(mut plbook)! + docusaurus.play(mut plbook)! + + // Ensure we did not leave any actions un‑processed + plbook.empty_check()! +} + +``` + +File: /Users/despiegk/code/github/freeflowuniverse/herolib/lib/core/playcmds/play_core.v +```v +module playcmds + +import freeflowuniverse.herolib.develop.gittools +import freeflowuniverse.herolib.core.playbook { PlayBook } +import freeflowuniverse.herolib.ui.console +import freeflowuniverse.herolib.core.texttools + +// ------------------------------------------------------------------- +// Core play‑command processing (context, session, env‑subst, etc) +// ------------------------------------------------------------------- + +fn play_core(mut plbook PlayBook) ! { + // ---------------------------------------------------------------- + // 1. Include handling (play include / echo) + // ---------------------------------------------------------------- + // Track included paths to prevent infinite recursion + mut included_paths := map[string]bool{} + + for action_ in plbook.find(filter: 'play.*')! { + if action_.name == 'include' { + console.print_debug('play run:${action_}') + mut action := *action_ + mut playrunpath := action.params.get_default('path', '')! + if playrunpath.len == 0 { + action.name = 'pull' + playrunpath = gittools.get_repo_path( + path: action.params.get_default('path', '')! + git_url: action.params.get_default('git_url', '')! + git_reset: action.params.get_default_false('git_reset') + git_pull: action.params.get_default_false('git_pull') + )! + } + if playrunpath.len == 0 { + return error("can't run a heroscript didn't find url or path.") + } + + // Check for cycle detection + if playrunpath in included_paths { + console.print_debug('Skipping already included path: ${playrunpath}') + continue + } + + console.print_debug('play run path:${playrunpath}') + included_paths[playrunpath] = true + plbook.add(path: playrunpath)! + } + if action_.name == 'echo' { + content := action_.params.get_default('content', "didn't find content")! + console.print_header(content) + } + } + + // ---------------------------------------------------------------- + // 2. Session environment handling + // ---------------------------------------------------------------- + // Guard – make sure a session exists + mut session := plbook.session + + // !!session.env_set / env_set_once + for mut action in plbook.find(filter: 'session.')! { + mut p := action.params + match action.name { + 'env_set' { + key := p.get('key')! + val := p.get('val') or { p.get('value')! } + session.env_set(key, val)! + } + 'env_set_once' { + key := p.get('key')! + val := p.get('val') or { p.get('value')! } + // Use the dedicated “set‑once” method + session.env_set_once(key, val)! + } + else { /* ignore unknown sub‑action */ } + } + action.done = true + } + + // ---------------------------------------------------------------- + // 3. Template replacement in action parameters + // ---------------------------------------------------------------- + // Apply template replacement from session environment variables + if session.env.len > 0 { + // Create a map with name_fix applied to keys for template replacement + mut env_fixed := map[string]string{} + for key, value in session.env { + env_fixed[texttools.name_fix(key)] = value + } + + for mut action in plbook.actions { + if !action.done { + action.params.replace(env_fixed) + } + } + } + + for mut action in plbook.find(filter: 'core.coderoot_set')! { + mut p := action.params + if p.exists('coderoot') { + coderoot := p.get_path_create('coderoot')! + if session.context.config.coderoot != coderoot { + session.context.config.coderoot = coderoot + session.context.save()! + } + } else { + return error('coderoot needs to be specified') + } + action.done = true + } + + for mut action in plbook.find(filter: 'core.params_context_set')! { + mut p := action.params + mut context_params := session.context.params()! + for param in p.params { + context_params.set(param.key, param.value) + } + session.context.save()! + action.done = true + } + + for mut action in plbook.find(filter: 'core.params_session_set')! { + mut p := action.params + for param in p.params { + session.params.set(param.key, param.value) + } + session.save()! + action.done = true + } +} + +``` + + +these are my instructions what needs to be done with the attached code + +TODO… + diff --git a/lib/core/playcmds/play_core.v b/lib/core/playcmds/play_core.v index fb6dfd19..0939d20e 100644 --- a/lib/core/playcmds/play_core.v +++ b/lib/core/playcmds/play_core.v @@ -54,10 +54,8 @@ fn play_core(mut plbook PlayBook) ! { // 2. Session environment handling // ---------------------------------------------------------------- // Guard – make sure a session exists - mut session := plbook.session or { - return error('PlayBook has no attached Session') - } - + mut session := plbook.session + // !!session.env_set / env_set_once for mut action in plbook.find(filter: 'session.')! { mut p := action.params