FEATURED · 精选文章

NocoBase CLI 的 `nb session setup` 命令:为 shell 与 AI Agent 运行时注入 NB_SESSION_ID 会话上下文

发布时间 / 2026/9/13 19:08:51
来源 / 创域科博编辑部
栏目 / 资讯中心
NocoBase CLI 的 `nb session setup` 命令:为 shell 与 AI Agent 运行时注入 NB_SESSION_ID 会话上下文 NocoBase CLI 的nb session setup命令为 shell 与 AI Agent 运行时注入 NB_SESSION_ID 会话上下文【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobasenb session setup是 NocoBase CLInb中用于安装NB_SESSION_ID会话集成的命令它根据当前 shell或通过--shell指定的目标 shell写入对应的初始化文件让每个新打开的 shell 会话自动注入一个独立、稳定的NB_SESSION_ID如果本机已存在 opencode 配置还会顺带写入 opencode 插件使 Agent 运行时也能注入属于自己的会话标识。本文以仓库源码为据完整讲解命令用法、五种 shell 的写入逻辑、opencode 插件集成、会话标识的优先级规则以及它与nb session id、nb session remove、nb env use的关系。一、命令概览与适用场景在 NocoBase 新版 CLI 中NB_SESSION_ID是会话级状态的载体CLI 以它为键读写当前会话对应的环境env选择、命令日志等状态。nb session setup正是把会话标识自动注入这件事做成一次性的安装动作。目标读者使用 NocoBase CLI 管理多个运行环境本地、Docker、SSH、HTTP的开发者在 Codex、opencode 等 Agent 运行时里调用nb命令的自动化场景。核心价值每次打开新终端或新 Agent 会话NB_SESSION_ID都自动可用且不同会话互不串扰。官方文档位置docs/docs/cn/api/cli/session/setup.md命令实现位于 packages/core/cli/src/commands/session/setup.ts核心逻辑在 packages/core/cli/src/lib/session-integration.ts。从源码看nb session setup是一个基于 oclif 框架的命令oclif/core的Command基类对外暴露 summary、examples 和一个--shell旗标run()中依次完成检测或解析目标 shell → 调用setupSessionIntegration(shell)→ 打印配置结果setup.ts。二、命令用法与参数2.1 基本用法nb session setup [flags]不带任何参数时命令会先尝试自动检测当前 shelldetectSessionShell()检测成功则按该 shell 写入配置若检测不到会直接报错并提示你显式指定Could not detect the current shell. Re-run with --shell bash|zsh|fish|powershell|cmd.2.2 参数表参数类型说明--shellstring指定目标 shell支持bash、zsh、fish、powershell、cmd该选项在 setup.ts 中定义options枚举与文档一致传入枚举外的值会被 oclif 直接拒绝。2.3 常用示例# 自动检测当前 shell 并安装会话集成 nb session setup # 显式指定 zsh nb session setup --shell zsh # 显式指定 PowerShell nb session setup --shell powershell这些示例与命令自带 examples 一一对应setup.ts。2.4 命令输出说明run()完成后会按结果打印信息主要包括Session integration configured for shell.——目标 shell 与受管文件Managed file: path——写入的受管初始化文件路径cmd AutoRun updated: registry——仅 cmd 场景Opencode agent plugin installed / config updated或Opencode config directory not found. Skipped agent session integration.——opencode 集成结果Profile updated: pathOpen a new shell session or reload your profile to initialize NB_SESSION_ID automatically.——profile 写入结果。对应输出逻辑见 setup.ts测试用例见 packages/core/cli/src/tests/session-commands.test.ts。三、五种 shell 的注入机制源码级拆解setupSessionIntegration(shell)是真正的执行者session-integration.ts。它的策略是受管文件 profile 挂载在 CLI 主目录resolveCliHomeDir()的shell/子目录下生成一个受管脚本文件在对应 shell 的 profile 文件里追加一段带标记的加载代码source/.若 shell 是cmd改用注册表 AutoRun 而非 profile无论哪种 shell都尝试安装 opencode 插件见第四节。3.1 受管文件命名与生成内容受管文件统一放在cli-home/shell/下session-integration.ts按 shell 命名shell受管文件生成的会话标识表达式bashsession.bashexport NB_SESSION_IDnb-$(node -e console.log(require(node:crypto).randomUUID()))zshsession.zsh同上fishsession.fishset -gx NB_SESSION_ID nb-(node -e console.log(require(node:crypto).randomUUID()))powershellsession.ps1$env:NB_SESSION_ID nb- [guid]::NewGuid().ToString()cmdnb.cmdset NB_SESSION_IDnb-%RANDOM%%RANDOM%%RANDOM%%RANDOM%生成逻辑见buildManagedFileContent()session-integration.tsbash/zsh 借助 Node 的node:crypto生成 UUID前缀nb-PowerShell 使用 .NET 的[guid]::NewGuid()cmd 出于兼容性不使用 Node 或 PowerShell而是用%RANDOM%拼接 4 段随机数。这也是 session-integration.test.ts 中断言managedContent 包含 node randomUUID 表达式、不包含node -e之外的外部依赖的由来对 cmd 场景则断言为set NB_SESSION_IDnb-%RANDOM%%RANDOM%%RANDOM%%RANDOM%同文件 L237-L258。3.2 profile 挂载标记块marked block机制对 bash/zsh/fish/powershell命令在 profile 中追加如下带起止标记的代码块buildProfileSnippet()session-integration.ts# nocobase nb session [ -f managed-path ] source managed-path # nocobase nb session 各 shell 的 profile 路径getSessionShellProfilePaths()session-integration.tsshellprofile 文件bash~/.bashrczsh~/.zshrcfish~/.config/fish/config.fishpowershell非 Windows~/.config/powershell/Microsoft.PowerShell_profile.ps1powershellWindowsDocuments\PowerShell\Microsoft.PowerShell_profile.ps1与Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1两个位置detectWindowsPowerShellProfiles()写回逻辑upsertMarkedBlock()是幂等的session-integration.ts先按起止标记正则剔除旧块再整体追加新块重复执行nb session setup不会产生重复片段删除时removeMarkedBlock()只清理标记块内的内容L669-L679。Windows PowerShell 会同时更新新旧两个 profile 位置这一行为有专门测试覆盖session-integration.test.ts。3.3 cmd注册表 AutoRuncmd 没有传统 profilesetupSessionIntegration对 cmd 走独立分支session-integration.ts在 Windows 上读取/写入注册表键HKCU\Software\Microsoft\Command Processor的AutoRun值常量定义见 L31-L32追加的片段为if exist managed-file call managed-filecmdAutoRunSegment()L230-L232若注册表里已有其他 AutoRun 命令如doskey /insert会用拼接保留且重复执行不重复追加appendCmdAutoRunSegment()L323-L332若 AutoRun 写入失败例如非 Windows 环境则降级输出手动指引在当前 cmd 会话中先执行call managed-file或自行配置 AutoRun。幂等与保留既有命令均有测试佐证session-integration.test.ts只删除自己管理的片段见 L275-L294。四、opencode Agent 集成让 Agent 运行时注入自己的会话 ID文档提到如果检测到本机已经安装了 opencode 配置还会顺手写入它的插件配置让 agent runtime 也能注入自己的NB_SESSION_ID。实现上installOpencodeSessionPlugin()session-integration.ts做三件事检查~/.config/opencode/目录是否存在不存在则跳过返回agentSkippedReason: opencode_dir_not_found对应命令输出 Opencode config directory not found...测试见 session-integration.test.ts写入插件文件~/.config/opencode/plugins/nb-agent-session.js内容是一个 opencode 插件通过shell.env钩子把当前会话 ID 注入NB_SESSION_IDbuildOpencodePluginContent()L546-L574语义注释明确同一聊天chat内稳定、不同聊天不同值若~/.config/opencode/opencode.json不存在则新建带$schema存在则合并把插件文件路径追加到plugin数组去重。// ~/.config/opencode/plugins/nb-agent-session.js生成物示例 export const NbAgentSessionPlugin async () { return { shell.env: async (input, output) { const sessionID typeof input?.sessionID string ? input.sessionID.trim() : ; if (!sessionID) return; output.env { ...output.env, NB_SESSION_ID: sessionID }; }, }; }; export default NbAgentSessionPlugin;也就是说在 opencode 这类 Agent 运行时中会话标识由 Agent 平台方提供input.sessionIDCLI 只负责把它透传到 shell 工具的NB_SESSION_ID环境变量。注意 opencode 配置目录始终基于用户主目录~/.config/opencode在 Windows 上同样如此相关行为有跨平台测试覆盖session-integration.test.ts。五、会话标识的解析与优先级CODEX_THREAD_ID等 Agent 上下文优先复用文档提到在 Codex 这类 agent runtime 里如果运行时本身已经注入了类似CODEX_THREAD_ID的上下文CLI 会优先复用这个值。这由 CLI 启动入口 packages/core/cli/bin/session-env.js 的normalizeSessionEnv()实现它会按固定优先级扫描以下环境变量取第一个非空值写入NB_SESSION_IDconst SESSION_ENV_SOURCES [ CODEX_THREAD_ID, // 最高优先级 OPENCODE_RUN_ID, COPILOT_AGENT_SESSION_ID, CLAUDE_CODE_SESSION_ID, ];优先级从高到低为CODEX_THREAD_ID→OPENCODE_RUN_ID→COPILOT_AGENT_SESSION_ID→CLAUDE_CODE_SESSION_ID所有值都会先trim()空白值视为不存在只有当某个 Agent 会话 ID 存在时才会覆盖NB_SESSION_ID否则保留原有值session-env.js。覆盖行为的完整矩阵在 packages/core/cli/src/tests/session-env-entry.test.ts 中有系统性验证例如同时存在CODEX_THREAD_IDthread-123与其他 ID 时取thread-123四个 Agent ID 全为空时NB_SESSION_ID保持不变 这类纯空白值会被忽略。因此nb session setup负责没有 Agent 上下文时的兜底注入而 Agent 运行时自带的会话 ID 会在 CLI 启动时以更高优先级覆盖它——两者配合保证无论从普通终端还是 Agent 会话启动nb都能拿到当前会话的稳定标识。六、验证与配套命令6.1 查看当前生效的会话 IDnb session id该命令调用resolveSessionIdentity()packages/core/cli/src/lib/session-id.ts只读取NB_SESSION_ID并输出若为空则提示先运行nb session setup并重开 shell/runtimepackages/core/cli/src/commands/session/id.ts。官方文档见 docs/docs/cn/api/cli/session/id.md。6.2 移除会话集成nb session remove [flags] # 自动检测 shell nb session remove --shell zsh # 显式指定 shellremoveSessionIntegration()会删除受管文件、清理 profile 标记块、还原 cmd AutoRun只删自己的片段、移除 opencode 插件与配置条目session-integration.ts。官方文档见 docs/docs/cn/api/cli/session/remove.md命令实现见 packages/core/cli/src/commands/session/remove.ts。6.3 会话 ID 在 CLI 中的实际用途NB_SESSION_ID并非孤立变量它驱动了两类会话级状态会话级环境选择getSessionId()packages/core/cli/src/lib/session-store.ts读取NB_SESSION_IDCLI 以${sessionId}.json为键在cli-home/sessions/下保存当前会话选中的 envnb env use等命令因此能做到每个终端/Agent 会话各自记住自己的环境选择。env use在拿不到会话 ID 时甚至会提示你先执行nb session setup见 packages/core/cli/src/tests/env-use-command.test.ts。命令日志归档命令日志按logs/日期/session-id/目录归档resolveSessionDirName()packages/core/cli/src/lib/command-log.ts无会话 ID 时归入no-session方便按会话回溯每条命令的输出。七、常见问题与最佳实践只需执行一次setup是幂等安装动作重复执行不会产生重复片段upsertMarkedBlock与 cmd AutoRun 去重均有测试保证。执行后需要重开会话profile 或 AutoRun 只在新会话加载当前终端里要立即生效可以手动source ~/.bashrc或对应 profilecmd 则执行call managed-file。自动检测失败时显式指定跨平台终端如 Windows 上套 Git Bash、MSYS、Windows Terminal场景下检测逻辑会依次参考FISH_VERSION/ZSH_VERSION/BASH_VERSION、SHELL/LOGINSHELL、Windows 父进程链、ComSpec/PROMPT/PSModulePath等线索detectSessionShell()session-integration.ts万一检测结果与预期不符用--shell显式指定即可。相关边界用例集中在 packages/core/cli/src/tests/session-shell-detect.test.ts。Agent 运行时无需重复 setup在 Codex/opencode 等运行时中bin/session-env.js会优先复用平台自带会话 IDnb session setup主要为普通终端兜底并为 opencode 提供把会话 ID 透传给 shell 工具的插件。相关命令一览命令作用文档nb session setup安装NB_SESSION_ID的 shell / runtime 集成setup.mdnb session id显示当前生效的会话 IDid.mdnb session remove移除会话集成remove.mdnb env use为当前会话选择运行环境依赖会话 IDenv/use.md【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻