diff --git a/etc/init.shy b/etc/init.shy
index 0cf97146..8419b467 100644
--- a/etc/init.shy
+++ b/etc/init.shy
@@ -50,7 +50,12 @@
role white void web.chat.macos.desktop action run
role white void web.wiki.draw action command
role white void web.wiki.draw action run
+ role white void web.wiki.portal
+ role white void portal
+ role white void LICENSE
+ role white void etc/path
role white void /require/usr/icebergs
+ role white void /require/modules/
role white void /require/usr/icons
role white void usr/local/image
role white void usr/local/export
diff --git a/src/document/commands/base/aaa/user.shy b/src/document/commands/base/aaa/user.shy
new file mode 100644
index 00000000..2f73fdbf
--- /dev/null
+++ b/src/document/commands/base/aaa/user.shy
@@ -0,0 +1,24 @@
+title "user"
+brief `user 命令,用户管理。`
+
+chapter "界面"
+spark demo user
+
+chapter "参数"
+spark `没有参数时,输出用户列表。指定了参数 username,则输出此用户的详情信息。`
+order `username: 用户名。`
+
+chapter "操作"
+order `
+create: 创建一个用户。
+remove: 删除一个用户。
+`
+section "create"
+spark `create 创建一个新的用户需要以下参数,其中 username 是必选,其它的都是可选。`
+order `
+usernick: 用户昵称
+username: 用户名
+userrole: 用户角色
+userzone: 用户领域
+background: 背景图片
+`
diff --git a/src/document/commands/base/cli/daemon.shy b/src/document/commands/base/cli/daemon.shy
new file mode 100644
index 00000000..8b95de62
--- /dev/null
+++ b/src/document/commands/base/cli/daemon.shy
@@ -0,0 +1,17 @@
+title "daemon"
+spark `daemon 命令,启动后台进程。`
+
+chapter "界面"
+spark demo daemon
+
+chapter "参数"
+spark `没有参数时,daemon 输出已经启动的后台进程列表。`
+
+chapter "操作"
+order `
+prunes,从进程列表中,清理已经结束的或启动异常的进程信息。
+remove,从进程列表中,删除进程信息。
+stop,结束某个后台进程。
+restart,重启某个后台进程。
+`
+
diff --git a/src/document/commands/base/cli/system.shy b/src/document/commands/base/cli/system.shy
new file mode 100644
index 00000000..c3a0224f
--- /dev/null
+++ b/src/document/commands/base/cli/system.shy
@@ -0,0 +1,12 @@
+title "system"
+spark `system 命令,执行系统命令。`
+
+chapter "界面"
+spark demo system
+
+chapter "参数"
+spark `system 需要一个参数 cmd,来指定需要执行的系统命令。`
+order `
+cmd: 指定命令。
+`
+
diff --git a/src/document/commands/base/ctx/command.shy b/src/document/commands/base/ctx/command.shy
new file mode 100644
index 00000000..e1646d80
--- /dev/null
+++ b/src/document/commands/base/ctx/command.shy
@@ -0,0 +1,12 @@
+title "command"
+spark `command 命令,输出 Contexts 的命令列表或命令详情。`
+
+chapter "界面"
+spark `使用树状图,来展示命令列表。`
+spark demo command
+
+chapter "参数"
+spark `没有参数时,输出命令列表。指定了参数 key 即命令名,则输出此命令的详细信息。`
+order `
+key: 命令名
+`
diff --git a/src/document/commands/base/ctx/config.shy b/src/document/commands/base/ctx/config.shy
new file mode 100644
index 00000000..264d59b6
--- /dev/null
+++ b/src/document/commands/base/ctx/config.shy
@@ -0,0 +1,17 @@
+title "config"
+spark `config 命令,输出配置列表或配置详情。`
+
+chapter "界面"
+spark demo config
+
+chapter "参数"
+spark `没有参数时,输出当前模块的所有配置列表。指定了参数 key 即配置名,则输出此配置的详细信息。`
+order `
+key: 配置名
+`
+
+chapter "操作"
+order `
+export,导出指定命令的配置,到指定的目录中。
+import,导入指定命令的配置,从指定的目录。
+trash,清理指定命令的配置。`
diff --git a/src/document/commands/base/nfs/cat.shy b/src/document/commands/base/nfs/cat.shy
new file mode 100644
index 00000000..1f08a232
--- /dev/null
+++ b/src/document/commands/base/nfs/cat.shy
@@ -0,0 +1,14 @@
+title "cat"
+brief `cat 命令,是文件管理器。`
+
+chapter "界面"
+spark demo cat
+
+chapter "参数"
+spark `没有参数或参数 path 为 / 结尾,则输出此目录下的文件列表。当参数 path 为一个文件路径时,则输出此文件内容。`
+order `path: 目录路径或文件路径。`
+
+chapter "操作"
+order `
+trash: 清理文件。
+`
diff --git a/src/document/commands/base/nfs/dir.shy b/src/document/commands/base/nfs/dir.shy
new file mode 100644
index 00000000..93703ca9
--- /dev/null
+++ b/src/document/commands/base/nfs/dir.shy
@@ -0,0 +1,15 @@
+title "dir"
+brief `dir 命令,是目录管理器。`
+
+chapter "界面"
+spark demo dir
+
+chapter "参数"
+spark `输出指定路径下的文件列表。`
+order `path: 目录路径或文件路径。`
+
+chapter "操作"
+order `
+upload: 上传文件。
+trash: 清理文件。
+`
diff --git a/src/document/commands/base/tcp/host.shy b/src/document/commands/base/tcp/host.shy
new file mode 100644
index 00000000..7a4fa955
--- /dev/null
+++ b/src/document/commands/base/tcp/host.shy
@@ -0,0 +1,9 @@
+title "host"
+brief `host 命令,查看网卡信息。`
+
+chapter "界面"
+spark demo host
+
+chapter "参数"
+spark `没有参数时,输出网卡列表。指定了参数 name,则只输出此网卡的信息`
+order `name: 网卡名。`
diff --git a/src/document/commands/base/web/serve.shy b/src/document/commands/base/web/serve.shy
new file mode 100644
index 00000000..1897e0af
--- /dev/null
+++ b/src/document/commands/base/web/serve.shy
@@ -0,0 +1,28 @@
+title "serve"
+spark `serve 命令,启动 web 服务器。`
+
+chapter "界面"
+spark demo serve
+
+chapter "参数"
+spark `没有参数时,输出服务列表。指定了参数 name 即服务名,则输出此服务的详细信息。`
+order `
+name: 服务名
+`
+
+chapter "操作"
+order `
+start: 启动一个 web 服务。
+remove: 删除一个 web 服务。
+`
+
+chapter "监听事件"
+order `
+serve.start: 服务启动后,在终端输出服务地址的二维码。
+`
+
+chapter "配置"
+section "domain"
+spark `指定服务的域名。`
+shell `serve domain ""`
+shell `serve domain "https://shylinux.com"`
diff --git a/src/document/commands/base/web/space.shy b/src/document/commands/base/web/space.shy
new file mode 100644
index 00000000..d3bc11e9
--- /dev/null
+++ b/src/document/commands/base/web/space.shy
@@ -0,0 +1,57 @@
+title "space"
+brief `space 命令,执行远程命令。`
+
+chapter "界面"
+spark demo space
+
+chapter "参数"
+spark `没有参数时,输出节点列表。指定了参数 name 即节点名,则输出此节点的详细信息。如果还指定了参数 cmds,则将 cmds 参数指定的命令,发送到 name 参数指定节点上去执行。`
+order `
+name: 空间名。
+cmds: 命令。
+`
+
+chapter "操作"
+order `
+open,打开一个节点的首页。
+remove,删除一个节点。
+`
+chapter "搜索"
+spark `默认结果,输出子服务节点,父节点。`
+
+chapter "接口"
+section "/space/"
+spark `监听子空间或子设备,发送的 websocket 连接请求,并创建新的双向连接。`
+
+chapter "命令"
+section "dial"
+spark `启动工作空间`
+shell `space dial dev dev name demo`
+order `
+dev: 指定远程服务地址。
+name: 指定本节点的名称。
+`
+
+section "start"
+spark `启动工作空间`
+shell `space start dev dev name demo`
+order `
+dev: 指定远程服务地址。
+name: 指定本节点的名称。
+`
+
+section "login"
+spark `授权登录。`
+shell `space login 113_87_49_222_52203`
+
+section "domain"
+spark `返回当前空间的地址。`
+shell `space domain`
+
+section "main"
+spark `返回空间的首页。`
+shell `space main`
+
+chapter "配置"
+order `main: 通过 config 命令指定空间的首页`
+shell `config web.space meta.main "desktop"`
diff --git a/src/document/commands/core/code/compile.shy b/src/document/commands/core/code/compile.shy
new file mode 100644
index 00000000..ae2a0668
--- /dev/null
+++ b/src/document/commands/core/code/compile.shy
@@ -0,0 +1,32 @@
+title "compile"
+brief `compile 命令,编译工具。`
+
+chapter "界面"
+spark demo compile
+
+chapter "参数"
+order `
+arch: CPU 类型。
+os: 操作系统类型。
+src: 源码文件。
+`
+
+chapter "操作"
+section "run"
+spark `将参数 src 指定的源码文件,编译成 os 和 arch 参数指定的类型。`
+
+section "binpack"
+spark `将所有资源打包进 binpack.go 文件中。`
+
+section "webpack"
+spark `将前端所有代码打包到一个文件中。`
+
+section "devpack"
+spark `删除前端的打包文件。`
+
+section "install"
+spark `安装编译器。`
+
+chapter "配置"
+section "env"
+spark `指定编译时的环境变量。`
diff --git a/src/document/commands/core/code/publish.shy b/src/document/commands/core/code/publish.shy
new file mode 100644
index 00000000..dbb97e62
--- /dev/null
+++ b/src/document/commands/core/code/publish.shy
@@ -0,0 +1,14 @@
+title "publish"
+brief `publish 命令,发布工具。
+将编译好的程序文件或其它资源文件对外发布,供自由的下载。`
+spark `在工具界面的工作区,默认的会生成一个下载命令,复制此命令,在终端执行,即可从本服务器,快速下载程序文件启动服务,并且连接到本服务器,成为本服务器的子设备。`
+
+chapter "界面"
+spark demo publish
+
+chapter "参数"
+spark `没有参数 path 时,会显示资源列表。否则会显示参数 path 指定文件的详细信息。`
+order `path: 文件路径。`
+
+chapter "目录"
+spark `发布出去的文件,都保存在 ./usr/publish/ 目录下。`
diff --git a/src/document/commands/core/wiki/word.shy b/src/document/commands/core/wiki/word.shy
new file mode 100644
index 00000000..e3047934
--- /dev/null
+++ b/src/document/commands/core/wiki/word.shy
@@ -0,0 +1,13 @@
+title "word"
+brief `word 命令,笔记文档。`
+
+chapter "界面"
+spark demo word
+
+chapter "参数"
+spark `没有参数 path 时,会显示所有的文档列表。否则会显示参数 path 指定文档的内容。`
+order `path: 文件路径。`
+
+chapter "操作"
+section "play"
+spark `word 命令,还支持文档演示。像 PPT 一样,将笔记文档,按章节一页一页的展示。`
diff --git a/src/document/commands/index.shy b/src/document/commands/index.shy
new file mode 100644
index 00000000..ade2604c
--- /dev/null
+++ b/src/document/commands/index.shy
@@ -0,0 +1,42 @@
+navmenu `
+基础模块 base/
+ ctx ctx/
+ command command.shy
+ config config.shy
+ cli cli/
+ system system.shy
+ daemon daemon.shy
+ web web/
+ serve serve.shy
+ space space.shy
+ aaa aaa/
+ user user.shy
+
+ lex lex/
+ yac yac/
+ ssh ssh/
+ gdb gdb/
+
+ tcp tcp/
+ host host.shy
+ nfs nfs/
+ dir dir.shy
+ cat cat.shy
+ mdb mdb/
+ log log/
+
+功能模块 core/
+ code code/
+ compile compile.shy
+ publish publish.shy
+ wiki wiki/
+ word word.shy
+ chat chat/
+ team team/
+ mall mall/
+
+其它模块 misc/
+ tmux tmux/
+ session session.shy
+ buffer buffer.shy
+`
diff --git a/src/document/commands/misc/tmux/buffer.shy b/src/document/commands/misc/tmux/buffer.shy
new file mode 100644
index 00000000..9bad5851
--- /dev/null
+++ b/src/document/commands/misc/tmux/buffer.shy
@@ -0,0 +1,21 @@
+title "web.code.tmux.buffer"
+brief `web.code.tmux.buffer 命令,tmux 缓存管理。`
+
+chapter "界面"
+spark demo web.code.tmux.buffer
+
+chapter "参数"
+spark `没有参数 name 时,会显示缓存列表。没有参数 value 时,会显示缓存详情,否则设置缓存内容。`
+order `
+name: 缓存名。
+value: 缓存值。
+`
+
+chapter "操作"
+section "create"
+spark `添加缓存`
+order `
+value: 缓存值。
+`
+section "remove"
+spark `删除缓存`
diff --git a/src/document/commands/misc/tmux/session.shy b/src/document/commands/misc/tmux/session.shy
new file mode 100644
index 00000000..2d376586
--- /dev/null
+++ b/src/document/commands/misc/tmux/session.shy
@@ -0,0 +1,35 @@
+title "web.code.tmux.session"
+brief `web.code.tmux.session 命令,tmux 会话管理。`
+
+chapter "界面"
+spark demo web.code.tmux.session
+
+chapter "参数"
+spark `没有参数 session 时,会显示会话列表。没有参数 window 时,会显示窗口列表。没有参数 pane 时,会显示面板列表。没有参数 cmds 会显示面板内容,否则会执行命令。`
+order `
+session: 会话名。
+window: 窗口名。
+pane: 面板名。
+cmds: 命令名。
+`
+
+chapter "操作"
+
+section "create"
+spark `在显示会话列表时,创建会话。`
+spark `在显示窗口列表时,创建窗口。`
+spark `在显示面板列表时,创建面板。`
+
+section "remove"
+spark `在显示会话列表时,删除会话。`
+spark `在显示窗口列表时,删除窗口。`
+spark `在显示面板列表时,删除面板。`
+
+section "select"
+spark `在显示会话列表时,将选中的会话置为当前会话。`
+spark `在显示窗口列表时,将选中的窗口置为当前窗口。`
+spark `在显示面板列表时,将选中的面板置为当前面板。`
+
+chapter "监听事件"
+section "dream.create"
+spark `空间创建成功后,会创建一个与空间同名的 tmux 会话。`
diff --git a/src/document/commands/web.dream/list.shy b/src/document/commands/web.dream/list.shy
deleted file mode 100644
index 7e5718f5..00000000
--- a/src/document/commands/web.dream/list.shy
+++ /dev/null
@@ -1,9 +0,0 @@
-chapter "dream 项目空间"
-
-section "list 空间列表"
-
-section "start 启动空间"
-
-section "stop 停止空间"
-
-section "trash 删除空间"
diff --git a/src/document/commands/web.dream/start.shy b/src/document/commands/web.dream/start.shy
deleted file mode 100644
index 9cead7f3..00000000
--- a/src/document/commands/web.dream/start.shy
+++ /dev/null
@@ -1,4 +0,0 @@
-chapter "start 启动空间"
-
-section "start 启动空间"
-
diff --git a/src/document/community/content.shy b/src/document/community/content.shy
new file mode 100644
index 00000000..b4ea2d45
--- /dev/null
+++ b/src/document/community/content.shy
@@ -0,0 +1,2 @@
+spark `shylinux@163.com`
+
diff --git a/src/document/content.shy b/src/document/content.shy
index 9976c6a7..c09f7afd 100644
--- a/src/document/content.shy
+++ b/src/document/content.shy
@@ -4,16 +4,16 @@ style flex
spark title "一个功能完备的工具系统"
order `
以模块化的方式,将编辑器、命令行、数据库、编译器等几百种工具,高度集成到一个 20M 的程序文件中。
-可一键部署到各种机器上,并快速启动很多个工作空间,以集群化的方式,将这些设备与空间高度组织到一起。
-每个工具都有自己的网页界面,以自己的数据逻辑将其它所有的工具与空间,组织到一个界面中,高效的完成各种工作。
+一键部署到各种机器上,快速启动很多个工作空间,以集群化的方式,将这些空间、设备高度组织到一起。
+每个工具都有网页界面,以自己的数据逻辑将其它所有的工具与空间,组织到自己的界面中,高效的完成各种工作。
`
style flex
- spark button "Get Started" route "started/"
- spark button "Get Download" route "download/"
+ spark button "Get Download" route "download/" style.background blue style.color white
+ spark button "Get Started" route "started/" style.background blue style.color white
style end
style end
- style column
- field "" web.code.inner style output width 500px
+ style column flex "0 0 460px" overflow hidden
+ spark inner src/main.go width 420px
shell `
mkdir -p demo/src; cd demo
vi src/main.go
@@ -23,7 +23,7 @@ go get shylinux.com/x/ice
go run src/main.go
open http://localhost:9020
-` style.width 500px
+`
style end
style end
@@ -37,15 +37,15 @@ spark `一款网页版的命令行,打开网页即可随时随地的敲命令
无论这些命令是运行在本机,还是远程,还是任何虚拟的空间,无论是内存还是磁盘。`
field "命令行" web.code.xterm args "ish"
+spark title "计划表"
+spark `一款网页版的任务计划表,打开网页即可随时随地的安排时间与任务。`
+field "计划表" web.team.plan
+
spark title "电脑桌面"
spark `一款网页版的电脑桌面,打开网页即可随时随地的使用各种软件,
无论这些软件是运行在本机,还是远程,还是任何虚拟的空间,无论是内存还是磁盘。`
field "电脑桌面" web.chat.macos.desktop style output
-spark title "计划表"
-spark `一款网页版的行程计划表,打开网页即可随时随地的安排时间与任务`
-field "计划表" web.team.plan
-
spark title "绘图工具"
spark `一款网页版的绘图工具,打开网页即可随时随地的画图,
无论这些文件是保存在本机,还是远程,还是任何虚拟的空间,无论是内存还是磁盘。`
diff --git a/src/document/development/contexts/icebergs/boot.shy b/src/document/development/contexts/icebergs/boot.shy
new file mode 100644
index 00000000..922bf17f
--- /dev/null
+++ b/src/document/development/contexts/icebergs/boot.shy
@@ -0,0 +1,33 @@
+title "启动流程"
+spark `总体来说分为四个阶段,init、ice.Frame.Begin、ice.Frame.Start、ice.Frame.Close。`
+spark `init,模块注册期。按照引入的顺序依次将每个模块,注册到某个父模块中。`
+spark `ice.Frame.Begin/c.Merge,模块合并期。全局资源的创建,模块的合并,参数的解析,生成初始化函数。`
+spark `ice.Frame.Start,框架启动期。加载配置与数据,每个模块依次初始化,执行初始化脚本 init.shy。`
+spark `ice.Frame.Close,框架退出期。执行退出脚本 exit.shy,每个模块依次退出,保存配置与数据。`
+
+chain `
+ice.bin
+ init
+ ice.Cmd
+ Index.MergeCommands
+ ice.Run
+ ice.Frame.Begin
+ c.Merge
+ log.Frame.Begin
+ gdb.Frame.Begin
+ ssh.Frame.Begin
+ ice.Frame.Start
+ ice.init
+ ice._init
+ "source etc/init.shy"
+ log.Frame.Start
+ gdb.Frame.Start
+ ssh.Frame.Start
+ "web.serve start"
+ ice.Frame.Close
+ "source etc/exit.shy"
+ ice._exit
+ log.Frame.Close
+ gdb.Frame.Close
+ ssh.Frame.Close
+`
diff --git a/src/document/development/contexts/message/format.shy b/src/document/development/contexts/message/format.shy
new file mode 100644
index 00000000..99fe73db
--- /dev/null
+++ b/src/document/development/contexts/message/format.shy
@@ -0,0 +1,3 @@
+title "message"
+spark `无论是前端框架还是后端框架,无论是本地调用还是远程调用,都是使用统一的消息格式。`
+spark ``
diff --git a/src/document/started/development/demo.go b/src/document/development/create/demo.go
similarity index 77%
rename from src/document/started/development/demo.go
rename to src/document/development/create/demo.go
index 5ba0a889..9c9b2a75 100644
--- a/src/document/started/development/demo.go
+++ b/src/document/development/create/demo.go
@@ -3,7 +3,7 @@ package demo
import "shylinux.com/x/ice"
type demo struct {
- list string `name:"list name auto" help:"示例模块"`
+ list string `name:"list path auto" help:"示例模块"`
}
func (s demo) List(m *ice.Message, arg ...string) {
diff --git a/src/document/development/create/main.go b/src/document/development/create/main.go
new file mode 100644
index 00000000..32b440e2
--- /dev/null
+++ b/src/document/development/create/main.go
@@ -0,0 +1,11 @@
+package main
+
+import (
+ "shylinux.com/x/ice"
+ _ "shylinux.com/x/icebergs/misc/alpha"
+ _ "shylinux.com/x/icebergs/misc/chrome"
+ _ "shylinux.com/x/icebergs/misc/java"
+ _ "shylinux.com/x/icebergs/misc/node"
+)
+
+func main() { print(ice.Run()) }
diff --git a/src/document/development/create/main.js b/src/document/development/create/main.js
new file mode 100644
index 00000000..83c1ef94
--- /dev/null
+++ b/src/document/development/create/main.js
@@ -0,0 +1,17 @@
+Volcanos({river: {
+ product: {name: "产品群", icon: "bi bi-bar-chart-line-fill", storm: {
+ office: {name: "办公 office", icon: "bi bi-bar-chart-line-fill", index: ["web.wiki.portal", "web.chat.macos.desktop", "web.wiki.feel", "web.wiki.draw", "web.wiki.data"]},
+ }},
+ project: {name: "研发群", icon: "bi bi-git", storm: {
+ studio: {name: "研发 studio", icon: "bi bi-git", index: ["web.code.vimer", "web.code.git.status", "web.chat.favor", "web.team.plan", "web.wiki.word"]},
+ }},
+ profile: {name: "测试群", icon: "bi bi-list-columns", type: aaa.TECH, storm: {
+ release: {name: "发布 release", icon: "bi bi-list-check", index: ["web.code.compile", "web.code.publish", "web.code.pprof", "web.code.bench", "web.dream", "web.space", "web.code.git.service", "web.code.git.status"]},
+ }},
+ operate: {name: "运维群", icon: "bi bi-gear", type: aaa.TECH, storm: {
+ web: {name: "应用 web", icon: "bi bi-browser-chrome", index: ["broad", "serve", "space", "dream", "share"]},
+ aaa: {name: "权限 aaa", icon: "bi bi-people-fill", index: ["offer", "email", "user", "totp", "sess", "role"]},
+ cli: {name: "系统 cli", icon: "bi bi-windows", index: ["qrcode", "daemon", "runtime", "cli.procstat", "cli.procinfo", "mirrors", "signal", "timer", "routine", "log.debug"]},
+ nfs: {name: "文件 nfs", icon: "bi bi-server", index: ["dir", "cat", "tar", "pack", "tail", "trash", "server", "host", "port"]},
+ }},
+}, list: ["/require/modules/bootstrap-icons/font/bootstrap-icons.min.css"]}) // https://icons.getbootstrap.com/
diff --git a/src/document/development/create/module.shy b/src/document/development/create/module.shy
new file mode 100644
index 00000000..d0e6d25b
--- /dev/null
+++ b/src/document/development/create/module.shy
@@ -0,0 +1,133 @@
+title "创建模块"
+spark `如果框架自带的模块满足不了需求,并且网上找不到现成的功能模块,可使用 Contexts 提供的框架与工具,快速开发出新的功能模块。
+Contexts 添加模块也非常简单,就是在 init 函数里,用命令名加一个结构体,调用 ice.Cmd() 注册到框架即可。`
+
+chapter `创建模块`
+spark `如下创建目录,并添加代码。将目录名与文件名中的 demo 替换成自己所需的模块名。`
+shell `
+mkdir src/demo/
+vi src/demo/demo.go
+`
+spark inner demo.go
+spark `ice.Cmd() 函数会通过反射,查找结构体的方法列表与属性列表,生成模块并注册到框架中。
+只有参数是 (*ice.Message, ...string) 的方法,才会注册到模块中,并且通过同名属性的 tag,来定义接口的参数与其它信息。
+所以,所有的后端接口,第一个参数都是 ice.Message, 第二个参数是根据同名属性的 tag,解析出来的参数列表 arg 。`
+
+spark `例如,这里的 List 方法与 list 属性。通过读出属性 list 的 tag, 解析 name 字段 list path auto
,来生成接口参数,
+其中 list 指定接口名,path 指定第一个参数名,auto 指定需要自动生成两个按钮。所以在自动生成的前端界面上,参数栏,有一个输入框名为 path,有两个按钮 list 与 back。
+在后端接收到请求时,参数 path 的值,就会放到 arg[0] 中。
+`
+spark `如果 list 的 tag 是 name:"list path file line auto"
,
+那么在自动生成的前端界面上,就会有三个输入框,名称依次为 path、file、line。
+后端接收到的请求时,arg[0] 就是 path 的值,arg[1] 就是 file 的值,arg[2] 就是 line 的值。
+`
+spark `另外,工具的标题栏是 demo(示例模块)
,就是从属性 list 的 tag 中, 取的 help 与 从 ice.Cmd() 第一个参数中取的命令名。`
+
+section "struct tag 语法"
+spark `Contexts 会根据属性的 tag,自动生成前端界面。tag 的完整语法是 name:type=value@script
。
+如 list 的 tag 完整定义是 name:"list path:text=src/@key.js auto"
,其中 path 是参数名,另外三个字段如下`
+order `
+:号后面,是参数的类型,text 是文本输入框,select 是下拉选择框,button 是按钮。
+=号后面,是参数的初始值,如果参数的类型是select,参数值用逗号 ,
分隔多个参数。
+@号后面,是前端插件,可以用指定的脚本,自定义这个输入控件的交互,如 key.js、date.js。
+`
+spark `这三个字段都是可以选的,如 path:text
、path=src/
、path:text=src/
,都是可正常解析的。
+需要注意的是,中间不能有任何空格和空值,否则就是两个参数了,如 path :text
、path:=src/
都是非法的。
+`
+
+chapter "ice.Message 消息"
+spark `在 Contexts 中,不论是后端模块,还是前端模块,不论是本地调用,还是远程调用,都是统一的由消息驱动。
+所以 ice.Message 提供了丰富的接口。这里简单介绍几个最常用的接口。`
+
+section "获取参数"
+spark `除了接口定义的参数 arg,还可以调用 m.Option(),获取更丰富的参数。`
+spark `如下,可以获取用户的相关信息。`
+spark inner `
+m.Option(ice.MSG_USERNAME)
+m.Option(ice.MSG_USERROLE)
+m.Option(ice.MSG_USERNICK)
+`
+
+section "获取配置"
+spark `Contexts 还提供了统一的模块配置。这些配置可以在启动文件 ./etc/init.shy 中设置,也可以在运行时读写,
+服务进程退出前,会把这些配置保存到磁盘中,服务重启时,会再加载到内存,所以这些配置会一直有效。`
+spark inner `
+m.Config("short")
+m.Config("field")
+`
+
+section "返回数据"
+spark `ice.Message 最常用的返回数据有两种,一种是表格类的,一种是文本类的。`
+spark `如下调用 m.Echo,就会在自动生成的前端界面上,输出纯文本 hello world
。`
+spark inner `m.Echo("hello world")`
+spark `如下调用 m.Push,就会在自动生成的前端界面上,输出一个表头为 path 和 file ,并且有两行数据的表格。`
+spark inner `
+m.Push("path, "src/").Push("file", "main.go")
+m.Push("path, "etc/").Push("file", "init.shy")
+`
+spark `还可以用 m.StatueTimeCount() 指定在前端界面上状态栏里展示的信息。`
+spark inner `m.StatusTimeCount()`
+
+section "模块调用"
+spark `Contexts 所有的功能都是模块化的,每个模块都可以独立编译,不依赖于其它模块。
+所以要想使用其它模块的功能,是不能直接通过函数调用。后端框架封装了几个模块间调用的接口。`
+spark `如下,查看 src/ 目录下的文件列表,m.Cmdy() 调用了命令 "nfs.dir",指定了参数 "src/"。`
+spark inner `m.Cmdy("nfs.dir", "src/")`
+
+spark `模块的每次调用都会创建一个新的消息,所以如何合并父消息和子消息的数据,就可以调用不同的接口,m.Cmd()、m.Cmdx()、m.Cmdy()。`
+spark `如下,m.Cmd() 调用 tcp.host 命令,但不会将子消息的数据复制到父消息,而是用 msg 保存了子消息,以便之后处理。`
+spark inner `msg := m.Cmd("tcp.host")`
+
+spark `如下,m.Cmdx() 调用 cli.system 命令,去执行本机命令 pwd,然后将命令返回的文本数据返回赋值给变量 pwd。`
+spark inner `pwd := m.Cmdx("cli.system", "pwd")`
+
+spark `如下,m.Cmdy() 调用 tcp.host 命令,然后将 tcp.host 命令返回的数据,全部复制到当前消息。`
+spark inner `m.Cmdy("tcp.host")`
+
+section "前端脚本"
+spark `Contexts 自动生成的前端界面,默认是使用前端框架 Volcanos 中的 /plugin/table.js 来渲染的界面。可以通过 m.Display() 指定任意 js 文件,来渲染前端界面。`
+shell `
+m.Display("/plugin/table.js")
+m.Display("/plugin/story/trend.js")
+`
+spark `还可以在当前模块下,添加一个前端的脚本文件。例如,添加了 src/demo/demo.js,只需要如下引入即可。`
+shell `m.Display("demo.js")`
+
+
+chapter `添加模块`
+spark `模块创建后,需要在 src/main.go 中引入,然后编译一下项目,重启服务即可。`
+spark inner `
+package main
+
+import (
+ "shylinux.com/x/ice"
+
+ _ "demo/src/demo"
+)
+
+func main() { print(ice.Run()) }
+`
+
+chapter `添加资源`
+section "添加配置"
+spark `Contexts 提供了统一的配置管理。在 ./etc/init.shy 文件中添加模块所需的配置即可。`
+spark `如下定义配置,用 config 命令设置 web.code.demo 命令的 expire 配置。`
+spark inner `config web.code.demo meta.expire 30s`
+spark `需要注意的是 expire 前面有个前缀 meta。其实 config 为每个模块,定义了一个完整的数据库,config 不仅可以读写配置,还可以读写数据,所以 meta 前缀代表配置,其它的前缀还有 hash、list 等。`
+
+spark `当同一模块下的配置比较多时,可以先用 ~web.code
切换到 code 模块下,就可以省略命令前缀。`
+spark inner `
+~web.code
+ config demo meta.expire 30s
+ config compile meta.env "GOBIN=xxx,GOPATH=xxx,GOROOT=xxx"
+`
+
+spark `在代码中,就可以取到此配置了。`
+spark inner `m.Config("expire")`
+
+section "添加模板"
+spark `Contexts 提供了统一的模板管理。在 ./src/template/ 目录中添加模块所需的模板即可。`
+
+section "添加文档"
+spark `Contexts 提供了统一的文档管理。在 ./src/document/ 目录中添加模块所需的文档即可。`
+
diff --git a/src/document/development/create/project.shy b/src/document/development/create/project.shy
new file mode 100644
index 00000000..c1d3e82c
--- /dev/null
+++ b/src/document/development/create/project.shy
@@ -0,0 +1,74 @@
+title "创建项目"
+spark `当 Contexts 自带的软件工具,无法满足使用需求时,可使用 Contexts 提供的框架与工具,快速创建出新的项目。`
+
+chapter "创建项目"
+spark `Contexts 提供了后端框架 shylinux.com/x/ice
,只需要通过 import 引入依赖,并调用 ice.Run() 即可启动框架。`
+section "初始化"
+spark `先取好一个项目名,并用项目名创建一个新的目录,将这里的 demo 换成自己的项目名即可,并初始化成 golang 的项目 。`
+shell `
+mkdir demo; cd demo
+go mod init demo
+`
+
+section "添加代码"
+spark `添加 src/main.go,并输入以下代码。`
+shell `
+mkdir src
+vi src/main.go
+`
+spark inner `
+package main
+
+import "shylinux.com/x/ice"
+
+func main() { print(ice.Run()) }
+`
+
+section "编译构建"
+spark `下载框架,并编译项目。`
+shell `
+go get shylinux.com/x/ice
+go build -v -o bin/ice.bin src/main.go
+`
+
+section "启动服务"
+spark `服务启动后,也会启动一个交互式的 shell,可以通过命令或信号进行各种操作。`
+shell `./bin/ice.bin forever start`
+order `
+Ctrl + C 重启服务。
+Ctrl + \\ 退出服务。
+exit 命令, 保存数据,并退出服务。
+quit 命令,不保存数据,直接退出服务。
+`
+
+section "访问服务"
+spark `Contexts 的后端框架,默认添加了很多功能模块,开箱即用,如下列表。`
+refer `
+首页 http://localhost:9020/
+官网 http://localhost:9020/wiki/portal/
+后台 http://localhost:9020/chat/portal/
+桌面 http://localhost:9020/chat/cmd/desktop
+文档 http://localhost:9020/chat/cmd/word
+编辑器 http://localhost:9020/chat/cmd/vimer
+`
+
+chapter "添加模块"
+spark `Contexts 所有功能都是模块化的,只需要通过 import 引入即可。每个模块启动时都会通过 init 函数,将自己的功能注册到框架中。`
+spark `如果从网上找到了现成的功能模块,直接引入即可。 如下所示,通过 import 添加了四个功能模块。然后编译项目并重启服务即可。`
+spark inner main.go
+
+chapter "管理系统"
+spark `Contexts 提供了前端框架 https://shylinux.com/x/volcanos
,前端也实现了功能模块化,并且由后端驱动。
+Contexts 默认会自带一个后台管理系统,并且可以随时定制化,将任意的软件工具添加到导航栏、搜索栏等。`
+
+section "导航栏"
+spark `后台管理系统,就是用 src/main.js 构建的。新添加的功能模块,如果需要添加到管理系统的导航栏,直接修改 src/main.js 文件即可,代码如下。`
+spark inner main.js
+
+section "搜索栏"
+spark `将新功能添加到搜索栏。打开搜索框,在输入关键字前,会提前展示一些内容。`
+
+chapter "命令网页"
+spark `新添加的功能模块,默认的就会有一个独立的网页展示。地址就像 http://localhost:9020/chat/cmd/vimer,其中 cmd 后面就是工具的名称。
+这样就可以通过 URL 很快的打开任意的软件工具,直接快速的使用功能。
+`
diff --git a/src/document/development/index.shy b/src/document/development/index.shy
new file mode 100644
index 00000000..47164ecb
--- /dev/null
+++ b/src/document/development/index.shy
@@ -0,0 +1,24 @@
+navmenu `
+"功能开发" create/
+ "创建项目" project.shy
+ "创建模块" module.shy
+
+"框架原理" contexts/
+ "后端框架" icebergs/
+ "启动流程" boot.shy
+ "模块注册" merge.shy
+ "事件消息" event.shy
+ "远程调用" space.shy
+ "前端框架" volcanos/
+ "加载流程" boot.shy
+ "模块注册" merge.shy
+ "事件消息" event.shy
+ "请求数据" space.shy
+
+"框架接口" interface/
+ "后端框架" icebergs/
+ ice ice.shy
+ Context ctx.shy
+ Message msg.shy
+ "前端框架" volcanos/
+`
diff --git a/src/document/development/interface/icebergs/msg.shy b/src/document/development/interface/icebergs/msg.shy
new file mode 100644
index 00000000..71e6b909
--- /dev/null
+++ b/src/document/development/interface/icebergs/msg.shy
@@ -0,0 +1,2 @@
+title "ice.Message"
+spark `ice.Message 是 Contexts 是核心的结构体。`
diff --git a/src/document/download/content.shy b/src/document/download/content.shy
index acc487b8..6800f5fc 100644
--- a/src/document/download/content.shy
+++ b/src/document/download/content.shy
@@ -1 +1,7 @@
+chapter "快速下载"
+spark `复制如下命令,并在终端执行,即可下载应用并启动服务。`
web.code.publish contexts
+
+chapter "自由下载"
+spark `Contexts 使用 Golang 开发,支持交叉编译。各平台与架构的下载链接如下。`
+web.code.publish version
diff --git a/src/document/index.shy b/src/document/index.shy
index ceca0614..f10a287e 100644
--- a/src/document/index.shy
+++ b/src/document/index.shy
@@ -1,13 +1,13 @@
navmenu `
"Contexts" /
_
-"GET STARED" started/
-"DOCS" docs/
-"COMMANDS" commands/
-"RESOURCES" resources/
-"COMMUNITY" community/
-"DOWNLOAD" download/
-"SUPPORT" support/
+"下 载" download/
+"文 档" started/
+"命 令" commands/
+"开 发" development/
+"资 源" resources/
+"社 区" community/
+"支 持" support/
+_
_
-"Login" /chat/portal/
`
diff --git a/src/document/resources/content.shy b/src/document/resources/content.shy
new file mode 100644
index 00000000..d5c8c0e9
--- /dev/null
+++ b/src/document/resources/content.shy
@@ -0,0 +1,6 @@
+title "resources"
+spark `Contexts 是一个工具系统,基于 Contexts 可以开发出更多的工具系统。
+这些工具系统,既可以直接下载编译单独使用,也可以在自己的工具系统,通过 import 引入这些依赖库,丰富自己的功能。`
+
+source mysql.shy
+source redis.shy
diff --git a/src/document/resources/mysql.shy b/src/document/resources/mysql.shy
new file mode 100644
index 00000000..768a6e38
--- /dev/null
+++ b/src/document/resources/mysql.shy
@@ -0,0 +1,13 @@
+chapter "mysql-story"
+brief `基于 Contexts 开发的,Mysql 管理工具,包括客户端、安装器、集群管理工具等。`
+table `
+模块 命令 功能
+shylinux.com/x/mysql-story/src/client web.code.mysql.client Mysql的客户端
+shylinux.com/x/mysql-story/src/client web.code.mysql.query Mysql的数据查询
+shylinux.com/x/mysql-story/src/client web.code.mysql.grant Mysql的权限管理
+shylinux.com/x/mysql-story/src/server web.code.mysql.server Mysql的下载、编译、安装
+`
+shell `
+git clone https://shylinux.com/x/mysql-story
+cd mysql-story; source etc/miss.sh
+`
diff --git a/src/document/resources/redis.shy b/src/document/resources/redis.shy
new file mode 100644
index 00000000..e362b603
--- /dev/null
+++ b/src/document/resources/redis.shy
@@ -0,0 +1,12 @@
+chapter "redis-story"
+brief `基于 Contexts 开发的,Redis 管理工具,包括客户端、安装器、集群管理工具等。`
+table `
+模块 命令 功能
+shylinux.com/x/redis-story/src/client web.code.redis.client Redis的客户端
+shylinux.com/x/redis-story/src/server web.code.redis.server Redis的下载、编译、安装
+shylinux.com/x/redis-story/src/cluster web.code.redis.cluster Redis的集群部署与管理工具
+`
+shell `
+git clone https://shylinux.com/x/redis-story
+cd redis-story; source etc/miss.sh
+`
diff --git a/src/document/started/about/introduction.shy b/src/document/started/about/introduction.shy
index 99afe3e1..0489e51f 100644
--- a/src/document/started/about/introduction.shy
+++ b/src/document/started/about/introduction.shy
@@ -1,12 +1,13 @@
title "Contexts"
-
spark `Contexts 是一个功能完备的工具系统。`
order `
Contexts 是一个工具箱,内置了很多实用的软件工具,开箱即用,每个工具既可以在命令行中使用,又可以在网页中使用。
Contexts 是一个工具框架,成千上万种工具,可以自由选择和组合,可快速构建自己专属的工具系统。
+Contexts 是一个文档系统,所有软件工具,都可以在笔记文档中直接引用,通过纯文本,就能快速创建出丰富的网页与网站。
+Contexts 是一个编辑器框架,所有的软件工具,都可以在编辑器中直接使用,支持语法高亮、补全、跳转、模板,支持语法模块的动态扩展。
Contexts 是一个开发工具箱,集成了开发软件常用的工具,如编辑器、编译器,完全实现自举,可快速开发出新软件工具。
-Contexts 是一个微服务框架,支持远程调用,支持分布式、支持自动组建集群。
+Contexts 是一个微服务框架,支持远程调用,支持分布式部署、支持自动化组建集群。
Contexts 使用 Golang 开发,完全跨平台,支持 Linux、macOS、Windows 等,一套工具箱,所有平台都可以使用。
-Contexts 构建完成后只有一个文件,只有 20M 大小,方便传输与存储。
+Contexts 构建完成后只有一个 bin 文件,只有 20M 大小,方便传输与存储。
Contexts 支持脚本、支持模板、支持内存版文件系统、支持内存版数据库,可以快速开发出一个完整的服务端应用。
`
diff --git a/src/document/started/development/main.go b/src/document/started/development/main.go
deleted file mode 100644
index 4642ca19..00000000
--- a/src/document/started/development/main.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package main
-
-import (
- "shylinux.com/x/ice"
- _ "shylinux.com/x/icebergs/misc/alpha"
-)
-
-func main() { ice.Run() }
diff --git a/src/document/started/development/module.shy b/src/document/started/development/module.shy
deleted file mode 100644
index 6e7e90c6..00000000
--- a/src/document/started/development/module.shy
+++ /dev/null
@@ -1,11 +0,0 @@
-chapter "创建模块"
-spark `如果框架自带的模块,或是网上找不到需要的功能模块,可以自行开发。Contexts 自带了完整的前后端框架与工具,可快速开发出完整的功能模块。`
-
-section "添加代码"
-spark `将 demo 替换成所需的模块名,创建目录并添加如下代码。`
-shell `
-mkdir src/demo/
-vi src/demo/demo.go
-`
-spark inner src/document/started/development/demo.go
-
diff --git a/src/document/started/development/project.shy b/src/document/started/development/project.shy
deleted file mode 100644
index 480e19c4..00000000
--- a/src/document/started/development/project.shy
+++ /dev/null
@@ -1,41 +0,0 @@
-title "创建项目"
-
-spark `当 Contexts 自带的工具,无法满足使用需求时,可以基于 Contexts 快速创建出新的项目。
-
-`
-chapter "创建项目"
-section "初始化项目"
-spark `根据项目名,创建一个新目录,将这里的 demo 换成自己的项目名,并初始化项目。`
-shell `
-mkdir demo
-cd demo
-go mod init demo
-`
-
-section "添加代码"
-spark `添加 main.go,并输入以下内容。`
-shell `
-mkdir src
-vi src/main.go
-`
-
-spark inner `
-package main
-
-import "shylinux.com/x/ice"
-
-func main() { ice.Run() }
-`
-
-section "编译构建"
-spark `添加依赖并编译`
-shell `
-go get shylinux.com/x/ice
-go build -o bin/ice.bin src/main.go
-`
-
-chapter "添加模块"
-spark `Contexts 所有功能,都是模块化开发。所以完全独立,可自由的组合与选择。只需要在需要的地方 import 一下即可,自动加载与注册。如下添加英汉词典的模块。`
-
-spark inner src/document/started/development/main.go
-
diff --git a/src/document/started/index.shy b/src/document/started/index.shy
index 7399c8a3..b4dedc7d 100644
--- a/src/document/started/index.shy
+++ b/src/document/started/index.shy
@@ -1,7 +1,7 @@
navmenu `
-"About" about/
- Introduction introduction.shy
- License license.shy
+"关于" about/
+ "简介" introduction.shy
+ "授权" license.shy
"下载安装" install/
"快速下载" quick.shy
@@ -14,12 +14,14 @@ navmenu `
"基础功能" using/
"编辑器" vimer.shy
- "任务计划" plan.shy
+ "代码库" repos.shy
"笔记文档" note.shy
+ "任务计划" plan.shy
"应用桌面" desktop.shy
"创建空间" space.shy
"组建集群" cluster.shy
"认证授权" auth.shy
+ "共享链接" share.shy
"应用管理" managing/
"目录结构" dir.shy
@@ -30,14 +32,4 @@ navmenu `
"进程控制" signal.shy
"数据目录" var.shy
"资源目录" usr.shy
-
-"功能开发" development/
- "创建项目" project.shy
- "创建模块" module.shy
-
-"架构原理" development/
- "启动流程" config.shy
- "事件消息" config.shy
- "模块注册" config.shy
- "远程调用" config.shy
`
diff --git a/src/document/started/install/manual.shy b/src/document/started/install/manual.shy
index 797a7f0b..372e69b5 100644
--- a/src/document/started/install/manual.shy
+++ b/src/document/started/install/manual.shy
@@ -1,7 +1,7 @@
title "手动下载"
-spark `如果有其它需要,如下载不同系统或不同架构的 bin 文件,可手动下载。如下,使用 wget 或 curl 命令,下载所需 bin 文件。
+spark `如果有其它需要,例如下载不同系统或不同架构的 bin 文件,可手动下载。如下,使用 wget 或 curl 命令,下载所需的 bin 文件。
其中 linux 替换成所需系统名如 darwin、windows 等,amd64 替换成所需的架构名如 x86、arm 等`
-web.code.publish binary
+web.code.publish manual
spark `添加执行权限,并重命名文件。`
shell `
chmod u+x ice.linux.amd64
diff --git a/src/document/started/install/quick.shy b/src/document/started/install/quick.shy
index 6156c1ad..cdb9874a 100644
--- a/src/document/started/install/quick.shy
+++ b/src/document/started/install/quick.shy
@@ -1,10 +1,11 @@
title "快速下载"
-spark `Contexts 使用 Golang 开发,所以编译后只有一个 bin 文件,直接下载即可使用。`
+spark `Contexts 使用 Golang 开发,所以编译后只有一个 bin 文件,直接下载执行即可。`
spark `为了方便下载并快速启动,可以使用如下命令。
自动选择 wget 或 curl 命令,
自动识别出操作系统与处理器类型,下载对应的 bin 文件,并自动启动服务。`
-spark `点击下面命令,即可直接复制命令,打开终端执行即可。`
+spark `点击下面命令,即可直接复制,打开终端执行即可。`
web.code.publish contexts
spark warning `Contexts 有组建集群的功能,为了快速组建集群,这条命令也带了连接远程服务器的功能。`
-spark warning `如果远程服务器是自己搭建的,或是可信的服务,可直接执行。`
-spark warning `或通过配置文件,设置远程服务的权限。或直接在上面命令后面加上参数 dev ""
直接禁用远程服务。`
+spark warning `如果远程服务器是自己搭建的,或是可信的服务,直接执行。`
+spark warning `如果不可信,可以通过配置文件,设置远程服务器访问本机的权限。
+或直接在前面命令后加上参数 dev ""
直接禁用远程服务。`
diff --git a/src/document/started/install/source.shy b/src/document/started/install/source.shy
index 11c2b2e4..968d42cf 100644
--- a/src/document/started/install/source.shy
+++ b/src/document/started/install/source.shy
@@ -1,5 +1,5 @@
title "源码编译"
-spark `如果想了解 Contexts 的源码与原理,可以直接下载项目源码,自己编译后再启动。编译 Contexts 需要提前安装好以下几个软件`
+spark `如果想了解 Contexts 的源码与原理,可以直接下载项目所有源码,自己编译后再启动。编译 Contexts 需要提前安装好以下几个软件`
refer `
make https://www.gnu.org/software/make/
git https://git-scm.com/download
@@ -7,15 +7,11 @@ golang https://golang.google.cn/dl/
`
web.code.publish source
spark `执行 etc/miss.sh
脚本,会自动下载所需要的依赖,并编译项目。`
-shell `
-cd contexts
-source etc/miss.sh
-`
chapter "项目组成"
-spark `Contexts 前后端框架和核心模块全部自研,只有少部分功能使用到了外部代码,并且随时会干掉,最终不依赖任何外部项目,做到完全自举。`
+spark `Contexts 前后端框架和核心模块全部自研,只有少部分功能使用到了外部代码,并且随时会被干掉,最终不依赖于任何外部项目,做到完全自举。`
-section "项目组成"
+section "核心项目"
spark `Contexts 主要由以下几个项目组成。`
order `
前端框架 https://shylinux.com/x/volcanos
diff --git a/src/document/started/interfaces/cli.shy b/src/document/started/interfaces/cli.shy
index 1b7c2383..361c29f4 100644
--- a/src/document/started/interfaces/cli.shy
+++ b/src/document/started/interfaces/cli.shy
@@ -1,5 +1,5 @@
title "命令交互"
-spark `Contexts 提供了命令接口,所有的功能模块,都可以通过命令行来使用。`
+spark `Contexts 提供了命令接口,所有的软件工具,都可以通过命令行来使用。`
spark `tcp.host 查看网卡信息`
shell `./bin/ice.bin tcp.host` with echo
diff --git a/src/document/started/interfaces/web.shy b/src/document/started/interfaces/web.shy
index 74c4178b..f886a1a8 100644
--- a/src/document/started/interfaces/web.shy
+++ b/src/document/started/interfaces/web.shy
@@ -1,43 +1,66 @@
title "网页交互"
-spark `Contexts 提供了网页接口,所有的功能模块,都可以通过网页来使用。`
+spark `Contexts 提供了网页接口,所有的软件工具,都可以通过网页来使用。`
+spark `在后续的所有文档中,也会使用到本机的 Contexts 服务 http://localhost:9020 来展示一些界面内容。
+为了提升文档的展现效果,建议先安装启动 Contexts 服务后,再查看后续文档。`
chapter "启动服务"
spark `通过网页使用 Contexts 前,需要先启动 web 服务器。Contexts 自带了多种启动方式。`
-section "直接启动"
spark `serve 命令直接启动服务。`
shell `./bin/ice.bin serve start`
-spark `默认的服务端口是 9020,打开 http://localhost:9020 即可通过网页使用所有的功能。`
-spark `服务启动后,会在终端上,启动一个交互式的 shell,可执行任何命令。因为 contexts 不支持密码登录,所以初始用户的权限,可以在终端上分配。`
-section "守护启动"
spark `如果需要进程常驻,可以使用 forever 守护命令。在开发过程中非常有用,每次执行 make 命令进行编译与构建时,都会发送信号自动重启服务进程。
forever 启动守护进程后,才会自动启动服务进程,当服务进程意外停止后,会重新拉起服务。`
shell `./bin/ice.bin forever start`
-section "容器启动"
-spark `Contexts 使用 Golang 开发,完全跨平台,支持 Linux、macOS、Windows 等。
-并且 Contexts 只有一个 bin 文件,运行时生成的所有文件,也只在当前目录。所以只要删除这个目录,就不会在系统上留下任何痕迹。`
-spark `但有时,也会用到容器部署,在容器中,也只需要下载一个 bin 文件即可,惟一的区别是需要登录认证。
-因为 Contexts 默认会开启 IP 认证授权,只有通过本机访问的请求,才会免登录。
-但通过容器启动或远程服务器启动的 Contexts,访问时都需要登录认证。`
+spark `无论哪种启动方式,默认的服务端口是 9020,打开 http://localhost:9020 即可通过网页使用所有的软件工具。`
+spark `服务启动后,会在终端上,启动一个交互式的 shell,可执行任何命令。`
+
+chapter "登录认证"
+spark `如果是在容器或远程服务器上启动的服务,访问时都是需要登录认证的。
+或是本机启动的服务,但在其它设备上访问此服务,也是需要登录认证的。`
+spark `前端网页在检测到没有登录,会展示一个登录页面。可扫码登录,也可以在后台执行命令进行授权登录。
+初始用户只能在后台用命令授权登录,复制二维码下面的授权命令,在后台服务启动的 shell 中执行一下,即可授权登录。`
chapter "使用方式"
-spark `在 Contexts 中,所有的工具,既可以添加到导航栏,通过结构化的组织起来,也可以搜索框被快速查找出来,还可以通过 URL 地址,直接在单独的网页中使用。`
+spark `在 Contexts 中,所有的工具,既可以添加到导航栏里,通过结构化的导航组织起来,也可以通过搜索框被快速查找出来,还可以通过 URL 地址,直接在单独的网页中使用。`
section "导航式"
spark `Contexts 启动后,可直接访问 http://localhost:9020/chat/portal/,即可打开后台管理系统。
-后台管理系统导航栏的内容,都是在 src/main.js 文件中定义的。如需自定义,直接此文件修改即可。
+后台管理系统导航栏的内容,都是在 src/main.js 文件中定义的。如需自定义导航栏的内容,直接修改此文件即可。
Contexts 也提供了界面添加功能,点击创建后,依次添加群组、添加应用、添加工具,即可动态自动定义导航栏。`
iframe "http://localhost:9020"
section "搜索式"
-spark `默认后台管理系统,会提供一个搜索框,所有的工具都可以通过搜索,直接在结果栏中展示,即可快速使用此工具。`
+spark `默认的后台管理系统,会提供一个搜索框,所有的软件工具都可以通过搜索,直接在结果栏中展示,即可实现快速使用此工具。`
iframe "http://localhost:9020?_search=tcp.host"
section "命令式"
-spark `所有的工具可以通过 URL 直接访问使用,如工具 web.team.plan 的 URL 是 http://localhost:9020/chat/cmd/web.team.plan。`
-iframe "http://localhost:9020/chat/cmd/web.team.plan"
+spark `所有的软件工具都可以通过 URL 直接访问使用,如工具 web.team.plan 的 URL 是 http://localhost:9020/chat/cmd/web.team.plan。`
+spark demo plan
+spark `有些软件工具在注册时,会注册一个全局的短名,如 web.team.plan 是全名,plan 就是注册的短名,在使用时,两个完全等价,如在链接地址里
+http://localhost:9020/chat/cmd/web.team.plan 与 http://localhost:9020/chat/cmd/plan 是一样的。
+需要注意的是,并不是所有的工具在注册时,都会注册短名。只有那些比较基础、比较通用的工具,才需要注册短名。`
-chapter "登录认证"
-spark `如果在其它设备上,访问本机的服务,都是需要认证的。前端网页在检测到没有登录,会展示一个登录页面。复制下面的授权命令,在后台执行,即可授权登录。`
+chapter "标准界面"
+spark `在 Contexts 中,所有的软件工具,都是使用同一前端框架,自动生成的前端界面。如果默认的前端界面,无法满足需求,可以随时编写前端模块,自行定义界面。`
+spark `一个标准的工具界面,由标题栏、参数栏、工具栏、工作区、状态栏组成。
+有时为了最大的展示工作区,会将标题栏、参数栏、工具栏,放在一行。`
+spark demo host
+
+section "标题栏"
+spark `标题栏,由工具名与中文名组成。当系统切换成英文版时,会只显示工具名。`
+spark `点击标题栏,会打开一个菜单,对工具界面进行更详情的控制,如切换全屏、切换浮动、打开单独的网页、生成共享链接等。`
+
+section "参数栏"
+spark `在参数栏中,会有输入框、选择框、按钮等输入控件。这些参数,会在刷新时直接传给后端,从而后端根据这些参数,返回不同的数据,然后刷新工作区。`
+
+section "工具栏"
+spark `工具栏与参数很相似,都有一样的输入控件,位置也相邻,都在工作区上面。但区别是,工具栏更偏向于前端交互,不一定会向后端发送请求。但参数栏的交互一般都会发送请求,然后刷新工作区。`
+
+section "状态栏"
+spark `状态栏,在工作区下方,由key 和 value 组成,一般都是一些状态信息、统计信息等。`
+
+section "工作区"
+spark `工作区,在正中间,占据最大的空间。默认的会以表格的形式展示数据,最后一列一般是当前行的操作按钮。点击表头,会对当前列排序。`
+spark `Contexts 的前端框架是 Volcanos,提供了完整的交互与丰富的前端组件。可以在后端代码、或是配置文件中,指定工具界面使用哪个组件展示数据。`
diff --git a/src/document/started/using/auth.shy b/src/document/started/using/auth.shy
index 14679e18..5b727cc8 100644
--- a/src/document/started/using/auth.shy
+++ b/src/document/started/using/auth.shy
@@ -1,24 +1,38 @@
title "认证授权"
-spark `Contexts 有多种认证方式,但就是坚决不支持密码。`
+spark `Contexts 有多种认证方式,但就是坚决不支持密码,因为密码是非常不安全,且会给用户添加很多负担。`
chapter "自动认证"
spark `服务启动时,会自动获取本机的用户名,来作为根用户,从本机发出的所有请求都会默认使用此用户,拥有所有操作的权限。
-所以在浏览器直接访问 http://localhost:9020 是不需要认证,会自动登录。`
-spark `但如果机器是共享机器,是和其它用户共享的,就需要关闭自动认证
-如果启动命令,还在还终端的前台运行,直接中执行 serve domain ""
即可。
-也可以在启动脚本 ./etc/init.shy
或 ./etc/local.shy
中,添加如下两行代码,禁用自动认证。`
+所以在浏览器直接访问 http://localhost:9020 是不需要认证的,会自动登录。`
+spark `但如果机器是共享机器,和其他用户共享的,就需要关闭自动认证。
+在启动脚本 ./etc/init.shy
或 ./etc/local.shy
中,添加如下两行代码,禁用自动认证。`
spark inner `
~web
serve domain ""
` args "etc/local.shy"
chapter "授权认证"
-spark `Contexts 并没有提供密码登录,因为密码是非常不安全,且会给用户添加很多负担。
-所以在其它设备上,访问本机的服务,或是其他用户访问,就需要已经登录的用户来授权认证。`
+spark `当访问其它机器上的 Contexts 服务时,就需要登录认证。`
+order `
+如果在手机上已经登录,直接扫码即可授权电脑登录。
+如果可以访问到后台服务的 shell,直接执行授权命令即可。
+如果是新用户,则需要老用户发送邀请链接,获取登录权限。
+如果是公开平台,则会提供用户注册的功能。
+`
-section `授权登录`
+section "扫码登录"
+spark `当网页被打开时,如果没有登录,则会展示登录界面,目前只支持扫码登录和命令授权登录。用已经登录的手机,扫描二维码,即可授权登录。`
-section `邀请登录`
+section "授权登录"
+spark `后台可以执行授权命令,授权网页登录,在登录界面会生成一个授权命令,复制后,在后台执行一下即可。`
+
+section "邀请登录"
+spark `Contexts 提供了发送邮件的功能,老用户可以发送邀请链接,邀请新用户使用此设备。`
+spark `aaa.offer 命令是发送邀请的工具。点创建,指定用户邮箱和邀请主题,发送即可。`
+spark `http://localhost:9020/chat/cmd/offer`
+
+section "用户注册"
+spark `详情请见 Contexts 搭建的一些公开平台,提供的注册方式。`
chapter "认证中心"
spark `如果服务启动时,连接了远程服务,远程服务节点会自动成为认证中心。
@@ -26,3 +40,5 @@ spark `如果服务启动时,连接了远程服务,远程服务节点会自
所以,在一个集群中的所有设备,只要有一台设备存储用户信息,其它所有设备,都可以实现自动登录。
`
section `远程权限`
+spark `远程服务器上的用户,访问本机服务时,默认会使用远程服务器上权限。
+如果远程服务器是不可信的,可以在启动脚本中配置远程用户的权限,从而将安全风险降低。`
diff --git a/src/document/started/using/cluster.shy b/src/document/started/using/cluster.shy
index 826a43b1..5e48262e 100644
--- a/src/document/started/using/cluster.shy
+++ b/src/document/started/using/cluster.shy
@@ -1,16 +1,29 @@
title "组建集群"
-spark `Contexts 既可以在一台机器上,启动任意多个工作空间。也可以把多台机器组网到一起。在 Contexts 看来,本机的工作空间,与其它设备上的工作空间是没有区别的,使用方式完全一样。`
-spark `因为现在每个人都可能会有很多台电脑,比如笔记本、台式机、开发机、服务器、开发板等,每台设备上的软件都需要下载、安装、配置,还要不断的同步数据,这是一个非常复杂且浪费时间的事情。`
+spark `Contexts 既可以在一台机器上,启动任意多个工作空间。也可以把多台机器组网到一起。
+在 Contexts 看来,本机的工作空间,与其它设备上的工作空间是没有区别的,都可以在同一个网页中无差别的使用。`
+spark `因为现在每个人都可能会有很多台电脑,比如笔记本、台式机、开发机、服务器、开发板等。
+每台设备上的软件都需要下载、安装、配置、升级,还要不断的同步数据,这是一个非常复杂且浪费时间的事情。`
spark `使用 Contexts 就可以很方便的,管理起这么多种设备和软件。只需要构建一个 Contexts 项目,选择自己的工具集合,就可以通过交叉编译,生成各种操作系统上可运行的软件。`
-spark `Contexts 还会自动组网,将所有设备连接到一起。通过任意一台设备,都可以使用其它设备上的所有工具与数据。即使这些设备不在一起,比如公司的电脑和家里的电脑。`
+spark `Contexts 还会自动组网,将所有设备连接到一起。通过任意一台设备,都可以使用其它设备上所有的工具与数据。即使这些设备不在一起,比如公司的电脑和家里的电脑。`
chapter "启动服务"
-spark `Contexts 服务启动时,默认的会启动集群的功能,本机的工作空间与其它机器的连接此服务的方式都是一样,惟一不同中的是,为了安全,子设备的名称是用 IP+Port,如需自定义需要认证授权后才行。`
+spark `Contexts 服务启动时,默认的会启动集群的功能,本机的工作空间与其它机器的服务节点连接此服务节点的方式都是一样,
+惟一不同中的是,为了安全起见,子设备的名称默认是用 IP + Port,如需自定义子设备的节点名,需要子设备提供认证授权的信息才行。`
shell `./bin/ice.bin forever start`
chapter "连接服务"
-spark `在另一台设备上,同样下载好 Contexts,并启动服务,在启动命令后加上参数"dev xxx",指定需要连接的服务节点即可。`
+spark `在另一台机器上,同样下载好 Contexts,并启动服务,在启动命令后加上参数"dev xxx",指定需要连接的服务节点即可。`
shell `./bin/ice.bin forever start dev "http://192.168.10.12:9020"`
+spark `也可以将服务节点的地址添加到环境变量 ctx_dev,启动参数变成 dev dev
。`
+shell `export ctx_dev=http://192.168.10.12:9020`
+shell `./bin/ice.bin forever start dev dev`
+
+spark `一般情况下,集群组建的方式,会在一台设备上下载并启动 Contexts。
+在其它机器,直接从已经启动的 Contexts 服务上,使用快速下载,即可自动组网。`
+spark `因为 Contexts 是一个工具系统,每个用户都有不同的需求,可以将自己的需要的各种软件工具,自行搭配编译成 Contexts。
+每个 Contexts 服务,都是一个完整的服务器,提供网页服务、认证服务、文件服务、代码源、镜像源等。
+所以只要安装好 Contexts 后,就可以为同一网络中的所有机器,提供各种服务,不需要依赖外部网络。
+`
chapter "访问子设备"
spark `当子设备的服务起动成功,并连接上父设备后,就可以把子设备当成父设备的工作空间来使用。`
@@ -21,7 +34,7 @@ iframe "http://localhost:9020/chat/portal/?river=operate&storm=web&index=space"
spark `或在搜索框中,直接搜索 space 即可打开空间管理的工具。搜索结果如果有多个,需要手动选择,点击"ctx command web space"一行,才会打开 space 工具。`
spark `http://localhost:9020?_search=space`
iframe "http://localhost:9020?_search=space"
-spark `或是直接打开命令网页,http://localhost:9020/chat/cmd/web.space`
-iframe "http://localhost:9020/chat/cmd/web.space"
+spark `或是直接打开命令网页,http://localhost:9020/chat/cmd/space`
+spark demo space
spark `在空间列表中,找到新启动的子设备,点击打开,即可进入子空间的管理界面。`
diff --git a/src/document/started/using/demo/image.shy b/src/document/started/using/demo/image.shy
new file mode 100644
index 00000000..686a38f8
--- /dev/null
+++ b/src/document/started/using/demo/image.shy
@@ -0,0 +1,3 @@
+image background.jpg
+video some.mov
+audio some.mp3
diff --git a/src/document/started/using/desktop.shy b/src/document/started/using/desktop.shy
index 75b32f2f..2b22698e 100644
--- a/src/document/started/using/desktop.shy
+++ b/src/document/started/using/desktop.shy
@@ -1,12 +1,22 @@
-title "电脑桌面"
-spark `Contexts 是一个工具系统,内置了很多软件工具。这些工具可以像本机电脑桌面一样,用图标与窗口来使用所有的软件工具。
-web.chat.macos.desktop 工具就是 Contexts 的电脑桌面。`
+title "应用桌面"
+spark `Contexts 是一个工具系统,内置了很多软件工具。这些工具可以像本机电脑桌面一样,用图标与窗口的界面,来使用所有的软件工具。
+web.chat.macos.desktop 命令就是 Contexts 的电脑桌面。`
spark `http://localhost:9020/chat/cmd/desktop`
-field "电脑桌面" web.chat.macos.desktop style output
+field "" web.chat.macos.desktop style output
-spark `在桌面的左上角,可以桌面 + 号,创建很多个新的桌面,每个桌面上可以打开不同的软件工具。打开 dock 工具栏中的 finder 工具,即可查看所有应用列表。`
+chapter "桌面列表"
+spark `Contexts 支持多桌面,可以创建出任意多个桌面。在桌面的左上角,点击 + 号,就可以创建一个新桌面,每个桌面上可以打开不同的软件工具。
+在顶部的菜单栏里就是桌面列表,每个桌面都可以自定义标题。`
+
+chapter "应用列表"
+spark `在桌面的底部,是 dock 工具栏,其中第一个图标是 finder 工具,点击打开,即可查看所有应用列表。`
spark `在 Contexts 中,每个工作空间,都有自己的电脑桌面与应用列表,通过配置文件,可以将任意的工具添加到应用列表中。
-应用列表中的所有应用,可以随时添加到桌面与工具栏中。`
+应用列表中的所有应用,可以随时添加到桌面上与工具栏中。`
-spark `同样的,电脑桌面 web.chat.macos.desktop,只是 Contexts 的一个工具,可以添加到导航栏中,也可以在搜索框中使用,甚于可以内嵌在任何其它工具中使用。`
+chapter "会话管理"
+spark `Contexts 的电脑桌面,支持会话管理。可以将桌面列表、已经打开的应用的窗口状态,保存到一个命名的会话中。
+这样,可以在之后,重新打开会话,恢复所有桌面与窗口的状态。`
+
+chapter "使用方式"
+spark `同样的,电脑桌面 web.chat.macos.desktop,只是 Contexts 的一个小工具,可以添加到管理系统的导航栏中,也可以在搜索框中直接查找,甚于可以内嵌在任何其它工具中使用。`
diff --git a/src/document/started/using/note.shy b/src/document/started/using/note.shy
index fdc7066d..20698e31 100644
--- a/src/document/started/using/note.shy
+++ b/src/document/started/using/note.shy
@@ -2,19 +2,22 @@ title "笔记文档"
brief `web.wiki.word 是 Contexts 用来管理笔记与文档的工具,Contexts 的文档以 .shy 作为文件格式的后缀。
语法也非常简单,就是命令加参数,像命令行一样使用。其中命令就是 Contexts 中的所有的工具名。
所以 Contexts 中的所有工具都可以在文档中直接使用。`
-spark `包括 Contexts 的官网,web.wiki.portal,也只是在 web.wiki.word 上包装了一个布局和路由而已。
+spark `包括 Contexts 的官网 web.wiki.portal,也只是在 web.wiki.word 上包装了一个布局和路由而已。
官网的所有内容也是用 .shy 文档来保存的,其中所有的内容在 web.wiki.word 中也一样显示。
`
-spark `Contexts 的文档不需要单独存放,直接和代码保存在一起,都在 ./src/
目录下,Contexts 在构建时,会根据代码结构,将关联的文档打包进 bin 文件中,以便在运行时随时查看。`
+spark `Contexts 的文档不需要单独存放,直接和代码保存在一起,都在 ./src/
目录下,
+Contexts 在构建时,会根据代码结构,将关联的文档打包进 bin 文件中,以便在运行时随时查看。`
chapter "使用方式"
-spark `同样的,web.wiki.word 工具,也是可以在导航栏中、在搜索栏中、在单独的网页中都能使用,甚至可以被任何其它的工具嵌套使用。如被 web.wiki.portal 嵌套。
-其中 web.wiki.word 的参数栏中,第一个输入框,是文档的文件名,输入需要查看的文档的文件名即可查看此文档。
-在命令网页中,如下添加参数 path 即可指定文档的文件名。`
+spark `同样的,web.wiki.word 工具,也是可以在后台管理系统的导航栏中、在搜索栏中、在单独的网页中都能使用,
+甚至可以被任何其它的工具嵌套使用,如被 web.wiki.portal 嵌套,比如在编辑器中编辑文档时,预览此文档。`
+spark `在 web.wiki.word 的参数栏中,第一个输入框,是文档的文件名,输入需要查看的文档的文件名,即可查看此文档。
+在命令网页中,如下添加参数 path 即可指定文档的文件名,在单独的网页中查看指定的文档。`
spark `http://localhost:9020/chat/cmd/word?path=src/document/started/using/note.shy`
+spark `Contexts 的笔记文档,可以直接生成网站,也可以像 ppt 一样,可以按章节一页页的播放。`
chapter "常用命令"
-spark `其中参数有空格或其它特殊字符,可以加引号,单引号、双引号、反引号,其中反引号中的文字可以跨行。`
+spark `其中参数有空格或其它特殊字符,可以加引号,单引号、双引号、反引号,其中反引号中的文字可以跨多行。`
section "文字类"
spark `文字类的命令很简单,常用的就 title、chapter、section、brief、spark。`
spark inner `
@@ -34,7 +37,7 @@ spark shell "命令文字"
shell "命令文字"
` args "src/ main.shy"
-spark `其中 shell 命令并不一个单独的命令,只是 spark shell 的别名而已。
+spark `其中 shell 命令并不是一个单独的命令,只是 spark shell 的别名而已。
还有 chapter 也是 title chapter 的别名,section 也是 title section 别名。`
section "数据类"
@@ -61,8 +64,5 @@ source src/document/started/using/demo/chain.shy
section "影音类"
spark `影音类的文件,存放在 ./usr/local/image/
目录下。当然参数也可以是一个完整的 URL 地址,直接引用外部的资源文件。`
-spark inner `
-image background.jpg
-video some.mov
-audio some.mp3
-` args "src/ main.shy"
+spark inner src/document/started/using/demo/image.shy
+source src/document/started/using/demo/image.shy
diff --git a/src/document/started/using/plan.shy b/src/document/started/using/plan.shy
index 58e51a7c..9f04a49f 100644
--- a/src/document/started/using/plan.shy
+++ b/src/document/started/using/plan.shy
@@ -2,9 +2,17 @@ title "任务计划"
spark `web.team.plan 是 Contexts 用来管理任务与计划的工具,此外在状态栏中附加了另外三个工具 web.team.todo、web.team.task、web.team.epic `
spark `http://localhost:9020/chat/cmd/plan`
field "" web.team.plan
-spark `web.team.plan 提供了日视图、周视图、月视图、年视图、长视图等,不同的时间维度来展示任务列表。
-双击时间的单元格,即可打开创建任务的对话框。其中 zone 与 name 是必选参数,指定分类与名称。
-单击任务,在任务表的右侧,即可显示出任务详情。`
+
+chapter "视图切换"
+spark `web.team.plan 提供了日视图、周视图、月视图、年视图、长视图等,不同的时间维度来展示任务列表。`
+
+section "创建任务"
+spark `双击时间的单元格,即可打开创建任务的对话框。其中 zone 与 name 是必选参数,指定分类与名称。`
+
+section "任务详情"
+spark `单击任务,在任务表的右侧,即可显示出任务详情。`
+
+chapter "关联工具"
spark `web.team.plan 工具,看上去功能很简单,但却不简单,因为在 Contexts 中,所有的工具,都可以嵌套任何其它工具,甚至子空间、子设备中的所有工具。
给任何一个任务,都可以绑定一个工具。在详情中,点击插件,输入工具名与参数,即可在任务选中时,在时间表下面显示工具,可以直接使用。
所以对于 web.team.plan 来说,它就是一个时间的框架,用时间的维度,将所有的工具显示在时间表中。`
diff --git a/src/document/started/using/repos.shy b/src/document/started/using/repos.shy
new file mode 100644
index 00000000..90d2b353
--- /dev/null
+++ b/src/document/started/using/repos.shy
@@ -0,0 +1,16 @@
+title "代码库"
+spark `Contexts 为了实现功能的完备,代码库和代码源当然是必不可少的功能。`
+spark `Contexts 在启动服务节点时,默认的就已经启动了 Git-Server 代码库服务。支持代码库的创建、上传、下载等功能。
+所以 Contexts 的所有代码,都是存放在 Contexts 启动的服务器上。
+`
+spark `http://localhost:9020/chat/cmd/web.code.git.service`
+spark demo web.code.git.service
+
+chapter "代码库目录"
+spark `Contexts 的代码源,都保存在 ./usr/local/repos/ 目录下`
+
+chapter "代码库权限"
+spark `默认的下载代码是不需要权限,所有人都可以下载代码。
+但上传代码需要权限的,需要用 web.code.git.token 生成令牌,并保存到本地。`
+
+spark `当 web.code.git.service 命令,接收到 receive-pack 请求时,如果代码库不存在,则会自动创建代码库。`
diff --git a/src/document/started/using/space.shy b/src/document/started/using/space.shy
index 1cad8c65..a0387cc4 100644
--- a/src/document/started/using/space.shy
+++ b/src/document/started/using/space.shy
@@ -1,8 +1,9 @@
title "工作空间"
-spark `Contexts 下载并启动后,会以当前运行目录为工作空间,加载启动脚本和保存数据与文件。`
-spark `Contexts 不推荐使用全局的资源或家目录的文件,为了减少全局依赖与资源冲突。从而可以在一台机器上启动任意多个空间。`
-spark `Contexts 推荐使用空间来管理项目与任务。Contexts 每个空间都是一个独立的目录,与独立的守护进程。
-每个空间即可以使用相同的 Contexts,也可以使用不同的 Contexts,即不同的工具集合。因为每个项目内容可能是不一样的,使用的工具也可能是不一样的。`
+spark `Contexts 下载并启动后,会以当前运行目录为工作空间,加载启动脚本和保存数据与文件。
+Contexts 不推荐使用全局的资源或家目录的文件,为了减少全局依赖与资源冲突。从而可以在一台机器上启动任意多个空间。
+Contexts 推荐使用空间来管理项目与任务。`
+spark `Contexts 每个空间都是一个独立的目录,与独立的守护进程。
+每个空间既可以使用相同的 Contexts,也可以使用不同的 Contexts,即不同的工具集合。因为每个项目内容可能是不一样的,使用的工具也可能是不一样的。`
chapter "创建空间"
section "启动服务"
@@ -20,11 +21,11 @@ spark `或在搜索框中,直接搜索 dream 即可打开空间管理的工具
spark `http://localhost:9020?_search=dream`
iframe "http://localhost:9020?_search=dream"
spark `或是直接打开命令网页,http://localhost:9020/chat/cmd/web.dream`
-iframe "http://localhost:9020/chat/cmd/web.dream"
+spark demo dream
section "创建空间"
spark `点击工具栏中的创建按钮,即可打开创建对话框。`
-spark `空间创建有 name、repos、binary、template 四个参数,其中 name 是必选参数,指定项目名,创建空间时,Contexts 会默认给项目名加一个时间前缀。`
+spark `空间创建有 name、repos、binary、template 四个参数,其中 name 是必选参数,指定空间名,创建空间时,Contexts 会默认给空间名加一个时间前缀。`
order `
repos 指定 git 仓库地址,Contexts 将此仓库下载到本地,然后把此目录当成工作空间。
binary 指定 bin 文件,Contexts 会自动下载并使用这个 bin 文件,来启动守护进程。
@@ -38,3 +39,39 @@ spark `空间创建成功后,会自动打开空间首页。之后也可以在
spark `空间打开后,即可在这个空间中,使用任意工具,去完成自己的工作。`
spark `所有的工具产生的数据与文件,也只会保存在自己空间目录下,不会对其它空间有任何影响。`
spark `如果当前空间下的工具,不能满足使用,也可以随时开发,创建新的工具。`
+
+chapter "发布空间"
+spark `Contexts 中的空间,除有独立的目录与进程,用来进行资源隔离和项目管理以外,还有更多的功能特性。`
+spark `虽然工作空间,默认没有分配端口,没有启动任何服务,但是可以通过服务进程作反向代理,将工作空间内的工具、文件、资源对外发布。`
+
+section "服务源"
+spark `Contexts 的工作空间启动后,可以通过服务进程中的空间管理工具来操作。
+也可以在单独网页中使用。例如 redis-story 项目的首页地址是 http://localhost:9020/chat/pod/20230511-redis-story`
+iframe "http://localhost:9020/chat/pod/20230511-redis-story"
+spark `每个工作空间,都可以灵活的配置自己的首页。Contexts 中的所有工具,都有自己的网页界面,都可以作为空间的首页来使用。
+例如 redis-story 项目,就选择 web.code.macos.desktop 命令作为自己的首页,这样打开 redis-story 空间,就是一个电脑桌面,完全用图标和窗口来使用所有工具。`
+
+spark `因为 Contexts 的工作空间,就是一个工作目录加一个守护进程,资源占有非常少,比虚拟机或是容器占有更少的资源。
+Contexts 的工作空间,为项目管理与服务部署,提供了一个更加轻量、更加完备的解决方案。
+`
+spark `每个工作空间下的所有软件工具也可以单独使用。如下地址,pod 和 cmd 分别指定空间名与命令名。`
+spark `http://localhost:9020/chat/pod/20230511-redis-story/cmd/host`
+iframe "http://localhost:9020/chat/pod/20230511-redis-story/cmd/host"
+
+section "镜像源"
+spark `Contexts 使用 Golang 开发,所以具备了交叉编译的功能。Contexts 封装了一个编译工具 web.code.compile,可以方便的将本空间的代码编译成指定系统与架构的程序,并将相关资源一起打包。`
+spark `http://localhost:9020/chat/cmd/compile`
+spark `编译后的程序文件会放到空间目录的 ./usr/publish/ 目录下,通过服务进程作了一个代理,就可以在其它机器,直接下载这个空间的程序文件,并起动任意多个完全相同的空间。`
+spark `这种使用方式,其实就是最快速的 devops,
+原始空间就是开发环境,在其它机器起动的空间就是测试环境或生产环境,
+从开发环境到生产环境,之间所有环节完全打通,甚至可以做到,从开发到上线,只需要一秒钟。并且开发环境与生产环境,完全同时在线,可以实现更快速的闭环互动,全面加速整个研发流程。`
+spark `如果直接用 wget 或 curl 命令,直接访问工作空间的地址,服务进程检测到请求头 UserAgent 判断出是命令行中的请求。则会直接返回空间的程序文件。
+因为 bin 文件中,打包了完整的资源文件,所以这样就可以在另一台设备上,快速部署出一个完全一样的工作空间。这个命令只是简单的下载程序文件,在实际使用时,会从空间中复制一个功能更完整的下载命令。`
+shell `wget http://localhost:9020/chat/pod/20230511-redis-story`
+
+section "代码源"
+spark `每个工作空间,都可以绑定一个代码库,在空间目录下的所有文件,都可以被提交到代码库里,包括代码、配置、数据等。
+不同机器的上工作空间就可以通过代码库,来同步代码与数据,并且记录每次变更的信息。同一台机器上的不同空间,当然也可以共用一个代码库。`
+
+spark `每个空间的地址,可以直接当成代码地址来使用。服务节点,会自动去查询工作空间的仓库地址,做一个内部重定向。`
+shell `git clone http://localhost:9020/chat/pod/20230511-redis-story`
diff --git a/src/document/started/using/vimer.shy b/src/document/started/using/vimer.shy
index e32b1fd0..28b14d69 100644
--- a/src/document/started/using/vimer.shy
+++ b/src/document/started/using/vimer.shy
@@ -1,7 +1,45 @@
title "编辑器"
-spark `作为一个功能完备的工具系统,编辑器是必不少的工具。web.code.vimer 就是 Contexts 自带的编辑器,具有语法高亮、语法模板、语法补全、语法跳转等功能。
+spark `作为一个功能完备的工具系统,编辑器是必不少的工具。
+web.code.vimer 就是 Contexts 自带的编辑器,具有语法高亮、语法模板、语法补全、语法跳转等功能。
web.code.vimer 也是一个编辑器框架,默认已经支持 Contexts 用到的语言 Golang、Javascript、HTML、CSS、sh、shy 等,
如需其它语言,直接添加语法模块即可。`
spark `Contexts 中所有的工具,都可以被当成插件,在编辑器中使用。`
spark `http://localhost:9020/chat/cmd/web.code.vimer`
field web.code.vimer
+
+chapter "目录与文件"
+section "目录结构"
+spark `在 Contexts 中,当前空间的所有的代码和文档都保存在 ./src/ 目录下,但有时会用户外部依赖库,并且根据当前需要去更改依赖库的代码。
+可以使用 web.code.git.repos 命令,来管理这些依赖库。这些依赖库,全部直接保存在 ./usr/ 目录下。
+`
+
+section "工具参数"
+spark `web.code.vimer 最核心的功能,当然是展示目录结构与文件内容。
+所以定义了三个参数 path、file、file。这样 vimer 在使用的地方,就可以通过这三个参数进行控制。
+vimer 也会根据场景有不同的界面。如在命令网页中,vimer 会占据整个网页显示完整的功能。在架构图的工具中使用时,则只展示文件内容。`
+
+section "目录列表"
+spark `在左边导航区,显示目录列表,是由参数 path 指定的目录,加上代码仓库管理工具 web.code.git.repos 返回的代码仓库列表中的目录。
+vimer 也实现了延时加载,默认只加载项目列表与当前目录下的文件列表,只有点击打开了目录,才会请求此目录下的文件列表。`
+
+chapter "语法与插件"
+spark `vimer 在加载文件内容时,会根据文件的扩展名,自动的加载语法插件。`
+
+chapter "预览与输出"
+spark `每种语法的文件,使用方式是不一样的。所以在 vimer 里实现了一种语法引擎的框架,可加载各种语法的模块,并分发各种处理事件。
+每种语法模块,都可以定义当前文件的预览界面与输出界面如何显示。`
+order `
+.shy 的语法模块,就定义了 .shy 的文件预览效果,是生成一个网页来显示文档的效果。
+.go 的语法模块,就会根据文件名,查找出它生成的软件工具,在预览界面中展示此工具。
+.js 的语法模块,也会根据文件名,查找出它关联的后端模块,并在预览界面中展示此工具。
+.html 的语法模块,会直接用文件内容生成一个网页,展示出来。
+`
+
+chapter "模块与插件"
+spark `Contexts 是一个工具系统,内置了大量的软件工具。这些工具既要完全独立,又要能和其它所有工具更深度的配合。这就是为什么 Contexts 要自研前后端框架的动力。`
+spark `Contexts 中的所有前端、后端的各种工具,都可以直接在编辑器中使用。但为了更好的和编辑配合起来,实现更高效的互动,在编辑器的代码添加了很多框架性的功能。
+如编译时 vimer 调用编译工具 web.code.compile 执行编译后,有时会生成一些错误提示信息,这时 vimer 就会根据这些信息实现跳转的功能。
+`
+
+chapter "分屏与按键"
+spark `vim 是一个非常高效且强大的编辑器,所以 Contexts 为了致敬 vim,便将自己的编辑器命名为 vimer,很多编辑器的操作,都是借鉴了 vim 的习惯。`
diff --git a/src/document/support/content.shy b/src/document/support/content.shy
new file mode 100644
index 00000000..9ec48843
--- /dev/null
+++ b/src/document/support/content.shy
@@ -0,0 +1 @@
+spark `shylinux@163.com`
diff --git a/src/template/web.chat.header/light.css b/src/template/web.chat.header/light.css
index a1c48ef8..fb8bdc7e 100644
--- a/src/template/web.chat.header/light.css
+++ b/src/template/web.chat.header/light.css
@@ -25,11 +25,13 @@ body.light {
--float-fg-color:var(--plugin-fg-color);
--float-bg-color:var(--plugin-bg-color);
--carte-bg-color:var(--plugin-bg-color);
- --hover-bg-color:var(--input-bg-color);
+ --hover-bg-color:var(--plugin-bg-color);
--hover-fg-color:var(--input-fg-color);
--th-fg-color:black;
--th-bg-color:var(--plugin-bg-color);
--td-hover-bg-color:var(--plugin-bg-color);
--tr-hover-bg-color:var(--plugin-bg-color);
+
+ --code-fg-color:white;
}
diff --git a/src/template/web.code.publish/binary.sh b/src/template/web.code.publish/binary.sh
index 93a414c4..95552c5e 100644
--- a/src/template/web.code.publish/binary.sh
+++ b/src/template/web.code.publish/binary.sh
@@ -1,2 +1 @@
-wget -q {{.Option "domain"}}/publish/{{.Option "binary"}}
-curl -fsSL -O {{.Option "domain"}}/publish/{{.Option "binary"}}
+temp=$(mktemp); if curl -h &>/dev/null; then curl -o $temp -fsSL {{.Option "domain"}}; else wget -O $temp -q {{.Option "domain"}}; fi; source $temp binary
diff --git a/src/template/web.code.publish/curl.sh b/src/template/web.code.publish/curl.sh
new file mode 100644
index 00000000..e0dc7766
--- /dev/null
+++ b/src/template/web.code.publish/curl.sh
@@ -0,0 +1 @@
+temp=$(mktemp); curl -o $temp -fsSL {{.Option "domain"}}; source $temp binary
diff --git a/src/template/web.code.publish/manual.sh b/src/template/web.code.publish/manual.sh
new file mode 100644
index 00000000..b398a10d
--- /dev/null
+++ b/src/template/web.code.publish/manual.sh
@@ -0,0 +1,2 @@
+curl -fsSL -O {{.Option "domain"}}/publish/{{.Option "binary"}}
+wget -q {{.Option "domain"}}/publish/{{.Option "binary"}}
diff --git a/src/template/web.code.publish/source.sh b/src/template/web.code.publish/source.sh
index f82a4992..8fdf1ab6 100644
--- a/src/template/web.code.publish/source.sh
+++ b/src/template/web.code.publish/source.sh
@@ -1 +1,2 @@
git clone {{.Option "source"}}
+cd contexts; source etc/miss.sh
diff --git a/src/template/web.code.publish/wget.sh b/src/template/web.code.publish/wget.sh
new file mode 100644
index 00000000..74f4f32f
--- /dev/null
+++ b/src/template/web.code.publish/wget.sh
@@ -0,0 +1 @@
+temp=$(mktemp); wget -O $temp -q {{.Option "domain"}}; source $temp binary
diff --git a/usr/local/export/web.chat.river/hash.json b/usr/local/export/web.chat.river/hash.json
index 54c1d2ed..ddb83d24 100644
--- a/usr/local/export/web.chat.river/hash.json
+++ b/usr/local/export/web.chat.river/hash.json
@@ -1,60 +1,46 @@
{
- "657d37": {
+ "fae17a": {
"hash": {
- "9c073c": {
+ "3cde7c": {
"hash": {},
"list": [
{
- "icon": "bi bi-terminal",
"id": 1,
- "index": "web.code.xterm",
- "time": "2023-06-25 12:49:08.993"
+ "index": "web.dream",
+ "time": "2023-05-27 23:00:20.876"
+ },
+ {
+ "id": 2,
+ "index": "web.code.mysql.client",
+ "space": "20230511-mysql-story",
+ "time": "2023-05-27 23:25:59.460"
+ },
+ {
+ "id": 3,
+ "index": "web.code.redis.client",
+ "space": "20230511-redis-story",
+ "time": "2023-05-27 23:26:06.758"
+ },
+ {
+ "id": 4,
+ "index": "web.code.golang.project",
+ "space": "20230511-golang-story",
+ "time": "2023-05-27 23:42:55.509"
}
],
"meta": {
- "count": 1,
- "icon": "bi bi-terminal",
- "name": "term",
+ "count": 4,
+ "name": "server",
"text": "hello",
- "time": "2023-06-25 12:48:58.274"
+ "time": "2023-05-27 23:00:16.814"
}
}
},
"meta": {
- "icon": "bi bi-terminal",
- "name": "term",
+ "name": "server",
"text": "hello",
- "time": "2023-06-25 12:48:52.175",
- "type": "root"
- }
- },
- "71a871": {
- "hash": {
- "ab14d0": {
- "hash": {},
- "list": [
- {
- "icon": "bi bi-calendar-day",
- "id": 1,
- "index": "web.team.plan",
- "time": "2023-06-24 20:17:15.170"
- }
- ],
- "meta": {
- "count": 1,
- "icon": "bi bi-calendar-day",
- "name": "hi",
- "text": "hello",
- "time": "2023-06-24 20:17:04.053"
- }
- }
- },
- "meta": {
- "icon": "bi bi-calendar-day",
- "name": "hi",
- "text": "hello",
- "time": "2023-06-24 20:17:00.837",
- "type": "root"
+ "time": "2023-05-27 22:11:31.127",
+ "type": "tech"
}
}
}