Skill: echoofzion/little-steve-task-manager (version 0.1.7)

--- name: little-steve-task-manager version: 0.1.7 description: Little Steve Task Manager: a lightweight IM-native task system for quick task operations in chat, with daily summaries and auto status updates. / 小史任务管理器：面向 IM 场景的轻量任务系统，可在聊天中快速管理任务，并支持每日汇总与自动状态更新。 --- # Little Steve Task Manager A lightweight task manager for chat workflows: add, list, update status, reprioritize, and complete tasks quickly. ## Data Files - `skills/little-steve-task-manager/data/tasks.json` - `skills/little-steve-task-manager/data/settings.json` ## Agent Command Conventions 1. Add task ```bash bash {baseDir}/scripts/task.sh add --title "<Title>" --priority P2 --due "2026-03-05" --tags "ops,finance" ``` 2. List tasks ```bash bash {baseDir}/scripts/task.sh list --status open ``` 3. Update status ```bash bash {baseDir}/scripts/task.sh update --id <id> --status doing ``` 4. Change priority ```bash bash {baseDir}/scripts/task.sh update --id <id> --priority P1 ``` 5. Mark done ```bash bash {baseDir}/scripts/task.sh done --id <id> ``` ## Status Enum - `open` — todo - `doing` — in progress - `blocked` — blocked - `done` — completed - `cancelled` — cancelled ## Priority - `P0` > `P1` > `P2` > `P3` ## IM Output Format - Sort order: priority → due date → created time - Per item format: `[status][priority] #ID title (due: date) tags` --- # 小史任务管理器 面向聊天工作流的轻量任务管理器：快速新增、列表、更新状态、调整优先级与完成任务。 ## 数据文件 - `skills/little-steve-task-manager/data/tasks.json` - `skills/little-steve-task-manager/data/settings.json` ## Agent 执行约定 1. 新增任务 ```bash bash {baseDir}/scripts/task.sh add --title "<标题>" --priority P2 --due "2026-03-05" --tags "ops,finance" ``` 2. 查看任务 ```bash bash {baseDir}/scripts/task.sh list --status open ``` 3. 更新状态 ```bash bash {baseDir}/scripts/task.sh update --id <id> --status doing ``` 4. 调整优先级 ```bash bash {baseDir}/scripts/task.sh update --id <id> --priority P1 ``` 5. 完成任务 ```bash bash {baseDir}/scripts/task.sh done --id <id> ``` ## 状态枚举 - `open` — 待办 - `doing` — 进行中 - `blocked` — 阻塞 - `done` — 已完成 - `cancelled` — 已取消 ## 优先级 - `P0` > `P1` > `P2` > `P3` ## IM 输出规范 - 列表排序：优先级 → 截止日 → 创建时间 - 每条显示：`[状态][优先级] #ID 标题 (due: 日期) tags`

path: README.md
content: # Little Steve Task Manager

Manage tasks directly in IM chats: add, view, sort, update status, and complete tasks.

The Little Steve Task Manager is designed for **fast adoption, low learning cost, and strong workflow integration**. You can complete the full task-management loop directly in chat without switching to heavy tools. It also supports configurable daily summaries and automatic status updates for personal execution, project delivery, and daily TODO tracking.

## Key Capabilities

- Task status: `open` / `doing` / `blocked` / `done` / `cancelled`
- Priority levels: `P0` > `P1` > `P2` > `P3`
- List sorting: priority → due date → created time
- Daily summary reminders (configurable)
- Auto status updates (configurable)

## Dependency

- `jq`

macOS:
```bash
brew install jq
```

## Common Commands

```bash
# Add
bash scripts/task.sh add --title "voice pipeline test" --priority P1 --due "2026-03-03" --tags "openai-whisper"

# List
bash scripts/task.sh list --status open

# Update status
bash scripts/task.sh update --id 1 --status doing

# Done
bash scripts/task.sh done --id 1
```

## Data Files

- `data/tasks.json`
- `data/settings.json`

---

# 小史任务管理器

在 IM（即时通讯）中直接管理任务：新增、查看、排序、更新状态、完成任务。

小史任务管理器强调**快速可用、低学习成本、与日常工作流高度融合**。无需切换到复杂工具，直接在聊天里就能完成任务管理闭环；同时支持每日汇总与自动状态更新配置，适合个人执行管理、项目推进和日常待办追踪。

## 主要能力

- 任务状态：`open` / `doing` / `blocked` / `done` / `cancelled`
- 优先级：`P0` > `P1` > `P2` > `P3`
- 列表排序：优先级 → 截止日 → 创建时间
- 每日汇总提醒（可配置）
- 自动状态更新（可配置）

## 依赖

- `jq`

macOS:
```bash
brew install jq
```

## 常用命令

```bash
# 新增
bash scripts/task.sh add --title "语音链路实测" --priority P1 --due "2026-03-03" --tags "openai-whisper"

# 列表
bash scripts/task.sh list --status open

# 更新状态
bash scripts/task.sh update --id 1 --status doing

# 完成
bash scripts/task.sh done --id 1
```

## 数据文件

- `data/tasks.json`
- `data/settings.json`


path: data/settings.json
content: {
  "autoStatusUpdate": true,
  "dailySummary": {
    "enabled": true,
    "times": ["10:00", "18:00"],
    "channel": "im"
  },
  "dueReminders": {
    "enabled": false,
    "hoursBefore": [24, 2]
  },
  "blockedReminder": {
    "enabled": false,
    "thresholdHours": 2,
    "priorities": ["P0", "P1"]
  },
  "quietHours": {
    "enabled": false,
    "start": "23:00",
    "end": "08:00"
  },
  "priorityFilter": {
    "enabled": false,
    "levels": ["P0", "P1", "P2", "P3"]
  },
  "ui": {
    "showSettingsHelpOnModify": true
  }
}


path: data/tasks.json
content: {
  "nextId": 13,
  "tasks": [
    {
      "createdAt": "2026-03-02T16:07:47Z",
      "due": "2026-03-03",
      "id": 1,
      "priority": "P1",
      "priorityWeight": 1,
      "status": "open",
      "tags": [
        "openai-whisper"
      ],
      "title": "语音链路实测",
      "updatedAt": "2026-03-02T16:07:47Z"
    },
    {
      "createdAt": "2026-03-02T16:07:53Z",
      "due": "2026-03-04",
      "id": 3,
      "priority": "P2",
      "priorityWeight": 2,
      "status": "open",
      "tags": [
        "installer"
      ],
      "title": "installer 增加覆盖/新装交互",
      "updatedAt": "2026-03-02T16:07:53Z"
    },
    {
      "createdAt": "2026-03-02T16:20:00Z",
      "due": "2026-03-03",
      "id": 4,
      "priority": "P1",
      "priorityWeight": 1,
      "status": "done",
      "tags": [
        "little-steve-task-manager",
        "im",
        "naming"
      ],
      "title": "Little Steve Task Manager å½åä¸ä»»å¡æè¿°æ´æ°",
      "updatedAt": "2026-03-02T16:38:00Z"
    },
    {
      "createdAt": "2026-03-02T16:20:00Z",
      "due": "2026-03-04",
      "id": 5,
      "priority": "P2",
      "priorityWeight": 2,
      "status": "open",
      "tags": [
        "meme",
        "tg",
        "wechat"
      ],
      "title": "文字动作表情包：输入文案自动生成 TG+微信 动态包",
      "updatedAt": "2026-03-02T16:20:00Z"
    },
    {
      "createdAt": "2026-03-02T16:20:00Z",
      "due": "2026-03-03",
      "id": 6,
      "priority": "P1",
      "priorityWeight": 1,
      "status": "open",
      "tags": [
        "gps",
        "monitor"
      ],
      "title": "GPSUSDT 币价监控复核（cron/heartbeat/阈值）",
      "updatedAt": "2026-03-02T16:20:00Z"
    },
    {
      "createdAt": "2026-03-02T16:20:00Z",
      "due": "2026-03-04",
      "id": 7,
      "priority": "P1",
      "priorityWeight": 1,
      "status": "open",
      "tags": [
        "gps",
        "exchange-reserve"
      ],
      "title": "交易所GPS数量监控（Bybit自动化并扩展Binance/Bitget/Bithumb）",
      "updatedAt": "2026-03-02T16:20:00Z"
    },
    {
      "createdAt": "2026-03-02T16:20:00Z",
      "due": "",
      "id": 8,
      "priority": "P2",
      "priorityWeight": 2,
      "status": "blocked",
      "tags": [
        "on-hold",
        "xiaoshi"
      ],
      "title": "小史状态仓（游戏化可交互Web）",
      "updatedAt": "2026-03-02T16:20:00Z"
    },
    {
      "createdAt": "2026-03-02T16:20:00Z",
      "due": "",
      "id": 9,
      "priority": "P2",
      "priorityWeight": 2,
      "status": "blocked",
      "tags": [
        "on-hold",
        "clawplaza"
      ],
      "title": "ClawPlaza（任务广场+skills/资产交易）",
      "updatedAt": "2026-03-02T16:20:00Z"
    },
    {
      "createdAt": "2026-03-02T16:39:00Z",
      "due": "2026-03-04",
      "id": 10,
      "priority": "P1",
      "priorityWeight": 1,
      "status": "doing",
      "tags": [
        "clawhub",
        "publisher",
        "automation",
        "merged-from-2"
      ],
      "title": "èªå¨åå¸å° ClawHubï¼æ¥å¥ token ä¸ä¸é®åå¸æµç¨ï¼",
      "updatedAt": "2026-03-03T09:56:00Z"
    },
    {
      "createdAt": "2026-03-04T15:06:00Z",
      "due": "2026-03-06",
      "id": 11,
      "priority": "P1",
      "priorityWeight": 1,
      "status": "doing",
      "tags": [
        "content-inbox",
        "skill",
        "im"
      ],
      "title": "落地 little-steve-content-inbox（转发内容收录+未读/已读/收藏）",
      "updatedAt": "2026-03-04T15:27:00Z"
    },
    {
      "id": 12,
      "title": "$(rm -rf /)",
      "status": "cancelled",
      "priority": "P2",
      "priorityWeight": 2,
      "due": "",
      "tags": [],
      "createdAt": "2026-03-04T16:33:15Z",
      "updatedAt": "2026-03-04T16:33:35Z"
    }
  ]
}


path: scripts/task.sh
content: #!/usr/bin/env bash
set -euo pipefail

BASE_DIR="$(cd "$(dirname "$0")/.." && pwd)"
DB="$BASE_DIR/data/tasks.json"

init_db(){
  if [[ ! -f "$DB" ]]; then
    mkdir -p "$(dirname "$DB")"
    cat > "$DB" <<JSON
{"tasks":[],"nextId":1}
JSON
    chmod 600 "$DB"
  fi
}

require_jq(){
  command -v jq >/dev/null 2>&1 || { echo "jq is required"; exit 1; }
}

priority_weight(){
  case "$1" in
    P0) echo 0 ;;
    P1) echo 1 ;;
    P2) echo 2 ;;
    P3) echo 3 ;;
    *) echo "error: invalid priority (allow: P0|P1|P2|P3): $1" >&2; exit 1 ;;
  esac
}

validate_status(){
  case "$1" in
    open|doing|blocked|done|cancelled) ;;
    "") ;;
    *) echo "error: invalid status (allow: open|doing|blocked|done|cancelled): $1" >&2; exit 1 ;;
  esac
}

validate_date(){
  local v="$1"
  [[ -z "$v" ]] && return 0
  [[ "$v" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] || { echo "error: invalid due date (YYYY-MM-DD): $v" >&2; exit 1; }
}

validate_id(){
  [[ "$1" =~ ^[0-9]+$ ]] || { echo "error: invalid id (must be positive integer): $1" >&2; exit 1; }
}

validate_tags(){
  [[ -z "$1" ]] && return 0
  if ! [[ "$1" =~ ^[a-zA-Z0-9_,\ -]+$ ]]; then
    echo "error: --tags contains invalid characters (allow: alphanumeric, hyphen, underscore, comma)" >&2
    exit 1
  fi
  if [[ ${#1} -gt 200 ]]; then
    echo "error: --tags exceeds 200 char limit" >&2; exit 1
  fi
}

validate_title(){
  if [[ ${#1} -gt 500 ]]; then
    echo "error: --title exceeds 500 char limit" >&2; exit 1
  fi
}

cmd_add(){
  local title="" priority="P2" due="" tags=""
  while [[ $# -gt 0 ]]; do
    case "$1" in
      --title) [[ $# -ge 2 ]] || { echo "error: missing value for --title" >&2; exit 1; }; title="$2"; shift 2 ;;
      --priority) [[ $# -ge 2 ]] || { echo "error: missing value for --priority" >&2; exit 1; }; priority="$2"; shift 2 ;;
      --due) [[ $# -ge 2 ]] || { echo "error: missing value for --due" >&2; exit 1; }; due="$2"; shift 2 ;;
      --tags) [[ $# -ge 2 ]] || { echo "error: missing value for --tags" >&2; exit 1; }; tags="$2"; shift 2 ;;
      *) echo "error: unknown arg: $1" >&2; exit 1 ;;
    esac
  done

  [[ -n "$title" ]] || { echo "error: missing --title" >&2; exit 1; }
  validate_title "$title"
  priority_weight "$priority" >/dev/null
  validate_date "$due"
  validate_tags "$tags"

  local now id w
  now="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
  id=$(jq -r '.nextId' "$DB")
  w=$(priority_weight "$priority")

  jq --arg title "$title" --arg priority "$priority" --arg due "$due" --arg tags "$tags" --arg now "$now" --argjson id "$id" --argjson w "$w" '
    .tasks += [{
      id:$id,
      title:$title,
      status:"open",
      priority:$priority,
      priorityWeight:$w,
      due:$due,
      tags:($tags|split(",")|map(gsub("^[[:space:]]+|[[:space:]]+$";"")|select(length>0))),
      createdAt:$now,
      updatedAt:$now
    }] |
    .nextId += 1
  ' "$DB" > "$DB.tmp" && mv "$DB.tmp" "$DB"
  echo "added #$id"
}

cmd_update(){
  local id="" status="" priority="" due="" title=""
  while [[ $# -gt 0 ]]; do
    case "$1" in
      --id) [[ $# -ge 2 ]] || { echo "error: missing value for --id" >&2; exit 1; }; id="$2"; shift 2 ;;
      --status) [[ $# -ge 2 ]] || { echo "error: missing value for --status" >&2; exit 1; }; status="$2"; shift 2 ;;
      --priority) [[ $# -ge 2 ]] || { echo "error: missing value for --priority" >&2; exit 1; }; priority="$2"; shift 2 ;;
      --due) [[ $# -ge 2 ]] || { echo "error: missing value for --due" >&2; exit 1; }; due="$2"; shift 2 ;;
      --title) [[ $# -ge 2 ]] || { echo "error: missing value for --title" >&2; exit 1; }; title="$2"; shift 2 ;;
      *) echo "error: unknown arg: $1" >&2; exit 1 ;;
    esac
  done

  [[ -n "$id" ]] || { echo "error: missing --id" >&2; exit 1; }
  validate_id "$id"
  validate_status "$status"
  [[ -z "$priority" ]] || priority_weight "$priority" >/dev/null
  validate_date "$due"
  [[ -z "$title" ]] || validate_title "$title"

  local now w
  now="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
  w=$( [[ -n "$priority" ]] && priority_weight "$priority" || echo 0 )

  jq --argjson id "$id" --arg status "$status" --arg priority "$priority" --arg due "$due" --arg title "$title" --arg now "$now" --argjson w "$w" '
    .tasks |= map(if .id==$id then
      .status = (if $status=="" then .status else $status end) |
      .priority = (if $priority=="" then .priority else $priority end) |
      .priorityWeight = (if $priority=="" then .priorityWeight else $w end) |
      .due = (if $due=="" then .due else $due end) |
      .title = (if $title=="" then .title else $title end) |
      .updatedAt = $now
    else . end)
  ' "$DB" > "$DB.tmp" && mv "$DB.tmp" "$DB"
  echo "updated #$id"
}

cmd_done(){
  local id=""
  if [[ "${1:-}" == "--id" ]]; then
    [[ $# -ge 2 ]] || { echo "error: missing value for --id" >&2; exit 1; }
    id="$2"
  else
    id="${1:-}"
  fi
  [[ -n "$id" ]] || { echo "usage: task.sh done --id <id>" >&2; exit 1; }
  validate_id "$id"
  cmd_update --id "$id" --status done
}

cmd_list(){
  local status=""
  while [[ $# -gt 0 ]]; do
    case "$1" in
      --status) [[ $# -ge 2 ]] || { echo "error: missing value for --status" >&2; exit 1; }; status="$2"; shift 2 ;;
      *) echo "error: unknown arg: $1" >&2; exit 1 ;;
    esac
  done

  validate_status "$status"

  jq -r --arg status "$status" '
    .tasks
    | (if $status=="" then . else map(select(.status==$status)) end)
    | sort_by(.priorityWeight, (if .due=="" then "9999-12-31" else .due end), .createdAt)
    | .[]
    | "[\(.status)][\(.priority)] #\(.id) \(.title)" +
      (if .due=="" then "" else " (due: \(.due))" end) +
      (if (.tags|length)>0 then " tags:" + (.tags|join(",")) else "" end)
  ' "$DB"
}

main(){
  require_jq
  init_db
  local cmd="${1:-}"
  shift || true
  case "$cmd" in
    add) cmd_add "$@" ;;
    update) cmd_update "$@" ;;
    done) cmd_done "$@" ;;
    list) cmd_list "$@" ;;
    *) echo "usage: task.sh {add|update|done|list}"; exit 1 ;;
  esac
}

main "$@"


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)