Skip to content

Paste-to-import + AI auto-labeling for tasks #53

Description

@ryota-murakami

Motivation

Corelive はまだ「使い物にならない」最大要因が 既存タスクを取り込めない=乗り換えられない こと。最小コストで「自分の過去/現在のタスク群を流し込めて、即 dogfooding できる」状態を作る。

Slice 1 — Paste import (no metadata)

  • 複数行テキストをペースト → \n で split → 空行除去 → 1行1レコード
  • Vercel dashboard の env var 画面のような「貼ると行ごとに分かれる」UX
  • メタデータなしで投入。Completed として入れると過去実績がそのままヒートマップ(草)に反映され、即「自分の過去を見てくれてる」報酬が出る
  • 実装は textarea + split('\n') + prisma.createMany レベル。PR1枚

Slice 2 — AI auto-labeling (optional)

  • 入った行に対し、カテゴリ/日付などを後付け。手動 or AI 自動
  • 「雑に雰囲気でラベル付ける」用途。ピーク性能不要、安いモデルで十分

技術方針

  • Vercel AI SDK (ai) を抽象レイヤーに。プロバイダ非依存でモデル差し替え自由
  • 裏に OpenRouter (@openrouter/ai-sdk-provider)。APIキー1本で300+モデル、安いのにルーティング
  • generateObject + Zod で型安全な構造化ラベル出力(既存 Category enum を schema に)
  • 安いモデル候補: Groq Llama 8B / Gemini Flash-Lite / DeepSeek V3.2
  • ⚠️ Electron なので AI 呼び出しは Next.js server 側src/server/)。クライアントにキーを晒さない
  • DeepSeek 等の直 SDK は1ベンダーロックで逆に不便 → OpenRouter 経由が後で楽

Slice 3 以降(動線メモ)

ラベル付く → 並び替えたくなる → DnDTodo.order 活用) → 大量描画で re-render 最適化。最初のかゆいところから技術詳細まで一直線に繋がる。

const { object } = await generateObject({
  model: openrouter('google/gemini-2.0-flash-lite-001'),
  schema: z.object({
    items: z.array(z.object({
      text: z.string(),
      category: z.enum(['Work','Health','Learning','Life']),
    })),
  }),
  prompt: `Label each task line:\n${pastedLines.join('\n')}`,
})

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions