open-index/open-npm huggingface dataset:
npm package: @keworks/string-utils
Description: javascript string utils
Author: Jiankai Zeng
Latest version: 0.1.1

# string-utils.js

[![Npm version](https://img.shields.io/npm/v/@keworks/string-utils.svg)](https://www.npmjs.com/package/@keworks/string-utils)
[![Gitee Go gitee-go-test](https://gitee.com/janpoem/string-utils.js/badge/giteego.svg?name=gitee-go-test&id=13599)](https://gitee.com/janpoem/string-utils.js/gitee_go/13599?branch=master)
[![Build Status](https://travis-ci.org/janpoem/string-utils.js.svg?branch=master)](https://travis-ci.org/github/janpoem/string-utils.js)


[_原 php-trim-plus_](https://www.npmjs.com/package/php-trim-plus)

Javascript 字符串处理的实用程序。保留原 php-trim-plus 的所有特性，并扩展了对 Buffer、ArrayBuffer、TypedBuffer的支持。

目前主要提供如下的函数工具：

* toSafeString
* isBufferObject, bufferToString
* trim, ltrim, rtrim
* isEmptyString, isEmptyStringOrWhitespace
* isString, isSymbol (from lodash)

## 使用说明

### toSafeString

* unicode 正规化处理
* 传入数组打扁，实用 join 处理
* Symbol 提取字符
* 函数转为空字符
* 对象，优先尝试执行对象的 toString 方法

```js
toSafeString(value)

// 处理数组时，第二个字符为数组拼接的连接符
toSafeString(['a', 'b', 'c'], '/'); // 'a/b/c'

// 处理 buffer 时，第二个参数为 encoding
toSafeString(Buffer.from('hello'), 'base64');
```

### trim

```js
trim(str, charList, isPlus)
ltrim(str, charList, isPlus)
rtrim(str, charList, isPlus)
trim(' 开源中国 '); // '开源中国'
trim(' 红薯-- ', '-'); // '红薯'
```

`str: string` 要截取的字符串
`charList: string` 要额外截取的字符串
`isPlus: boolean` 对 charList 是在现有空字符的基础上追加 charList，默认为 true，`trim.Replace` or `trim.Plus`

### isEmptyString, isEmptyStringOrWhitespace

```js
isEmptyString(value);

isEmptyString(null); // true
isEmptyString(undefined); // true
isEmptyString(''); // true
isEmptyString([]); // true 当前版本修改
isEmptyString({}); // false
```

是否为空白字符串，这里不会对 `value` 进行trim，如果需要检查是否为纯粹的空格，请使用 `isEmptyStringOrWhitespace`。

```js
isEmptyStringOrWhitespace(value);

isEmptyStringOrWhitespace(null); // true
isEmptyStringOrWhitespace(undefined); // true
isEmptyStringOrWhitespace(''); // true
isEmptyStringOrWhitespace(' '); // true
isEmptyStringOrWhitespace('\t'); // true
isEmptyStringOrWhitespace('\n'); // true
isEmptyStringOrWhitespace([]); // true 当前版本修改
isEmptyStringOrWhitespace({}); // false
```

是否为空白字符串或者是只包含空格符号的空白字符串，这里对 `value` 进行trim。

```js
isSymbol(value); 
```

判断值是否为Symbol
npm package: @kex22/kex-mem
Description: Local long-term memory CLI tool + Claude Code plugin
Latest version: 0.4.1

# kex-mem

本地长期记忆 CLI 工具，为 AI 编程助手（Claude Code 等）提供跨会话记忆能力。

基于三层记忆架构：

| 层 | 存储 | 用途 |
|---|---|---|
| Durable | `memory/MEMORY.md` | 长期决策、约定、架构 |
| User | `memory/USER.md` | 用户偏好和习惯 |
| Ephemeral | `memory/YYYY-MM-DD.md` | 每日工作日志 |
| Deep Search | `memory/.kex-mem.db` | SQLite FTS5 + sqlite-vec 混合搜索 |

Markdown 是数据源，SQLite 只是搜索索引。人类和 AI 都能直接读写。

## 安装

```bash
# 需要 Bun (内置 SQLite)
bun install -g @kex22/kex-mem
```

## 快速开始

```bash
# 在项目根目录初始化
kex-mem init

# 记录
kex-mem log "选择 Bun 作为运行时" --tag decision
kex-mem log "修复了路径解析的 bug" --tag bug

# 查看近期日志
kex-mem recall            # 今天 + 昨天
kex-mem recall --week     # 最近 7 天
kex-mem recall --durable  # 长期记忆
kex-mem recall --user     # 用户偏好
kex-mem recall --tag decision  # 按 tag 过滤

# 全文搜索
kex-mem search "Bun"
kex-mem search "路径" --limit 20

# TODO 管理
kex-mem todo              # 列出未完成 TODO
kex-mem todo --resolve "substring"  # 标记完成

# 精简上下文（会话启动用）
kex-mem brief             # DURABLE + RECENT + TODO

# 索引
kex-mem index             # 增量索引（默认）
kex-mem index --full      # 全量重建

# 归档旧日志
kex-mem compact           # 预览
kex-mem compact --auto    # 按月归档
kex-mem compact --smart   # 输出结构化 prompt 供 LLM 提炼
```

## 标签

| 标签 | 用途 |
|---|---|
| `decision` | 技术决策及理由 |
| `bug` | Bug 及修复方式 |
| `convention` | 项目约定和模式 |
| `todo` | 待办和后续跟进 |

## Claude Code 集成

`kex-mem init` 会自动向项目 `CLAUDE.md` 注入使用说明，Claude Code 加载后即知道如何调用。

同时提供 `.claude-plugin/plugin.json`，支持：
- `/kex-mem` 斜杠命令
- `PostToolUse` hook（Write/Edit 后自动单文件索引）

运行 `kex-mem init --hooks` 自动安装 plugin.json 和 hook 脚本，并生成 `.claude/settings.json`：
- `SessionStart` hook → 自动运行 `kex-mem brief`，注入上下文摘要
- `PreCompact` hook → 上下文压缩前注入持久记忆（DURABLE + TODO），确保关键信息不丢失

## 项目结构

```
src/
  cli.ts                 # Commander 入口
  commands/              # init, log, search, recall, compact, index, config, todo, brief
  lib/
    paths.ts             # 路径解析
    db.ts                # SQLite FTS5 + sqlite-vec
    markdown.ts          # Markdown 读写
    parser.ts            # 日志条目解析器
    config.ts            # 模板常量
    config-store.ts      # 向量搜索配置
    embedder.ts          # Embedding 接口
tests/                   # 169 个单元测试
```

## 开发

```bash
bun install
bun run build
bun test
```

## 路线图

- **v0.1** — FTS5 全文搜索，6 个核心命令 ✅
- **v0.2** — sqlite-vec 混合搜索 + `kex-mem config` ✅
- **v0.3** — 增量索引 + PostToolUse hook + USER.md + `compact --smart` ✅
- **v0.4** — 按需检索（tag/limit）+ TODO 追踪 + `brief` 上下文摘要 ✅

## License

MIT
npm package: @kexi/uiflow
Description: uiflow - the simplest way to write down your ui-flow diagram like markdown
Author: hirokidaichi
Latest version: 2.1.1

[![codecov](https://codecov.io/github/kexi/uiflow/branch/master/graph/badge.svg?token=WcA1Aa84EQ)](https://codecov.io/github/kexi/uiflow)

# uiflow

マークダウン風のテキストからUI Flowsのグラフを生成するコンパイラ

## UI Flowsとは？

Webサイトやスマホアプリなどのユーザーインタフェースを設計する際に、より簡単な表現で全体の流れを記述する次のような図のことです。

![simple.png](https://qiita-image-store.s3.amazonaws.com/0/35671/83a65590-8ea7-a124-0a86-ca9cb967402b.png "simple.png")

具体的なUI設計に触れず、

* ユーザーが見るもの
* ユーザーがする行動

に注目することでシンプルにUIの必要条件、あるいは骨子を記述することができます。

``uiflow``コンパイラは、次のような簡潔な表現でこのような図を作図することができます。

```markdown:sample.txt
[最初に]
ユーザーが見るものを書きます。
--
ユーザーがする行動を書きます。

[次に]
ユーザーが見るもの
--
ユーザーがすること１
==> その結果１
ユーザーがすること２
==> その結果２

[その結果１]
結果

[その結果２]
結果
```

## コマンドの使い方

### シンプルな使い方

```bash:
uiflow -i myapp.txt -o myapp.dot -f dot  
```

myapp.txtをdot形式で、myapp.dotに変換する。

## uiflow形式の文法

### 基本ブロック

```markdown:基本ブロック
[ページ名]
表示要素1
表示要素2
表示要素3
--
行動要素1
===> 遷移先ページ1名
行動要素2
===> 遷移先ページ2名
```

![base.png](https://qiita-image-store.s3.amazonaws.com/0/35671/f2b4855d-a53c-5414-50f1-de4f07bc2f16.png "base.png")

### 基本ブロックをつなげる

```markdown:基本ブロック
[ページ名]
表示要素1
--
行動要素1

[ページ名2]
表示要素
--
行動要素

[ページ名3]
表示要素
--
行動要素
```

行動要素の``==>``を省略すると次の基本ブロックに自動的につながります。

![base.png](https://qiita-image-store.s3.amazonaws.com/0/35671/01f02911-6738-549f-dd93-b829887843fb.png "base.png")

### 遷移に名前をつける

``=={hogehoge}=>``と表記して、遷移に名前をつけることができます。

```
[最初に]
ユーザーが見るものを書きます。
--
ユーザーがする行動を書きます。

[次に]
ユーザーが見るもの
--
ユーザーがすること１
=={遷移アクション名}=> その結果１
ユーザーがすること２
=={API名など}=> その結果２

[その結果１]
結果

[その結果２]
結果

```

![simple-graph.png](https://qiita-image-store.s3.amazonaws.com/0/35671/eff43bff-b436-c9e5-815e-559143cec750.png "simple-graph.png")

### 少し複雑な例

```markdown:complex

[初回通知]
通知の確認ダイアログ
--
OK

[国選択]
リージョンの選択
デフォルトで日本
OKボタン
--
OK

[はじめよう]
ヒント情報
はじめるボタン
--
ヒントをスワイプ
==> はじめよう
LINEQを始める

[非ログインメイン画面]
ログインすると全ての機能を使えますアラート
フィード
通知アイコン
検索アイコン
ホーム
分野
Qボタン
ランキング
マイページ(N)
------
アラートをタップ
==> 利用規約
分野をタップ
==> 分野
Qボタンをタップ
==> ログイン確認
ランキングをタップ
==> ランキング


[利用規約]
利用規約の表示

[分野]
分野詳細

[ランキング]
ランキング詳細

```

![base.png](https://qiita-image-store.s3.amazonaws.com/0/35671/5f26cd34-39bf-4dd3-c2b9-2ac892abbdd8.png "base.png")

## uiflowをライブラリとして使う

次のように使うことができます。

```javascript:sampleusage
const uiflow = require("@kexi/uiflow");
```

## SEE ALSO

* [画面遷移に疑問を感じたあなたにオススメするUI Flowsというツール](http://www.standardinc.jp/reflection/article/ui-flows/)
* [A shorthand for designing UI flows](https://signalvnoise.com/posts/1926-a-shorthand-for-designing-ui-flows)