{"_id":"@can_in_can/limkenion","name":"@can_in_can/limkenion","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@can_in_can/limkenion","version":"1.0.0","description":"Limkenion 命令行编程助手：纯文本 REPL、浏览器界面与一次性执行模式","publishConfig":{"access":"public"},"type":"module","limkenionConfig":{"name":"limkenion","configDir":".limkenion"},"bin":{"limkenion":"dist/cli.js"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","build":"tsgo -p tsconfig.build.json && node scripts/copy-web-assets.mjs","test":"vitest --run","prepublishOnly":"npm run clean && npm run build"},"dependencies":{"@can_in_can/limkenion-agent":"^1.0.0","@can_in_can/limkenion-ai":"^1.0.0"},"keywords":["coding-agent","ai","llm","cli","agent"],"author":{"name":"IamCanincan"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/IamCanincan/Limkenion-Agent.git","directory":"packages/coding-agent"},"engines":{"node":">=22.19.0"},"devDependencies":{"@types/node":"22.19.19","typescript":"5.9.3","vitest":"4.1.9"},"gitHead":"67bd5fbf374e626b23fd1a12bcec7833ec6baef5","_id":"@can_in_can/limkenion@1.0.0","bugs":{"url":"https://github.com/IamCanincan/Limkenion-Agent/issues"},"homepage":"https://github.com/IamCanincan/Limkenion-Agent#readme","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-E8a/feznr8Kyv1UIxcuRsasPMrK1WgMXC+xy6j8digz9ICBPsFcROQ41c37paqnlqS3yTmqcevNK6Km0iknvuQ==","shasum":"96287e800aa5b762aedad9f50b4f3dd4f15cd181","tarball":"https://registry.npmjs.org/@can_in_can/limkenion/-/limkenion-1.0.0.tgz","fileCount":67,"unpackedSize":383241,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDSbfdLLSh2TGirsUIBKi1vawELhaOfwG/rD49gOBQfhAiEAp38AD6VZqFmEG7YWK4abPapBYoEn9xkQ3EliD3IPPhg="}]},"_npmUser":{"name":"can_in_can","email":"2065384887@qq.com"},"directories":{},"maintainers":[{"name":"can_in_can","email":"2065384887@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/limkenion_1.0.0_1789144266981_0.07244614670825045"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-11T16:31:06.829Z","1.0.0":"2026-09-11T16:31:07.187Z","modified":"2026-09-11T16:31:07.639Z"},"maintainers":[{"name":"can_in_can","email":"2065384887@qq.com"}],"description":"Limkenion 命令行编程助手：纯文本 REPL、浏览器界面与一次性执行模式","homepage":"https://github.com/IamCanincan/Limkenion-Agent#readme","keywords":["coding-agent","ai","llm","cli","agent"],"repository":{"type":"git","url":"git+https://github.com/IamCanincan/Limkenion-Agent.git","directory":"packages/coding-agent"},"author":{"name":"IamCanincan"},"bugs":{"url":"https://github.com/IamCanincan/Limkenion-Agent/issues"},"license":"MIT","readme":"# @can_in_can/limkenion\n\nLimkenion 命令行编程助手。纯文本交互界面，加上一个可以管道的非交互模式，\n以及一个浏览器界面。\n\n## 安装\n\n```bash\nnpx @can_in_can/limkenion web     # 不安装，直接用\n\nnpm install -g @can_in_can/limkenion\nexport DEEPSEEK_API_KEY=sk-...\nlimkenion\n```\n\n## 用法\n\n```bash\nlimkenion                               # 交互模式\nlimkenion \"给这个仓库补一个 LICENSE\"       # 执行一条指令后退出\nlimkenion -p \"解释 src/config.ts\"        # 显式写法\ncat error.log | limkenion -p \"分析这个报错\"  # 从标准输入读取指令\nlimkenion -c                            # 继续当前目录下最近的会话\nlimkenion -m deepseek-v4-pro -v \"重构这个模块\"\n```\n\n| 选项 | 说明 |\n|------|------|\n| `-p, --print <文本>` | 一次性执行并输出结果 |\n| `-m, --model <id>` | 指定模型，默认 `deepseek-flash` |\n| `-c, --continue` | 继续当前目录下最近的会话 |\n| `--api-key <key>` | 指定 API Key，默认读 `DEEPSEEK_API_KEY` |\n| `--base-url <url>` | 指定接口地址 |\n| `--max-turns <n>` | 单次指令最多几轮工具调用，默认 25 |\n| `-v, --verbose` | 显示思维链与完整工具输出 |\n| `-h, --help` / `-V, --version` | 帮助与版本号 |\n\n交互模式下的命令：`/help`、`/quit`、`/clear`、`/model <id>`、`/history`。\n`Ctrl+C` 中断正在进行的回答，在提示符下再按一次退出。\n\n## 浏览器界面\n\n```bash\nlimkenion web                            # http://127.0.0.1:4887 并打开浏览器\nlimkenion web --no-open                  # 只起服务，不打开浏览器\nlimkenion web --port 0                   # 让系统分配空闲端口\nlimkenion web --host 0.0.0.0 --port 8080 # 对局域网开放，无认证，谨慎使用\n```\n\n启动时会尝试用系统默认浏览器打开地址。SSH 会话下不会打开——浏览器不在本机，\n打开没有意义，此时只打印地址，端口转发交给 SSH 客户端或编辑器。\n\n| 选项 | 说明 |\n|------|------|\n| `--port <n>` | 监听端口，默认 4887，`0` 表示由系统分配 |\n| `--host <addr>` | 监听地址，默认 `127.0.0.1`，可选 `::1`、`localhost`、`0.0.0.0` |\n| `--no-open` | 不打开浏览器 |\n| `-m, --model <id>` | 新建会话使用的模型 |\n| `--api-key` / `--base-url` | 同上面的全局选项 |\n\n界面能力：\n\n- **会话列表与切换**：读同一份 JSONL 会话存储，可新建、切换、删除。正在生成的会话带状态点。\n- **流式对话**：正文增量渲染 Markdown（代码块、列表、标题、行内格式），思维链折叠展示。\n- **工具卡片**：显示名称、参数、输出、耗时与成功/失败；失败时自动展开。入参里带 `path` 的工具\n  卡片提供「预览文件」入口。\n- **模型切换、目录显示、停止生成**。\n- **多会话并行**：不同会话可以同时生成，各自独立推流。\n- **文件只读预览**：右侧栏，超长截断，二进制文件提示不支持。\n- **主题切换**：深色/浅色，跟随系统偏好，选择记在 `localStorage`。\n\n### 实现方式\n\n前端是手写的 HTML/CSS/原生 JS，**没有构建步骤、没有前端依赖**，由服务器直接托管。\n服务端也只用 `node:http`：\n\n- 静态资源：`GET /` 与 `public/` 下的扁平文件名（`index.html`、`app.css`、各 ES module），\n  源码在 `src/web/public/`，构建时复制到 `dist/web/public/`。白名单用正则限定，不含 `/`，\n  因此请求路径无法穿越出该目录。前端拆成 9 个模块，导入图无环。\n- JSON API：`/api/state`、`/api/sessions`、`/api/file`、`/api/model`。\n- 流式输出：`GET /api/sessions/:id/events` 是 SSE。`history` 与 `pending` 是**状态快照**，\n  客户端收到就整体重绘，因此断线重连不会出现增量错位；另有 20 秒注释行心跳保活。\n- 输入：`POST /api/sessions/:id/prompt`（`202` 立即返回，生成过程走 SSE）、`POST .../abort`。\n\n### 安全姿态\n\n默认只绑定 `127.0.0.1`，没有 TLS、没有认证，与 dsh 的 web 宿主一致。因此额外校验：\n\n- `Host` 头必须是回环名字（`127.0.0.1`、`::1`、`localhost`）。这挡掉 DNS rebinding：\n  恶意域名解析到 127.0.0.1 时浏览器发来的 `Host` 是攻击者域名，会被拒绝。\n- 带 `Origin` 的请求必须与服务端自己的 `Host` 一致，挡掉跨站请求。`curl` 之类没有\n  `Origin` 的客户端不受影响。\n\n`--host 0.0.0.0` 是明确的对外暴露，此时不再做 Host 校验，只应部署在可信网络。\n\n## 输出约定\n\n模型正文走 **stdout**，思维链、工具活动、状态与错误走 **stderr**。\n因此 `limkenion -p \"...\" > answer.txt` 得到的是干净的答案，可以直接管道给别的程序。\n\n## 配置与凭据\n\n密钥不用每次设环境变量，存一次就行：\n\n```bash\nlimkenion auth login          # 交互式输入，不回显\nlimkenion auth login --api-key sk-...   # 适合脚本\nlimkenion auth status         # 看当前生效的是哪一把、来自哪里\nlimkenion auth logout         # 删除本地保存的密钥\n```\n\n密钥保存在 `<配置目录>/auth.json`，文件权限 `0600`，与普通配置分开存放，\n这样备份或分享配置时不会连密钥一起带出去。\n\n生效优先级：`--api-key` 参数 > 环境变量 `DEEPSEEK_API_KEY` > 本地保存的密钥。\n`auth status` 会把三者都列出来，密钥一律打码显示。\n\n普通配置放在 `<配置目录>/config.json`：\n\n```json\n{\n  \"model\": \"deepseek-v4-pro\",\n  \"baseUrl\": \"https://api.deepseek.com\",\n  \"maxTurns\": 40,\n  \"verbose\": true\n}\n```\n\n| 键 | 说明 |\n|----|------|\n| `model` | 默认模型 |\n| `baseUrl` | 接口地址 |\n| `maxTurns` | 单次指令最多几轮工具调用 |\n| `verbose` | 是否默认显示思维链与完整工具输出 |\n\n优先级同样是命令行 > 环境变量 > 配置文件。**只读这一份全局配置，不读工作目录里的配置**：\n项目级配置能改接口地址，等于让随便一个陌生仓库把你的密钥送到它自己的服务器上。\n\n## 项目说明\n\n工作目录及其上级目录里的 `AGENTS.md` 会被自动注入系统提示词，不需要在对话里重复交代\n项目约定。发现规则与 opencode 一致：\n\n1. 全局先看 `<配置目录>/AGENTS.md`，再看 `~/.claude/CLAUDE.md`，第一个存在的胜出。\n2. 项目侧从工作目录向上找，按 `AGENTS.md` → `CLAUDE.md` → `CONTEXT.md` 的顺序尝试，\n   **第一个有命中的文件名胜出**，后面的名字直接不看。所以同时存在 `AGENTS.md` 和\n   `CLAUDE.md` 时只读前者。\n3. 胜出的那个名字，沿路径向上的**所有**命中都会注入。子目录里的 `AGENTS.md` 因此可以\n   覆盖仓库根的说明，注入顺序是由近到远。\n\n上限是单文件 32KB、合计 64KB，超出会截断并标注。向上查找不会越过 git 仓库根。\n\n提示词里还会带一段环境信息（工作目录、是否 git 仓库、平台、今天日期）——模型不知道\n今天是几号，缺了它会把「最近」「当前版本」这类判断做错。\n\n每轮提问前都会重新读一遍，所以改完 `AGENTS.md` 直接接着问就生效，不用重启；\n文件没变时不会改动系统消息，以免白费服务端的前缀缓存。\n\n## 环境变量\n\n| 变量 | 说明 |\n|------|------|\n| `DEEPSEEK_API_KEY` | API Key，优先级低于 `--api-key`、高于本地保存的密钥 |\n| `DEEPSEEK_BASE_URL` | 接口地址，默认 `https://api.deepseek.com` |\n| `LIMKENION_MODEL` | 默认模型 |\n| `LIMKENION_CODING_AGENT_DIR` | 配置目录，默认 `~/.limkenion/agent` |\n| `LIMKENION_CODING_AGENT_SESSION_DIR` | 会话目录，默认 `<配置目录>/sessions` |\n| `LIMKENION_SHELL` | bash 工具使用的 shell，默认 Windows 用 `cmd.exe`，其它平台用 `$SHELL` |\n\n## 会话\n\n会话按工作目录分开存放：`<会话目录>/--<编码后的工作目录>--/<时间戳>.jsonl`。\n第一行是会话头，之后每行一条消息。文件是可读的 JSONL，可以直接用 `grep`、`jq` 查看。\n\n- 交互模式每次启动都会新建一个会话文件。\n- `limkenion -p` 默认不写会话文件，避免零散提问混进会话列表；加 `--continue` 才会续写。\n\n## 设计取舍\n\n- **没有权限系统**：工具以当前用户权限直接执行。需要隔离就用容器或沙箱运行。\n- **没有 TUI**：不引入差分渲染与键盘绑定，代价是界面朴素，收益是没有终端兼容性负担。\n- **没有扩展机制**：需要新工具就实现 `AgentTool`，用 `@can_in_can/limkenion-agent` 自己组装。\n- **只支持 DeepSeek**：只要兼容 OpenAI 的 `/chat/completions`，改 `--base-url` 也能接其它服务。\n\n## 许可证\n\nMIT\n","readmeFilename":"README.md","_rev":"1-70617ad8dbb8edd1688b5653e3e8a2a7"}