[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-10374":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":22,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":29,"readmeContent":30,"aiSummary":31,"trendingCount":15,"starSnapshotCount":15,"syncStatus":32,"lastSyncTime":33,"discoverSource":34},10374,"jid","simeji\u002Fjid","simeji","json incremental digger",null,"Go",7133,159,63,10,0,4,11,65.71,"MIT License",false,"master",true,[24,25,26,5,27,28],"cli","go","golang","json","tool","2026-06-12 04:00:49","# jid\n\n[![Test](https:\u002F\u002Fgithub.com\u002Fsimeji\u002Fjid\u002Factions\u002Fworkflows\u002Ftest.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fsimeji\u002Fjid\u002Factions\u002Fworkflows\u002Ftest.yml)\n\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F78b0ee4c-2171-4557-b690-50d503f91190\" alt=\"jid logo\" width=\"200\" \u002F>\n\nJson Incremental Digger\n\nIt's a very simple tool.\nYou can drill down JSON interactively by using filtering queries like [jq](https:\u002F\u002Fstedolan.github.io\u002Fjq\u002F).\n\n**Suggestion**, **Auto completion**, and **JMESPath** support provide a comfortable JSON exploration experience.\n\n## Demo\n\n### Drill-down navigation\n\nInteractively navigate JSON using dot-path queries. Tab-complete fields, cycle through candidates, and see the matching key highlighted in the JSON view in real time.\n\n![demo-jid-drilldown](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fb37e5a62-e9e4-4ec5-9cc8-e4ca9180a744)\n\n### JMESPath expressions\n\nUse pipes, wildcards, and built-in functions directly in the filter. Function candidates are shown with usage hints and argument templates are filled in automatically.\n\n![demo-jid-jmespath](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fd6cb5cc7-4e66-4b66-b7bb-c4cc50e8b050)\n\n## Installation\n\n* [With HomeBrew (for macOS)](#with-homebrew-for-macos)\n* [With MacPorts (for macOS)](#with-macports-for-macos)\n* [With pkg (for FreeBSD)](#with-pkg-for-freebsd)\n* [With scoop (for Windows)](#with-scoop-for-windows)\n* [Other package management system](#other-package-management-systems)\n* [Simply use \"jid\" command](#simply-use-jid-command)\n* [Build](#build)\n\n### With HomeBrew (for macOS)\n\n```\nbrew install jid\n```\n\n### With MacPorts (for macOS)\n\n```\nsudo port install jid\n```\n\n### With pkg (for FreeBSD)\n\n```\npkg install jid\n```\n\n### With scoop (for Windows)\n\n```\nscoop install jid\n```\n\n### Other package management systems\n\nJid can install by package management systems of below OS.\n\n[![Packaging status](https:\u002F\u002Frepology.org\u002Fbadge\u002Fvertical-allrepos\u002Fjid.svg)](https:\u002F\u002Frepology.org\u002Fmetapackage\u002Fjid\u002Fversions)\n\n\n### Simply use \"jid\" command\n\nIf you simply want to use `jid` command, please download binary from below.\n\nhttps:\u002F\u002Fgithub.com\u002Fsimeji\u002Fjid\u002Freleases\n\n## Build\n\n```\ngo install github.com\u002Fsimeji\u002Fjid\u002Fcmd\u002Fjid@latest\n```\n\n## Usage\n\n### Quick start\n\n* [simple json example](#simple-json-example)\n* [simple json example2](#simple-json-example2)\n* [with initial query](#with-initial-query)\n* [with curl](#with-curl)\n\n#### simple json example\n\nPlease execute the below command.\n\n```\necho '{\"aa\":\"2AA2\",\"bb\":{\"aaa\":[123,\"cccc\",[1,2]],\"c\":321}}'| jid\n```\n\nthen, jid will be running.\n\nYou can dig JSON data incrementally.\n\nWhen you enter `.bb.aaa[2]`, you will see the following.\n\n```\n[Filter]> .bb.aaa[2]\n[\n  1,\n  2\n]\n```\n\nThen, you press Enter key and output `[1,2]` and exit.\n\n#### simple json example2\n\n```\necho '{\"info\":{\"date\":\"2016-10-23\",\"version\":1.0},\"users\":[{\"name\":\"simeji\",\"uri\":\"https:\u002F\u002Fgithub.com\u002Fsimeji\",\"id\":1},{\"name\":\"simeji2\",\"uri\":\"https:\u002F\u002Fexample.com\u002Fsimeji\",\"id\":2},{\"name\":\"simeji3\",\"uri\":\"https:\u002F\u002Fexample.com\u002Fsimeji3\",\"id\":3}],\"userCount\":3}}'|jid\n```\n\n#### With a initial query\n\nFirst argument of `jid` is initial query.\n(Use JSON same as [Demo](#demo))\n\n![demo-jid-with-query](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fd4ef1067-ccd1-401d-8cc3-eef4eef96109)\n\n#### with curl\n\nSample for using [RDAP](https:\u002F\u002Fdatatracker.ietf.org\u002Fwg\u002Fweirds\u002Fdocuments\u002F) data.\n\n```\ncurl -s http:\u002F\u002Frdg.afilias.info\u002Frdap\u002Fdomain\u002Fexample.info | jid\n```\n\n#### Load JSON from a file\n\n```\njid \u003C file.json\n```\n\n## Keymaps\n\n|key|description|\n|:-----------|:----------|\n|`TAB` \u002F `CTRL` + `I` |Show available items and choose them (cycles forward); highlights the matching key in the JSON view|\n|`Shift` + `TAB` |Cycle candidates backward \u002F decrement array index|\n|`CTRL` + `W` |Delete one JMESPath segment backward (e.g. `.id` → `[0]` → `func(@)` → pipe)|\n|`CTRL` + `U` |Delete whole query|\n|`CTRL` + `X` |Toggle function description display (visible when function candidates are shown)|\n|`CTRL` + `F` \u002F Right Arrow (:arrow_right:)|Move cursor a character to the right|\n|`CTRL` + `B` \u002F Left Arrow (:arrow_left:)|Move cursor a character to the left|\n|`CTRL` + `A`|To the first character of the 'Filter'|\n|`CTRL` + `E`|To the end of the 'Filter'|\n|`CTRL` + `J`|Scroll json buffer 1 line downwards|\n|`CTRL` + `K`|Scroll json buffer 1 line upwards|\n|`CTRL` + `G`|Scroll json buffer to bottom|\n|`CTRL` + `T`|Scroll json buffer to top|\n|`CTRL` + `N`|Scroll json buffer 'Page Down'|\n|`CTRL` + `P`|Scroll json buffer 'Page Up'|\n|`CTRL` + `L`|Change view mode whole json or keys (only object)|\n|`ESC`|Hide a candidate box|\n|Up Arrow|Navigate to previous query in history|\n|Down Arrow|Navigate to next query in history|\n\n### Option\n\n|option|description|\n|:-----------|:----------|\n|First argument ($1) | Initial query|\n|-h | print a help|\n|-help | print a help|\n|-version | print the version and exit|\n|-q | Output query mode (for jq)|\n|-M | monochrome output mode|\n\n## Configuration\n\njid can be configured via a TOML file located at:\n\n| OS | Path |\n|:---|:-----|\n| macOS | `~\u002FLibrary\u002FApplication Support\u002Fjid\u002Fconfig.toml` |\n| Linux | `~\u002F.config\u002Fjid\u002Fconfig.toml` |\n| Windows | `%AppData%\\jid\\config.toml` |\n\n### Example config.toml\n\n```toml\n[history]\npath = \"~\u002F.jid_history\"  # custom history file path\nmax_size = 1000           # number of entries to keep\n\n[keybindings]\nhistory_prev    = \"up\"      # navigate to older query\nhistory_next    = \"down\"    # navigate to newer query\nscroll_down     = \"ctrl+j\"\nscroll_up       = \"ctrl+k\"\nscroll_to_bottom = \"ctrl+g\"\nscroll_to_top   = \"ctrl+t\"\nscroll_page_down = \"ctrl+n\"\nscroll_page_up  = \"ctrl+p\"\ntoggle_keymode  = \"ctrl+l\"\ndelete_line     = \"ctrl+u\"\ndelete_word     = \"ctrl+w\"\ncursor_left     = \"ctrl+b\"\ncursor_right    = \"ctrl+f\"\ncursor_to_start = \"ctrl+a\"\ncursor_to_end   = \"ctrl+e\"\ntoggle_func_help = \"ctrl+x\"\ncandidate_next  = \"tab\"       # cycle candidates forward\ncandidate_prev  = \"ctrl+p\"    # cycle candidates backward (additional key; Shift+Tab always works)\nquit            = \"ctrl+q\"    # exit jid (used when exit_on_enter = false)\n\n[behavior]\nexit_on_enter = true   # set to false to prevent accidental exit on Enter\n```\n\n> **Note:** Shift+Tab (`\\x1b[Z`) is a fixed terminal escape sequence and always triggers backward cycling regardless of `candidate_prev`.\n\n### Preventing accidental exit on Enter\n\nBy default, pressing Enter exits jid and prints the current result. If you find yourself accidentally exiting, set `exit_on_enter = false` in `config.toml`:\n\n```toml\n[behavior]\nexit_on_enter = false\n```\n\nWhen disabled, Enter only confirms a candidate selection. Use `Ctrl+Q` (or your configured `quit` key) to exit.\n\n### Supported key strings\n\n`ctrl+a` … `ctrl+z`, `up`, `down`, `left`, `right`, `tab`, `enter`, `esc`, `backspace`, `home`, `end`, `pgup`, `pgdn`, `delete`, `f1` … `f12`\n\n### Query History\n\nQueries are saved automatically on Enter. The history file path follows the same OS convention as the config file (e.g. `~\u002FLibrary\u002FApplication Support\u002Fjid\u002Fhistory` on macOS) unless overridden in `config.toml`.\n\n## JMESPath Support\n\njid supports [JMESPath](https:\u002F\u002Fjmespath.org\u002F) expressions in addition to the traditional dot-path notation.\nJMESPath mode is automatically activated when the query contains pipe (`|`), wildcards (`[*]`), filter expressions (`[?`), or function calls.\n\n### JMESPath Query Examples\n\n```\n.                          traditional: show root JSON\n.users                     traditional: navigate to users field\n.users[0].name             traditional: array index + field access\n\n.users[*].name             wildcard projection: extract name from every user\n.users[*].address.city     nested wildcard projection\n.users[*].\u003CTab>            show field candidates from array elements\n\n. | keys(@)                pipe: list root object keys\n.users | length(@)         pipe: count users array\n.users | sort_by(@, &name) pipe: sort users by name field\n.users | reverse(@)        pipe: reverse the array\n\n.[1] | to_array(@)[0].id   chained pipe with indexing\n. | to_array(@)[0]         wrap root in array and index\n\n.users[*].name | [0]       project names then index\n```\n\n### Wildcard Projection + Array Index\n\nAfter a wildcard projection like `.game_indices[*].version`, the result is an array.\nUse `[N]` to navigate into it — jid automatically rewrites to pipe form internally:\n\n```\n.game_indices[*]           → field candidates: game_index, version\n.game_indices[*].version   → shows array of version objects; suggests [\n.game_indices[*].version[0]           → first version object {name, url}\n.game_indices[*].version[0].name      → first version's name\n.game_indices[*].version[0] | keys(@) → keys of first version object\n.game_indices[*].version[0] | keys(@) | sort(@)  → sorted keys\n```\n\n> **Note**: In standard JMESPath, `[*].field[0]` applies `[0]` to each projected\n> element rather than the projected array, producing `[]`. jid detects this pattern\n> and transparently rewrites it to `[*].field | [0]` so `[0]` indexes the array.\n\n### Function Candidates\n\nWhen you type `|` after a field, jid shows available JMESPath functions filtered by the type of the preceding expression:\n\n| Input type | Suggested functions |\n|:-----------|:-------------------|\n| Array | `avg`, `contains`, `join`, `length`, `map`, `max`, `max_by`, `min`, `min_by`, `not_null`, `reverse`, `sort`, `sort_by`, `sum`, `to_array`, `to_string`, `type` |\n| Object | `keys`, `length`, `merge`, `not_null`, `to_array`, `to_string`, `type`, `values` |\n| String | `contains`, `ends_with`, `length`, `not_null`, `reverse`, `starts_with`, `to_array`, `to_number`, `to_string`, `type` |\n| Number | `abs`, `ceil`, `floor`, `not_null`, `to_array`, `to_string`, `type` |\n\nA usage description is shown below the candidate list (toggle with `Ctrl+X`).\n\n### Candidate Key Highlighting\n\nThe matching JSON key is highlighted in yellow and the view auto-scrolls to it in two situations:\n\n- **While typing** — as soon as the query narrows down to a single candidate (e.g. typing `.na` when only `name` matches), the corresponding key is highlighted immediately, before pressing `Tab`.\n- **While cycling with `Tab` \u002F `Shift+Tab`** — the key for each selected candidate is highlighted as you cycle through the list.\n\nIn both cases, if the key is outside the visible area the JSON view scrolls to bring it into view. Only the key at the correct nesting level is highlighted — nested keys with the same name are ignored.\n\n### Function Argument Templates\n\nWhen a function candidate is confirmed, the arguments are automatically filled in and the cursor is placed at the right position:\n\n| Function | Inserted as | Cursor position |\n|:---------|:-----------|:----------------|\n| `contains` | `contains(@, '')` | inside `''` |\n| `ends_with` | `ends_with(@, '')` | inside `''` |\n| `starts_with` | `starts_with(@, '')` | inside `''` |\n| `join` | `join('', @)` | inside `''` (separator) |\n| `sort_by` | `sort_by(@, &field)` | on `field` placeholder |\n| `max_by` | `max_by(@, &field)` | on `field` placeholder |\n| `min_by` | `min_by(@, &field)` | on `field` placeholder |\n| `map` | `map(&expr, @)` | on `expr` placeholder |\n\nPlaceholder text is shown in cyan. Typing any character replaces the entire placeholder.\n\n#### `&field` Candidate Completion\n\nFor functions that take a `&field` argument (`sort_by`, `max_by`, `min_by`, `map`),\njid automatically shows the available field names from the base array as soon as the\n`&field` template is inserted:\n\n```\n.stats | sort_by(@, &field)   →  field names shown: base_stat  effort  stat\n.stats | sort_by(@, &b        →  filtered: base_stat\n.stats | sort_by(@, &base_stat)  →  confirmed; expression evaluates normally\n```\n\n- **Tab \u002F Shift+Tab** cycles through field candidates; cursor stays between `&` and `)`\n- **Typing** filters candidates by the partial name after `&`\n- **Enter** or **Tab** (when only one candidate) confirms the selection\n- **Ctrl+W** deletes the field name but keeps `&` (e.g. `&base_stat)` → `&`)\n\n### Wildcard Projection Navigation\n\nAfter a wildcard expression like `.game_indices[*]`, jid shows the field names of the array elements as candidates:\n\n```\n.game_indices[*]           → candidates: game_index, version\n.game_indices[*].\u003CTab>     → same candidates (trailing dot still shows fields)\n.game_indices[*].v\u003CTab>    → filtered: version\n.game_indices[*].version   → shows array result; suggests [ for index navigation\n.game_indices[*].version[0] → first version object; candidates: name, url\n```\n\n### Ctrl+W in JMESPath Mode\n\n`Ctrl+W` removes one segment at a time from the end of a JMESPath expression:\n\n```\n.[3] | to_array(@)[0].id  →(Ctrl+W)→  .[3] | to_array(@)[0]\n.[3] | to_array(@)[0]     →(Ctrl+W)→  .[3] | to_array(@)\n.[3] | to_array(@)        →(Ctrl+W)→  .[3] |\n.[3] |                    →(Ctrl+W)→  .[3]\n```\n\nInside a function call, the `&field` argument is treated as one unit and `&` is preserved:\n\n```\n.stats | max_by(@, &base_stat)  →(Ctrl+W)→  .stats | max_by(@, &\n.stats | max_by(@, &            →(Ctrl+W)→  .stats |\n```\n","Jid 是一个用于交互式探索和解析 JSON 数据的命令行工具。它支持通过点路径查询逐步深入 JSON 结构，提供自动补全、建议以及 JMESPath 表达式的功能，使得 JSON 数据的导航和过滤更加直观便捷。该工具采用 Go 语言编写，具备跨平台特性，适用于 macOS、Windows 以及 FreeBSD 等操作系统。对于需要频繁处理复杂 JSON 数据结构的开发者或数据分析师来说，Jid 提供了一个高效且友好的解决方案，特别是在进行 API 调试或者日志分析时尤为有用。",2,"2026-06-11 03:28:02","top_topic"]