{"id":13687774,"url":"https://github.com/wikibonsai/tendr-cli","last_synced_at":"2025-10-29T08:10:16.676Z","repository":{"id":97889725,"uuid":"608263639","full_name":"wikibonsai/tendr-cli","owner":"wikibonsai","description":"Cli tools for markdown-based digital gardening","archived":false,"fork":false,"pushed_at":"2024-10-04T14:27:13.000Z","size":748,"stargazers_count":10,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-18T16:01:51.931Z","etag":null,"topics":["bidirectional-link","cli","internal-link","semantic-tree","wikibonsai","wikilink","wikiref"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/tendr-cli","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wikibonsai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-01T16:52:54.000Z","updated_at":"2024-10-04T14:27:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"fd3ea088-38cc-4ddb-8278-170146e6d823","html_url":"https://github.com/wikibonsai/tendr-cli","commit_stats":{"total_commits":88,"total_committers":3,"mean_commits":"29.333333333333332","dds":0.06818181818181823,"last_synced_commit":"7ba95ccdd636239a6e12b55afe4e8a3f1f65ff48"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/wikibonsai/tendr-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wikibonsai%2Ftendr-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wikibonsai%2Ftendr-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wikibonsai%2Ftendr-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wikibonsai%2Ftendr-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wikibonsai","download_url":"https://codeload.github.com/wikibonsai/tendr-cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wikibonsai%2Ftendr-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281585002,"owners_count":26526175,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-29T02:00:06.901Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bidirectional-link","cli","internal-link","semantic-tree","wikibonsai","wikilink","wikiref"],"created_at":"2024-08-02T15:01:00.320Z","updated_at":"2025-10-29T08:10:16.661Z","avatar_url":"https://github.com/wikibonsai.png","language":"TypeScript","readme":"# 🪴 tendr-cli 🎍\n\n[![A WikiBonsai Project](https://img.shields.io/badge/%F0%9F%8E%8B-A%20WikiBonsai%20Project-brightgreen)](https://github.com/wikibonsai/wikibonsai)\n[![NPM package](https://img.shields.io/npm/v/tendr-cli)](https://npmjs.org/package/tendr-cli)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./tendr.svg\" width=\"300\" height=\"300\"/\u003e\n\u003c/p\u003e\n\n\u003e ⚠️ 🌱 This project is newly sprouted! So please consider it a beta: Remember to backup all data and please use version control.\n\nCLI tooling to edit [`[[wikirefs]]`](https://github.com/wikibonsai/wikirefs) and [semantic trees](https://github.com/wikibonsai/semtree) in a collection of markdown files. Commands will feel familiar to typical cli commands to inspect files and directories.\n\n🧑‍🌾 🚰 ✂️ Tend your [🎋 WikiBonsai](https://github.com/wikibonsai/wikibonsai) digital garden with minimalist tooling.\n\n## Install\n\nInstall with [npm](https://docs.npmjs.com/cli/v9/commands/npm-install):\n\n```\nnpm install -g tendr-cli\n```\n\n## Use\n\nExample:\n\n```\n$ tendr stat \u003cfilename\u003e\n```\n\nManual:\n\n```\nusage: tendr \u003ccommand\u003e\n\ncli tools for markdown-based digital gardening.\n\nCommands:\n  tendr lint                             lint garden files.\n  tendr tree                             print full knowledge bonsai.\n  tendr status \u003cfilename\u003e                show status of file relationships.\n                                                                 [aliases: stat]\n  tendr rename \u003cold-fname\u003e \u003cnew-fname\u003e   rename a file and all of its references\n                                         .                         [aliases: rn]\n  tendr retypedoc \u003cold-type\u003e \u003cnew-type\u003e  rename document type and update all occ\n                                         urrences.         [aliases: rtdoc, rtd]\n  tendr retyperef \u003cold-type\u003e \u003cnew-type\u003e  rename reference type and all its occur\n                                         rences.           [aliases: rtref, rtr]\n  tendr mkdntowiki [glob]                convert from \"[markdown](style)\" to \"[[\n                                         wiki-style]]\" internal links.\n                                                                 [aliases: mtow]\n  tendr wikitomkdn [glob]                convert from \"[[wiki-style]]\" to \"[mark\n                                         down](style)\" internal links.\n                                                                 [aliases: wtom]\n  tendr camltoyaml [glob]                convert from \"caml\" to \"yaml\" style att\n                                         ributes.                [aliases: ctoy]\n  tendr yamltocaml [glob]                convert from \"yaml\" to \"caml\" style att\n                                         ributes.                [aliases: ytoc]\n\nOptions:\n  --version  Show version number                                       [boolean]\n  --help     Show help                                                 [boolean]\n```\n\n## Commands\n\nNote:\n- Commands expect markdown files using the `.md` extension.\n- Commands that perform anything other than read operations will display a confirmation prompt before executing. This may typically be skipped with the force flag (`-f`).\n\n### `lint`\n\nExample:\n\n```\n$ tendr lint\n```\n\nSample output:\n\n```\n// success\n\n✅ all clean\n```\n\n```\n// warnings\n\n⚠️ lint warnings:\n\nsemtree.lint(): orphan trunk files found:\n\n- i.orphan-trunk-1\n- i.orphan-trunk-2\n```\n\n```\n// errors\n\n❌ lint errors:\n\nsemtree.lint(): duplicate entity names found:\n\n- \"duplicate-filename\"\n  - File \"i.bonsai\" Line 1\n  - File \"i.bonsai\" Line 4\n```\n\nManual:\n\n```\ntendr lint\n\nlint garden files.\n\nOptions:\n      --version  Show version number                                   [boolean]\n      --help     Show help                                             [boolean]\n  -c, --config   relative path to config file, including filename; defaults to \"\n                 ./config.toml\"              [string] [default: \"./config.toml\"]\n  -d, --doctype  relative path to doctype file, including filename; defaults to\n                 \"t.doc.toml\"                 [string] [default: \"./t.doc.toml\"]\n  -r, --root     filename for root of tree                              [string]\n  -g, --glob     glob to index files                                    [string]\n```\n\n### `list`, `ls` (⚠️ todo)\n\nList garden information. Runs on all files in current directory and all subdirectories.\n\nExample:\n\n```\n$ tendr list\n```\n\nSample output:\n\ntodo\n\nManual:\n\ntodo\n\n### `tree`\n\nExample:\n\n```\n$ tendr tree\n```\n\nSample output:\n\n```\nbk.how-to-read-a-book\n├── demanding-reader\n|   └── active-reading\n|       ├── reading-comprehension\n|       └── the-art-of-reading\n└── 4-levels-of-reading\n    ├── elementary-reading\n    ├── inspectional-reading\n    ├── analytical-reading\n    └── syntopical-reading\n```\n\nManual:\n\n```\ntendr tree\n\nprint full knowledge bonsai/semantic tree\n\nOptions:\n      --version  Show version number                                   [boolean]\n      --help     Show help                                             [boolean]\n  -c, --config   relative path to config file, including filename; defaults to \"\n                 ./config.toml\"              [string] [default: \"./config.toml\"]\n  -d, --doctype  relative path to doctype file, including filename; defaults to\n                 \"t.doc.toml\"                 [string] [default: \"./t.doc.toml\"]\n  -r, --root     filename for root of tree                              [string]\n  -g, --glob     glob to index files                                    [string]\n```\n\n### `status`, `stat`\n\nExample:\n\n```\n$ tendr status \u003cfilename\u003e\n```\n\nSample output:\n\n```\n┌────────────────────────────────────┐\n│ 📄 RELs for...                     │\n├──────┬─────────┬─────────┬─────────┤\n│ FILE │ fname-a │ DOCTYPE │ default │\n└──────┴─────────┴─────────┴─────────┘\n┌───────────────────────┐\n│ 🌳 FAM                │\n├───────────┬───────────┤\n│ ANCESTORS │ i.bonsai  │\n├───────────┼───────────┤\n│ CHILDREN  │ • fname-b │\n│           │ • fname-c │\n│           │ • fname-d │\n│           │ • fname-e │\n└───────────┴───────────┘\n┌─────────────────────────────────────────────────────┐\n│ 🕸️ REF                                              │\n├───────┬──────────────────────┬──────────────────────┤\n│       │ BACK                 │ FORE                 │\n├───────┼──────────────────────┼──────────────────────┤\n│ ATTR  │ ◦ attrtype           │ ◦ reftype            │\n│       │   • fname-b          │   • fname-b          │\n│       │                      │ ◦ attrtype           │\n│       │                      │   • fname-c          │\n├───────┼──────────────────────┼──────────────────────┤\n│ LINK  │ • fname-b (attrtype) │ • fname-d (linktype) │\n│       │ • fname-c (linktype) │ • fname-e            │\n│       │ • fname-d            │ • no-doc             │\n│       │ • i.bonsai           │                      │\n├───────┼──────────────────────┼──────────────────────┤\n│ EMBED │ • fname-f            │ --                   │\n└───────┴──────────────────────┴──────────────────────┘\n```\n\nManual:\n\n```\ntendr status \u003cfilename\u003e\n\nshow status of file relationships\n\nOptions:\n      --version  Show version number                                   [boolean]\n      --help     Show help                                             [boolean]\n  -k, --kind     kind of relationships to list\n                 (kinds: rel, fam, ancestor, child\n                 , ref, attr, link, embed, fore, foreref, foreattr, forelink, fo\n                 reembed, back, backref, backattr, backlink, backembed; default\n                 is \"rel\")                             [string] [default: \"rel\"]\n```\n\n### `find` , `f`\n\nExample:\n\n```\n$ tendr find \u003cfname\u003e\n```\n\nSample output:\n\nSingle file:\n\n```\n/path/to/notes/fname.md\n```\n\nMultiple files:\n\n```\n/path/to/notes/fname.md\n/path/to/notes/folder/fname.md\n```\n\nManual:\n\n```\ntendr find \u003cfname\u003e\n\nshow full path of markdown file(s) with the given filename.\n\nOptions:\n      --version  Show version number                                   [boolean]\n      --help     Show help                                             [boolean]\n  -r, --regex    usage: find \u003cregex\u003e; use regex pattern instead of string -- thi\n                 s will find all filenames containing matches to the regex patte\n                 rn. (use quotes around regex if the terminal is preemptively ex\n                 ecuting it)                          [boolean] [default: false]\n```\n\n### `rename`, `rn`\n\nExample:\n\n```\n$ tendr rename \u003cold-fname\u003e \u003cnew-fname\u003e\n```\n\nSample Output:\n\n```\n$ tendr rename '4-levels-of-reading' 'four-levels-of-reading'\nare you sure you want to rename \"4-levels-of-reading\" to \"four-levels-of-reading\"? [y/n]\ny\nUPDATED FILENAMES:\n  4-levels-of-reading -\u003e four-levels-of-reading\nUPDATED FILE CONTENT:\n  analytical-reading\n  demanding-reading\n  elementary-reading\n  inspectional-reading\n  syntopical-reading\n```\n\nManual:\n\n```\ntendr rename \u003cold-fname\u003e \u003cnew-fname\u003e\n\nrename a file and all of its references.\n\nOptions:\n      --version  Show version number                                   [boolean]\n      --help     Show help                                             [boolean]\n  -r, --regex    usage: rename \u003cregex\u003e \u003creplace-string\u003e; use regex replacement i\n                 nstead of string replacement -- this will rename all filenames\n                 containing matches to the regex pattern; the regex argument wil\n                 l be replaced by the string argument. (use quotes around regex\n                 if the terminal is preemptively executing it)\n                                                      [boolean] [default: false]\n  -f, --force    skip verification prompt and perform operation\n                                                      [boolean] [default: false]\n```\n\n### `retyperef`, `rtref`, `rtr`\n\nnote: keep in mind this will **not** retype caml primitive properties! this is for wikirefs only.\n\nExample:\n\n```\n$ tendr retyperef \u003cold-type\u003e \u003cnew-type\u003e\n```\n\nManual:\n\n```\ntendr retyperef \u003cold-type\u003e \u003cnew-type\u003e\n\nrename reference type and all its occurrences.\n\nOptions:\n      --version  Show version number                                   [boolean]\n      --help     Show help                                             [boolean]\n  -k, --kind     kind of entity to rename (kinds: \"reftype\", \"attrtype\", \"linkty\n                 pe\"; default is \"reftype\")        [string] [default: \"reftype\"]\n```\n\n### `mkdntowiki`, `mtow`\n\nExample:\n\n```\n$ tendr mkdntowiki\n```\n\nManual:\n\n```\ntendr mkdntowiki [glob]\n\nconvert from \"[markdown](style)\" to \"[[wiki-style]]\" internal links.\n\nOptions:\n      --version  Show version number                                   [boolean]\n      --help     Show help                                             [boolean]\n  -F, --format   how to parse markdown links -- \"filename\", \"relative\" urls, or\n                 \"absolute\" urls                  [string] [default: \"filename\"]\n  -k, --kind     kind of references to convert\n                 (kinds: rel, fam, ancestor, child\n                 , ref, attr, link, embed, fore, foreref, foreattr, forelink, fo\n                 reembed, back, backref, backattr, backlink, backembed; default\n                 is \"rel\")                             [string] [default: \"ref\"]\n```\n\n### `wikitomkdn`, `wtom`\n\nExample:\n\n```\n$ tendr wikitomkdn\n```\n\nManual:\n\n```\ntendr wikitomkdn [glob]\n\nconvert from \"[[wiki-style]]\" to \"[markdown](style)\" internal links.\n\nOptions:\n      --version  Show version number                                   [boolean]\n      --help     Show help                                             [boolean]\n  -F, --format   how to format the resulting markdown links -- \"filename\", \"rela\n                 tive\" urls, or \"absolute\" urls   [string] [default: \"filename\"]\n  -k, --kind     kind of references to convert\n                 (kinds: rel, fam, ancestor, child\n                 , ref, attr, link, embed, fore, foreref, foreattr, forelink, fo\n                 reembed, back, backref, backattr, backlink, backembed; default\n                 is \"rel\")                             [string] [default: \"ref\"]\n```\n\n### `camltoyaml`, `ctoy`\n\nExample:\n\n```\n$ tendr camltoyaml [glob]\n```\n\nManual:\n\n```\ntendr camltoyaml [glob]\n\nconvert from \"caml\" to \"yaml\" style attributes.\n\nOptions:\n  --version  Show version number                                       [boolean]\n  --help     Show help                                                 [boolean]\n```\n\n### `yamltocaml`, `ytoc`\n\nExample:\n\n```\n$ tendr yamltocaml [glob]\n```\n\nManual:\n\n```\ntendr yamltocaml [glob]\n\nconvert from \"yaml\" to \"caml\" style attributes.\n\nOptions:\n      --version      Show version number                               [boolean]\n      --help         Show help                                         [boolean]\n  -f, --format       how to format caml output (kinds: \"none\", \"pretty\", or \"pad\n                     \"; default is \"none\")          [string] [default: \"pretty\"]\n  -l, --list-format  how to format caml output lists (kinds: \"mkdn\" or \"comma\";\n                     default is \"mkdn\")               [string] [default: \"mkdn\"]\n  -p, --no-prefix    do not use colon prefix in caml output\n                                                       [boolean] [default: true]\n```\n","funding_links":[],"categories":["cli"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwikibonsai%2Ftendr-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwikibonsai%2Ftendr-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwikibonsai%2Ftendr-cli/lists"}