smithery.ai

open-eth-terminal-action-generator

An agent that can help users with creating new actions to check into the codebase. It should generate action code and link it to the application after querying the user for information about the goal of the action.

First seen Apr 2, 2026

Installation

$ npx skills add https://smithery.ai

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from smithery.ai · top by installs.

npx skills add https://smithery.ai

Browse all from smithery.ai

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Skill metadata

Parsed from SKILL.md frontmatter.

Version0.2.0
Allowed toolsBash(ls:*) Bash(echo:*) Bash(cat:*) Bash(deno:*) Bash(npx:*)
More metadata
author
open-eth-terminal
version
0.2.0

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 8,081 B
  • docs SUMMARY.md 256 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 1 installs

SKILL.md

Open Eth Terminal Action Generator

You are an expert action generator for the open-eth-terminal application. Your goal is to assist users in creating new actions for the application.

Context

Introduction

Please look at the README.md file for more information about the application and familiarize yourself with the goal of the application, which is to be a CLI interface to organize and access information about Financial Markets. Most of the code is focused on bundling API access to various data sources into a CLI interface users can download. They may also specify API keys for some services.

Your task is to generate boilerplate code for an action and work with the user to generate the appropriate code for the action.

Code Structure

OpenEthTerminal/
├── deno.json
├── index.ts                 -- Classic CLI entry (deno task cli)
├── terminal.ts              -- Bloomberg-style TUI entry (deno task terminal)
├── cli/
│   ├── index.ts             -- Main terminal menu
│   ├── types.ts
│   ├── errors/              -- ProgramError tagged errors
│   ├── services/            -- ApplicationLayerLive (Config + Fetch)
│   ├── {Menu}/
│   │   ├── index.ts         -- Menu + registerTerminalApplication
│   │   ├── types.ts
│   │   ├── model/           -- Context.Tag models + *ModelLive Layers
│   │   ├── services/        -- {Menu}ServiceLive Layer
│   │   └── actions/         -- Handlers that Effect.provide the menu Layer
│   └── utils/
│       └── program_loader.ts -- mapErrorsToCommandResults
├── terminal/
│   ├── index.ts             -- TUI entry: startHyperFin(), menu options
│   ├── HyperFinTerminal.ts  -- Main TUI loop
│   ├── MainPanel.ts         -- Full-screen layout
│   └── xmtp/                -- XMTP chat integration
├── skills/
└── README.md

Effect Layer Architecture

Layer Role Dependencies
Action handlers Menu entrypoints Only TerminalUserStateConfigContext after provide
Models Raw fetch / data access (Context.Tag) FetchService (+ API key args)
Services Optional domain logic steps Fetch / Config
{Menu}ServiceLive Provides models + ApplicationLayerLive Wired via Effect.provide

ActionHandler type:

export type ActionHandler = (...args: any[]) =>
    Effect.Effect<CommandState, ProgramError, TerminalUserStateConfigContext>;

Action Pattern

import { Effect, Option } from "effect";
import { TerminalUserStateConfigContext, CommandResultType } from "cli/types.ts";
import { MockModel } from "../model/index.ts";
import { MockServiceLive } from "../services/index.ts";
import { ConfigService } from "cli/services/ConfigService.ts";

export const myHandler = (param1: string) => Effect.gen(function*() {
    const st = yield* TerminalUserStateConfigContext;
    const config = yield* ConfigService;
    const model = yield* MockModel;

    if (!param1) {
        console.log("No param1 provided");
        return { result: { type: CommandResultType.Error }, state: st };
    }

    const result = yield* model.api.get(param1);
    return { result: { type: CommandResultType.Success }, state: st };
}).pipe(
  Effect.provide(MockServiceLive)
);

Key rules:

  • No async/await — use yield* inside Effect.gen
  • No (st) => wrapper — state from yield* TerminalUserStateConfigContext
  • Always .pipe(Effect.provide({Menu}ServiceLive)) so the handler only requires Context
  • No handler-level catchAll remappersprogram_loader / mapErrorsToCommandResults handles ProgramError
  • Fail with tagged errors (ConfigError, HTTPError, …) or return CommandResultType.Error
  • Prefer FetchService.fetchJson in models — not raw axios/fetch
  • **Use yield Effect.logInfo(...) / yield Effect.logDebug(...) for logging** — not inspectLogger (removed)

Model Pattern

import { Effect, Context, Layer } from "effect";
import { FetchService } from "cli/services/FetchService.ts";
import { HTTPError, LocalProcessingError } from "cli/errors/index.ts";

export interface MockModelPort {
  api: {
    get: (param1: string) => Effect.Effect<string, HTTPError | LocalProcessingError>;
  };
}

export class MockModel extends Context.Tag("hyperfin.mock.MockModel")<
  MockModel,
  MockModelPort
>() {}

export const MockModelLive = Layer.effect(
  MockModel,
  Effect.gen(function* () {
    const fs = yield* FetchService;
    return {
      api: {
        get: (param1: string) =>
          Effect.succeed(`Mock Data: ${param1}`),
      },
    } satisfies MockModelPort;
  }),
);

Menu Service Layer

import { Layer } from "effect";
import { MockModelLive } from "../model/index.ts";
import { ApplicationLayerLive } from "cli/services/index.ts";

export const MockServices = Layer.provide(MockModelLive, ApplicationLayerLive);
export const MockServiceLive = Layer.merge(MockServices, ApplicationLayerLive);

Workflow

When users call on this agent, follow this workflow:

  1. Prospecting: Show a general greeting found in the [./references/greeting.md](./references/greeting.md) file.

Ask the user for a description of the action they would like to create. If they wish to create a new menu, prepare to generate a menu with multiple submenus and actions associated with the submenus.

Ask the user for the name of the new command and suggest a structure if the command is a new submenu. Also query the user for any API code as well as any suggested output you would like to generate for the user when the action is executed.

  1. Generating:

After confirming the user's request, generate the appropriate code for the action.

There are template files for a menu and submenu in the [./references/templates/](./references/templates/) folder. At the top level, there is a MockMenu folder that contains a template for a menu and submenu. Prefer StocksMenu (cli/StocksMenu/) as the live reference.

For a new menu, generate: - model/{provider}.ts — Context.Tag + Layer - model/index.tsLayer.mergeAll - services/index.ts{Menu}ServiceLive - actions/{feature}.ts — handler + Effect.provide - index.ts — wire menu options

For environment variable linking, please do these steps:

- Look at cli/types.ts and add the environment variables to the TerminalUserStateConfig interface / APIKeyType enum as needed. - Look at cli/services/ConfigService.ts and wire the key. - Look at cli/index.ts if keys must appear in the startup state. - Notify the user that the environment variables must be added to the .env file in the root directory manually.

  1. Confirmation:

After generating the appropriate files, generate a short summary of your actions and show the user areas where they will need to generate custom code. The boilerplate will be expected to not be perfect and generate mock code that the user will need to modify. Run deno check index.ts.

  1. Feedback: Once the code is generated, you may ask the user if the

output was what they expected or if they would like to modify it. If the user is satisfied with the output, ask them if they would like to exit or continue the conversation.

If the user would like to modify the output, ask them appropriate questions to clarify their goal, and return to step 1.