inmem-memo 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +150 -0
  2. package/bin/cli.js +126 -0
  3. package/package.json +58 -0
package/README.md ADDED
@@ -0,0 +1,150 @@
1
+ # ⚡ InMem Scratchpad
2
+
3
+ <div align="center">
4
+
5
+ <img src="src/assets/icon.png" width="128" height="128" alt="InMem Scratchpad Icon" />
6
+
7
+ ### 超高速・完全インメモリ型スクラッチパッド メモアプリケーション
8
+ **npm / npx で即座に起動・インストール可能(Windows / macOS / Linux マルチプラットフォーム対応)**
9
+
10
+ [![npm version](https://img.shields.io/npm/v/inmem-memo.svg?style=flat-square&color=cb3837)](https://www.npmjs.com/package/inmem-memo)
11
+ [![Framework: Tauri v2](https://img.shields.io/badge/Framework-Tauri%20v2.0-6366f1.svg?style=flat-square&logo=tauri&logoColor=white)](https://v2.tauri.app/)
12
+ [![Frontend: React 18](https://img.shields.io/badge/Frontend-React%2018%20%2B%20Vite%205-61dafb.svg?style=flat-square&logo=react&logoColor=black)](https://react.dev/)
13
+ [![Storage: In-Memory Only](https://img.shields.io/badge/Storage-In--Memory%20Only-f59e0b.svg?style=flat-square)](https://github.com/)
14
+ [![License: MIT](https://img.shields.io/badge/License-MIT-10b981.svg?style=flat-square)](LICENSE)
15
+
16
+ </div>
17
+
18
+ ---
19
+
20
+ ## 🚀 クイックスタート (npm / npx)
21
+
22
+ Node.js がインストールされていれば、**インストール不要で今すぐ実行**できます:
23
+
24
+ ```bash
25
+ # インストールなしで即座に起動
26
+ npx inmem-memo
27
+ ```
28
+
29
+ グローバルコマンドとして常駐させたい場合:
30
+
31
+ ```bash
32
+ # グローバルインストール
33
+ npm install -g inmem-memo
34
+
35
+ # どこからでも起動
36
+ inmem-memo
37
+ ```
38
+
39
+ > [!TIP]
40
+ > **🍎 macOS で初回起動時にセキュリティ警告が表示された場合**
41
+ > Mac の **「システム設定」➔「プライバシーとセキュリティ」** を開き、画面下部の「"inmem-memo" は開発元を確認できないためブロックされました」の横にある **「このまま開く (Open Anyway)」** を1回クリックしてください。以降は通常通り起動します。
42
+
43
+ ---
44
+
45
+ ## 📖 コンセプト
46
+
47
+ **「すぐに書いて、すぐに捨てる。」**
48
+
49
+ 日常のコーディングや作業中に発生する一時的なJSONの確認、正規表現による文字列置換、作業ログの控えなど、「保存する必要はないが今すぐ広げて使いたい」メモに特化した軽量スクラッチパッドです。
50
+
51
+ タイトル編集・ファイル保存・フォルダ階層・検索インデックスといった複雑な管理機能をあえて排除し、**Rust + Tauri v2 による極限の高速起動と軽量性、完全なインメモリ設計**を実現しています。
52
+
53
+ ---
54
+
55
+ ## 🌟 主な機能・特長
56
+
57
+ ### 1. 🛡️ 完全インメモリ保護ポリシー (Pure In-Memory)
58
+ - **メモ本文の非永続化**: メモ内容はハードディスク・データベース・localStorage に一切書き込まれません。
59
+ - **プロセスの完全終了とデータ破棄**: アプリケーションを完全に終了(設定画面の「アプリを完全終了」またはトレイメニューの「Quit」)すると、OSのメモリ解放によりデータは即座に完全消滅します。
60
+ - **誤終了防止**: テキスト入力中にウィンドウを閉じようとした場合の警告アラートを標準装備。
61
+
62
+ ### 2. ⚡ 右側クイックアクション・ツールバー (JSON整形 & 正規表現置換)
63
+ - **JSON自動整形 (JSON Format)**:
64
+ - ツールバー最上段に標準配置。崩れたJSON文字列をインデント付き(2スペース)で瞬時に美しく自動整形。
65
+ - **カスタム正規表現アクション**:
66
+ - 設定画面から「よく使う正規表現置換」をユーザー自身で自由に追加・編集・並べ替え・保存可能。
67
+ - **ライブテスト機能**: 設定画面内で正規表現の動作をリアルタイムにプレビュー確認可能。
68
+ - **ワンクリック追加プリセット**:
69
+ - 「空行を削除」(`^\s*$\n` ➔ `""`)
70
+ - 「行末スペース削除」(`[ \t]+$` ➔ `""`)
71
+ - 「カンマを改行に」(`,\s*` ➔ `\n`)
72
+ - 「HTMLタグ除去」(`<[^>]+>` ➔ `""`)
73
+ - 「連続空白を1つに」(`[ \t]+` ➔ `" "`)
74
+
75
+ ### 3. ↩️ `Ctrl + Z` (Undo) & `Ctrl + Y` (Redo) 履歴スタックの完全サポート
76
+ - JSON整形や正規表現アクションを実行した後でも、**`Ctrl + Z`(Mac: `Cmd + Z`)** を押すだけで、アクション実行前の元のテキストへ一瞬で完璧に巻き戻せます。
77
+ - やり直したい場合は **`Ctrl + Y`** または **`Ctrl + Shift + Z`(Mac: `Cmd + Shift + Z`)** で復元可能。
78
+ - ヘッダーにも視覚的な「↩️ 戻す」「↪️ やり直す」アイコンボタンを搭載。
79
+
80
+ ### 4. ⌨️ グローバルショートカット & タスクトレイ常駐
81
+ - **常駐バックグラウンド待機**: ウィンドウの「×」ボタンを押すと、プロセスを終了せずにタスクトレイ(Windows)/ メニューバー(macOS)へ最小化。
82
+ - **瞬時のホットキー呼び出し**:
83
+ - 別の作業中(ブラウザやIDEなど)でも、ショートカットキーを押すだけで画面最前面に即座にポップアップ表示 / 非表示。
84
+ - デフォルトは `Ctrl + Shift + M`(Mac: `Cmd + Shift + M`)。
85
+ - 設定画面の**キー入力レコーダー**で、お好みのショートカットキーに直感的に変更可能(即時反映)。
86
+
87
+ ### 5. ⚙️ 設定のローカル永続化 & 完全終了ボタン
88
+ - メモ本文はメモリ限定ですが、以下の**ユーザー設定項目はローカル(localStorage)に安全に永続化**されます:
89
+ - グローバルショートカットキー
90
+ - 登録したカスタム正規表現アクション一覧
91
+ - カラーテーマ(Midnight Dark / OLED Pure Black)
92
+ - エディタ設定(フォントサイズ 13px/15px/17px、Tabインデント幅 2/4、自動折り返し)
93
+ - **アプリの完全終了 (Exit)**:
94
+ - 設定画面の「メモリ・終了」タブ、またはトレイの右クリックメニューから、タスクトレイ常駐を含めたプロセス全体を完全に終了できます。
95
+
96
+ ### 6. 🎨 プレミアム UI & Markdown プレビュー
97
+ - **Dark Glassmorphism UI**: 深みのあるグラデーションと洗練されたダークモード。
98
+ - **Markdown プレビュー**: `Preview` ボタンでエディタとレンダリング表示をシームレスに切り替え。
99
+ - **リアルタイムメトリクス**: ステータスバーに文字数・単語数・行数をライブ表示。
100
+ - **ワンクリック操作**: 全文コピー (`Copy`)、手動バックアップ用エクスポート (`Export .md`)、クリア (`Clear`)。
101
+
102
+ ---
103
+
104
+ ## ⌨️ ショートカットキー一覧
105
+
106
+ | ショートカット | 動作 |
107
+ |---|---|
108
+ | `Ctrl + Shift + M` (Mac: `Cmd + Shift + M`) | **グローバル呼び出し**(アプリの表示 / 非表示トグル)※設定で変更可能 |
109
+ | `Ctrl + Z` (Mac: `Cmd + Z`) | **元に戻す (Undo)**(手入力・JSON整形・正規表現置換の直前状態へ復元) |
110
+ | `Ctrl + Y` / `Ctrl + Shift + Z` | **やり直す (Redo)** |
111
+ | `Tab` | エディタ内でのインデント挿入(スペース 2/4) |
112
+ | 「×」閉じるボタン / トレイクリック | ウィンドウをトレイに隠す(メモリ上のメモデータは維持) |
113
+
114
+ ---
115
+
116
+ ## 🏗️ 技術スタック & アーキテクチャ
117
+
118
+ - **コアバックエンド**: [Tauri v2 (2.0)](https://v2.tauri.app/) (Rust)
119
+ - `tauri-plugin-global-shortcut`: システム全体のホットキーバインド
120
+ - `tray-icon`: システムトレイ・メニューバー常駐
121
+ - `include_image!`: ネイティブアイコン埋め込み
122
+ - **フロントエンド**: [React 18](https://react.dev/) + [Vite 5](https://vitejs.dev/) + [Lucide Icons](https://lucide.dev/)
123
+ - **スタイリング**: Vanilla CSS (CSS Variables, Flex/Grid, Glassmorphism, Animations)
124
+ - **配信・パッケージング**:
125
+ - npm: CLI 自動ランナー (`inmem-memo`)
126
+ - GitHub Actions: Windows (`.exe`), macOS (`.dmg`), Linux (`.AppImage`) 自動ビルド
127
+
128
+ ---
129
+
130
+ ## 💻 ローカル開発・ソースコードからのビルド
131
+
132
+ ```powershell
133
+ # 依存パッケージのインストール
134
+ npm install
135
+
136
+ # フロントエンド開発サーバーの起動 (ブラウザ確認)
137
+ npm run dev
138
+
139
+ # Tauri デスクトップアプリのローカル開発起動
140
+ npm run tauri dev
141
+
142
+ # プロダクションビルド
143
+ npm run tauri build
144
+ ```
145
+
146
+ ---
147
+
148
+ ## 📄 ライセンス
149
+
150
+ [MIT License](LICENSE) © 2026 InMem Scratchpad Project
package/bin/cli.js ADDED
@@ -0,0 +1,126 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import os from 'os';
6
+ import { spawn } from 'child_process';
7
+ import https from 'https';
8
+ import { fileURLToPath } from 'url';
9
+
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = path.dirname(__filename);
12
+
13
+ // Read package.json for version and metadata
14
+ const packageJson = JSON.parse(
15
+ fs.readFileSync(path.join(__dirname, '../package.json'), 'utf8')
16
+ );
17
+
18
+ const VERSION = packageJson.version;
19
+ const REPO = 'jakelizzI/InMem_Scratchpad';
20
+ const CACHE_DIR = path.join(os.homedir(), '.inmem-memo', `v${VERSION}`);
21
+
22
+ function getPlatformInfo() {
23
+ const platform = process.platform;
24
+ const arch = process.arch;
25
+
26
+ if (platform === 'win32') {
27
+ return {
28
+ osName: 'windows',
29
+ fileName: 'inmem-memo.exe',
30
+ assetName: 'inmem-memo.exe',
31
+ executable: 'inmem-memo.exe'
32
+ };
33
+ } else if (platform === 'darwin') {
34
+ return {
35
+ osName: 'macos',
36
+ fileName: 'inmem-memo',
37
+ assetName: arch === 'arm64' ? 'inmem-memo_aarch64' : 'inmem-memo_x64',
38
+ executable: 'inmem-memo'
39
+ };
40
+ } else if (platform === 'linux') {
41
+ return {
42
+ osName: 'linux',
43
+ fileName: 'inmem-memo.AppImage',
44
+ assetName: 'inmem-memo.AppImage',
45
+ executable: 'inmem-memo.AppImage'
46
+ };
47
+ } else {
48
+ throw new Error(`Unsupported platform: ${platform} (${arch})`);
49
+ }
50
+ }
51
+
52
+ function downloadFile(url, destPath) {
53
+ return new Promise((resolve, reject) => {
54
+ https.get(url, (response) => {
55
+ // Handle redirects (GitHub releases 302 redirect to S3/CDN)
56
+ if (response.statusCode >= 300 && response.statusCode < 400 && response.headers.location) {
57
+ return downloadFile(response.headers.location, destPath).then(resolve).catch(reject);
58
+ }
59
+
60
+ if (response.statusCode !== 200) {
61
+ return reject(new Error(`Failed to download binary: HTTP ${response.statusCode}`));
62
+ }
63
+
64
+ const fileStream = fs.createWriteStream(destPath);
65
+ response.pipe(fileStream);
66
+
67
+ fileStream.on('finish', () => {
68
+ fileStream.close();
69
+ resolve();
70
+ });
71
+
72
+ fileStream.on('error', (err) => {
73
+ fs.unlink(destPath, () => {});
74
+ reject(err);
75
+ });
76
+ }).on('error', reject);
77
+ });
78
+ }
79
+
80
+ async function main() {
81
+ try {
82
+ const platformInfo = getPlatformInfo();
83
+
84
+ if (!fs.existsSync(CACHE_DIR)) {
85
+ fs.mkdirSync(CACHE_DIR, { recursive: true });
86
+ }
87
+
88
+ const localBinaryPath = path.join(CACHE_DIR, platformInfo.executable);
89
+
90
+ // If not cached locally, download from GitHub Releases
91
+ if (!fs.existsSync(localBinaryPath)) {
92
+ console.log(`⚡ InMem Scratchpad (v${VERSION}) をセットアップしています...`);
93
+ console.log(`📥 ネイティブバイナリ (${platformInfo.osName}) を取得中...`);
94
+
95
+ const downloadUrl = `https://github.com/${REPO}/releases/download/v${VERSION}/${platformInfo.assetName}`;
96
+
97
+ try {
98
+ await downloadFile(downloadUrl, localBinaryPath);
99
+ if (process.platform !== 'win32') {
100
+ fs.chmodSync(localBinaryPath, 0o755);
101
+ }
102
+ console.log('✅ セットアップが完了しました!');
103
+ } catch (dlErr) {
104
+ console.error(`\n⚠️ バイナリの自動ダウンロードに失敗しました (${dlErr.message})`);
105
+ console.error(`GitHub Releases (https://github.com/${REPO}/releases) から手動で取得することも可能です。\n`);
106
+ process.exit(1);
107
+ }
108
+ }
109
+
110
+ // Launch application in detached mode
111
+ console.log('🚀 InMem Scratchpad を起動しています...');
112
+ const child = spawn(localBinaryPath, [], {
113
+ detached: true,
114
+ stdio: 'ignore'
115
+ });
116
+
117
+ child.unref();
118
+ process.exit(0);
119
+
120
+ } catch (err) {
121
+ console.error(`❌ エラー: ${err.message}`);
122
+ process.exit(1);
123
+ }
124
+ }
125
+
126
+ main();
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "inmem-memo",
3
+ "version": "1.0.0",
4
+ "description": "Ultra-Fast In-Memory Scratchpad Memo Application for Windows, macOS, and Linux",
5
+ "type": "module",
6
+ "bin": {
7
+ "inmem-memo": "bin/cli.js"
8
+ },
9
+ "files": [
10
+ "bin",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/jakelizzI/InMem_Scratchpad.git"
17
+ },
18
+ "homepage": "https://github.com/jakelizzI/InMem_Scratchpad#readme",
19
+ "bugs": {
20
+ "url": "https://github.com/jakelizzI/InMem_Scratchpad/issues"
21
+ },
22
+ "keywords": [
23
+ "scratchpad",
24
+ "memo",
25
+ "in-memory",
26
+ "tauri",
27
+ "react",
28
+ "desktop-app",
29
+ "json-formatter",
30
+ "quick-memo"
31
+ ],
32
+ "author": "jakelizzI",
33
+ "license": "MIT",
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "scripts": {
38
+ "dev": "vite",
39
+ "build": "vite build",
40
+ "preview": "vite preview",
41
+ "tauri": "tauri"
42
+ },
43
+ "dependencies": {
44
+ "@tauri-apps/api": "^2.0.0",
45
+ "@tauri-apps/plugin-global-shortcut": "^2.0.0",
46
+ "lucide-react": "^0.344.0",
47
+ "marked": "^12.0.0",
48
+ "react": "^18.3.1",
49
+ "react-dom": "^18.3.1"
50
+ },
51
+ "devDependencies": {
52
+ "@tauri-apps/cli": "^2.0.0",
53
+ "@types/react": "^18.3.12",
54
+ "@types/react-dom": "^18.3.1",
55
+ "@vitejs/plugin-react": "^4.3.3",
56
+ "vite": "^5.4.10"
57
+ }
58
+ }