AI进度管理工具

Ava是一个AI驱动的进度管理工具,通过自动向Slack报告任务进度、阻塞和完成情况,帮助开发者和团队保持沟通,同时不影响工作流程。

  • by yutakobayashidev
  • TypeScript
  • 本地部署
  • 9 星标
  • 更新于
在 GitHub 查看 yutakobayashidev/ava

使用说明

艾娃

Ava 即使是不擅长共享进展和与团队交流的人AI 是创造自动帮助外部化和信息共享的世界的项目。

由于工作过于集中而忘记了进度报告,在堵塞却很难商量的定期进度确认会议上中断编码。有这样的烦恼吗?

Ava 能够

自动进度Slack报告

Claude Code 啊Cursor 等AI 在编码代理中工作时,自动Slack 的规格化距离的幂函数。

  • 任务开始:报告开始致力于什么
  • 进捗更新:随时共享工作进度
  • 封锁报告自动商量有困难的事情
  • 休止・再开:共享其他任务优先和暂停的情况
  • 完了报告:共享完成内容

隐私设计

Slack 中描述的场景,使用下列步骤创建明细表,以便在概念设计中分析体量的周长。不发送代码全文、私钥或令牌或错误日志详细信息。仅提交工作摘要、阻塞暂停原因摘要和完成摘要。

自动控制

什么时候报告,用哪个粒度说话,共享什么可以用自然语言控制。不是完全自动化的工具,根据提示自己控制例程也能得到安心感。

超焦点也可以放心

即使在集中工作的时候AI 取而代之的是和团队进行交流。不需要微管理,可以在保持信赖关系的同时集中精力开发。


主要功能

MCP 服务器

Model Context Protocol (MCP) 支持HTTP 打开服务器 /mcp 端点提供。AI Agents 中所述修改相应参数的值。

可用工具:

  • start_task -启动任务Slack 通知
  • update_task -更新进度(自动消除阻塞暂停)
  • report_blocked -报告封锁
  • pause_task -暂停任务
  • resume_task -继续暂停任务
  • complete_task -任务完成和PR 报告
  • list_tasks -获取任务列表

OAuth 2.1 + PKCE 认证

在安全认证流程中MCP 保护客户机:

  • 动态客户端注册(/api/oauth/register)
  • Authorization Code + PKCE 流程/oauth/authorize)
  • 访问令牌管理(/api/oauth/token)
  • Well-Known 元数据端点

Slack 统合

用户身份验证:

  • Slack OpenID Connect 无缝登录
  • 以工作区为单位安装机器人

实时通知:

  • 为每个任务创建专用线程
  • 实时发布开始、进度、阻塞、暂停、恢复和完成
  • 不发送代码和机密信息,只发送抽象摘要

每日报告:

  • /daily-report 通过命令AI 生成每日摘要
  • 仅对执行用户可见ephemeral message

Stripe 预订

Terraform 费用计划管理:

  • Infrastructure as Code 管理费用计划
  • dev/prod 每个环境的独立设置
  • lookup key 灵活的价格管理
  • Stripe Provider(lukasaron/stripe)を使用

预订API:

  • 检出 (POST /api/stripe/checkout:重定向至预订购买屏幕
  • 吊索入口 (POST /api/stripe/portal-session:重定向至预订管理屏幕
  • 预订获取 (GET /api/stripe/subscription:获取当前预订信息

Webhook 対応:

  • customer.subscription.created/updated/deleted:自动同步预订更改
  • customer.deleted:删除客户时的数据清理
  • 通过签名验证进行安全通信

费用计划:

  • Basic Plan: 500円/月
  • 查找关键字 basic_monthly 动态获取价格
  • 自动税计算对应(日本)

仪表板,仪表板

Web UI 任务可视化:

  • 按状态查看正在进行、封锁、暂停和完成
  • 任务详细历史记录(记录更新、阻止、暂停)
  • 查看整个团队的工作状态列表

開発者体験

  • 单点登岸(Slack协作→频道选择→MCP 设置)
  • .mcp.json 自动生成
  • 自签名证书开发服务器
  • TypeScript 完全支持

体系结构

Monorepo 构成

这个项目pnpm workspace 使用monorepo 配置:

ava/
├── apps/
│   └── www/              # Next.js アプリケーション (MCP サーバー、API、ダッシュボード)
├── packages/
│   ├── database/         # Drizzle ORM スキーマと DB ユーティリティ
│   └── integrations/     # 外部サービス連携 (Slack, Stripe など)
└── infra/                # Terraform による Infrastructure as Code

系统体系结构

┌─────────────────┐
│   AI Agents     │
│  (MCP Client)   │
└────────┬────────┘
         │ HTTPS + OAuth 2.1
         ▼
┌─────────────────────────────────────────────────┐
│            Ava (Next.js 16)                     │
│                                                 │
│  ┌──────────┐      ┌────────────┐              │
│  │   /mcp   │      │  /api/*    │              │
│  │  (Hono)  │      │  (Hono)    │              │
│  └──────────┘      └────────────┘              │
│                                                 │
│  ┌──────────────────────────────┐              │
│  │    Next.js App Router        │              │
│  │  (Dashboard, Onboarding)     │              │
│  └──────────────────────────────┘              │
│                                                 │
│  ┌──────────────────────────────┐              │
│  │   OpenTelemetry              │              │
│  │   (instrumentation.ts)       │              │
│  └──────────────────────────────┘              │
└────┬───────────┬───────────┬───────────┬────────┘
     │           │           │           │
     ▼           ▼           ▼           ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│PostgreSQL│ │Slack API │ │Stripe API│ │  Axiom   │
│(Drizzle) │ │(Bot,OIDC)│ │(Payments)│ │ (Traces) │
└──────────┘ └──────────┘ └──────────┘ └──────────┘

路由配置:

  • /mcp - MCP 服务器(Hono,单独路由)
  • /api/* - API 端点(Hono、catch-all根)
    • /api/oauth/* - OAuth 2.1 授权服务器
    • /api/auth/* - Slack OIDC 认证
    • /api/slack/* - Slack 协作(机器人安装、命令)
    • /api/stripe/* - Stripe 预订(检出、链接门户、Webhook)
    • /api/health -健康检查
  • 其他-Next.js App Router(仪表板,登入)

技术栈

|类别|技术| | ------------------ | ---------------------------------------- | | 框架结构 |Next.js 16(应用路由器),React 19| | API 是4.10。 | 数据库 |PostgreSQL+Drizzle ORM| | 认证 |Arctic(OAuth 2.1)、Slack OpenID Connect| | 主控程序 |@hono/mcp,@modelcontextprotocol/sdk| | 人工智能 |Vercel AI SDK+OpenAI| | 决済 |条纹| | 基础设施 |地形,条纹提供商(lukasaron)| | 可观测性 |开放遥测,Axiom| | 用户界面 |顺风CSS v4,Radix UI,shadcn/UI| | 型安全 |TypeScript 5,Zod| | 测试 |维特斯特,剧作家| | 开发工具 |pnpm、左撇子、ESLint、Prettier|


前提条件

必须

  • Node.js 18+ (corepack enable pnpm 推奨)
  • Docker&Docker编写 (PostgreSQL 用)
  • Slack 应用 -使用以下设置创建:

Slack 应用程序设置

方法 1: App Manifest を使用(推奨)

  1. 松弛API 从中选择“创建新应用程序”→“从应用程序管理器”

  2. 选择工作区

  3. 以下App Manifest 粘贴(<YOUR_BASE_URL> 实际基础URL ):

{
  "display_information": {
    "name": "Ava"
  },
  "features": {
    "bot_user": {
      "display_name": "Ava",
      "always_online": false
    },
    "slash_commands": [
      {
        "command": "/daily-report",
        "url": "https://<YOUR_BASE_URL>/api/slack/commands",
        "description": "本日のタスクサマリを生成",
        "usage_hint": "",
        "should_escape": false
      }
    ]
  },
  "oauth_config": {
    "redirect_urls": [
      "https://<YOUR_BASE_URL>/api/auth/slack/callback",
      "https://<YOUR_BASE_URL>/api/slack/install/callback"
    ],
    "scopes": {
      "user": ["openid", "profile", "email"],
      "bot": [
        "chat:write",
        "chat:write.public",
        "channels:read",
        "groups:read",
        "commands"
      ]
    }
  },
  "settings": {
    "interactivity": {
      "is_enabled": true,
      "request_url": "https://<YOUR_BASE_URL>/api/slack/interactions"
    },
    "org_deploy_enabled": false,
    "socket_mode_enabled": false,
    "token_rotation_enabled": true
  }
}
  1. 应用程序凭据 从 Client ID、Client Secret、Signing Secret 获得

方法2:手动设定

  1. 松弛API 从中选择“创建新应用程序”→“从scratch”

  2. OAuth和权限 的Bot Token Scopes 添加:

    • chat:write -留言帖子
    • chat:write.public -发布到公共频道
    • channels:read -获取通道列表
    • groups:read -获取专用频道列表
    • commands - Slash Command 実行
  3. OAuth和权限 的User Token Scopes 添加:

    • openid - OpenID Connect 认证
    • profile -获取基本信息
    • email -获取电子邮件地址
  4. OAuth和权限 的Redirect URLs 添加:

    https://<YOUR_BASE_URL>/api/auth/slack/callback
    https://<YOUR_BASE_URL>/api/slack/install/callback
    
  5. 斜杠命令 的 /daily-report 创建:

    • 请求URL: https://<YOUR_BASE_URL>/api/slack/commands
    • 说明: 本日のタスクサマリを生成
  6. 应用程序凭据 从 Client ID、Client Secret、Signing Secret 获得

  • OpenAI API 按键 - OpenAI平台 获得
  • Stripe 账户 - 条纹仪表板 创建帐户
    • 在测试环境中开发时API 键和Webhook 使用密码
    • Webhook 端点: https://<YOUR_BASE_URL>/api/stripe/webhook
    • Webhook 事件: customer.subscription.created, customer.subscription.updated, customer.subscription.deleted, customer.deleted

设置环境变量

项目根目录 .env 请创建文件。.env.example 请参考:

cp .env.example .env

然后,设置以下环境变量。

环境变量说明

变数名 说明 必须
NEXT_PUBLIC_BASE_URL 应用程序基础URL。OAuth 元数据和Slack 重定向URL 用于构建Yes
NEXT_PUBLIC_SITE_NAME |站点名称(默认值:“Ava”)|否|
DATABASE_URL PostgreSQL 接続文字列 Yes
SLACK_APP_CLIENT_ID Slack 应用程序Client ID Yes
SLACK_APP_CLIENT_SECRET Slack 应用程序Client Secret Yes
SLACK_SIGNING_SECRET Slack 应用程序Signing Secret(Slash Command 的签名验证使用)|Yes
OPENAI_API_KEY OpenAI API 键(用于每日报告功能)Yes
STRIPE_SECRET_KEY Stripe API 密钥(测试环境: sk_test_、本番环境: sk_live_) 是
STRIPE_WEBHOOK_SECRET Stripe Webhook 签名密码(用于验证Webhook事件)Yes
AXIOM_API_TOKEN Axiom API 标记(用于发送OpenTelemetry跟踪,仅限于生产环境)No
AXIOM_DATASET_NAME Axiom 数据集名称(OpenTelemetry跟踪目标,仅限于生产环境)No

本地开发

# corepack を有効化
$ npm run setup

# 依存関係をインストール
$ pnpm install

# .env としてコピー
$ cp .env.example .env

.env 请在文件中设置环境变量(请参阅前面的“设置环境变量”)。

# PostgreSQL コンテナを起動
$ pnpm db:up

# マイグレーションを実行
$ pnpm db:migrate

# 開発サーバーを起動
$ pnpm dev

在动态输入提示中单击https://localhost:3000中所述修改相应参数的值。

Stripe Webhook 本地测试

Stripe CLI 在本地环境中Webhook 可测试:

# Stripe CLI でローカルに Webhook を転送
$ pnpm dev:stripe

# 別のターミナルで開発サーバーを起動
$ pnpm dev

Stripe CLI 的 STRIPE_WEBHOOK_SECRET 进行动态观察时的轴心点.env 请设置为文件。

Terraform 在中部署费用计划

# Stripe API キーを環境変数に設定
$ export TF_VAR_stripe_api_key=sk_test_xxxxx

# dev 環境の場合
$ cd infra/enviroments/dev

# Terraform を初期化(初回のみ)
$ ../../../infra/tf.sh init

# 変更内容を確認
$ ../../../infra/tf.sh plan

# Stripe にデプロイ
$ ../../../infra/tf.sh apply

# Price ID などの出力を確認
$ ../../../infra/tf.sh output

注意: 本番环境(infra/enviroments/prod)中API 键(sk_live_),模板名称将采用不同的格式。

测试

单元测试

$ pnpm test
$ pnpm test:watch

E2E测试

$ pnpm exec playwright install chrome

$ pnpm build

$ pnpm test:e2e
$ pnpm test:e2e:ui

数据库

$ pnpm db:up        # PostgreSQL コンテナを起動
$ pnpm db:migrate   # マイグレーションを実行
$ pnpm db:studio    # Drizzle Studio を起動
$ pnpm db:down      # PostgreSQL コンテナを停止

入门设置

启动开发服务器后,按照以下步骤Slack 协作和MCP 完成设置。

第1步:Slack 登录到

  1. 在浏览器中https://localhost:3000访问
  2. 「Login with Slack」来修改标记元素的显示属性
  3. Slack 认证画面许可

第2步:Slack 在工作区中安装机器人

  1. 仪表板上的“滑动协作”或 /slack/install/start 访问
  2. 选择要安装机器人的工作区
  3. 确认所需权限并允许

步骤3:选择通知通道

  1. /onboarding/connect-slack 访问
  2. 选择要发布任务进度的通道
  3. 单击保存

注: 如果以后想变更的话 /settings/channel 中所述修改相应参数的值。

第4步:MCP 客户端设置

  1. /onboarding/setup-mcp 访问
  2. 复制显示的设置

注: 以后想确认设定的情况下 /settings 中所述修改相应参数的值。3.项目路线 .mcp.json 创建并粘贴文件:

{
  "mcpServers": {
    "ava": {
      "type": "http",
      "url": "https://localhost:3000/mcp"
    }
  }
}

步骤5:AI Agents 连接到

# 自己署名証明書を許可して AI Agent を起動
NODE_TLS_REJECT_UNAUTHORIZED=0 claude

初次连接时,在浏览器中OAuth 2.1 的规格化距离的幂函数。单击“允许”AI Agents 从Ava 的,之MCP 可以使用工具了。


MCP 工具详细信息

start_task

启动新任务。

参数:

  • issue.provider: "github" 或 "manual"
  • issue.id: GitHub Issue 编号(可选)
  • issue.title:任务标题
  • initial_summary:初始状态说明

动作:

  • 在数据库中创建新的任务会话
  • Slack 在的通知频道上创建新线程,发布开始消息
  • 保存线程信息

update_task

更新任务进度。

参数:

  • task_session_id:任务会话ID
  • summary:进度汇总
  • raw_context:详细上下文(仅数据库保存Slack ),模板名称将采用不同的格式

动作:

  • 打开 in_progress 返回到
  • 自动消除未解决的阻塞和暂停
  • Slack 向线程发布进度

report_blocked

报告任务发生阻塞。

参数:

  • task_session_id:任务会话ID
  • reason:阻塞原因
  • raw_context:详细上下文(可选)

动作:

  • 打开 blocked 更新为
  • Slack 通知线程封锁

pause_task

暂停任务。

参数:

  • task_session_id:任务会话ID
  • reason:暂停原因
  • raw_context:详细上下文(可选)

动作:

  • 打开 paused 更新为
  • Slack 通知线程暂停

resume_task

恢复暂停的任务。

参数:

  • task_session_id:任务会话ID
  • summary:恢复状态
  • raw_context:详细上下文(可选)

动作:

  • 打开 in_progress 返回到
  • 暂停报告 resumed_at 记录
  • Slack 通知线程重新启动

complete_task

完成任务。

参数:

  • task_session_id:任务会话ID
  • summary:完成摘要

动作:

  • 打开 completed 更新为
  • 完成信息upsert
  • Slack 向线程提交完成

list_tasks

获取任务列表。

参数:

  • status:按状态筛选in_progress, blocked, paused, completed)(可选)
  • limit:获取次数上限(可选)

返回值:

  • 验证用户任务列表(更新日期和时间降序)

每日报告功能

Slack 的 /daily-report 在您查看完详细信息后,单击AI 总结今天的任务。

目标任务

  • 本日 completed 已完成的任务
  • 今天更新了 in_progress 或 blocked 任务

动作

  1. 从数据库检索目标任务
  2. OpenAI API 使用汇总任务
  3. 仅显示已运行的用户ephemeral message 回复

必要条件

  • OPENAI_API_KEY 设置环境变量
  • Slack 安装机器人

安全和隐私

存储在数据库中

  • 用户信息(Slack ID、邮箱地址)
  • 工作区信息和Bot 令牌
  • 任务会话、更新历史记录、阻塞报告、暂停报告
  • OAuth 客户端信息、授权代码和访问令牌

Slack 发送给

  • 任务抽象摘要(开始、进度、阻塞、暂停和完成)
  • 状态更改通知

Slack 未发送给

  • 代码全文和片段
  • 私钥、令牌和环境变量
  • 原始错误日志和堆栈跟踪
  • 存储库机密信息

raw_context 参数中指定的数据仅存储在数据库中Slack 中所述修改相应参数的值。


故障排除

AI Agents 无法连接

症状: MCP 从客户端Ava 挂牵

解决方法:

  1. 允许自签名证书启动:
    NODE_TLS_REJECT_UNAUTHORIZED=0 claude
    
  2. .mcp.json 的,之URL 确认是否正确
  3. 确认开发服务器是否启动(pnpm dev)

Slack 通知不到

症状: 启动/更新任务Slack 未通知

解决方法:

  1. /settings/channel 确认、变更通知频道的设置
  2. Slack 机器人是否安装在工作区中 /settings 确认
  3. 确认机器人是否参加通知频道(应该是自动参加)

数据库连接错误

症状: ECONNREFUSED 啊 database "ava" does not exist 错误

解决方法:

# コンテナの状態を確認
docker compose ps

# コンテナを再起動
pnpm db:down
pnpm db:up

# マイグレーションを再実行
pnpm db:migrate

/daily-report 挂怀

症状: Slack 的 /daily-report 执行时返回错误

解决方法:

  1. OPENAI_API_KEY 的 .env 查看项目中可用的所有族
  2. Slack 应用程序Slash Commands 确认设置
  3. Request URL 确认是否正确: <BASE_URL>/api/slack/commands

分发

欢迎分享!

  1. 分叉此存储库
  2. 创建特征分支(git checkout -b feature/amazing-feature)
  3. 提交更改(git commit -m 'Add some amazing feature')
  4. 推到分支(git push origin feature/amazing-feature)
  5. Pull Request 创建

了解更多信息 贡献.md 来修改标记元素的显示属性。


许可证

这个项目MIT 在许可证下公开。了解更多信息 许可证 请参见文件。


谢辞