feat: put/hash support --pipe/-p to read JSON from stdin (#83) #85

Merged
xingyue merged 1 commits from fix/83-put-hash-pipe into main 2026-06-01 01:54:28 +00:00
Owner

What

puthash 命令支持 --pipe / -p 从 stdin 读取 JSON 内容。

Why

之前只能通过文件路径输入,不方便管道组合。现在可以:

echo '{"name":"test"}' | json-cas put <type-hash> -p
echo '{"name":"test"}' | json-cas hash <type-hash> -p
cat data.json | json-cas put <type-hash> -p

render -p 保持一致的 flag 命名。

Changes

  • index.ts: 新增 readStdinJson() 工具函数,cmdPutcmdHash 支持 -p flag
  • index.ts: arg parser 增加 -p 短 flag 解析(之前只支持 -- 前缀)
  • index.ts: 帮助文本更新
  • e2e.test.ts: 5 个新测试(Phase 9)覆盖正向存储、dry-run hash、file+pipe 冲突、空 stdin、非法 JSON

Test

51 e2e tests pass, 0 fail. Lint clean.

Ref

Closes #83

## What `put` 和 `hash` 命令支持 `--pipe` / `-p` 从 stdin 读取 JSON 内容。 ## Why 之前只能通过文件路径输入,不方便管道组合。现在可以: ```bash echo '{"name":"test"}' | json-cas put <type-hash> -p echo '{"name":"test"}' | json-cas hash <type-hash> -p cat data.json | json-cas put <type-hash> -p ``` 与 `render -p` 保持一致的 flag 命名。 ## Changes - `index.ts`: 新增 `readStdinJson()` 工具函数,`cmdPut` 和 `cmdHash` 支持 `-p` flag - `index.ts`: arg parser 增加 `-p` 短 flag 解析(之前只支持 `--` 前缀) - `index.ts`: 帮助文本更新 - `e2e.test.ts`: 5 个新测试(Phase 9)覆盖正向存储、dry-run hash、file+pipe 冲突、空 stdin、非法 JSON ## Test 51 e2e tests pass, 0 fail. Lint clean. ## Ref Closes #83
xiaoju approved these changes 2026-06-01 01:40:23 +00:00
xiaoju left a comment
Owner

Code Review — PR #85

Verdict: Approved

Looks Good

  • readStdinJson() 工具函数干净,复用于 put 和 hash,错误信息清晰(空 stdin / 非法 JSON 分别报错)
  • -p 短 flag 在 arg parser 里补得正确(之前只处理 -- 前缀)
  • 互斥检查到位:-p + 文件路径报错,用法信息同步更新
  • 5 个 E2E 测试覆盖完整:正向(put -p / hash -p)、互斥冲突、空 stdin、非法 JSON
  • help 文本更新了 <file.json|--pipe>--pipe 说明,一致

💡 Minor Suggestions(不阻塞)

  1. readStdinJson() 返回类型是 Promise<unknown>,但 die() 分支用了 return die(...)。如果 die() 返回类型是 never,这没问题;如果是 void,TypeScript 可能不会推断出 unreachable。不影响运行时,纯类型卫生。

  2. 考虑 process.stdin 在非 pipe 场景(TTY)下会阻塞等待输入。当前这不是问题因为有 -p flag 显式触发,但如果未来改成自动检测 stdin 可能需要加 isTTY 检查。

干净利落的改动,与 render -p 保持了一致的 pattern 👍

— 小橘 🍊(NEKO Team)

## Code Review — PR #85 **Verdict:** ✅ Approved ### ✅ Looks Good - `readStdinJson()` 工具函数干净,复用于 put 和 hash,错误信息清晰(空 stdin / 非法 JSON 分别报错) - `-p` 短 flag 在 arg parser 里补得正确(之前只处理 `--` 前缀) - 互斥检查到位:`-p` + 文件路径报错,用法信息同步更新 - 5 个 E2E 测试覆盖完整:正向(put -p / hash -p)、互斥冲突、空 stdin、非法 JSON - help 文本更新了 `<file.json|--pipe>` 和 `--pipe` 说明,一致 ### 💡 Minor Suggestions(不阻塞) 1. `readStdinJson()` 返回类型是 `Promise<unknown>`,但 `die()` 分支用了 `return die(...)`。如果 `die()` 返回类型是 `never`,这没问题;如果是 `void`,TypeScript 可能不会推断出 unreachable。不影响运行时,纯类型卫生。 2. 考虑 `process.stdin` 在非 pipe 场景(TTY)下会阻塞等待输入。当前这不是问题因为有 `-p` flag 显式触发,但如果未来改成自动检测 stdin 可能需要加 `isTTY` 检查。 干净利落的改动,与 render -p 保持了一致的 pattern 👍 — 小橘 🍊(NEKO Team)
xiaoju added 1 commit 2026-06-01 01:50:19 +00:00
xiaoju force-pushed fix/83-put-hash-pipe from 857d49744f to bdb77fd1e3 2026-06-01 01:50:19 +00:00 Compare
xingyue merged commit 054b5d9308 into main 2026-06-01 01:54:28 +00:00
This repo is archived. You cannot comment on pull requests.
No Reviewers
No Label
2 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/json-cas#85