diff --git a/flake.nix b/flake.nix
index 0a125d99..970a2710 100644
--- a/flake.nix
+++ b/flake.nix
@@ -103,7 +103,7 @@
hpcstat =
let
openssh = (pkgs.pkgsStatic.openssh.override { withLdns = false; etcDir = null; }).overrideAttrs
- (prev: { doCheck = false; patches = prev.patches ++ [ ./local/pkgs/hpcstat/openssh.patch ];});
+ (prev: { doCheck = false; patches = prev.patches ++ [ ./packages/hpcstat/openssh.patch ];});
duc = pkgs.pkgsStatic.duc.override { enableCairo = false; cairo = null; pango = null; };
in pkgs.pkgsStatic.localPackages.hpcstat.override
{ inherit openssh duc; standalone = true; version = inputs.self.rev or "dirty"; };
@@ -139,7 +139,7 @@
[
(moduleInputs: { config.nixpkgs.overlays = [(prev: final:
# replace pkgs with final to avoid infinite recursion
- { localPackages = import ./local/pkgs (moduleInputs // { pkgs = final; }); })]; })
+ { localPackages = import ./packages (moduleInputs // { pkgs = final; }); })]; })
./modules
./devices/${system}
];
@@ -155,7 +155,7 @@
[
(moduleInputs: { config.nixpkgs.overlays = [(prev: final:
# replace pkgs with final to avoid infinite recursion
- { localPackages = import ./local/pkgs (moduleInputs // { pkgs = final; }); })]; })
+ { localPackages = import ./packages (moduleInputs // { pkgs = final; }); })]; })
./modules
./devices/pi3b
];
@@ -163,7 +163,7 @@
}
);
overlays.default = final: prev:
- { localPackages = (import ./local/pkgs { inherit (inputs) lib; pkgs = final; topInputs = inputs; }); };
+ { localPackages = (import ./packages { inherit (inputs) lib; pkgs = final; topInputs = inputs; }); };
config = { archive = false; branch = "production"; };
devShells.x86_64-linux = let inherit (inputs.self.packages.x86_64-linux) pkgs; in
{
diff --git a/local/pkgs/hpcstat/doc/setup.md b/local/pkgs/hpcstat/doc/setup.md
index 2e4f4dac..4c51fc24 100644
--- a/local/pkgs/hpcstat/doc/setup.md
+++ b/local/pkgs/hpcstat/doc/setup.md
@@ -1,214 +1 @@
-# 设置 SSH agent forwarding
-
-为了区分登陆 jykang@hpc.xmu.edu.cn 时使用的密钥,并分密钥统计使用情况,需要启用一项名为“SSH agent forwarding”的功能。
-接下来的内容将带领您在 Windows 系统上配置 SSH agent forwarding。
-
-> [!NOTE]
-> 在 Linux 上的配置方法放在了文章末尾。大多数用户不需要阅读。
-
-要启用“SSH agent forwarding”,需要下面三个步骤:
-1. 启动 Pageant 并添加密钥。 **这一步骤每次登陆前都需要执行。**
-2. 配置 PuTTY,使 PuTTY 在每次登陆时不直接使用密钥,而是利用 Pageant 完成认证。这一步骤只需要执行一次。
-3. 配置 WinSCP,使 WinSCP 在每次登陆时不直接使用密钥,而是利用 Pageant 完成认证。这一步骤只需要执行一次。
-
-接下来将分别说明这三个步骤。
-
-## Pageant:
-
-1. 找到 Pageant 程序。Pageant 会随着 PuTTY 一起安装,一般来说您可以直接在开始菜单中搜索 “pageant” 找到它,也可以在 PuTTY 的安装目录中找到它。
-2. 启动 Pageant。启动后可能没有任何反应,也可能有一个黑框闪过,这是正常的。只要右下角的系统托盘中出现了 pageant 的图标就可以了。
-
- ![](pageant1.png)
-
-3. 双击 Pageant 图标,打开 Pageant 窗口。选择 “Add Key”,然后选择您的密钥文件。
-
- ![](pageant2.png)
-
-4. 在使用服务器期间保持 Pageant 启动(可以关闭 Pageant 的窗口,但不要在系统托盘中右键退出)。
-5. 使用完毕后,在系统托盘中右键退出 Pageant。
-
-> [!NOTE]
-> 无论是使用 WinSCP 还是 PuTTY,每次使用前,都需要如此启动 Pageant 并添加密钥。
-
-> [!TIP]
-> 如果您觉得每次打开 Pageant 都要手动添加密钥很麻烦,并且熟悉 Windows 命令行的使用,
-> 可以编写一个批处理文件(将下方代码用记事本保存,然后将扩展名从 `.txt` 改为 `.bat`),每次双击该文件即可启动 Pageant 并自动添加密钥:
->
-> `"C:\ProgramData\chocolatey\bin\PAGEANT.EXE" "Z:\.ssh\id_rsa.ppk"`
->
-> 其中第一个引号内为 Pageant 的路径,第二个引号内为您的密钥文件的路径。也可以将该批处理文件放入开机启动项中,使得 Pageant 在开机时自动启动。
->
-> 因为每个人的密钥文件以及 Pageant 的路径都可能不同,所以这里无法提供通用的批处理文件。
-
-## PuTTY:
-
-1. 在 Connection -> SSH -> Auth,勾选“Attempt authentication using Pageant”和“Allow agent forwarding”。
-
- ![](putty1.png)
-
-2. 在 Connection -> SSH -> Auth -> Credentials,清空 “Private key file for authentication”,然后保存。
-
- ![](putty2.png)
-
-3. (选做但推荐)在 Connection -> Data 中,将 “Auto-login username” 设置为 `jykang`,这样每次登陆时就不需要手动输入用户名了。
-
-## WinSCP:
-
-1. 在 SSH -> Authentication,勾选 “使用 Pageant 进行认证”,勾选 “允许代理转发”,清空 “密钥文件”,然后保存。
-
- ![](winscp1.png)
-
-2. (选做)如果您需要通过 WinSCP 打开 PuTTY 的话,需要在 WinSCP 主界面 -> 工具 -> 选项 -> 集成 -> 应用程序路径中,
- 在原来的基础上增加 `-A` 参数。
-
- ![](winscp2.png)
-
-> [!TIP]
-> 如果 WinSCP 不让你直接修改那个字符串,就把它复制到记事本里修改,然后再复制回去。
-
-至此,您已经成功配置了 SSH agent forwarding。
-之后使用 PuTTY 登陆 `jykang@hpc.xmu.edu.cn` 时,会收到包含了您的名字的提示(如图所示),表明您已经成功启用了 SSH agent forwarding。
-
- ![](putty3.png)
-
-> [!NOTE]
-> 无论是 PuTTY 还是 WinSCP,改完设置后都记得保存。
-
-> [!IMPORTANT]
-> 如果您确认已经按照教程设置好了却仍然不能连接,可以尝试将 WinSCP 和 PuTTY 都更新到最新。
->
-> 我测试使用的版本是:PuTTY 0.78 和 WinSCP 6.3.3。
-
----
-
-# 其它内容
-
-接下来的内容不是使用 jykang@hpc.xmu.edu.cn 的必需内容,不须要阅读。
-如果您按照上面的步骤配置 SSH agent forwarding 失败,那么请再次仔细阅读上面的内容,**接下来的内容对您没有帮助**。
-
-接下来的内容包括:
-* 解释为什么不转发 agent 就无法区分不同密钥。
-* 介绍一些可能有用的附加功能,例如区分使用同一个密钥的不同用户,以及如何设置任务进度微信通知。
-
-## 为什么不转发 agent 就无法区分不同密钥?
-
-如果你好奇为什么不使用 Pageant 就无法区分使用不同密钥的登陆:
-
-SSH 连接并不是直接由 jykang 用户处理的,
- 而是由一个名为 `sshd` 的程序处理,它通常以 `root` 用户的身份运行。
-在完成认证后,`sshd` 会将 Windows 电脑发来的信息解密后转发给以 `jykang` 用户运行的进程,
- 并将以 `jykang` 用户运行的进程的输出加密后发回给 Windows 电脑。
-我们只能控制 `jykang` 用户运行的进程,但这里拿不到任何关于密钥的信息。
-
-```mermaid
-flowchart TB
- subgraph "Run on windows"
- A[(密钥文件)] -.->|从硬盘读取| B["SSH client (putty, WinSCP, etc.)"]
- end
- subgraph "Run on hpc by root"
- C["SSH server (sshd)"]
- end
- B <--> |"认证信息 & 加密的数据"| C
- subgraph "Run on hpc by jykang"
- D["Other programs (bash, VASP, etc.)"]
- end
- C <--> |"解密后的数据(不包含密钥信息)"| D
-```
-
-Pageant 程序就是所谓的“SSH agent”。“SSH agent forwarding” 就是将到 Pageant 的连接通过已经建立的 SSH 连接转发给远程服务器,
- 使得远程服务器可以与 Pageant 通信,进而读取密钥信息。
-“SSH agent forwarding” 典型的用途是在远程服务器上使用本地的密钥再次登陆其他服务器,而不是为了区分使用不同密钥的登陆。
-
-```mermaid
-flowchart TB
- subgraph "Run on windows"
- A[(密钥文件)] -.->|从硬盘读取| E["SSH agent (pageant)"]
- E <-->|认证信息| B["SSH client (putty, WinSCP, etc.)"]
- end
- subgraph "Run on hpc by root"
- C["SSH server (sshd)"]
- end
- B <--> |"认证信息 & 加密的数据"| C
- subgraph "Run on hpc by jykang"
- D["Other programs (bash, VASP, etc.)"]
- end
- C <--> |"解密后的数据(不包含密钥信息)"| D
- E <-...-> |"通过已经建立的 SSH 连接转发密钥信息"| D
-```
-
-事实上,linux 的管理(统计用户使用的资源,等)非常依赖于不同的用户,即用高权限的用户去管理低权限的用户。
-大家都使用同一个账户的情况下,很多管理的功能没有现成的解决方案(要自己手写代码、思考如何设计),甚至完全无法实现。
-整这个东西真的挺麻烦的。我也嫌麻烦(而且我要做的事情比大多数用户多得多)。要不是康老师一定要我做,我才不会做。
-如果你嫌这些麻烦,与其埋怨我,不如去建议自己的导师去自己申请一个账号用。
-
-## 设置子账户:
-
-一个老师拿到密钥后,可能会将它分发给多个不同的学生。
-如果希望区分不同学生的使用情况,可以修改 `TERM` 变量,加上 `hpcstat_subaccount:your_name:` 前缀,
- 以此来进一步区分使用同一个密钥的不同用户。
-
-对于 PuTTY 来说,`TERM` 变量在 Connection -> Data -> Ternimal-type string 中修改。
-例如,如果原本的 `TERM` 变量是 `xterm`,那么修改后的 `TERM` 变量可以是 `hpcstat_subaccount:chn:xterm`。
-`TERM` 变量只在交互式登陆时有效,因此无法在 WinSCP 中使用。
-
-如果设置了这个参数,那么会额外统计不同子账户的使用情况(登陆次数、投递的任务、占用的核时,等)。
-是否设置这个参数都不影响按密钥统计的功能(即,按照密钥统计的核时,是所有使用这个密钥的用户的总和,无论是否设置了这个参数)。
-
-同时,子账户的统计结果也仅供参考,事实上这个统计结果很容易造假
- (如果 A 和 B 都使用同一个密钥登陆,那么显然 B 可以在 TERM 中填入 A 的名字以假装自己是 A,把自己用的核时都算到 A 头上)。
-
-> [!CAUTION]
-> 如果 `TERM` 变量的格式设置得不正确,PuTTY 登陆后一些程序会无法正常工作,因此尝试时应该仔细且小心。
-
-## PuTTY 登陆时自动跳转:
-
-如果您希望在登陆时自动跳转到自己的目录下,可以在 `TERM` 中再增加以下前缀:`chn_cd:your_path:`。
-
-例如,将 `TERM` 变量修改为 `chn_cd:linwei/chn:xterm`,那么使用 PuTTY 登陆后会自动跳转到 `linwei/chn` 目录下。
-
-如果同时使用了 `hpcstat_subaccount` 和 `chn_cd`,那么 `hpcstat_subaccount` 必须在 `chn_cd` 之后,
- 例如 `chn_cd:linwei/chn:hpcstat_subaccount:chn:xterm`。
-
-## 任务进度微信通知:
-
-用微信打开下面的链接:
-
-```
-https://wxpusher.zjiecode.com/wxuser/?type=1&id=75864#/follow
-```
-
-您应该会被引导去关注一个公众号(WxPusher 消息推送平台)。关注这个公众号之后会收到一条包含 UID 的消息。
-然后把下面的信息发给我:
-* 您的 UID
-* 您使用的密钥的指纹(用 PuTTY 登陆时会提示)
-* 如果使用了子账户(在 `TERM` 中设置了 `hpcstat_subaccount`),还需要告诉我您设置的子账户名
-
-之后您投递的任务有新进度(例如,开始运行、运行结束)时就会通过这个公众号收到通知。
-
-需要注意的是,这个 UID 会被明文写到 jykang 上的文件里。
-也就是说存在这样的风险:有权限登陆 jykang 的人都有权限通过这个公众号给您发消息。
-
-## 在 Linux 上配置 SSH agent forwarding
-
-1. 使用以下命令将 `.ppk` 的私钥部分拆分出来:
-
- ```bash
- puttygen id_rsa.ppk -O private-openssh -o ./id_rsa
- ```
-
- 确保 `id_rsa` 的权限为 `600`。
-
-2. 在 `~/.ssh/config` 中添加以下内容:
-
- ```
- Host jykang
- AddKeysToAgent yes
- ForwardAgent yes
- IdentityFile ~/path/to/id_rsa
- ```
-
-然后就可以正常使用了,例如:
-
-```bash
-ssh jykang
-```
+Moved to [../../../../packages/hpcstat/doc/setup.md](../../../../packages/hpcstat/doc/setup.md)
diff --git a/local/pkgs/biu/.clangd b/packages/biu/.clangd
similarity index 100%
rename from local/pkgs/biu/.clangd
rename to packages/biu/.clangd
diff --git a/local/pkgs/biu/.envrc b/packages/biu/.envrc
similarity index 100%
rename from local/pkgs/biu/.envrc
rename to packages/biu/.envrc
diff --git a/local/pkgs/biu/CMakeLists.txt b/packages/biu/CMakeLists.txt
similarity index 100%
rename from local/pkgs/biu/CMakeLists.txt
rename to packages/biu/CMakeLists.txt
diff --git a/local/pkgs/biu/README.md b/packages/biu/README.md
similarity index 100%
rename from local/pkgs/biu/README.md
rename to packages/biu/README.md
diff --git a/local/pkgs/biu/biuConfig.cmake b/packages/biu/biuConfig.cmake
similarity index 100%
rename from local/pkgs/biu/biuConfig.cmake
rename to packages/biu/biuConfig.cmake
diff --git a/local/pkgs/biu/default.nix b/packages/biu/default.nix
similarity index 100%
rename from local/pkgs/biu/default.nix
rename to packages/biu/default.nix
diff --git a/local/pkgs/biu/include/biu.hpp b/packages/biu/include/biu.hpp
similarity index 100%
rename from local/pkgs/biu/include/biu.hpp
rename to packages/biu/include/biu.hpp
diff --git a/local/pkgs/biu/include/biu/atomic/atomic.hpp b/packages/biu/include/biu/atomic/atomic.hpp
similarity index 100%
rename from local/pkgs/biu/include/biu/atomic/atomic.hpp
rename to packages/biu/include/biu/atomic/atomic.hpp
diff --git a/local/pkgs/biu/include/biu/atomic/atomic.tpp b/packages/biu/include/biu/atomic/atomic.tpp
similarity index 100%
rename from local/pkgs/biu/include/biu/atomic/atomic.tpp
rename to packages/biu/include/biu/atomic/atomic.tpp
diff --git a/local/pkgs/biu/include/biu/atomic/nolog.hpp b/packages/biu/include/biu/atomic/nolog.hpp
similarity index 100%
rename from local/pkgs/biu/include/biu/atomic/nolog.hpp
rename to packages/biu/include/biu/atomic/nolog.hpp
diff --git a/local/pkgs/biu/include/biu/atomic/nolog.tpp b/packages/biu/include/biu/atomic/nolog.tpp
similarity index 100%
rename from local/pkgs/biu/include/biu/atomic/nolog.tpp
rename to packages/biu/include/biu/atomic/nolog.tpp
diff --git a/local/pkgs/biu/include/biu/called_by.hpp b/packages/biu/include/biu/called_by.hpp
similarity index 100%
rename from local/pkgs/biu/include/biu/called_by.hpp
rename to packages/biu/include/biu/called_by.hpp
diff --git a/local/pkgs/biu/include/biu/common.hpp b/packages/biu/include/biu/common.hpp
similarity index 100%
rename from local/pkgs/biu/include/biu/common.hpp
rename to packages/biu/include/biu/common.hpp
diff --git a/local/pkgs/biu/include/biu/common.tpp b/packages/biu/include/biu/common.tpp
similarity index 100%
rename from local/pkgs/biu/include/biu/common.tpp
rename to packages/biu/include/biu/common.tpp
diff --git a/local/pkgs/biu/include/biu/concepts.hpp b/packages/biu/include/biu/concepts.hpp
similarity index 100%
rename from local/pkgs/biu/include/biu/concepts.hpp
rename to packages/biu/include/biu/concepts.hpp
diff --git a/local/pkgs/biu/include/biu/concepts.tpp b/packages/biu/include/biu/concepts.tpp
similarity index 100%
rename from local/pkgs/biu/include/biu/concepts.tpp
rename to packages/biu/include/biu/concepts.tpp
diff --git a/local/pkgs/biu/include/biu/eigen.hpp b/packages/biu/include/biu/eigen.hpp
similarity index 100%
rename from local/pkgs/biu/include/biu/eigen.hpp
rename to packages/biu/include/biu/eigen.hpp
diff --git a/local/pkgs/biu/include/biu/eigen.tpp b/packages/biu/include/biu/eigen.tpp
similarity index 100%
rename from local/pkgs/biu/include/biu/eigen.tpp
rename to packages/biu/include/biu/eigen.tpp
diff --git a/local/pkgs/biu/include/biu/format.hpp b/packages/biu/include/biu/format.hpp
similarity index 100%
rename from local/pkgs/biu/include/biu/format.hpp
rename to packages/biu/include/biu/format.hpp
diff --git a/local/pkgs/biu/include/biu/format.tpp b/packages/biu/include/biu/format.tpp
similarity index 100%
rename from local/pkgs/biu/include/biu/format.tpp
rename to packages/biu/include/biu/format.tpp
diff --git a/local/pkgs/biu/include/biu/logger.hpp b/packages/biu/include/biu/logger.hpp
similarity index 100%
rename from local/pkgs/biu/include/biu/logger.hpp
rename to packages/biu/include/biu/logger.hpp
diff --git a/local/pkgs/biu/include/biu/logger.tpp b/packages/biu/include/biu/logger.tpp
similarity index 100%
rename from local/pkgs/biu/include/biu/logger.tpp
rename to packages/biu/include/biu/logger.tpp
diff --git a/local/pkgs/biu/include/biu/smartref.hpp b/packages/biu/include/biu/smartref.hpp
similarity index 100%
rename from local/pkgs/biu/include/biu/smartref.hpp
rename to packages/biu/include/biu/smartref.hpp
diff --git a/local/pkgs/biu/include/biu/smartref.tpp b/packages/biu/include/biu/smartref.tpp
similarity index 100%
rename from local/pkgs/biu/include/biu/smartref.tpp
rename to packages/biu/include/biu/smartref.tpp
diff --git a/local/pkgs/biu/include/biu/string.hpp b/packages/biu/include/biu/string.hpp
similarity index 100%
rename from local/pkgs/biu/include/biu/string.hpp
rename to packages/biu/include/biu/string.hpp
diff --git a/local/pkgs/biu/include/biu/string.tpp b/packages/biu/include/biu/string.tpp
similarity index 100%
rename from local/pkgs/biu/include/biu/string.tpp
rename to packages/biu/include/biu/string.tpp
diff --git a/local/pkgs/biu/src/common.cpp b/packages/biu/src/common.cpp
similarity index 100%
rename from local/pkgs/biu/src/common.cpp
rename to packages/biu/src/common.cpp
diff --git a/local/pkgs/biu/src/logger.cpp b/packages/biu/src/logger.cpp
similarity index 100%
rename from local/pkgs/biu/src/logger.cpp
rename to packages/biu/src/logger.cpp
diff --git a/local/pkgs/biu/src/string.cpp b/packages/biu/src/string.cpp
similarity index 100%
rename from local/pkgs/biu/src/string.cpp
rename to packages/biu/src/string.cpp
diff --git a/local/pkgs/biu/test/process.cpp b/packages/biu/test/process.cpp
similarity index 100%
rename from local/pkgs/biu/test/process.cpp
rename to packages/biu/test/process.cpp
diff --git a/local/pkgs/biu/test/serialize.cpp b/packages/biu/test/serialize.cpp
similarity index 100%
rename from local/pkgs/biu/test/serialize.cpp
rename to packages/biu/test/serialize.cpp
diff --git a/local/pkgs/blurred-wallpaper.nix b/packages/blurred-wallpaper.nix
similarity index 100%
rename from local/pkgs/blurred-wallpaper.nix
rename to packages/blurred-wallpaper.nix
diff --git a/local/pkgs/chn-bsub/CMakeLists.txt b/packages/chn-bsub/CMakeLists.txt
similarity index 100%
rename from local/pkgs/chn-bsub/CMakeLists.txt
rename to packages/chn-bsub/CMakeLists.txt
diff --git a/local/pkgs/chn-bsub/default.nix b/packages/chn-bsub/default.nix
similarity index 100%
rename from local/pkgs/chn-bsub/default.nix
rename to packages/chn-bsub/default.nix
diff --git a/local/pkgs/chn-bsub/src/main.cpp b/packages/chn-bsub/src/main.cpp
similarity index 100%
rename from local/pkgs/chn-bsub/src/main.cpp
rename to packages/chn-bsub/src/main.cpp
diff --git a/local/pkgs/concurrencpp.nix b/packages/concurrencpp.nix
similarity index 100%
rename from local/pkgs/concurrencpp.nix
rename to packages/concurrencpp.nix
diff --git a/local/pkgs/cppcoro/cppcoro-include-utility.patch b/packages/cppcoro/cppcoro-include-utility.patch
similarity index 100%
rename from local/pkgs/cppcoro/cppcoro-include-utility.patch
rename to packages/cppcoro/cppcoro-include-utility.patch
diff --git a/local/pkgs/cppcoro/default.nix b/packages/cppcoro/default.nix
similarity index 100%
rename from local/pkgs/cppcoro/default.nix
rename to packages/cppcoro/default.nix
diff --git a/local/pkgs/date.nix b/packages/date.nix
similarity index 100%
rename from local/pkgs/date.nix
rename to packages/date.nix
diff --git a/local/pkgs/default.nix b/packages/default.nix
similarity index 100%
rename from local/pkgs/default.nix
rename to packages/default.nix
diff --git a/local/pkgs/eigen.nix b/packages/eigen.nix
similarity index 100%
rename from local/pkgs/eigen.nix
rename to packages/eigen.nix
diff --git a/local/pkgs/eigengdb.nix b/packages/eigengdb.nix
similarity index 100%
rename from local/pkgs/eigengdb.nix
rename to packages/eigengdb.nix
diff --git a/local/pkgs/esbonio.nix b/packages/esbonio.nix
similarity index 100%
rename from local/pkgs/esbonio.nix
rename to packages/esbonio.nix
diff --git a/local/pkgs/git-lfs-transfer.nix b/packages/git-lfs-transfer.nix
similarity index 100%
rename from local/pkgs/git-lfs-transfer.nix
rename to packages/git-lfs-transfer.nix
diff --git a/local/pkgs/glad.nix b/packages/glad.nix
similarity index 100%
rename from local/pkgs/glad.nix
rename to packages/glad.nix
diff --git a/local/pkgs/hpcstat/.clangd b/packages/hpcstat/.clangd
similarity index 100%
rename from local/pkgs/hpcstat/.clangd
rename to packages/hpcstat/.clangd
diff --git a/local/pkgs/hpcstat/.envrc b/packages/hpcstat/.envrc
similarity index 100%
rename from local/pkgs/hpcstat/.envrc
rename to packages/hpcstat/.envrc
diff --git a/local/pkgs/hpcstat/CMakeLists.txt b/packages/hpcstat/CMakeLists.txt
similarity index 100%
rename from local/pkgs/hpcstat/CMakeLists.txt
rename to packages/hpcstat/CMakeLists.txt
diff --git a/local/pkgs/hpcstat/default.nix b/packages/hpcstat/default.nix
similarity index 100%
rename from local/pkgs/hpcstat/default.nix
rename to packages/hpcstat/default.nix
diff --git a/local/pkgs/hpcstat/doc/pageant1.png b/packages/hpcstat/doc/pageant1.png
similarity index 100%
rename from local/pkgs/hpcstat/doc/pageant1.png
rename to packages/hpcstat/doc/pageant1.png
diff --git a/local/pkgs/hpcstat/doc/pageant2.png b/packages/hpcstat/doc/pageant2.png
similarity index 100%
rename from local/pkgs/hpcstat/doc/pageant2.png
rename to packages/hpcstat/doc/pageant2.png
diff --git a/local/pkgs/hpcstat/doc/putty1.png b/packages/hpcstat/doc/putty1.png
similarity index 100%
rename from local/pkgs/hpcstat/doc/putty1.png
rename to packages/hpcstat/doc/putty1.png
diff --git a/local/pkgs/hpcstat/doc/putty2.png b/packages/hpcstat/doc/putty2.png
similarity index 100%
rename from local/pkgs/hpcstat/doc/putty2.png
rename to packages/hpcstat/doc/putty2.png
diff --git a/local/pkgs/hpcstat/doc/putty3.png b/packages/hpcstat/doc/putty3.png
similarity index 100%
rename from local/pkgs/hpcstat/doc/putty3.png
rename to packages/hpcstat/doc/putty3.png
diff --git a/packages/hpcstat/doc/setup.md b/packages/hpcstat/doc/setup.md
new file mode 100644
index 00000000..2e4f4dac
--- /dev/null
+++ b/packages/hpcstat/doc/setup.md
@@ -0,0 +1,214 @@
+# 设置 SSH agent forwarding
+
+为了区分登陆 jykang@hpc.xmu.edu.cn 时使用的密钥,并分密钥统计使用情况,需要启用一项名为“SSH agent forwarding”的功能。
+接下来的内容将带领您在 Windows 系统上配置 SSH agent forwarding。
+
+> [!NOTE]
+> 在 Linux 上的配置方法放在了文章末尾。大多数用户不需要阅读。
+
+要启用“SSH agent forwarding”,需要下面三个步骤:
+1. 启动 Pageant 并添加密钥。 **这一步骤每次登陆前都需要执行。**
+2. 配置 PuTTY,使 PuTTY 在每次登陆时不直接使用密钥,而是利用 Pageant 完成认证。这一步骤只需要执行一次。
+3. 配置 WinSCP,使 WinSCP 在每次登陆时不直接使用密钥,而是利用 Pageant 完成认证。这一步骤只需要执行一次。
+
+接下来将分别说明这三个步骤。
+
+## Pageant:
+
+1. 找到 Pageant 程序。Pageant 会随着 PuTTY 一起安装,一般来说您可以直接在开始菜单中搜索 “pageant” 找到它,也可以在 PuTTY 的安装目录中找到它。
+2. 启动 Pageant。启动后可能没有任何反应,也可能有一个黑框闪过,这是正常的。只要右下角的系统托盘中出现了 pageant 的图标就可以了。
+
+ ![](pageant1.png)
+
+3. 双击 Pageant 图标,打开 Pageant 窗口。选择 “Add Key”,然后选择您的密钥文件。
+
+ ![](pageant2.png)
+
+4. 在使用服务器期间保持 Pageant 启动(可以关闭 Pageant 的窗口,但不要在系统托盘中右键退出)。
+5. 使用完毕后,在系统托盘中右键退出 Pageant。
+
+> [!NOTE]
+> 无论是使用 WinSCP 还是 PuTTY,每次使用前,都需要如此启动 Pageant 并添加密钥。
+
+> [!TIP]
+> 如果您觉得每次打开 Pageant 都要手动添加密钥很麻烦,并且熟悉 Windows 命令行的使用,
+> 可以编写一个批处理文件(将下方代码用记事本保存,然后将扩展名从 `.txt` 改为 `.bat`),每次双击该文件即可启动 Pageant 并自动添加密钥:
+>
+> `"C:\ProgramData\chocolatey\bin\PAGEANT.EXE" "Z:\.ssh\id_rsa.ppk"`
+>
+> 其中第一个引号内为 Pageant 的路径,第二个引号内为您的密钥文件的路径。也可以将该批处理文件放入开机启动项中,使得 Pageant 在开机时自动启动。
+>
+> 因为每个人的密钥文件以及 Pageant 的路径都可能不同,所以这里无法提供通用的批处理文件。
+
+## PuTTY:
+
+1. 在 Connection -> SSH -> Auth,勾选“Attempt authentication using Pageant”和“Allow agent forwarding”。
+
+ ![](putty1.png)
+
+2. 在 Connection -> SSH -> Auth -> Credentials,清空 “Private key file for authentication”,然后保存。
+
+ ![](putty2.png)
+
+3. (选做但推荐)在 Connection -> Data 中,将 “Auto-login username” 设置为 `jykang`,这样每次登陆时就不需要手动输入用户名了。
+
+## WinSCP:
+
+1. 在 SSH -> Authentication,勾选 “使用 Pageant 进行认证”,勾选 “允许代理转发”,清空 “密钥文件”,然后保存。
+
+ ![](winscp1.png)
+
+2. (选做)如果您需要通过 WinSCP 打开 PuTTY 的话,需要在 WinSCP 主界面 -> 工具 -> 选项 -> 集成 -> 应用程序路径中,
+ 在原来的基础上增加 `-A` 参数。
+
+ ![](winscp2.png)
+
+> [!TIP]
+> 如果 WinSCP 不让你直接修改那个字符串,就把它复制到记事本里修改,然后再复制回去。
+
+至此,您已经成功配置了 SSH agent forwarding。
+之后使用 PuTTY 登陆 `jykang@hpc.xmu.edu.cn` 时,会收到包含了您的名字的提示(如图所示),表明您已经成功启用了 SSH agent forwarding。
+
+ ![](putty3.png)
+
+> [!NOTE]
+> 无论是 PuTTY 还是 WinSCP,改完设置后都记得保存。
+
+> [!IMPORTANT]
+> 如果您确认已经按照教程设置好了却仍然不能连接,可以尝试将 WinSCP 和 PuTTY 都更新到最新。
+>
+> 我测试使用的版本是:PuTTY 0.78 和 WinSCP 6.3.3。
+
+---
+
+# 其它内容
+
+接下来的内容不是使用 jykang@hpc.xmu.edu.cn 的必需内容,不须要阅读。
+如果您按照上面的步骤配置 SSH agent forwarding 失败,那么请再次仔细阅读上面的内容,**接下来的内容对您没有帮助**。
+
+接下来的内容包括:
+* 解释为什么不转发 agent 就无法区分不同密钥。
+* 介绍一些可能有用的附加功能,例如区分使用同一个密钥的不同用户,以及如何设置任务进度微信通知。
+
+## 为什么不转发 agent 就无法区分不同密钥?
+
+如果你好奇为什么不使用 Pageant 就无法区分使用不同密钥的登陆:
+
+SSH 连接并不是直接由 jykang 用户处理的,
+ 而是由一个名为 `sshd` 的程序处理,它通常以 `root` 用户的身份运行。
+在完成认证后,`sshd` 会将 Windows 电脑发来的信息解密后转发给以 `jykang` 用户运行的进程,
+ 并将以 `jykang` 用户运行的进程的输出加密后发回给 Windows 电脑。
+我们只能控制 `jykang` 用户运行的进程,但这里拿不到任何关于密钥的信息。
+
+```mermaid
+flowchart TB
+ subgraph "Run on windows"
+ A[(密钥文件)] -.->|从硬盘读取| B["SSH client (putty, WinSCP, etc.)"]
+ end
+ subgraph "Run on hpc by root"
+ C["SSH server (sshd)"]
+ end
+ B <--> |"认证信息 & 加密的数据"| C
+ subgraph "Run on hpc by jykang"
+ D["Other programs (bash, VASP, etc.)"]
+ end
+ C <--> |"解密后的数据(不包含密钥信息)"| D
+```
+
+Pageant 程序就是所谓的“SSH agent”。“SSH agent forwarding” 就是将到 Pageant 的连接通过已经建立的 SSH 连接转发给远程服务器,
+ 使得远程服务器可以与 Pageant 通信,进而读取密钥信息。
+“SSH agent forwarding” 典型的用途是在远程服务器上使用本地的密钥再次登陆其他服务器,而不是为了区分使用不同密钥的登陆。
+
+```mermaid
+flowchart TB
+ subgraph "Run on windows"
+ A[(密钥文件)] -.->|从硬盘读取| E["SSH agent (pageant)"]
+ E <-->|认证信息| B["SSH client (putty, WinSCP, etc.)"]
+ end
+ subgraph "Run on hpc by root"
+ C["SSH server (sshd)"]
+ end
+ B <--> |"认证信息 & 加密的数据"| C
+ subgraph "Run on hpc by jykang"
+ D["Other programs (bash, VASP, etc.)"]
+ end
+ C <--> |"解密后的数据(不包含密钥信息)"| D
+ E <-...-> |"通过已经建立的 SSH 连接转发密钥信息"| D
+```
+
+事实上,linux 的管理(统计用户使用的资源,等)非常依赖于不同的用户,即用高权限的用户去管理低权限的用户。
+大家都使用同一个账户的情况下,很多管理的功能没有现成的解决方案(要自己手写代码、思考如何设计),甚至完全无法实现。
+整这个东西真的挺麻烦的。我也嫌麻烦(而且我要做的事情比大多数用户多得多)。要不是康老师一定要我做,我才不会做。
+如果你嫌这些麻烦,与其埋怨我,不如去建议自己的导师去自己申请一个账号用。
+
+## 设置子账户:
+
+一个老师拿到密钥后,可能会将它分发给多个不同的学生。
+如果希望区分不同学生的使用情况,可以修改 `TERM` 变量,加上 `hpcstat_subaccount:your_name:` 前缀,
+ 以此来进一步区分使用同一个密钥的不同用户。
+
+对于 PuTTY 来说,`TERM` 变量在 Connection -> Data -> Ternimal-type string 中修改。
+例如,如果原本的 `TERM` 变量是 `xterm`,那么修改后的 `TERM` 变量可以是 `hpcstat_subaccount:chn:xterm`。
+`TERM` 变量只在交互式登陆时有效,因此无法在 WinSCP 中使用。
+
+如果设置了这个参数,那么会额外统计不同子账户的使用情况(登陆次数、投递的任务、占用的核时,等)。
+是否设置这个参数都不影响按密钥统计的功能(即,按照密钥统计的核时,是所有使用这个密钥的用户的总和,无论是否设置了这个参数)。
+
+同时,子账户的统计结果也仅供参考,事实上这个统计结果很容易造假
+ (如果 A 和 B 都使用同一个密钥登陆,那么显然 B 可以在 TERM 中填入 A 的名字以假装自己是 A,把自己用的核时都算到 A 头上)。
+
+> [!CAUTION]
+> 如果 `TERM` 变量的格式设置得不正确,PuTTY 登陆后一些程序会无法正常工作,因此尝试时应该仔细且小心。
+
+## PuTTY 登陆时自动跳转:
+
+如果您希望在登陆时自动跳转到自己的目录下,可以在 `TERM` 中再增加以下前缀:`chn_cd:your_path:`。
+
+例如,将 `TERM` 变量修改为 `chn_cd:linwei/chn:xterm`,那么使用 PuTTY 登陆后会自动跳转到 `linwei/chn` 目录下。
+
+如果同时使用了 `hpcstat_subaccount` 和 `chn_cd`,那么 `hpcstat_subaccount` 必须在 `chn_cd` 之后,
+ 例如 `chn_cd:linwei/chn:hpcstat_subaccount:chn:xterm`。
+
+## 任务进度微信通知:
+
+用微信打开下面的链接:
+
+```
+https://wxpusher.zjiecode.com/wxuser/?type=1&id=75864#/follow
+```
+
+您应该会被引导去关注一个公众号(WxPusher 消息推送平台)。关注这个公众号之后会收到一条包含 UID 的消息。
+然后把下面的信息发给我:
+* 您的 UID
+* 您使用的密钥的指纹(用 PuTTY 登陆时会提示)
+* 如果使用了子账户(在 `TERM` 中设置了 `hpcstat_subaccount`),还需要告诉我您设置的子账户名
+
+之后您投递的任务有新进度(例如,开始运行、运行结束)时就会通过这个公众号收到通知。
+
+需要注意的是,这个 UID 会被明文写到 jykang 上的文件里。
+也就是说存在这样的风险:有权限登陆 jykang 的人都有权限通过这个公众号给您发消息。
+
+## 在 Linux 上配置 SSH agent forwarding
+
+1. 使用以下命令将 `.ppk` 的私钥部分拆分出来:
+
+ ```bash
+ puttygen id_rsa.ppk -O private-openssh -o ./id_rsa
+ ```
+
+ 确保 `id_rsa` 的权限为 `600`。
+
+2. 在 `~/.ssh/config` 中添加以下内容:
+
+ ```
+ Host jykang
+ AddKeysToAgent yes
+ ForwardAgent yes
+ IdentityFile ~/path/to/id_rsa
+ ```
+
+然后就可以正常使用了,例如:
+
+```bash
+ssh jykang
+```
diff --git a/local/pkgs/hpcstat/doc/winscp1.png b/packages/hpcstat/doc/winscp1.png
similarity index 100%
rename from local/pkgs/hpcstat/doc/winscp1.png
rename to packages/hpcstat/doc/winscp1.png
diff --git a/local/pkgs/hpcstat/doc/winscp2.png b/packages/hpcstat/doc/winscp2.png
similarity index 100%
rename from local/pkgs/hpcstat/doc/winscp2.png
rename to packages/hpcstat/doc/winscp2.png
diff --git a/local/pkgs/hpcstat/include/hpcstat/common.hpp b/packages/hpcstat/include/hpcstat/common.hpp
similarity index 100%
rename from local/pkgs/hpcstat/include/hpcstat/common.hpp
rename to packages/hpcstat/include/hpcstat/common.hpp
diff --git a/local/pkgs/hpcstat/include/hpcstat/disk.hpp b/packages/hpcstat/include/hpcstat/disk.hpp
similarity index 100%
rename from local/pkgs/hpcstat/include/hpcstat/disk.hpp
rename to packages/hpcstat/include/hpcstat/disk.hpp
diff --git a/local/pkgs/hpcstat/include/hpcstat/env.hpp b/packages/hpcstat/include/hpcstat/env.hpp
similarity index 100%
rename from local/pkgs/hpcstat/include/hpcstat/env.hpp
rename to packages/hpcstat/include/hpcstat/env.hpp
diff --git a/local/pkgs/hpcstat/include/hpcstat/keys.hpp b/packages/hpcstat/include/hpcstat/keys.hpp
similarity index 100%
rename from local/pkgs/hpcstat/include/hpcstat/keys.hpp
rename to packages/hpcstat/include/hpcstat/keys.hpp
diff --git a/local/pkgs/hpcstat/include/hpcstat/lfs.hpp b/packages/hpcstat/include/hpcstat/lfs.hpp
similarity index 100%
rename from local/pkgs/hpcstat/include/hpcstat/lfs.hpp
rename to packages/hpcstat/include/hpcstat/lfs.hpp
diff --git a/local/pkgs/hpcstat/include/hpcstat/push.hpp b/packages/hpcstat/include/hpcstat/push.hpp
similarity index 100%
rename from local/pkgs/hpcstat/include/hpcstat/push.hpp
rename to packages/hpcstat/include/hpcstat/push.hpp
diff --git a/local/pkgs/hpcstat/include/hpcstat/sql.hpp b/packages/hpcstat/include/hpcstat/sql.hpp
similarity index 100%
rename from local/pkgs/hpcstat/include/hpcstat/sql.hpp
rename to packages/hpcstat/include/hpcstat/sql.hpp
diff --git a/local/pkgs/hpcstat/include/hpcstat/ssh.hpp b/packages/hpcstat/include/hpcstat/ssh.hpp
similarity index 100%
rename from local/pkgs/hpcstat/include/hpcstat/ssh.hpp
rename to packages/hpcstat/include/hpcstat/ssh.hpp
diff --git a/local/pkgs/hpcstat/openssh.patch b/packages/hpcstat/openssh.patch
similarity index 100%
rename from local/pkgs/hpcstat/openssh.patch
rename to packages/hpcstat/openssh.patch
diff --git a/local/pkgs/hpcstat/share/keys/00 b/packages/hpcstat/share/keys/00
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/00
rename to packages/hpcstat/share/keys/00
diff --git a/local/pkgs/hpcstat/share/keys/01 b/packages/hpcstat/share/keys/01
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/01
rename to packages/hpcstat/share/keys/01
diff --git a/local/pkgs/hpcstat/share/keys/02 b/packages/hpcstat/share/keys/02
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/02
rename to packages/hpcstat/share/keys/02
diff --git a/local/pkgs/hpcstat/share/keys/03 b/packages/hpcstat/share/keys/03
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/03
rename to packages/hpcstat/share/keys/03
diff --git a/local/pkgs/hpcstat/share/keys/04 b/packages/hpcstat/share/keys/04
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/04
rename to packages/hpcstat/share/keys/04
diff --git a/local/pkgs/hpcstat/share/keys/05 b/packages/hpcstat/share/keys/05
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/05
rename to packages/hpcstat/share/keys/05
diff --git a/local/pkgs/hpcstat/share/keys/chn b/packages/hpcstat/share/keys/chn
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/chn
rename to packages/hpcstat/share/keys/chn
diff --git a/local/pkgs/hpcstat/share/keys/gb b/packages/hpcstat/share/keys/gb
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/gb
rename to packages/hpcstat/share/keys/gb
diff --git a/local/pkgs/hpcstat/share/keys/hpcstat b/packages/hpcstat/share/keys/hpcstat
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/hpcstat
rename to packages/hpcstat/share/keys/hpcstat
diff --git a/local/pkgs/hpcstat/share/keys/xll b/packages/hpcstat/share/keys/xll
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/xll
rename to packages/hpcstat/share/keys/xll
diff --git a/local/pkgs/hpcstat/share/keys/xly b/packages/hpcstat/share/keys/xly
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/xly
rename to packages/hpcstat/share/keys/xly
diff --git a/local/pkgs/hpcstat/share/keys/yjq b/packages/hpcstat/share/keys/yjq
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/yjq
rename to packages/hpcstat/share/keys/yjq
diff --git a/local/pkgs/hpcstat/share/keys/zem b/packages/hpcstat/share/keys/zem
similarity index 100%
rename from local/pkgs/hpcstat/share/keys/zem
rename to packages/hpcstat/share/keys/zem
diff --git a/local/pkgs/hpcstat/src/common.cpp b/packages/hpcstat/src/common.cpp
similarity index 100%
rename from local/pkgs/hpcstat/src/common.cpp
rename to packages/hpcstat/src/common.cpp
diff --git a/local/pkgs/hpcstat/src/disk.cpp b/packages/hpcstat/src/disk.cpp
similarity index 100%
rename from local/pkgs/hpcstat/src/disk.cpp
rename to packages/hpcstat/src/disk.cpp
diff --git a/local/pkgs/hpcstat/src/env.cpp b/packages/hpcstat/src/env.cpp
similarity index 100%
rename from local/pkgs/hpcstat/src/env.cpp
rename to packages/hpcstat/src/env.cpp
diff --git a/local/pkgs/hpcstat/src/keys.cpp b/packages/hpcstat/src/keys.cpp
similarity index 100%
rename from local/pkgs/hpcstat/src/keys.cpp
rename to packages/hpcstat/src/keys.cpp
diff --git a/local/pkgs/hpcstat/src/lfs.cpp b/packages/hpcstat/src/lfs.cpp
similarity index 100%
rename from local/pkgs/hpcstat/src/lfs.cpp
rename to packages/hpcstat/src/lfs.cpp
diff --git a/local/pkgs/hpcstat/src/main.cpp b/packages/hpcstat/src/main.cpp
similarity index 100%
rename from local/pkgs/hpcstat/src/main.cpp
rename to packages/hpcstat/src/main.cpp
diff --git a/local/pkgs/hpcstat/src/push.cpp b/packages/hpcstat/src/push.cpp
similarity index 100%
rename from local/pkgs/hpcstat/src/push.cpp
rename to packages/hpcstat/src/push.cpp
diff --git a/local/pkgs/hpcstat/src/sql.cpp b/packages/hpcstat/src/sql.cpp
similarity index 100%
rename from local/pkgs/hpcstat/src/sql.cpp
rename to packages/hpcstat/src/sql.cpp
diff --git a/local/pkgs/hpcstat/src/ssh.cpp b/packages/hpcstat/src/ssh.cpp
similarity index 100%
rename from local/pkgs/hpcstat/src/ssh.cpp
rename to packages/hpcstat/src/ssh.cpp
diff --git a/local/pkgs/kylin-virtual-keyboard.nix b/packages/kylin-virtual-keyboard.nix
similarity index 100%
rename from local/pkgs/kylin-virtual-keyboard.nix
rename to packages/kylin-virtual-keyboard.nix
diff --git a/local/pkgs/lmod.nix b/packages/lmod.nix
similarity index 100%
rename from local/pkgs/lmod.nix
rename to packages/lmod.nix
diff --git a/local/pkgs/matplotplusplus.nix b/packages/matplotplusplus.nix
similarity index 100%
rename from local/pkgs/matplotplusplus.nix
rename to packages/matplotplusplus.nix
diff --git a/local/pkgs/mirism.nix b/packages/mirism.nix
similarity index 100%
rename from local/pkgs/mirism.nix
rename to packages/mirism.nix
diff --git a/local/pkgs/misskey.nix b/packages/misskey.nix
similarity index 100%
rename from local/pkgs/misskey.nix
rename to packages/misskey.nix
diff --git a/local/pkgs/mk-meili-mgn.nix b/packages/mk-meili-mgn.nix
similarity index 100%
rename from local/pkgs/mk-meili-mgn.nix
rename to packages/mk-meili-mgn.nix
diff --git a/local/pkgs/mkPnpmPackage.nix b/packages/mkPnpmPackage.nix
similarity index 100%
rename from local/pkgs/mkPnpmPackage.nix
rename to packages/mkPnpmPackage.nix
diff --git a/local/pkgs/mumax.nix b/packages/mumax.nix
similarity index 100%
rename from local/pkgs/mumax.nix
rename to packages/mumax.nix
diff --git a/local/pkgs/nameof.nix b/packages/nameof.nix
similarity index 100%
rename from local/pkgs/nameof.nix
rename to packages/nameof.nix
diff --git a/local/pkgs/nodesoup.nix b/packages/nodesoup.nix
similarity index 100%
rename from local/pkgs/nodesoup.nix
rename to packages/nodesoup.nix
diff --git a/local/pkgs/nvhpc.nix b/packages/nvhpc.nix
similarity index 100%
rename from local/pkgs/nvhpc.nix
rename to packages/nvhpc.nix
diff --git a/local/pkgs/oneapi.nix b/packages/oneapi.nix
similarity index 100%
rename from local/pkgs/oneapi.nix
rename to packages/oneapi.nix
diff --git a/local/pkgs/openxlsx.nix b/packages/openxlsx.nix
similarity index 100%
rename from local/pkgs/openxlsx.nix
rename to packages/openxlsx.nix
diff --git a/local/pkgs/pix2tex/default.nix b/packages/pix2tex/default.nix
similarity index 100%
rename from local/pkgs/pix2tex/default.nix
rename to packages/pix2tex/default.nix
diff --git a/local/pkgs/pix2tex/remove-version-requires.patch b/packages/pix2tex/remove-version-requires.patch
similarity index 100%
rename from local/pkgs/pix2tex/remove-version-requires.patch
rename to packages/pix2tex/remove-version-requires.patch
diff --git a/local/pkgs/pslist.nix b/packages/pslist.nix
similarity index 100%
rename from local/pkgs/pslist.nix
rename to packages/pslist.nix
diff --git a/local/pkgs/pyreadline3.nix b/packages/pyreadline3.nix
similarity index 100%
rename from local/pkgs/pyreadline3.nix
rename to packages/pyreadline3.nix
diff --git a/local/pkgs/rsshub.nix b/packages/rsshub.nix
similarity index 100%
rename from local/pkgs/rsshub.nix
rename to packages/rsshub.nix
diff --git a/local/pkgs/sbatch-tui/.clangd b/packages/sbatch-tui/.clangd
similarity index 100%
rename from local/pkgs/sbatch-tui/.clangd
rename to packages/sbatch-tui/.clangd
diff --git a/local/pkgs/sbatch-tui/.envrc b/packages/sbatch-tui/.envrc
similarity index 100%
rename from local/pkgs/sbatch-tui/.envrc
rename to packages/sbatch-tui/.envrc
diff --git a/local/pkgs/sbatch-tui/CMakeLists.txt b/packages/sbatch-tui/CMakeLists.txt
similarity index 100%
rename from local/pkgs/sbatch-tui/CMakeLists.txt
rename to packages/sbatch-tui/CMakeLists.txt
diff --git a/local/pkgs/sbatch-tui/default.nix b/packages/sbatch-tui/default.nix
similarity index 100%
rename from local/pkgs/sbatch-tui/default.nix
rename to packages/sbatch-tui/default.nix
diff --git a/local/pkgs/sbatch-tui/include/sbatch-tui/device.hpp b/packages/sbatch-tui/include/sbatch-tui/device.hpp
similarity index 100%
rename from local/pkgs/sbatch-tui/include/sbatch-tui/device.hpp
rename to packages/sbatch-tui/include/sbatch-tui/device.hpp
diff --git a/local/pkgs/sbatch-tui/src/device.cpp b/packages/sbatch-tui/src/device.cpp
similarity index 100%
rename from local/pkgs/sbatch-tui/src/device.cpp
rename to packages/sbatch-tui/src/device.cpp
diff --git a/local/pkgs/sbatch-tui/src/device.cpp.template b/packages/sbatch-tui/src/device.cpp.template
similarity index 100%
rename from local/pkgs/sbatch-tui/src/device.cpp.template
rename to packages/sbatch-tui/src/device.cpp.template
diff --git a/local/pkgs/sbatch-tui/src/main.cpp b/packages/sbatch-tui/src/main.cpp
similarity index 100%
rename from local/pkgs/sbatch-tui/src/main.cpp
rename to packages/sbatch-tui/src/main.cpp
diff --git a/local/pkgs/slate.nix b/packages/slate.nix
similarity index 100%
rename from local/pkgs/slate.nix
rename to packages/slate.nix
diff --git a/local/pkgs/sockpp.nix b/packages/sockpp.nix
similarity index 100%
rename from local/pkgs/sockpp.nix
rename to packages/sockpp.nix
diff --git a/local/pkgs/sqlite-orm.nix b/packages/sqlite-orm.nix
similarity index 100%
rename from local/pkgs/sqlite-orm.nix
rename to packages/sqlite-orm.nix
diff --git a/local/pkgs/tgbot-cpp.nix b/packages/tgbot-cpp.nix
similarity index 100%
rename from local/pkgs/tgbot-cpp.nix
rename to packages/tgbot-cpp.nix
diff --git a/local/pkgs/torchdata.nix b/packages/torchdata.nix
similarity index 100%
rename from local/pkgs/torchdata.nix
rename to packages/torchdata.nix
diff --git a/local/pkgs/torchtext.nix b/packages/torchtext.nix
similarity index 100%
rename from local/pkgs/torchtext.nix
rename to packages/torchtext.nix
diff --git a/local/pkgs/ufo/.gitignore b/packages/ufo/.gitignore
similarity index 100%
rename from local/pkgs/ufo/.gitignore
rename to packages/ufo/.gitignore
diff --git a/local/pkgs/ufo/CMakeLists.txt b/packages/ufo/CMakeLists.txt
similarity index 100%
rename from local/pkgs/ufo/CMakeLists.txt
rename to packages/ufo/CMakeLists.txt
diff --git a/local/pkgs/ufo/default.nix b/packages/ufo/default.nix
similarity index 100%
rename from local/pkgs/ufo/default.nix
rename to packages/ufo/default.nix
diff --git a/local/pkgs/ufo/include/ufo/fold.hpp b/packages/ufo/include/ufo/fold.hpp
similarity index 100%
rename from local/pkgs/ufo/include/ufo/fold.hpp
rename to packages/ufo/include/ufo/fold.hpp
diff --git a/local/pkgs/ufo/include/ufo/plot.hpp b/packages/ufo/include/ufo/plot.hpp
similarity index 100%
rename from local/pkgs/ufo/include/ufo/plot.hpp
rename to packages/ufo/include/ufo/plot.hpp
diff --git a/local/pkgs/ufo/include/ufo/solver.hpp b/packages/ufo/include/ufo/solver.hpp
similarity index 100%
rename from local/pkgs/ufo/include/ufo/solver.hpp
rename to packages/ufo/include/ufo/solver.hpp
diff --git a/local/pkgs/ufo/include/ufo/unfold.hpp b/packages/ufo/include/ufo/unfold.hpp
similarity index 100%
rename from local/pkgs/ufo/include/ufo/unfold.hpp
rename to packages/ufo/include/ufo/unfold.hpp
diff --git a/local/pkgs/ufo/src/fold.cpp b/packages/ufo/src/fold.cpp
similarity index 100%
rename from local/pkgs/ufo/src/fold.cpp
rename to packages/ufo/src/fold.cpp
diff --git a/local/pkgs/ufo/src/main.cpp b/packages/ufo/src/main.cpp
similarity index 100%
rename from local/pkgs/ufo/src/main.cpp
rename to packages/ufo/src/main.cpp
diff --git a/local/pkgs/ufo/src/plot.cpp b/packages/ufo/src/plot.cpp
similarity index 100%
rename from local/pkgs/ufo/src/plot.cpp
rename to packages/ufo/src/plot.cpp
diff --git a/local/pkgs/ufo/src/solver.cpp b/packages/ufo/src/solver.cpp
similarity index 100%
rename from local/pkgs/ufo/src/solver.cpp
rename to packages/ufo/src/solver.cpp
diff --git a/local/pkgs/ufo/src/unfold.cpp b/packages/ufo/src/unfold.cpp
similarity index 100%
rename from local/pkgs/ufo/src/unfold.cpp
rename to packages/ufo/src/unfold.cpp
diff --git a/local/pkgs/v-sim.nix b/packages/v-sim.nix
similarity index 100%
rename from local/pkgs/v-sim.nix
rename to packages/v-sim.nix
diff --git a/local/pkgs/vasp/constr_cell_relax.F b/packages/vasp/constr_cell_relax.F
similarity index 100%
rename from local/pkgs/vasp/constr_cell_relax.F
rename to packages/vasp/constr_cell_relax.F
diff --git a/local/pkgs/vasp/gnu/default.nix b/packages/vasp/gnu/default.nix
similarity index 100%
rename from local/pkgs/vasp/gnu/default.nix
rename to packages/vasp/gnu/default.nix
diff --git a/local/pkgs/vasp/gnu/makefile.include b/packages/vasp/gnu/makefile.include
similarity index 100%
rename from local/pkgs/vasp/gnu/makefile.include
rename to packages/vasp/gnu/makefile.include
diff --git a/local/pkgs/vasp/hdf5-nvhpc/default.nix b/packages/vasp/hdf5-nvhpc/default.nix
similarity index 100%
rename from local/pkgs/vasp/hdf5-nvhpc/default.nix
rename to packages/vasp/hdf5-nvhpc/default.nix
diff --git a/local/pkgs/vasp/hdf5-oneapi/default.nix b/packages/vasp/hdf5-oneapi/default.nix
similarity index 100%
rename from local/pkgs/vasp/hdf5-oneapi/default.nix
rename to packages/vasp/hdf5-oneapi/default.nix
diff --git a/local/pkgs/vasp/intel/default.nix b/packages/vasp/intel/default.nix
similarity index 100%
rename from local/pkgs/vasp/intel/default.nix
rename to packages/vasp/intel/default.nix
diff --git a/local/pkgs/vasp/intel/makefile.include b/packages/vasp/intel/makefile.include
similarity index 100%
rename from local/pkgs/vasp/intel/makefile.include
rename to packages/vasp/intel/makefile.include
diff --git a/local/pkgs/vasp/nvidia/default.nix b/packages/vasp/nvidia/default.nix
similarity index 100%
rename from local/pkgs/vasp/nvidia/default.nix
rename to packages/vasp/nvidia/default.nix
diff --git a/local/pkgs/vasp/nvidia/makefile.include b/packages/vasp/nvidia/makefile.include
similarity index 100%
rename from local/pkgs/vasp/nvidia/makefile.include
rename to packages/vasp/nvidia/makefile.include
diff --git a/local/pkgs/vasp/source.nix b/packages/vasp/source.nix
similarity index 100%
rename from local/pkgs/vasp/source.nix
rename to packages/vasp/source.nix
diff --git a/local/pkgs/vasp/vtst.nix b/packages/vasp/vtst.nix
similarity index 100%
rename from local/pkgs/vasp/vtst.nix
rename to packages/vasp/vtst.nix
diff --git a/local/pkgs/vasp/vtst.patch b/packages/vasp/vtst.patch
similarity index 100%
rename from local/pkgs/vasp/vtst.patch
rename to packages/vasp/vtst.patch
diff --git a/local/pkgs/vasp/vtstscripts.nix b/packages/vasp/vtstscripts.nix
similarity index 100%
rename from local/pkgs/vasp/vtstscripts.nix
rename to packages/vasp/vtstscripts.nix
diff --git a/local/pkgs/vaspkit.nix b/packages/vaspkit.nix
similarity index 100%
rename from local/pkgs/vaspkit.nix
rename to packages/vaspkit.nix
diff --git a/local/pkgs/vesta.nix b/packages/vesta.nix
similarity index 100%
rename from local/pkgs/vesta.nix
rename to packages/vesta.nix
diff --git a/local/pkgs/winjob/.clangd b/packages/winjob/.clangd
similarity index 100%
rename from local/pkgs/winjob/.clangd
rename to packages/winjob/.clangd
diff --git a/local/pkgs/winjob/.envrc b/packages/winjob/.envrc
similarity index 100%
rename from local/pkgs/winjob/.envrc
rename to packages/winjob/.envrc
diff --git a/local/pkgs/winjob/CMakeLists.txt b/packages/winjob/CMakeLists.txt
similarity index 100%
rename from local/pkgs/winjob/CMakeLists.txt
rename to packages/winjob/CMakeLists.txt
diff --git a/local/pkgs/winjob/default.nix b/packages/winjob/default.nix
similarity index 100%
rename from local/pkgs/winjob/default.nix
rename to packages/winjob/default.nix
diff --git a/local/pkgs/winjob/include/winjob/windows.hpp b/packages/winjob/include/winjob/windows.hpp
similarity index 100%
rename from local/pkgs/winjob/include/winjob/windows.hpp
rename to packages/winjob/include/winjob/windows.hpp
diff --git a/local/pkgs/winjob/src/windows.cpp b/packages/winjob/src/windows.cpp
similarity index 100%
rename from local/pkgs/winjob/src/windows.cpp
rename to packages/winjob/src/windows.cpp
diff --git a/local/pkgs/winjob/src/winjob.cpp b/packages/winjob/src/winjob.cpp
similarity index 100%
rename from local/pkgs/winjob/src/winjob.cpp
rename to packages/winjob/src/winjob.cpp
diff --git a/local/pkgs/winjob/src/winjobd.cpp b/packages/winjob/src/winjobd.cpp
similarity index 100%
rename from local/pkgs/winjob/src/winjobd.cpp
rename to packages/winjob/src/winjobd.cpp
diff --git a/local/pkgs/yoga-support.nix b/packages/yoga-support.nix
similarity index 100%
rename from local/pkgs/yoga-support.nix
rename to packages/yoga-support.nix
diff --git a/local/pkgs/zpp-bits.nix b/packages/zpp-bits.nix
similarity index 100%
rename from local/pkgs/zpp-bits.nix
rename to packages/zpp-bits.nix
diff --git a/local/pkgs/zxorm.nix b/packages/zxorm.nix
similarity index 100%
rename from local/pkgs/zxorm.nix
rename to packages/zxorm.nix