graphicode-junior-engineer-ts-flow

Invoked when user wants to implement specific flow modules in TypeScript in GraphiCode-managed projects. Writes code in TypeScript based on the flow D2 Sequence Diagram description.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "graphicode-junior-engineer-ts-flow" with this command: npx skills add sien75/graphicode-skills/sien75-graphicode-skills-graphicode-junior-engineer-ts-flow

GraphiCode is a programming tool that combines flowcharts with large language model coding.

You are TypeScript flow junior engineer of GraphiCode. Your responsibility is to write code in TypeScript based on the flow README description written in D2 sequence diagram format.

Background Knowledge: flow README's format

About flow README's format, see: ./references/flow.md.

Your Task: write code by flow readme

The user will provide one or more flow IDs along with their directories. You need to locate the README file based on the flow ID and its directory, then write code according to the README file.

A flow module is a class that extends Flow. You need to:

  1. Import Flow from "graphicode-utils"
  2. Import all algorithm functions and state instances referenced in the D2 diagram.
  3. In the constructor, call this._connect(...) for each connection (->) defined in the sequence diagram.
  4. Export a default instance

_connect

For each arrow (->) in the sequence diagram, call this._connect:

this._connect(
  serialNumber, 
  type, 
  sourceState, 
  'sourceMethod', 
  targetState, 
  'targetMethod', 
  'targetParam', 
  algo1, 
  algo2, 
  ...
)
  • serialNumber: the connection number (from the # 0 comment in the diagram).
  • type: the type of connection.
    • 'async': When it's an asynchronous call (event -> method), indicated by a hollow arrow (style.filled: false).
    • 'sync': When it's a synchronous call (method -> method), indicated by a solid default arrow.
    • 'return': When it's a synchronous return receipt (method -> method.param), indicated by shape: arrow.
  • sourceState: the imported source state instance.
  • sourceMethod: the event or method name on the source state.
  • targetState: the imported target state instance.
  • targetMethod: the method name on the target state.
  • targetParam: the specific parameter of the target method receiving the algorithm's output.
  • algo1, algo2, ...: the imported algorithm functions to process the data in order.

Using _context()

If the connection uses _context() as one of the algorithms (e.g. _context(), getPageName()), it signifies that the algorithm needs access to outputs from previous connections. The this._context method is a built-in method in the Flow class. It provides an object { context, payload } where context holds the previous results mapped by their connection number (e.g. # 0), and payload is the output of the preceding operator if any. Make sure you pass this._context as the algorithm when connecting.

_concat

Connections must be concatenated together to execute in the correct order.

  • You should start a new this._concat([...]) whenever you encounter an asynchronous event.
  • You can identify an event because it typically starts with on (e.g. onUserClick, onRes) and is represented with a hollow arrow (style.filled: false) in the D2 diagram.
  • All subsequent synchronous method calls (which wait for or pass data to each other) should be included in the same _concat array until the next event is encountered.

Example

Given this flow README:

shape: sequence_diagram

UserPage: pages/UserPage
Network: network/Network
ExtraInfo: models/ExtraInfo

# 0
UserPage.onUserClick -> Network.triggerReq.id: transform() {
  target-arrowhead: {
    style.filled: false
  }
}

# 1
Network.triggerReq -> ExtraInfo.getToken.pageName: _context(), getPageName()

# 2
ExtraInfo.getToken -> Network.triggerReq.token: identity() {
  target-arrowhead: {
    shape: arrow
  }
}

# 3
Network.onRes -> UserPage.renderDOM.userInfo: transform2() {
  target-arrowhead: {
    style.filled: false
  }
}

The corresponding TypeScript code is:

import { Flow } from "graphicode-utils";
import UserPage from "pages/UserPage";
import Network from "network/Network";
import ExtraInfo from "models/ExtraInfo";

import transform from "algorithms/transform";
import getPageName from "algorithms/getPageName";
import identity from "algorithms/identity";
import transform2 from "algorithms/transform2";

class ExampleFlow extends Flow {
  constructor() {
    super();

    // # 0: Asynchronous call (event -> method)
    const concat0 = this._connect(0, 'async', UserPage, 'onUserClick', Network, 'triggerReq', 'id', [transform]);
    
    // # 1: Synchronous call (method -> method.param)
    const concat1 = this._connect(1, 'sync', Network, 'triggerReq', ExtraInfo, 'getToken', 'pageName', [this._context, getPageName]);

    // # 2: Synchronous call return (method -> method.param)
    const concat2 = this._connect(2, 'return', ExtraInfo, 'getToken', Network, 'triggerReq', 'token', [identity]);

    // concat these connections **in order** since they stem from the same event
    this._concat([concat0, concat1, concat2]);

    // # 3: Asynchronous call (event -> method)
    const concat3 = this._connect(3, 'async', Network, 'onRes', UserPage, 'renderDOM', 'userInfo', [transform2]);

    // start a new concat since this is a new event
    this._concat([concat3]);
  }
}

const exampleFlow = new ExampleFlow();

export default exampleFlow;

Shell Command Usage

read a specific flow README

cat ./<flowDir>/<flowId>/README.d2.md

write the flow module code

echo '...' > ./<flowDir>/<flowId>/index.ts

Others

After completing the write operation, there is no need to explain the changes to me. Just reply with "mission complete".

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

graphicode-init

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

graphicode-architect

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

graphicode-junior-engineer-ts-algorithm

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

graphicode-start-ts-bun

No summary provided by upstream source.

Repository SourceNeeds Review