Hanji
Designless command line user interface builder for nodejs+typescript
Install / Use
/learn @drizzle-team/HanjiREADME
Hanji is a designless command line user interface builder for nodejs+typescript. by @_alexblokh
You can implement prompts by extending Prompt class
Below is an example of how to implement Select with utility SelectData bundle provided from the library
I will provide more view agnostic datasets to make implementing custom views like input a breath
import color from "kleur";
import { ITerminal, Prompt, render, SelectData } from "hanji";
export class Select extends Prompt<{ index: number; value: string }> {
private readonly data: SelectState<{ label: string; value: string }>;
private readonly spinner: () => string;
private timeout: NodeJS.Timer | undefined;
constructor(items: string[]) {
super();
this.on("attach", (terminal) => terminal.toggleCursor("hide"));
this.on("detach", () => clearInterval(this.timeout));
this.data = new SelectState(
items.map((it) => ({ label: it, value: `${it}-value` }))
);
this.data.bind(this);
}
render(status: "idle" | "submitted" | "aborted"): string {
if (status === "submitted" || status === "aborted") {
return "";
}
let text = "";
this.data.items.forEach((it, idx) => {
text +=
idx === this.data.selectedIdx
? `${color.green("❯ " + it.label)}`
: ` ${it.label}`;
text += idx != this.data.items.length - 1 ? "\n" : "";
});
return text;
}
result() {
return {
index: this.data.selectedIdx,
value: this.data.items[this.data.selectedIdx]!.value!,
};
}
}
const { status, data } = await render(
new Select(["user1", "user2", "user3", "user4"])
);
if (status === "aborted") return;
console.log(data);
// { index: 0, value: 'users1' }
Related Skills
Writing Hookify Rules
104.6kThis skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.
review-duplication
100.0kUse this skill during code reviews to proactively investigate the codebase for duplicated functionality, reinvented wheels, or failure to reuse existing project best practices and shared utilities.
cursorrules
A collection of .cursorrules
mcp-for-beginners
15.8kThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.
