【JavaScript】仕事を始める時に便利なコマンドを作ってみる

## はじめに
はじめまして。RIOと申します。
普段はモバイルアプリ開発を行いながらバックエンドとAWSの学習中です！
初投稿なので、書き方等間違っていましたらご容赦ください..


## 業務開始時の憂鬱
私は普段、仕事や勉強に関わるメモをPCで取っています。
もともとMacのメモアプリで取っていましたが、現在はVSCodeで落ち着いています。

特に、仕事の時は毎日その日のメモ用のMarkdownファイルを作成しているのですが...
毎日手動でメモファイルを作るのは**まあ面倒**です...💦  
  
  
あーあ。コマンド叩いたらメモ用のファイル作ってくれないかな。
ついでに今日やることリスト作ってくれたり、なんかもう全部やってくれないかな-...

と、現実逃避シリーズしていても仕方ないので..
今回はカスタムなコマンドを作成して、業務開始時にメモファイルを作ってもらうことにしました。


## 目標
* 業務開始時にコマンドを実行したらその日のメモ用マークダウンファイルを作れるようにする

例えば、以下のdiaryフォルダに毎日のメモを残していく構成にしているとします。
```
~/dev/workspace/
├── notes/
│   ├── diary/  
│   |　　├─ yyyy-mm-dd.md
```
ここのdiaryフォルダ以下に毎日のメモを自動的に残していくといったものを目指していきます。


## 作成するもの
最終的な成果物は以下のとおりです。
```
workspace/
├── index.js         ← メインコマンドスクリプト
├── lib/
│   └── start.js     ← wrk start 実行用の処理
├── notes/
│   └── diary/
├── package.json
```

## 準備
* Node.jsとnpmの環境を整えます。以下を実行してバージョンが表示されるかどうかを確認します。
```
node -v
npm -v
```

## package.jsonを作成
* ルートディレクトリで以下のコマンドを実行してpackage.jsonファイルを作成します。
```
npm init -y
```

## lib/start.jsを作成
* 実行された日付を取得してマークダウンファイルを作成するメソッドを作成します。
```js:~/lib/start.js
import fs from "fs";

export async function runStartCommand() {
  const today = new Date();
  const yyyy = today.getFullYear();
  const mm = String(today.getMonth() + 1).padStart(2, '0');
  const dd = String(today.getDate()).padStart(2, '0');
  const filename = `${yyyy}-${mm}-${dd}_today.md`;
  const filePath = `notes/diary/${filename}`;

  // 日次メモ生成
  // notes/diaryフォルダがなければ作成
  if (!fs.existsSync("notes/diary")) {
    fs.mkdirSync("notes/diary", { recursive: true });
  }

  // ファイルが作成されていない場合は作成
  if (!fs.existsSync(filePath)) {
    const template = `# ${yyyy}-${mm}-${dd} メモ

## ✅ 今日やったこと
- 

## 💡 気づき・学び
- 

## 🎯 明日やること
- 

---

📌 メモ
`;

    fs.writeFileSync(filePath, template);
    console.log(`日報ファイル作成: ${filePath}`);
  } else {
    console.log(`既に日報ファイルが存在します: ${filePath}`);
  }
}
```
このメソッドでは日次ファイルを作成しています。
`template`で、好みのテンプレートを指定しています。

## 日次ファイルを作成するコマンドを決める
* 日次ファイルを作成するためのコマンドを作ります。例えば..

```
wrk start   // wrkは"work"の意味を込めたカスタムなコマンド。
```
のように、startを実行すると自動的に先ほど作成した`runStartCommand()`が実行できるようにします。

## index.js作成


```js:~/index.js
#!/usr/bin/env node

import { runStartCommand } from "./lib/start.js";

const command = process.argv[2];

switch (command) {
    case "start":
        runStartCommand();
        break;
    default:
        console.log("❓ 未知のコマンドです。例: wrk start");
}

```
コンソールで"start"が叩かれたら、`./lib/start.js`の`runStartCommand`を実行するサンプルです。

※なぜ`argv[2]`と記載するのかはこちらを参考にしてください。

https://qiita.com/furusin_oriver/items/f030d1eaa9e7b54233c3


## index.jsを実行可能なコマンドとして登録
* package.jsonに以下のフィールドを追加します。
```json:package.json
"bin": {
  "wrk": "./index.js"
},
"type": "module"
```
* package.json記載後に以下を実行します。

```
npm link
```

これで`wrk`コマンドがローカル環境で使えるようになります。

## 実行！
```
$ wrk start
日報ファイル作成: notes/diary/2025-03-22_today.md
```
![スクリーンショット 2025-03-22 21.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582240/ebf487b4-6de6-465f-9696-167a84b61a83.png)
~/notes/diaryフォルダにファイルが作成されたことも確認できました！！

## まとめ
これで`wrk start`を実行するだけで日次ファイルを作成することができるようになりました！
毎日毎日手作業でファイルを作る必要がなく、また作り忘れも防げるのかなと思ってます。

また、`runStartCommand`にはメモファイルを作成するだけでなく、他にも業務開始時に行いたい処理を載せることができます。例えば、Jiraを使って今日の自分のタスクなどを表示したりもできるみたいなので、今度また記事を書いてみます！

以上、ご覧いただきありがとうございました🙇