docs: add org-mode documentation and improve navigation links master
authorSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sun, 19 Apr 2026 20:11:54 +0000 (23:11 +0300)
committerSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sun, 19 Apr 2026 20:11:54 +0000 (23:11 +0300)
Add AGENTS.org with project overview in org-mode format. Add CUSTOM_ID
properties to all headings in doc/index.org for reliable internal
linking. Update .gitignore to use global HTML pattern and ignore IDE
project files. Rename tool scripts with title case.

.gitignore
AGENTS.org [new file with mode: 0644]
doc/index.org
tools/Implement idea [new file with mode: 0755]
tools/Open with IntelliJ IDEA [new file with mode: 0755]
tools/Update web site [new file with mode: 0755]
tools/implement idea [deleted file]
tools/open with IntelliJ IDEA [deleted file]
tools/update web site [deleted file]

index 52e4c3b..80a1eb3 100644 (file)
@@ -7,7 +7,8 @@
 
 /doc/apidocs/
 /doc/graphs/
-/doc/index.html
-/doc/setup.html
-
 
+/.classpath
+/.factorypath
+/.project
+*.html
diff --git a/AGENTS.org b/AGENTS.org
new file mode 100644 (file)
index 0000000..e94c8e3
--- /dev/null
@@ -0,0 +1,95 @@
+A Java CLI tool for batch processing with large language models using
+CPU-based computation via llama.cpp. Designed for "slow but smart" AI
+tasks where batch processing is more valuable than real-time
+interaction.
+
+* Commands
+
+- *wizard* :: Interactive configuration wizard. Validates and fixes
+  configuration files, discovers new models in the models directory,
+  and updates configuration. Run this first to set up or update your
+  setup.
+
+- *process* :: Continuous task processor. Monitors the tasks directory
+  for files starting with =TOCOMPUTE:=, processes them using the
+  configured AI model, and appends results to the same file.
+
+- *listmodels* :: Lists all available models defined in the configuration.
+
+- *joinfiles* :: Utility to concatenate multiple files together (used
+  for preparing task files with context).
+
+- *addtaskheader* :: Adds a TOCOMPUTE header to task files.
+
+* Task File Format
+
+Task files are plain text files placed in the tasks directory. Format:
+
+#+BEGIN_SRC text
+TOCOMPUTE: skill=<skill_name> model=<model_alias> priority=<number>
+
+<user prompt content here>
+#+END_SRC
+
+- First line must start with =TOCOMPUTE:=
+- Parameters are optional: =skill= (defaults to "default"), =model=
+  (defaults per-skill or "default"), =priority= (defaults to 0)
+- Files are processed in priority order (higher priority = processed first)
+- After processing, the file =TOCOMPUTE:= heading in the file is renamed
+  to =DONE:= and contains the AI response
+
+* Configuration
+
+Configuration is stored in YAML format at
+=~/.config/alyverkko-cli/configuration.yaml=. Key settings:
+
+- =tasks_directory= :: Where task files are placed for processing
+- =models_directory= :: Directory containing GGUF model files
+- =skills_directory= :: Directory containing skill (prompt) YAML files
+- =llama_cli_path= :: Path to the llama-cli executable
+- =thread_count=, =batch_thread_count= :: CPU thread settings
+
+** Skills (Prompts)
+
+Skills are YAML files in the skills directory (e.g., =writer.yaml=):
+
+#+BEGIN_SRC yaml
+prompt: |
+  You are a helpful assistant...
+temperature: 0.7
+top_p: 0.9
+model_alias: "mistral"
+timeout_millis: 300000
+#+END_SRC
+
+Model selection hierarchy (highest priority first):
+
+1. Explicit =model= parameter in TOCOMPUTE line
+2. =model_alias= in skill configuration
+3. Model named "default" in configuration
+
+** Models
+
+Models are defined in the configuration with aliases, filesystem paths,
+and optional settings:
+
+#+BEGIN_SRC yaml
+models:
+  - alias: "mistral"
+    filesystem_path: "mistral-7b-instruct-v0.2.Q4_K_M.gguf"
+    context_size: 8192
+    final_answer_indicator: "</s>"
+#+END_SRC
+
+The =final_answer_indicator= splits the AI response into "internal
+thoughts" and "final answer" sections in the output file.
+
+* Source Structure
+
+- =src/main/java/eu/svjatoslav/alyverkko_cli/= :: Main package
+  - =Main.java= :: Entry point, command dispatcher
+  - =Command.java= :: Interface for all commands
+  - =commands/= :: Command implementations
+    - =task_processor/= :: Core batch processing logic
+  - =configuration/= :: Configuration model classes (Configuration, Model, SkillConfig)
+  - =Utils.java= :: Utility functions
index 982fc89..80cdd28 100644 (file)
@@ -9,6 +9,10 @@
 #+OPTIONS: author:nil
 
 * Introduction
+:PROPERTIES:
+:CUSTOM_ID: introduction
+:ID:       b4da28df-7208-4c27-a1ea-98d8692c5012
+:END:
 
 The *Älyverkko CLI* application is a user-friendly tool developed in
 Java, specifically tailored to streamline the utilization of expansive
@@ -59,8 +63,13 @@ is highly beneficial.
 Note: project is still in early stage.
 
 ** Use cases
+:PROPERTIES:
+:CUSTOM_ID: use-cases
+:ID:       9aeba681-2d9d-442f-bc4b-3d61a294e596
+:END:
 *** Domain: Natural Language Processing (NLP)
 :PROPERTIES:
+:CUSTOM_ID: nlp-domain
 :ID:       e1b6aa9a-a27d-4019-8bd4-fceb0c606e23
 :END:
 
@@ -84,6 +93,7 @@ product.
 
 *** Domain: Code Generation
 :PROPERTIES:
+:CUSTOM_ID: code-generation-domain
 :ID:       f4c7d3e0-8c18-4123-a797-871ca73a7580
 :END:
 
@@ -111,6 +121,7 @@ a way by AI.
 
 *** Domain: Content Creation
 :PROPERTIES:
+:CUSTOM_ID: content-creation-domain
 :ID:       f38360ad-54f6-4f24-b299-f73a9faacabd
 :END:
 
@@ -131,6 +142,10 @@ Here is [[https://www.svjatoslav.eu/writing/Whispers%20in%20the%20Stream%20of%20
 *Älyverkko CLI*.
 
 ** Why Bother With This Setup? (The Big Picture)
+:PROPERTIES:
+:CUSTOM_ID: why-this-setup
+:ID:       5862520c-db92-4a5e-9177-717e8dea66f8
+:END:
 
 Before diving into steps, let's address the elephant in the room: *Why
 go through this setup when ChatGPT is just a click away?*
@@ -151,9 +166,18 @@ but for substantial tasks where quality matters more than speed: code
 generation, document analysis, content creation, etc.
 
 * Concept glossary
+:PROPERTIES:
+:CUSTOM_ID: concept-glossary
+:ID:       3bff0680-db41-4f97-a2af-f677209dd430
+:END:
 ** General concepts
+:PROPERTIES:
+:CUSTOM_ID: general-concepts
+:ID:       2ae2e3ec-835f-45e1-bc15-618c8b2c3e85
+:END:
 *** Task
 :PROPERTIES:
+:CUSTOM_ID: task-concept
 :ID:       140c53cb-8032-4a04-83ed-d1818b1cfc52
 :END:
 
@@ -176,6 +200,7 @@ may take minutes to hours.
 
 *** Skill
 :PROPERTIES:
+:CUSTOM_ID: skill-concept
 :ID:       6579abb4-8386-418b-9457-cae6c3345dfb
 :END:
 - See also:
@@ -207,6 +232,7 @@ rather than constantly redefining how the AI should behave.
 
 *** Model
 :PROPERTIES:
+:CUSTOM_ID: model-concept
 :ID:       074af969-8a9b-407d-a605-6725fe4e8580
 :END:
 
@@ -231,6 +257,7 @@ llama.cpp for CPU-based inference.
 
 *** "TOCOMPUTE" Marker
 :PROPERTIES:
+:CUSTOM_ID: tocompute-marker
 :ID:       cd4b622a-6b74-4fac-85fe-f5b056367824
 :END:
 
@@ -257,6 +284,7 @@ then signal completion with this single line.
 
 *** "DONE" Marker
 :PROPERTIES:
+:CUSTOM_ID: done-marker
 :ID:       aa69e23a-248a-4459-a36e-74b43948dba9
 :END:
 
@@ -284,6 +312,10 @@ can review the AI's response, add follow-up questions, and re-add a
 =TOCOMPUTE:= line to continue the conversation.
 
 *** Priority
+:PROPERTIES:
+:CUSTOM_ID: priority-concept
+:ID:       fc7d5e69-a2ef-4afb-b4c3-a549d0792373
+:END:
 
 /Priority/ is an integer value specified in the =TOCOMPUTE:= header
 (e.g., =priority=10=) that determines task processing order. Higher
@@ -308,6 +340,7 @@ jump the queue.
 
 *** System Prompt
 :PROPERTIES:
+:CUSTOM_ID: system-prompt
 :ID:       89bc60f0-89d4-4e10-ae80-8f824f2e3c55
 :END:
 
@@ -337,6 +370,7 @@ models.
 
 *** User Prompt
 :PROPERTIES:
+:CUSTOM_ID: user-prompt
 :ID:       009e5410-f852-4faa-b81a-f9c98b056ae3
 :END:
 
@@ -369,6 +403,10 @@ interaction. Well-structured prompts yield significantly better
 results - the AI can only work with what you provide.
 
 *** Model Library
+:PROPERTIES:
+:CUSTOM_ID: model-library
+:ID:       5ec0618d-90bb-4b7e-913a-477da45f406f
+:END:
 
 The /model library/ is the internal registry of all available AI
 models configured in the system. It's constructed during startup
@@ -391,6 +429,10 @@ actual model files on disk, handling all path resolution and
 validation so your tasks can reference models by simple aliases.
 
 *** GGUF Format
+:PROPERTIES:
+:CUSTOM_ID: gguf-format
+:ID:       7d8ae98c-5d47-422e-8d18-00496774cfd9
+:END:
 
 /GGUF/ is the binary model format used by llama.cpp for AI inference.
 
@@ -409,6 +451,7 @@ on consumer hardware - a 4-bit quantized 70B model requires "only"
 
 *** llama.cpp
 :PROPERTIES:
+:CUSTOM_ID: llama-cpp
 :ID:       01b0d389-75d4-420f-8d5c-cae29900301f
 :END:
 
@@ -437,8 +480,13 @@ couldn't execute any AI tasks - it's the actual "brain" behind the
 system.
 
 ** Important files and directories
+:PROPERTIES:
+:CUSTOM_ID: important-files-directories
+:ID:       ca3dce55-566b-427f-b6d1-630fcd245f76
+:END:
 *** Configuration File
 :PROPERTIES:
+:CUSTOM_ID: configuration-file
 :ID:       fd687508-0a76-4fee-9a1c-4031cb403c60
 :END:
 
@@ -468,6 +516,10 @@ precedence follows *skill* > *model* > *global* rules, creating a
 flexible hierarchy for managing complex workflows.
 
 *** Skill Directory
+:PROPERTIES:
+:CUSTOM_ID: skill-directory
+:ID:       c62dcf42-5017-4ba4-9e4d-af5517d4f968
+:END:
 
 The /skill directory/ (configured via =skills_directory=) is the
 filesystem location where YAML files defining AI behaviors are stored.
@@ -490,6 +542,10 @@ file automatically affects subsequent tasks using that skill, without
 requiring Alyverkko CLI restart.
 
 *** Task Directory
+:PROPERTIES:
+:CUSTOM_ID: task-directory
+:ID:       c59976d5-cb22-44b2-a86c-7b39c40cedee
+:END:
 
 The /task directory/ is the designated filesystem location where users
 place task files for processing, configured via =tasks_directory= in
@@ -529,8 +585,13 @@ Think of it like email versus phone calls - sometimes asynchronous
 communication is actually /more/ productive.
 
 ** Generation parameters
+:PROPERTIES:
+:CUSTOM_ID: generation-parameters
+:ID:       5a253c87-2ae4-4335-a1a2-c9e07a208f7f
+:END:
 *** Temperature
 :PROPERTIES:
+:CUSTOM_ID: temperature
 :ID:       24a0a54b-828b-4c78-8208-504390848fbc
 :END:
 
@@ -559,6 +620,7 @@ modifying model files.
 
 *** Top-p (Nucleus Sampling)
 :PROPERTIES:
+:CUSTOM_ID: top-p
 :ID:       047f5bf7-e964-49ac-a666-c7ac75754e54
 :END:
 
@@ -583,6 +645,7 @@ general-purpose tasks while preventing extremely low-probability
 
 *** Repeat Penalty
 :PROPERTIES:
+:CUSTOM_ID: repeat-penalty
 :ID:       728f6daf-7a75-4e09-832b-5d449f0b4cae
 :END:
 
@@ -609,6 +672,7 @@ while allowing more repetition in poetic outputs.
 
 *** Top-k
 :PROPERTIES:
+:CUSTOM_ID: top-k
 :ID:       2c8eb415-509c-4269-8a65-48b2e6662290
 :END:
 
@@ -634,6 +698,7 @@ the token selection pool.
 
 *** Min-p
 :PROPERTIES:
+:CUSTOM_ID: min-p
 :ID:       9ee338ae-bb79-4c3e-b262-928fe237cb17
 :END:
 
@@ -663,6 +728,10 @@ experiment with min_p=0.03-0.07 for critical applications requiring
 maximum response reliability.
 
 *** Thread Count
+:PROPERTIES:
+:CUSTOM_ID: thread-count
+:ID:       727a72a7-44d1-419d-8c3b-5b2fe224b933
+:END:
 
 /Thread count/ specifies the number of CPU threads dedicated to the
 core AI inference process (configured via =thread_count= in
@@ -684,6 +753,10 @@ despite CPU claiming to have 12 threads. Reason is that RAM bandwidth
 gets fully utilized already very fast with just few threads.
 
 *** Batch Thread Count
+:PROPERTIES:
+:CUSTOM_ID: batch-thread-count
+:ID:       133c0c3b-f1f0-454c-a159-cca5266d728a
+:END:
 
 /Batch thread count/ specifies threads used for prompt preprocessing
 (configured via =batch_thread_count=). This parameter affects how
@@ -694,6 +767,10 @@ typically compute-bound rather than RAM-bound, so higher values often
 help up to your CPU's logical core count.
 
 *** Context Size Tokens
+:PROPERTIES:
+:CUSTOM_ID: context-size-tokens
+:ID:       d6b978f2-1db0-4b14-93f3-30ed63d97e59
+:END:
 
 /Context size tokens/ defines the maximum number of tokens
 (word-pieces) a model can process, configured per-model via
@@ -712,6 +789,10 @@ size. Always verify your model's actual supported context - exceeding
 it causes unpredictable or significantly degraded model output.
 
 *** Timeout
+:PROPERTIES:
+:CUSTOM_ID: timeout
+:ID:       85ab8c92-9439-44bc-b8d5-cb64f1fd9270
+:END:
 
 /Timeout/ is a parameter that specifies the maximum time (in
 milliseconds) that the AI is allowed to run for a task. If this time
@@ -749,6 +830,7 @@ task completion times.
 
 *** Parameter Precedence Hierarchy
 :PROPERTIES:
+:CUSTOM_ID: parameter-precedence
 :ID:       456dd42e-a474-4464-a14e-384c68713537
 :END:
 
@@ -773,8 +855,13 @@ creating a flexible "rule cascade" where specialized configurations
 override broader ones.
 
 ** AI response post processing parameters
+:PROPERTIES:
+:CUSTOM_ID: response-post-processing
+:ID:       2096333d-1b08-40fb-b04a-94b739cb1c4b
+:END:
 *** Final answer indicator
 :PROPERTIES:
+:CUSTOM_ID: final-answer-indicator
 :ID:       8da2522b-d34f-4632-9fdd-603c1a64febb
 :END:
 
@@ -831,6 +918,10 @@ of internal thought and transition to final response mode.
    #+end_example
 
 *** End of text marker
+:PROPERTIES:
+:CUSTOM_ID: end-of-text-marker
+:ID:       a554f321-b387-4666-b7c4-768f0e7a4e96
+:END:
 
 An /end of text marker/ is an optional string (e.g., "###", ”[end of
 text]“) specified per-model that signals the AI has completed its
@@ -845,6 +936,10 @@ For example, if a model typically ends responses with "###", setting
 end of AI response.
 
 * Installation
+:PROPERTIES:
+:CUSTOM_ID: installation
+:ID:       d5ca2e96-2063-4236-94c8-d962d13ea484
+:END:
 
 When you first encounter Älyverkko CLI, the setup process might seem
 involved compared to cloud-based AI services. That's completely
@@ -853,6 +948,10 @@ it ultimately creates a powerful, private, and cost-effective AI
 assistant that works /for you/.
 
 ** Requirements
+:PROPERTIES:
+:CUSTOM_ID: requirements
+:ID:       c0e57874-93c1-40fe-a129-e43e7e6dc810
+:END:
 *Operating System:*
 
 Älyverkko CLI is developed and tested on Debian 13 "Bookworm". It
@@ -872,6 +971,10 @@ to the installation process.
   input/output data.
 
 ** Your Setup Journey - What to Expect
+:PROPERTIES:
+:CUSTOM_ID: setup-journey
+:ID:       6a2f2fa2-6d40-46c6-bf45-69a261bd69ea
+:END:
 
 Before we start actual setup, here's brief overview of what you'll be
 doing:
@@ -919,6 +1022,7 @@ doing:
 
 ** Installation
 :PROPERTIES:
+:CUSTOM_ID: installation-steps
 :ID:       0b705a37-9b84-4cd5-878a-fedc9ab09b12
 :END:
 
@@ -962,6 +1066,7 @@ computer that runs Debian 13 operating system:
 
 ** Alyverkko CLI daemon configuration
 :PROPERTIES:
+:CUSTOM_ID: daemon-configuration
 :ID:       0fcdae48-81c5-4ae1-bdb9-64ae74e87c45
 :END:
 Älyverkko CLI application configuration is done by editing YAML
@@ -971,7 +1076,15 @@ Configuration file should be placed under current user home directory:
 : ~/.config/alyverkko-cli.yaml
 
 *** Key Parameters Explained
+:PROPERTIES:
+:CUSTOM_ID: key-parameters
+:ID:       bd4c9716-5f04-4e94-b713-ad0ff078f8a6
+:END:
 **** Core Directories
+:PROPERTIES:
+:CUSTOM_ID: core-directories
+:ID:       75c76c6b-637c-42a7-a31a-6f6be9570747
+:END:
 
 - =tasks_directory=: Where task files are placed for processing.
 
@@ -982,6 +1095,10 @@ Configuration file should be placed under current user home directory:
 - =llama_cli_path=: Path to llama.cpp's *llama-completion* executable.
 
 **** Generation Parameters
+:PROPERTIES:
+:CUSTOM_ID: generation-parameters-config
+:ID:       40ec81ad-cea1-4d41-a007-1f334f9b4117
+:END:
 
 - =default_temperature=: (Optional) Creativity control (0-3, higher =
   more creative).
@@ -1001,6 +1118,10 @@ Configuration file should be placed under current user home directory:
   1.0 = no penalty)
 
 **** Performance Tuning
+:PROPERTIES:
+:CUSTOM_ID: performance-tuning
+:ID:       18acf2d6-7118-4f18-9a86-ac48a33c761b
+:END:
 
 - =thread_count=: Sets the number of threads to be used by the AI
   during response generation. RAM data transfer speed is usually
@@ -1014,6 +1135,7 @@ Configuration file should be placed under current user home directory:
 
 **** Model-Specific Settings
 :PROPERTIES:
+:CUSTOM_ID: model-specific-settings
 :ID:       4206c6e9-d116-4030-94a4-87bf6f82043f
 :END:
 
@@ -1048,6 +1170,10 @@ Each model in the =models= list can have:
   answer indicator]].
 
 *** Configuration file example
+:PROPERTIES:
+:CUSTOM_ID: configuration-example
+:ID:       0c577b27-df6f-429f-9ac2-f89105a73544
+:END:
 
 The application is configured using a YAML-formatted configuration
 file. Below is an example of how the configuration file might look:
@@ -1084,6 +1210,10 @@ file. Below is an example of how the configuration file might look:
 #+end_src
 
 *** Enlisting available models
+:PROPERTIES:
+:CUSTOM_ID: enlisting-models
+:ID:       47bb1776-2824-425f-a13b-c0a863c48c23
+:END:
 Once Älyverkko CLI is installed and properly configured, you can run
 following command at commandline to see what models are available to
 it:
@@ -1095,6 +1225,10 @@ with "-missing" suffix in their alias by configuration wizard. You can
 manually remove this suffix after fixing the model file path.
 
 *** Self test
+:PROPERTIES:
+:CUSTOM_ID: self-test
+:ID:       781917b5-3d46-4368-9473-8a379088c91f
+:END:
 The *selftest* command performs a series of checks to ensure the
 system is configured correctly:
 
@@ -1106,9 +1240,14 @@ It verifies:
 - The presence of the *llama.cpp* executable.
 
 ** Skill concept and configuration
+:PROPERTIES:
+:CUSTOM_ID: skill-configuration
+:ID:       1592510e-5a8c-4cf3-9851-4a96fae6434e
+:END:
 + See also: [[id:6579abb4-8386-418b-9457-cae6c3345dfb][Skill]] concept explanation.
 *** Skill File Format
 :PROPERTIES:
+:CUSTOM_ID: skill-file-format
 :ID:       47fd0e4e-f86e-4c94-9656-ed76c0f9c2c5
 :END:
 
@@ -1131,6 +1270,7 @@ the actual user prompt during execution.
 
 *** Example Skill File
 :PROPERTIES:
+:CUSTOM_ID: example-skill-file
 :ID:       4fae9009-eb2e-4d3f-a43e-68ec8c43a7cd
 :END:
 : writer.yaml
@@ -1158,6 +1298,10 @@ the actual user prompt during execution.
 See more example skills: [[https://www3.svjatoslav.eu/projects/alyverkko-cli/examples/skills/default.yaml][default.yaml]], [[https://www3.svjatoslav.eu/projects/alyverkko-cli/examples/skills/summary.yaml][summary.yaml]]
 
 ** Starting process daemon
+:PROPERTIES:
+:CUSTOM_ID: starting-daemon
+:ID:       ab98110c-4603-40b1-a69c-72ddc13524e6
+:END:
 
 Älyverkko CLI keeps continuously listening for and processing tasks
 from a specified mail directory.
@@ -1166,6 +1310,10 @@ There are multiple alternative ways to start Älyverkko CLI in mail
 processing mode:
 
 **** Start via command line interface
+:PROPERTIES:
+:CUSTOM_ID: start-cli
+:ID:       bea72be2-994b-479c-bd7d-56300518fb5a
+:END:
 
 1. Open your terminal.
 
@@ -1179,6 +1327,10 @@ processing mode:
    close terminal window.
 
 **** Start using your desktop environment application launcher
+:PROPERTIES:
+:CUSTOM_ID: start-desktop
+:ID:       eeb89786-3b9a-4e3d-9699-75fd4119ccee
+:END:
 
 1. Access the application launcher or application menu on your desktop
    environment.
@@ -1191,6 +1343,10 @@ processing mode:
 4. If you want to stop Älyverkko CLI, just close terminal window.
 
 **** Start in the background as systemd system service
+:PROPERTIES:
+:CUSTOM_ID: start-systemd
+:ID:       85a79517-dd51-466b-8b12-3907c133e75a
+:END:
 
 During Älyverkko CLI [[id:0b705a37-9b84-4cd5-878a-fedc9ab09b12][installation]], installation script will prompt you
 if you want to install *systemd* service. If you chose *Y*, Alyverkko
@@ -1207,6 +1363,10 @@ facilities:
 : sudo systemctl disable alyverkko-cli
 
 ** The Light at the End of the Tunnel
+:PROPERTIES:
+:CUSTOM_ID: setup-benefits
+:ID:       b96f4505-85a9-4347-8f50-5a83fcbd1bfb
+:END:
 
 After setup, here's what you get:
 
@@ -1225,8 +1385,13 @@ specific needs. The initial investment pays dividends every time you
 need serious AI power without compromise.
 
 * Usage
+:PROPERTIES:
+:CUSTOM_ID: usage
+:ID:       ca6003eb-d478-47e9-b05e-21e3c668595b
+:END:
 ** Task file format
 :PROPERTIES:
+:CUSTOM_ID: task-file-format
 :ID:       f2fd232d-5d2b-42fa-83db-76ab015d4df9
 :END:
 
@@ -1246,6 +1411,10 @@ what kind of personality might the number 'zero' have?
 #+end_example
 
 *** Task File Header Format
+:PROPERTIES:
+:CUSTOM_ID: task-file-header
+:ID:       8609b337-83c6-425b-8f6c-d4bda22ebf1e
+:END:
 
 The first line *must* begin with exactly =TOCOMPUTE:= followed by
 space-separated key-value pairs:
@@ -1260,6 +1429,10 @@ Valid parameters in the header:
 - =priority=[integer]=: Higher integers mean higher priority (default: 0)
 
 *** Processed File Format
+:PROPERTIES:
+:CUSTOM_ID: processed-file-format
+:ID:       f9c19a99-b610-46ea-9d2e-902288995048
+:END:
 
 After AI processing completes, a new file is created with:
 1. First line: =DONE: skill=[name] model=[alias] duration=[time]=
@@ -1318,6 +1491,7 @@ After AI processing completes, a new file is created with:
 
 ** Task preparation
 :PROPERTIES:
+:CUSTOM_ID: task-preparation
 :ID:       4b7900e4-77c1-45e7-9c54-772d0d3892ea
 :END:
 
@@ -1331,6 +1505,7 @@ ready for processing, you should [[id:883d6e7c-60e0-422b-8c00-5cdc9dfec20d][init
 
 *** "joinfiles" command
 :PROPERTIES:
+:CUSTOM_ID: joinfiles-command
 :ID:       be907a1f-e347-48d9-ab0c-6a556912dc49
 :END:
 *Note:* See also alternative solution with similar goal: [[https://github.com/aerugo/prelude][prelude]].
@@ -1342,6 +1517,10 @@ statements from various source files, such as software project
 directories or collections of text documents.
 
 **** Usage
+:PROPERTIES:
+:CUSTOM_ID: joinfiles-usage
+:ID:       d734875d-e26a-4915-9d2d-4b047f4a4d0e
+:END:
 
 To use the *joinfiles* command, specify the source directory
 containing the files you wish to join and a topic name that will be
@@ -1365,6 +1544,10 @@ alyverkko-cli joinfiles -t "my_topic" --edit
 #+end_example
 
 **** Options
+:PROPERTIES:
+:CUSTOM_ID: joinfiles-options
+:ID:       be737651-2f1b-4197-a6ad-40ffb8bc8df5
+:END:
 
 - **-s, --src-dir**: Specifies the source directory from which to join
   files.
@@ -1380,6 +1563,10 @@ alyverkko-cli joinfiles -t "my_topic" --edit
   operation is complete.
 
 **** Example Use Case
+:PROPERTIES:
+:CUSTOM_ID: joinfiles-example
+:ID:       c2e1066c-7f1b-4007-a22c-69c40a772c48
+:END:
 
 Imagine you have a software project with various source files that you
 want to analyze using AI. You can use the *joinfiles* command to
@@ -1398,6 +1585,7 @@ and after some time, you will get results and the end of the file.
 
 ** Initiate AI processing
 :PROPERTIES:
+:CUSTOM_ID: initiate-processing
 :ID:       883d6e7c-60e0-422b-8c00-5cdc9dfec20d
 :END:
 
@@ -1441,6 +1629,7 @@ can benefit from [[id:25038854-c905-4b26-9670-cca06600223e][purpose-built GNU Em
 
 ** Helpful GNU Emacs utilities
 :PROPERTIES:
+:CUSTOM_ID: emacs-utilities
 :ID:       25038854-c905-4b26-9670-cca06600223e
 :END:
 
@@ -1449,6 +1638,10 @@ use Älyverkko CLI. Their purpose is to increase comfort for existing
 GNU Emacs users.
 
 *** Easily compose new problem statement for AI from emacs
+:PROPERTIES:
+:CUSTOM_ID: emacs-compose-task
+:ID:       4ae50ef2-104d-43f7-a002-ba007d99693f
+:END:
 
 The Elisp function *ai-new-topic* facilitates the creation and opening
 of a new Org-mode file dedicated to a user-defined topic within a
@@ -1485,6 +1678,10 @@ new file and open it for editing.
 #+end_src
 
 *** Easily signal to AI that problem statement is ready for solving
+:PROPERTIES:
+:CUSTOM_ID: emacs-signal-ready
+:ID:       6ef58180-ece3-4649-927a-e8465c9b4083
+:END:
 
 The function =alyverkko-compute= is designed to enhance the workflow
 of users working with the Älyverkko CLI application by automating the
@@ -1550,6 +1747,10 @@ the top of the current buffer."
 #+end_src
 
 * Getting the source code
+:PROPERTIES:
+:CUSTOM_ID: getting-source-code
+:ID:       f67a3668-eca2-425f-b284-915ff3b3ed82
+:END:
 - This program is free software: released under Creative Commons Zero
   (CC0) license.
 
@@ -1562,6 +1763,7 @@ the top of the current buffer."
 
 ** Source code
 :PROPERTIES:
+:CUSTOM_ID: source-code
 :ID:       f5740953-079b-40f4-87d8-b6d1635a8d39
 :END:
 - [[https://www2.svjatoslav.eu/gitweb/?p=alyverkko-cli.git;a=snapshot;h=HEAD;sf=tgz][Download latest snapshot in TAR GZ format]]
@@ -1577,6 +1779,10 @@ the top of the current buffer."
   understand diagrams. Diagrams were generated using [[https://www3.svjatoslav.eu/projects/javainspect/][JavaInspect tool]].
 
 * Feature ideas
+:PROPERTIES:
+:CUSTOM_ID: feature-ideas
+:ID:       0f597bc9-0a23-40e2-b60d-80d2394a3f85
+:END:
 
 - Recommend some concrete AI models.
 
diff --git a/tools/Implement idea b/tools/Implement idea
new file mode 100755 (executable)
index 0000000..6472735
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/bash
+cd "${0%/*}"; if [ "$1" != "T" ]; then gnome-terminal -e "'$0' T"; exit; fi;
+cd ..
+
+read -p "Enter the topic name: " TOPIC_NAME
+
+alyverkko-cli joinfiles -t "$TOPIC_NAME" --src-dir . --pattern "*.org"
+alyverkko-cli joinfiles -t "$TOPIC_NAME" --src-dir . --pattern "*.java"
+alyverkko-cli joinfiles -t "$TOPIC_NAME" --src-dir . --pattern "implement*"
+alyverkko-cli joinfiles -t "$TOPIC_NAME" --src-dir . --pattern "install"
+alyverkko-cli joinfiles -t "$TOPIC_NAME" --src-dir . --pattern "uninstall"
+alyverkko-cli joinfiles -t "$TOPIC_NAME" --edit
diff --git a/tools/Open with IntelliJ IDEA b/tools/Open with IntelliJ IDEA
new file mode 100755 (executable)
index 0000000..304bf94
--- /dev/null
@@ -0,0 +1,54 @@
+#!/bin/bash
+
+# This script launches IntelliJ IDEA with the current project
+# directory. The script is designed to be run by double-clicking it in
+# the GNOME Nautilus file manager.
+
+# First, we change the current working directory to the directory of
+# the script.
+
+# "${0%/*}" gives us the path of the script itself, without the
+# script's filename.
+
+# This command basically tells the system "change the current
+# directory to the directory containing this script".
+
+cd "${0%/*}"
+
+# Then, we move up one directory level.
+# The ".." tells the system to go to the parent directory of the current directory.
+# This is done because we assume that the project directory is one level up from the script.
+cd ..
+
+# Now, we use the 'setsid' command to start a new session and run
+# IntelliJ IDEA in the background. 'setsid' is a UNIX command that
+# runs a program in a new session.
+
+# The command 'idea .' opens IntelliJ IDEA with the current directory
+# as the project directory.  The '&' at the end is a UNIX command that
+# runs the process in the background.  The '> /dev/null' part tells
+# the system to redirect all output (both stdout and stderr, denoted
+# by '&') that would normally go to the terminal to go to /dev/null
+# instead, which is a special file that discards all data written to
+# it.
+
+setsid idea . &>/dev/null &
+
+# The 'disown' command is a shell built-in that removes a shell job
+# from the shell's active list. Therefore, the shell will not send a
+# SIGHUP to this particular job when the shell session is terminated.
+
+# '-h' option specifies that if the shell receives a SIGHUP, it also
+# doesn't send a SIGHUP to the job.
+
+# '$!' is a shell special parameter that expands to the process ID of
+# the most recent background job.
+disown -h $!
+
+
+sleep 2
+
+# Finally, we use the 'exit' command to terminate the shell script.
+# This command tells the system to close the terminal window after
+# IntelliJ IDEA has been opened.
+exit
diff --git a/tools/Update web site b/tools/Update web site
new file mode 100755 (executable)
index 0000000..ec23ca9
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/bash
+cd "${0%/*}"; if [ "$1" != "T" ]; then gnome-terminal -e "'$0' T"; exit; fi;
+
+cd ..
+
+# Build the project jar file and the apidocs.
+export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64/
+mvn clean package
+
+# Export org to html using emacs in batch mode
+(
+  cd doc/
+
+  rm -f index.html
+  emacs --batch -l ~/.emacs --visit=index.org --funcall=org-html-export-to-html --kill
+
+  #rm setup.html
+  #emacs --batch -l ~/.emacs --visit=setup.org --funcall=org-html-export-to-html --kill
+)
+
+# Generate class diagrams. See: https://www3.svjatoslav.eu/projects/javainspect/
+rm -rf doc/graphs/
+mkdir -p doc/graphs/
+javainspect -j target/alyverkko-cli-*-SNAPSHOT.jar -d doc/graphs/ -n "all classes" -t png -ho
+meviz index -w doc/graphs/ -t "Älyverkko CLI program classes"
+
+# Copy the apidocs to the doc folder so that they can be uploaded to the server.
+rm -rf doc/apidocs/
+cp -r target/apidocs/ doc/
+
+# Upload project homepage to the server.
+rsync -avz --delete  -e 'ssh -p 10006' doc/ n0@www3.svjatoslav.eu:/mnt/big/projects/alyverkko-cli/
+
+echo ""
+echo "Press ENTER to close this window."
+read
diff --git a/tools/implement idea b/tools/implement idea
deleted file mode 100755 (executable)
index 6472735..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-cd "${0%/*}"; if [ "$1" != "T" ]; then gnome-terminal -e "'$0' T"; exit; fi;
-cd ..
-
-read -p "Enter the topic name: " TOPIC_NAME
-
-alyverkko-cli joinfiles -t "$TOPIC_NAME" --src-dir . --pattern "*.org"
-alyverkko-cli joinfiles -t "$TOPIC_NAME" --src-dir . --pattern "*.java"
-alyverkko-cli joinfiles -t "$TOPIC_NAME" --src-dir . --pattern "implement*"
-alyverkko-cli joinfiles -t "$TOPIC_NAME" --src-dir . --pattern "install"
-alyverkko-cli joinfiles -t "$TOPIC_NAME" --src-dir . --pattern "uninstall"
-alyverkko-cli joinfiles -t "$TOPIC_NAME" --edit
diff --git a/tools/open with IntelliJ IDEA b/tools/open with IntelliJ IDEA
deleted file mode 100755 (executable)
index 304bf94..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/bash
-
-# This script launches IntelliJ IDEA with the current project
-# directory. The script is designed to be run by double-clicking it in
-# the GNOME Nautilus file manager.
-
-# First, we change the current working directory to the directory of
-# the script.
-
-# "${0%/*}" gives us the path of the script itself, without the
-# script's filename.
-
-# This command basically tells the system "change the current
-# directory to the directory containing this script".
-
-cd "${0%/*}"
-
-# Then, we move up one directory level.
-# The ".." tells the system to go to the parent directory of the current directory.
-# This is done because we assume that the project directory is one level up from the script.
-cd ..
-
-# Now, we use the 'setsid' command to start a new session and run
-# IntelliJ IDEA in the background. 'setsid' is a UNIX command that
-# runs a program in a new session.
-
-# The command 'idea .' opens IntelliJ IDEA with the current directory
-# as the project directory.  The '&' at the end is a UNIX command that
-# runs the process in the background.  The '> /dev/null' part tells
-# the system to redirect all output (both stdout and stderr, denoted
-# by '&') that would normally go to the terminal to go to /dev/null
-# instead, which is a special file that discards all data written to
-# it.
-
-setsid idea . &>/dev/null &
-
-# The 'disown' command is a shell built-in that removes a shell job
-# from the shell's active list. Therefore, the shell will not send a
-# SIGHUP to this particular job when the shell session is terminated.
-
-# '-h' option specifies that if the shell receives a SIGHUP, it also
-# doesn't send a SIGHUP to the job.
-
-# '$!' is a shell special parameter that expands to the process ID of
-# the most recent background job.
-disown -h $!
-
-
-sleep 2
-
-# Finally, we use the 'exit' command to terminate the shell script.
-# This command tells the system to close the terminal window after
-# IntelliJ IDEA has been opened.
-exit
diff --git a/tools/update web site b/tools/update web site
deleted file mode 100755 (executable)
index ec23ca9..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/bash
-cd "${0%/*}"; if [ "$1" != "T" ]; then gnome-terminal -e "'$0' T"; exit; fi;
-
-cd ..
-
-# Build the project jar file and the apidocs.
-export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64/
-mvn clean package
-
-# Export org to html using emacs in batch mode
-(
-  cd doc/
-
-  rm -f index.html
-  emacs --batch -l ~/.emacs --visit=index.org --funcall=org-html-export-to-html --kill
-
-  #rm setup.html
-  #emacs --batch -l ~/.emacs --visit=setup.org --funcall=org-html-export-to-html --kill
-)
-
-# Generate class diagrams. See: https://www3.svjatoslav.eu/projects/javainspect/
-rm -rf doc/graphs/
-mkdir -p doc/graphs/
-javainspect -j target/alyverkko-cli-*-SNAPSHOT.jar -d doc/graphs/ -n "all classes" -t png -ho
-meviz index -w doc/graphs/ -t "Älyverkko CLI program classes"
-
-# Copy the apidocs to the doc folder so that they can be uploaded to the server.
-rm -rf doc/apidocs/
-cp -r target/apidocs/ doc/
-
-# Upload project homepage to the server.
-rsync -avz --delete  -e 'ssh -p 10006' doc/ n0@www3.svjatoslav.eu:/mnt/big/projects/alyverkko-cli/
-
-echo ""
-echo "Press ENTER to close this window."
-read