Compare commits
1 commit
Author | SHA1 | Date | |
---|---|---|---|
0cdb355dd0 |
3 changed files with 38 additions and 57 deletions
54
README.md
54
README.md
|
@ -1,53 +1,40 @@
|
||||||
# DocMachine Cli
|
# DocMachine (Utils)
|
||||||
|
|
||||||
DocMachine Cli is a tool designed to simplify the process of creating technical
|
DocMachine is a CLI tool designed to simplify the process of creating technical documentation and presentations.
|
||||||
documentation and presentations.
|
|
||||||
|
|
||||||
## Motivation
|
## Motivation
|
||||||
|
|
||||||
This project aims to address the following challenges:
|
This project aims to address the following challenges:
|
||||||
|
|
||||||
* **Automation:** Automate the generation of high-quality technical content,
|
* **Automation:** Automate the generation of high-quality technical content, including documentation and presentation slides.
|
||||||
including documentation and presentation slides.
|
* **Consistency:** Ensure a consistent and polished look and feel across all content pieces.
|
||||||
* **Consistency:** Ensure a consistent and polished look and feel across all
|
* **Efficiency:** Reduce the time and effort required to produce content by leveraging AI tools.
|
||||||
content pieces.
|
|
||||||
* **Efficiency:** Reduce the time and effort required to produce content by
|
|
||||||
leveraging AI tools.
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
DocMachine offers a range of features to streamline the content creation process:
|
DocMachine offers a range of features to streamline the content creation process:
|
||||||
|
|
||||||
* **Scaffolding:** Generate a well-structured project directory with all the
|
* **Scaffolding:** Generate a well-structured project directory with all the necessary files.
|
||||||
necessary files.
|
* **Building:** Compile and publish your content as HTML and PDF documents using Dockerized build processes.
|
||||||
* **Building:** Compile and publish your content as HTML and PDF documents
|
|
||||||
using Dockerized build processes.
|
|
||||||
|
|
||||||
We are actively developing the following features for future releases:
|
We are actively developing the following features for future releases:
|
||||||
|
|
||||||
* **Planning:** Leverage LLMs (Large Language Models) to generate content
|
* **Planning:** Leverage LLMs (Large Language Models) to generate content outlines tailored to your specific needs and requirements.
|
||||||
outlines tailored to your specific needs and requirements.
|
* **Writing:** Utilize LLMs to draft content for each section and subsection, saving you valuable time and effort.
|
||||||
* **Writing:** Utilize LLMs to draft content for each section and subsection,
|
|
||||||
saving you valuable time and effort.
|
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
You'll need a recent version of Crystal (>= 1.11.0) to use this project.
|
FIXME: list prerequisites for crystal lang & dependencies
|
||||||
|
|
||||||
You'll also need to install a few dependencies:
|
|
||||||
|
|
||||||
* libreadline-dev
|
|
||||||
* libncurses-dev
|
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
Follow these steps to start using DocMachine Cli:
|
Follow these steps to start using DocMachine:
|
||||||
|
|
||||||
### Installation
|
### Installation
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://code.apps.glenux.net/glenux/docmachine-cli.git docmachine-cli
|
git clone https://code.apps.glenux.net/glenux/docmachine-utils.git docmachine-utils
|
||||||
cd docmachine-cli
|
cd docmachine-utils
|
||||||
make build
|
make build
|
||||||
make install
|
make install
|
||||||
```
|
```
|
||||||
|
@ -55,14 +42,13 @@ make install
|
||||||
### Create a New Project
|
### Create a New Project
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docmachine scaffold my-documentation-project
|
docmachine scaffold my-doc-project
|
||||||
```
|
```
|
||||||
|
|
||||||
This command will create a new directory named `my-documentation-project` with
|
This command will create a new directory named `my-doc-project` with the following structure:
|
||||||
the following structure:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
my-documentation-project
|
my-doc-project
|
||||||
├── _build
|
├── _build
|
||||||
├── docs
|
├── docs
|
||||||
│ └── images # link to ../images
|
│ └── images # link to ../images
|
||||||
|
@ -74,8 +60,7 @@ my-documentation-project
|
||||||
### Start Writing Content
|
### Start Writing Content
|
||||||
|
|
||||||
* **Documentation:** Place your Markdown files inside the `docs` directory.
|
* **Documentation:** Place your Markdown files inside the `docs` directory.
|
||||||
* **Presentations:** Place your Markdown files (using Marp syntax) inside the
|
* **Presentations:** Place your Markdown files (using Marp syntax) inside the `slides` directory.
|
||||||
`slides` directory.
|
|
||||||
* **Images:** Store your images in the respective `images` directories.
|
* **Images:** Store your images in the respective `images` directories.
|
||||||
|
|
||||||
### Live-reload during writing
|
### Live-reload during writing
|
||||||
|
@ -85,7 +70,6 @@ docmachine build -a watch
|
||||||
```
|
```
|
||||||
|
|
||||||
This command will start a Docker container and build your documentation and presentations:
|
This command will start a Docker container and build your documentation and presentations:
|
||||||
|
|
||||||
* **Documentation:** Built using MkDocs and served on `http://localhost:5100`.
|
* **Documentation:** Built using MkDocs and served on `http://localhost:5100`.
|
||||||
* **Presentations:** Built using Marp and served on `http://localhost:5200`.
|
* **Presentations:** Built using Marp and served on `http://localhost:5200`.
|
||||||
|
|
||||||
|
@ -116,6 +100,6 @@ We welcome contributions to DocMachine! To contribute:
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
DocMachine Cli is licensed under the GPL-3.0-or-later license. See the
|
DocMachine is licensed under the GPL-3.0-or-later license. See the `LICENSE`
|
||||||
`LICENSE` file for details.
|
file for details.
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ require "socket"
|
||||||
|
|
||||||
require "./module"
|
require "./module"
|
||||||
require "./config"
|
require "./config"
|
||||||
require "../common/network"
|
|
||||||
|
|
||||||
module DocMachine::Build
|
module DocMachine::Build
|
||||||
class Run
|
class Run
|
||||||
|
@ -20,6 +19,7 @@ module DocMachine::Build
|
||||||
@process = nil
|
@process = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# cleanup environment
|
# cleanup environment
|
||||||
# create directories
|
# create directories
|
||||||
# setup permissions
|
# setup permissions
|
||||||
|
@ -32,6 +32,22 @@ module DocMachine::Build
|
||||||
self._avoid_duplicates() unless @config.enable_multiple
|
self._avoid_duplicates() unless @config.enable_multiple
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private def _find_port(port_base)
|
||||||
|
(port_base..65535).each do |port|
|
||||||
|
return port if _port_available?(port)
|
||||||
|
end
|
||||||
|
raise "No port available"
|
||||||
|
end
|
||||||
|
|
||||||
|
private def _port_available?(port)
|
||||||
|
sock = Socket.new(Socket::Family::INET, Socket::Type::STREAM)
|
||||||
|
sock.bind(Socket::IPAddress.new("0.0.0.0", port))
|
||||||
|
sock.close
|
||||||
|
return true
|
||||||
|
rescue ex : Socket::BindError
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
private def _avoid_duplicates
|
private def _avoid_duplicates
|
||||||
Log.info { "Multiple Instances: stopping duplicate containers (for #{@docker_name})" }
|
Log.info { "Multiple Instances: stopping duplicate containers (for #{@docker_name})" }
|
||||||
docker_cid = %x{docker ps -f "name=#{@docker_name}" -q}.strip
|
docker_cid = %x{docker ps -f "name=#{@docker_name}" -q}.strip
|
||||||
|
@ -145,7 +161,7 @@ module DocMachine::Build
|
||||||
## Detect docs
|
## Detect docs
|
||||||
if Dir.exists?("#{@config.data_dir}/docs")
|
if Dir.exists?("#{@config.data_dir}/docs")
|
||||||
Log.info { "Docs: detected docs directory." }
|
Log.info { "Docs: detected docs directory." }
|
||||||
mkdocs_port = Network.find_port(@config.port)
|
mkdocs_port = _find_port(@config.port)
|
||||||
docker_opt_mkdocs_port = ["-p", "#{mkdocs_port}:5100"]
|
docker_opt_mkdocs_port = ["-p", "#{mkdocs_port}:5100"]
|
||||||
docker_opts.concat docker_opt_mkdocs_port
|
docker_opts.concat docker_opt_mkdocs_port
|
||||||
Log.notice { "Using port #{mkdocs_port} for docs" }
|
Log.notice { "Using port #{mkdocs_port} for docs" }
|
||||||
|
@ -157,7 +173,7 @@ module DocMachine::Build
|
||||||
## Detect slides
|
## Detect slides
|
||||||
if Dir.exists?("#{@config.data_dir}/slides")
|
if Dir.exists?("#{@config.data_dir}/slides")
|
||||||
Log.info { "Slides: detected slides directory." }
|
Log.info { "Slides: detected slides directory." }
|
||||||
marp_port = Network.find_port(@config.port+100)
|
marp_port = _find_port(@config.port+100)
|
||||||
docker_opt_marp_port = ["-p", "#{marp_port}:5200"]
|
docker_opt_marp_port = ["-p", "#{marp_port}:5200"]
|
||||||
docker_opts.concat docker_opt_marp_port
|
docker_opts.concat docker_opt_marp_port
|
||||||
Log.info { "Slides: Adding option to command line (#{docker_opt_marp_port})" }
|
Log.info { "Slides: Adding option to command line (#{docker_opt_marp_port})" }
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
|
|
||||||
class Network
|
|
||||||
|
|
||||||
def self.find_port(port_base)
|
|
||||||
(port_base..65535).each do |port|
|
|
||||||
return port if self.port_available?(port)
|
|
||||||
end
|
|
||||||
raise "No port available"
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.port_available?(port)
|
|
||||||
sock = Socket.new(Socket::Family::INET, Socket::Type::STREAM)
|
|
||||||
sock.bind(Socket::IPAddress.new("0.0.0.0", port))
|
|
||||||
sock.close
|
|
||||||
return true
|
|
||||||
rescue ex : Socket::BindError
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
Loading…
Reference in a new issue