艾娃
 ](https://github.com/yutakobayashidev/ava/stargazers) ](https://github.com/yutakobayashidev/ava/issues)  
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 を使用(推奨)
- 松弛API 从中选择“创建新应用程序”→“从应用程序管理器”
- 选择工作区
- 以下App Manifest 粘贴(`` 实际基础URL ):
{
"display_information": {
"name": "Ava"
},
"features": {
"bot_user": {
"display_name": "Ava",
"always_online": false
},
"slash_commands": [
{
"command": "/daily-report",
"url": "https:///api/slack/commands",
"description": "本日のタスクサマリを生成",
"usage_hint": "",
"should_escape": false
}
]
},
"oauth_config": {
"redirect_urls": [
"https:///api/auth/slack/callback",
"https:///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:///api/slack/interactions"
},
"org_deploy_enabled": false,
"socket_mode_enabled": false,
"token_rotation_enabled": true
}
}- 应用程序凭据 从
Client ID、Client Secret、Signing Secret获得
方法2:手动设定
- 松弛API 从中选择“创建新应用程序”→“从scratch”
- OAuth和权限 的Bot Token Scopes 添加:
- chat:write -留言帖子 - chat:write.public -发布到公共频道 - channels:read -获取通道列表 - groups:read -获取专用频道列表 - commands - Slash Command 実行
- OAuth和权限 的User Token Scopes 添加:
- openid - OpenID Connect 认证 - profile -获取基本信息 - email -获取电子邮件地址
- OAuth和权限 的Redirect URLs 添加:
https:///api/auth/slack/callback
https:///api/slack/install/callback- 斜杠命令 的
/daily-report创建:
- 请求URL: https:///api/slack/commands - 说明: 本日のタスクサマリを生成
- 应用程序凭据 从
Client ID、Client Secret、Signing Secret获得
- 在测试环境中开发时API 键和Webhook 使用密码 - Webhook 端点: https:///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 devStripe 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:watchE2E测试
$ 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 登录到
- 在浏览器中https://localhost:3000访问
- 「Login with Slack」来修改标记元素的显示属性
- Slack 认证画面许可
第2步:Slack 在工作区中安装机器人
- 仪表板上的“滑动协作”或
/slack/install/start访问 - 选择要安装机器人的工作区
- 确认所需权限并允许
步骤3:选择通知通道
/onboarding/connect-slack访问- 选择要发布任务进度的通道
- 单击保存
注: 如果以后想变更的话 /settings/channel 中所述修改相应参数的值。第4步:MCP 客户端设置
/onboarding/setup-mcp访问- 复制显示的设置
注: 以后想确认设定的情况下/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:任务会话IDsummary:进度汇总raw_context:详细上下文(仅数据库保存Slack ),模板名称将采用不同的格式
动作:
- 打开
in_progress返回到 - 自动消除未解决的阻塞和暂停
- Slack 向线程发布进度
report_blocked
报告任务发生阻塞。
参数:
task_session_id:任务会话IDreason:阻塞原因raw_context:详细上下文(可选)
动作:
- 打开
blocked更新为 - Slack 通知线程封锁
pause_task
暂停任务。
参数:
task_session_id:任务会话IDreason:暂停原因raw_context:详细上下文(可选)
动作:
- 打开
paused更新为 - Slack 通知线程暂停
resume_task
恢复暂停的任务。
参数:
task_session_id:任务会话IDsummary:恢复状态raw_context:详细上下文(可选)
动作:
- 打开
in_progress返回到 - 暂停报告
resumed_at记录 - Slack 通知线程重新启动
complete_task
完成任务。
参数:
task_session_id:任务会话IDsummary:完成摘要
动作:
- 打开
completed更新为 - 完成信息upsert
- Slack 向线程提交完成
list_tasks
获取任务列表。
参数:
status:按状态筛选in_progress,blocked,paused,completed)(可选)limit:获取次数上限(可选)
返回值:
- 验证用户任务列表(更新日期和时间降序)
______________________________________________________________________
每日报告功能
Slack 的 /daily-report 在您查看完详细信息后,单击AI 总结今天的任务。
目标任务
- 本日
completed已完成的任务 - 今天更新了
in_progress或blocked任务
动作
- 从数据库检索目标任务
- OpenAI API 使用汇总任务
- 仅显示已运行的用户ephemeral message 回复
必要条件
OPENAI_API_KEY设置环境变量- Slack 安装机器人
______________________________________________________________________
安全和隐私
存储在数据库中
- 用户信息(Slack ID、邮箱地址)
- 工作区信息和Bot 令牌
- 任务会话、更新历史记录、阻塞报告、暂停报告
- OAuth 客户端信息、授权代码和访问令牌
Slack 发送给
- 任务抽象摘要(开始、进度、阻塞、暂停和完成)
- 状态更改通知
Slack 未发送给
- 代码全文和片段
- 私钥、令牌和环境变量
- 原始错误日志和堆栈跟踪
- 存储库机密信息
raw_context 参数中指定的数据仅存储在数据库中Slack 中所述修改相应参数的值。
______________________________________________________________________
故障排除
AI Agents 无法连接
症状: MCP 从客户端Ava 挂牵
解决方法:
- 允许自签名证书启动:
NODE_TLS_REJECT_UNAUTHORIZED=0 claude.mcp.json的,之URL 确认是否正确- 确认开发服务器是否启动(
pnpm dev)
Slack 通知不到
症状: 启动/更新任务Slack 未通知
解决方法:
/settings/channel确认、变更通知频道的设置- Slack 机器人是否安装在工作区中
/settings确认 - 确认机器人是否参加通知频道(应该是自动参加)
数据库连接错误
症状: ECONNREFUSED 啊 database "ava" does not exist 错误
解决方法:
# コンテナの状態を確認
docker compose ps
# コンテナを再起動
pnpm db:down
pnpm db:up
# マイグレーションを再実行
pnpm db:migrate/daily-report 挂怀
症状: Slack 的 /daily-report 执行时返回错误
解决方法:
OPENAI_API_KEY的.env查看项目中可用的所有族- Slack 应用程序Slash Commands 确认设置
- Request URL 确认是否正确:
/api/slack/commands
______________________________________________________________________
分发
欢迎分享!
- 分叉此存储库
- 创建特征分支(
git checkout -b feature/amazing-feature) - 提交更改(
git commit -m 'Add some amazing feature') - 推到分支(
git push origin feature/amazing-feature) - Pull Request 创建
了解更多信息 贡献.md 来修改标记元素的显示属性。
______________________________________________________________________
许可证
这个项目MIT 在许可证下公开。了解更多信息 许可证 请参见文件。
______________________________________________________________________
