feique 1.1.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.
- package/LICENSE +21 -0
- package/README.en.md +220 -0
- package/README.md +265 -0
- package/dist/backend/claude.d.ts +36 -0
- package/dist/backend/claude.js +358 -0
- package/dist/backend/claude.js.map +1 -0
- package/dist/backend/codex.d.ts +31 -0
- package/dist/backend/codex.js +100 -0
- package/dist/backend/codex.js.map +1 -0
- package/dist/backend/factory.d.ts +9 -0
- package/dist/backend/factory.js +56 -0
- package/dist/backend/factory.js.map +1 -0
- package/dist/backend/types.d.ts +54 -0
- package/dist/backend/types.js +2 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/bridge/commands.d.ts +135 -0
- package/dist/bridge/commands.js +860 -0
- package/dist/bridge/commands.js.map +1 -0
- package/dist/bridge/service.d.ts +160 -0
- package/dist/bridge/service.js +3785 -0
- package/dist/bridge/service.js.map +1 -0
- package/dist/bridge/task-queue.d.ts +14 -0
- package/dist/bridge/task-queue.js +81 -0
- package/dist/bridge/task-queue.js.map +1 -0
- package/dist/bridge/types.d.ts +39 -0
- package/dist/bridge/types.js +2 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1199 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex/capabilities.d.ts +20 -0
- package/dist/codex/capabilities.js +41 -0
- package/dist/codex/capabilities.js.map +1 -0
- package/dist/codex/runner.d.ts +47 -0
- package/dist/codex/runner.js +294 -0
- package/dist/codex/runner.js.map +1 -0
- package/dist/codex/session-index.d.ts +22 -0
- package/dist/codex/session-index.js +205 -0
- package/dist/codex/session-index.js.map +1 -0
- package/dist/collaboration/awareness.d.ts +36 -0
- package/dist/collaboration/awareness.js +107 -0
- package/dist/collaboration/awareness.js.map +1 -0
- package/dist/collaboration/digest.d.ts +65 -0
- package/dist/collaboration/digest.js +178 -0
- package/dist/collaboration/digest.js.map +1 -0
- package/dist/collaboration/handoff.d.ts +66 -0
- package/dist/collaboration/handoff.js +94 -0
- package/dist/collaboration/handoff.js.map +1 -0
- package/dist/collaboration/insights.d.ts +24 -0
- package/dist/collaboration/insights.js +243 -0
- package/dist/collaboration/insights.js.map +1 -0
- package/dist/collaboration/knowledge.d.ts +26 -0
- package/dist/collaboration/knowledge.js +105 -0
- package/dist/collaboration/knowledge.js.map +1 -0
- package/dist/collaboration/timeline.d.ts +31 -0
- package/dist/collaboration/timeline.js +150 -0
- package/dist/collaboration/timeline.js.map +1 -0
- package/dist/collaboration/trust.d.ts +49 -0
- package/dist/collaboration/trust.js +176 -0
- package/dist/collaboration/trust.js.map +1 -0
- package/dist/config/codex-skill.d.ts +7 -0
- package/dist/config/codex-skill.js +44 -0
- package/dist/config/codex-skill.js.map +1 -0
- package/dist/config/doctor.d.ts +12 -0
- package/dist/config/doctor.js +314 -0
- package/dist/config/doctor.js.map +1 -0
- package/dist/config/init.d.ts +3 -0
- package/dist/config/init.js +123 -0
- package/dist/config/init.js.map +1 -0
- package/dist/config/load.d.ts +33 -0
- package/dist/config/load.js +252 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/mutate.d.ts +21 -0
- package/dist/config/mutate.js +86 -0
- package/dist/config/mutate.js.map +1 -0
- package/dist/config/paths.d.ts +3 -0
- package/dist/config/paths.js +33 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +308 -0
- package/dist/config/schema.js +250 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/control-plane/project-session.d.ts +67 -0
- package/dist/control-plane/project-session.js +234 -0
- package/dist/control-plane/project-session.js.map +1 -0
- package/dist/feishu/base.d.ts +19 -0
- package/dist/feishu/base.js +93 -0
- package/dist/feishu/base.js.map +1 -0
- package/dist/feishu/cards.d.ts +22 -0
- package/dist/feishu/cards.js +144 -0
- package/dist/feishu/cards.js.map +1 -0
- package/dist/feishu/client.d.ts +61 -0
- package/dist/feishu/client.js +315 -0
- package/dist/feishu/client.js.map +1 -0
- package/dist/feishu/diagnostics.d.ts +42 -0
- package/dist/feishu/diagnostics.js +194 -0
- package/dist/feishu/diagnostics.js.map +1 -0
- package/dist/feishu/doc.d.ts +13 -0
- package/dist/feishu/doc.js +59 -0
- package/dist/feishu/doc.js.map +1 -0
- package/dist/feishu/extractors.d.ts +7 -0
- package/dist/feishu/extractors.js +215 -0
- package/dist/feishu/extractors.js.map +1 -0
- package/dist/feishu/long-connection.d.ts +12 -0
- package/dist/feishu/long-connection.js +41 -0
- package/dist/feishu/long-connection.js.map +1 -0
- package/dist/feishu/message-resource.d.ts +14 -0
- package/dist/feishu/message-resource.js +309 -0
- package/dist/feishu/message-resource.js.map +1 -0
- package/dist/feishu/replay.d.ts +37 -0
- package/dist/feishu/replay.js +114 -0
- package/dist/feishu/replay.js.map +1 -0
- package/dist/feishu/task.d.ts +18 -0
- package/dist/feishu/task.js +86 -0
- package/dist/feishu/task.js.map +1 -0
- package/dist/feishu/text.d.ts +23 -0
- package/dist/feishu/text.js +155 -0
- package/dist/feishu/text.js.map +1 -0
- package/dist/feishu/webhook.d.ts +23 -0
- package/dist/feishu/webhook.js +130 -0
- package/dist/feishu/webhook.js.map +1 -0
- package/dist/feishu/wiki.d.ts +52 -0
- package/dist/feishu/wiki.js +300 -0
- package/dist/feishu/wiki.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/search.d.ts +11 -0
- package/dist/knowledge/search.js +83 -0
- package/dist/knowledge/search.js.map +1 -0
- package/dist/logging.d.ts +3 -0
- package/dist/logging.js +40 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp/server.d.ts +34 -0
- package/dist/mcp/server.js +1196 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/memory/embedding-factory.d.ts +6 -0
- package/dist/memory/embedding-factory.js +20 -0
- package/dist/memory/embedding-factory.js.map +1 -0
- package/dist/memory/embeddings.d.ts +40 -0
- package/dist/memory/embeddings.js +150 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/ollama-embeddings.d.ts +63 -0
- package/dist/memory/ollama-embeddings.js +215 -0
- package/dist/memory/ollama-embeddings.js.map +1 -0
- package/dist/memory/retrieve.d.ts +17 -0
- package/dist/memory/retrieve.js +29 -0
- package/dist/memory/retrieve.js.map +1 -0
- package/dist/memory/summarize.d.ts +13 -0
- package/dist/memory/summarize.js +58 -0
- package/dist/memory/summarize.js.map +1 -0
- package/dist/observability/cost.d.ts +12 -0
- package/dist/observability/cost.js +22 -0
- package/dist/observability/cost.js.map +1 -0
- package/dist/observability/dashboard-html.d.ts +5 -0
- package/dist/observability/dashboard-html.js +304 -0
- package/dist/observability/dashboard-html.js.map +1 -0
- package/dist/observability/metrics.d.ts +36 -0
- package/dist/observability/metrics.js +230 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/readiness.d.ts +31 -0
- package/dist/observability/readiness.js +57 -0
- package/dist/observability/readiness.js.map +1 -0
- package/dist/observability/server.d.ts +84 -0
- package/dist/observability/server.js +181 -0
- package/dist/observability/server.js.map +1 -0
- package/dist/projects/paths.d.ts +9 -0
- package/dist/projects/paths.js +30 -0
- package/dist/projects/paths.js.map +1 -0
- package/dist/runtime/instance-lock.d.ts +12 -0
- package/dist/runtime/instance-lock.js +99 -0
- package/dist/runtime/instance-lock.js.map +1 -0
- package/dist/runtime/process.d.ts +2 -0
- package/dist/runtime/process.js +43 -0
- package/dist/runtime/process.js.map +1 -0
- package/dist/runtime/shutdown.d.ts +11 -0
- package/dist/runtime/shutdown.js +38 -0
- package/dist/runtime/shutdown.js.map +1 -0
- package/dist/security/access.d.ts +13 -0
- package/dist/security/access.js +160 -0
- package/dist/security/access.js.map +1 -0
- package/dist/service/install.d.ts +19 -0
- package/dist/service/install.js +35 -0
- package/dist/service/install.js.map +1 -0
- package/dist/service/templates.d.ts +22 -0
- package/dist/service/templates.js +118 -0
- package/dist/service/templates.js.map +1 -0
- package/dist/state/audit-log.d.ts +33 -0
- package/dist/state/audit-log.js +116 -0
- package/dist/state/audit-log.js.map +1 -0
- package/dist/state/config-history-store.d.ts +27 -0
- package/dist/state/config-history-store.js +65 -0
- package/dist/state/config-history-store.js.map +1 -0
- package/dist/state/handoff-store.d.ts +20 -0
- package/dist/state/handoff-store.js +97 -0
- package/dist/state/handoff-store.js.map +1 -0
- package/dist/state/idempotency-store.d.ts +19 -0
- package/dist/state/idempotency-store.js +84 -0
- package/dist/state/idempotency-store.js.map +1 -0
- package/dist/state/memory-store.d.ts +137 -0
- package/dist/state/memory-store.js +713 -0
- package/dist/state/memory-store.js.map +1 -0
- package/dist/state/pending-command-store.d.ts +30 -0
- package/dist/state/pending-command-store.js +108 -0
- package/dist/state/pending-command-store.js.map +1 -0
- package/dist/state/run-state-store.d.ts +58 -0
- package/dist/state/run-state-store.js +269 -0
- package/dist/state/run-state-store.js.map +1 -0
- package/dist/state/session-store.d.ts +56 -0
- package/dist/state/session-store.js +275 -0
- package/dist/state/session-store.js.map +1 -0
- package/dist/state/trust-store.d.ts +15 -0
- package/dist/state/trust-store.js +53 -0
- package/dist/state/trust-store.js.map +1 -0
- package/dist/utils/fs.d.ts +4 -0
- package/dist/utils/fs.js +26 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/json.d.ts +1 -0
- package/dist/utils/json.js +9 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/path.d.ts +3 -0
- package/dist/utils/path.js +22 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/serial-executor.d.ts +5 -0
- package/dist/utils/serial-executor.js +12 -0
- package/dist/utils/serial-executor.js.map +1 -0
- package/package.json +71 -0
- package/skills/feique-session/SKILL.md +27 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.en.md
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# 飞鹊 (Feique) v1.1.0
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
5
|
+
**Team AI Collaboration Hub — from individual productivity to team synergy, weave AI into every stage of work.**
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/feique)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
[](https://nodejs.org)
|
|
10
|
+
[](CONTRIBUTING.md)
|
|
11
|
+
|
|
12
|
+
[简体中文](README.md) | [Website](https://colorcross.github.io/feique/en.html) | [Getting Started](docs/getting-started.md) | [Architecture](docs/architecture.md) | [FAQ](docs/faq.md)
|
|
13
|
+
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
Feique is a **Team AI Collaboration Hub**. It connects AI capabilities like Codex CLI and Claude Code through Feishu so team members collaborate, complement each other, uncover bottlenecks, and improve efficiency — driving the iteration from individual growth to smooth teamwork to continuous organizational capability building.
|
|
19
|
+
|
|
20
|
+
Currently supports the full AI coding workflow: project bindings persist by `chat_id`, local sessions can be adopted, shared repositories are automatically serialized, and queued runtime states are directly visible within Feishu. Final replies support rich text and cards, collapsed into cleaner single result messages.
|
|
21
|
+
|
|
22
|
+
## 🌟 Core Features
|
|
23
|
+
|
|
24
|
+
| Feature | Description |
|
|
25
|
+
| :--- | :--- |
|
|
26
|
+
| **Sticky Routing** | Project selection is remembered by `chat_id`. Switch once in a group, and the entire group inherits it; DMs also remember their own current project. |
|
|
27
|
+
| **Session Adoption** | Can resume the bridge's own sessions, or directly adopt native local sessions from `~/.codex/sessions` or `~/.claude/sessions` via `/session adopt`. |
|
|
28
|
+
| **Runtime Guard** | Dual-layer serialization with `queue key` + `project.root`. Threads in the same project won't conflict, and concurrent operations on the same repository across different chats are automatically queued with visible status. |
|
|
29
|
+
| **Docs / Base / Tasks** | Beyond `/wiki` and `/kb search`, the bridge can read/create Feishu Docs, list/create/complete Tasks, and list/write Base records. |
|
|
30
|
+
| **Media Aware** | Images, files, audio, and rich text messages are parsed into structured metadata and injected into Codex prompts. |
|
|
31
|
+
| **MCP Surface** | Not just for Feishu. Run `feique mcp` to expose core capabilities through `stdio` or `HTTP/SSE`, with multi-token Bearer rotation for remote clients. |
|
|
32
|
+
| **Access Roles** | Supports `viewer / operator / admin` plus finer capability allow-lists for sessions, runs, config changes, and service operations. |
|
|
33
|
+
| **Memory System** | Supports project memory and group shared memory, SQLite + FTS5 retrieval, configurable TTL, pin strategies, and background cleanup. |
|
|
34
|
+
| **Project Isolation** | Downloads, temp files, cache, and project audit logs default to `state/projects/<alias>/...`, with per-project overrides available. |
|
|
35
|
+
| **Observability** | Built-in `/healthz`, `/readyz`, and `/metrics`, plus structured audit trails and Prometheus / Alertmanager / Grafana integration. |
|
|
36
|
+
| **Multi-Backend** | A single bridge can manage both Codex and Claude Code backends, configurable globally via `[backend]` or per-project. The Claude backend supports `--model`, `--permission-mode`, `--max-budget-usd`, and other advanced options. |
|
|
37
|
+
| **Team Awareness** | `/team` shows who is using AI on what in real time, with automatic conflict warnings. |
|
|
38
|
+
| **Knowledge Loop** | `/learn` and `/recall` for team knowledge capture and semantic retrieval, with AI-powered auto-extraction. |
|
|
39
|
+
| **Handoff & Review** | `/handoff` `/pickup` `/review` `/approve` `/reject` for session handoffs and code review workflows. |
|
|
40
|
+
| **Team Insights** | `/insights` detects retry patterns, duplicated effort, queue bottlenecks, and error clusters. |
|
|
41
|
+
| **Trust Boundaries** | `/trust` enables progressive trust levels: observe → suggest → execute → autonomous. |
|
|
42
|
+
| **Context Continuity** | `/timeline` shows the project timeline; newcomers automatically receive historical context. |
|
|
43
|
+
| **Team Digest** | `/digest` sends scheduled team AI collaboration daily digests. |
|
|
44
|
+
| **Dashboard** | `GET /dashboard` provides an embedded Web UI for runtime and team status visualization. |
|
|
45
|
+
| **Cost Tracking** | Token usage stats broken down by project and user, with estimated costs. |
|
|
46
|
+
|
|
47
|
+
## 🚀 Quick Start
|
|
48
|
+
|
|
49
|
+
### 1. Installation
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm install -g feique
|
|
53
|
+
feique init --mode global
|
|
54
|
+
|
|
55
|
+
# Create a new project directory and bind it
|
|
56
|
+
feique create-project repo-new /srv/codex/repo-new
|
|
57
|
+
|
|
58
|
+
# Bind an existing directory as a project
|
|
59
|
+
feique bind repo-a /path/to/repo-a
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 2. Configure Environment Variables
|
|
63
|
+
|
|
64
|
+
Simply set the Feishu app credentials to start quickly (defaults to `long-connection` mode, no public IP required):
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
export FEISHU_APP_ID=cli_xxx
|
|
68
|
+
export FEISHU_APP_SECRET=***
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 3. Check and Start
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Check environment and connectivity
|
|
75
|
+
feique doctor --remote
|
|
76
|
+
|
|
77
|
+
# Start the service
|
|
78
|
+
feique start
|
|
79
|
+
|
|
80
|
+
# View logs
|
|
81
|
+
feique logs --follow
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 💬 Interaction Examples in Feishu
|
|
85
|
+
|
|
86
|
+
In Feishu, you can interact with Codex directly using natural language or slash commands:
|
|
87
|
+
|
|
88
|
+
```text
|
|
89
|
+
# Project Management
|
|
90
|
+
/projects
|
|
91
|
+
/project repo-a
|
|
92
|
+
/admin project create repo-new /srv/codex/repo-new
|
|
93
|
+
|
|
94
|
+
# Session Management
|
|
95
|
+
/session adopt latest
|
|
96
|
+
/session list
|
|
97
|
+
|
|
98
|
+
# Knowledge Base Operations
|
|
99
|
+
/wiki search deployment docs
|
|
100
|
+
/kb search architecture design
|
|
101
|
+
/doc read doxcn123
|
|
102
|
+
/task create Follow up the release checklist
|
|
103
|
+
/base records app_token tbl_id 5
|
|
104
|
+
|
|
105
|
+
# Team Collaboration
|
|
106
|
+
/team # See who's using AI on what
|
|
107
|
+
/learn always run e2e before deploy # Capture team knowledge
|
|
108
|
+
/recall deploy process # Semantic search existing knowledge
|
|
109
|
+
/handoff @alice continue fix # Hand off session to a teammate
|
|
110
|
+
/pickup # Pick up a session handed to you
|
|
111
|
+
/review # Request a review
|
|
112
|
+
/approve # Approve a review
|
|
113
|
+
/reject needs more test cases # Reject with reason
|
|
114
|
+
/insights # View team bottleneck diagnostics
|
|
115
|
+
/trust suggest # Set trust level for current project
|
|
116
|
+
/timeline # View project timeline
|
|
117
|
+
/digest # Manually trigger team digest
|
|
118
|
+
|
|
119
|
+
# Natural Language Commands
|
|
120
|
+
Switch to project repo-a
|
|
121
|
+
Adopt the latest session
|
|
122
|
+
Show detailed status
|
|
123
|
+
Who on the team is busy right now?
|
|
124
|
+
Hand off my session to Bob
|
|
125
|
+
What's been happening in this project lately?
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## 🏗️ Architecture Overview
|
|
129
|
+
|
|
130
|
+
```text
|
|
131
|
+
[ Feishu App ] <---> [ Transport (WS/Webhook) ]
|
|
132
|
+
|
|
|
133
|
+
v
|
|
134
|
+
[ Project Router ] ---> [ Session Manager ] ---> [ Concurrency Queue ]
|
|
135
|
+
| | |
|
|
136
|
+
v v v
|
|
137
|
+
[ Team Awareness ] [ Memory / Wiki ] [ Backend (Codex / Claude) ]
|
|
138
|
+
[ Trust Boundaries] [ Knowledge Loop ] |
|
|
139
|
+
[ Cost Tracking ] [ Context Continuity ] v
|
|
140
|
+
| | [ Local Workspace ]
|
|
141
|
+
v v
|
|
142
|
+
[ Dashboard ] [ Handoff & Review ]
|
|
143
|
+
[ Team Digest ] [ Team Insights ]
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
For detailed architecture design, please refer to the [Architecture Document](docs/architecture.md).
|
|
147
|
+
|
|
148
|
+
## ⚙️ Minimal Configuration Example
|
|
149
|
+
|
|
150
|
+
The configuration file is located at `~/.feique/config.toml` by default:
|
|
151
|
+
|
|
152
|
+
```toml
|
|
153
|
+
version = 1
|
|
154
|
+
|
|
155
|
+
[service]
|
|
156
|
+
default_project = "default"
|
|
157
|
+
reply_mode = "card" # text | post | card
|
|
158
|
+
|
|
159
|
+
[codex]
|
|
160
|
+
bin = "codex"
|
|
161
|
+
default_sandbox = "workspace-write"
|
|
162
|
+
run_timeout_ms = 1800000 # 30 minutes
|
|
163
|
+
|
|
164
|
+
[storage]
|
|
165
|
+
dir = "~/.feique/state"
|
|
166
|
+
|
|
167
|
+
[embedding]
|
|
168
|
+
provider = "ollama"
|
|
169
|
+
ollama_model = "auto" # Auto-detect best local embedding model
|
|
170
|
+
|
|
171
|
+
[mcp]
|
|
172
|
+
transport = "http"
|
|
173
|
+
active_auth_token_id = "primary"
|
|
174
|
+
[[mcp.auth_tokens]]
|
|
175
|
+
id = "primary"
|
|
176
|
+
token = "env:MCP_AUTH_TOKEN_PRIMARY"
|
|
177
|
+
enabled = true
|
|
178
|
+
[[mcp.auth_tokens]]
|
|
179
|
+
id = "rollover"
|
|
180
|
+
token = "env:MCP_AUTH_TOKEN_ROLLOVER"
|
|
181
|
+
enabled = true
|
|
182
|
+
|
|
183
|
+
[security]
|
|
184
|
+
allowed_project_roots = ["/srv/repos"]
|
|
185
|
+
admin_chat_ids = ["oc_admin_chat_1"]
|
|
186
|
+
|
|
187
|
+
[feishu]
|
|
188
|
+
app_id = "env:FEISHU_APP_ID"
|
|
189
|
+
app_secret = "env:FEISHU_APP_SECRET"
|
|
190
|
+
transport = "long-connection"
|
|
191
|
+
|
|
192
|
+
[projects.default]
|
|
193
|
+
root = "/srv/repos/repo-a"
|
|
194
|
+
session_scope = "chat"
|
|
195
|
+
run_priority = 200
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Feishu object tools and status cards:
|
|
199
|
+
|
|
200
|
+
- `/doc read <url|token>` and `/doc create <title>` for native Feishu Docs
|
|
201
|
+
- `/task list|get|create|complete` for Feishu Tasks
|
|
202
|
+
- `/base tables|records|create|update` for Feishu Base
|
|
203
|
+
- write operations execute directly and update the same reply with current status
|
|
204
|
+
- runtime cards expose phases such as `queued / preparing context / generating / executing / completed / failed / cancelled`
|
|
205
|
+
|
|
206
|
+
## 📚 Documentation Navigation
|
|
207
|
+
|
|
208
|
+
- [Getting Started](docs/getting-started.md) - Complete guide from zero to one
|
|
209
|
+
- [Architecture](docs/architecture.md) - Deep dive into internal mechanisms
|
|
210
|
+
- [FAQ](docs/faq.md) - Frequently asked questions
|
|
211
|
+
- [Deployment Guide](docs/deployment.md) - Recommendations for production deployment
|
|
212
|
+
- [Contributing Guide](CONTRIBUTING.md) - How to participate in project development
|
|
213
|
+
|
|
214
|
+
## 🤝 Contributing
|
|
215
|
+
|
|
216
|
+
We welcome all forms of contributions! Whether it's submitting bugs, proposing new features, or directly submitting Pull Requests. Please read our [Contributing Guide](CONTRIBUTING.md) before contributing.
|
|
217
|
+
|
|
218
|
+
## 📄 License
|
|
219
|
+
|
|
220
|
+
This project is licensed under the [MIT License](LICENSE).
|
package/README.md
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
# 飞鹊 (Feique) v1.1.0
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
5
|
+
**团队 AI 协作中枢 — 从个人提效到团队协作,让 AI 融入工作的每个环节。**
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/feique)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
[](https://nodejs.org)
|
|
10
|
+
[](CONTRIBUTING.md)
|
|
11
|
+
|
|
12
|
+
[English](README.en.md) | [官网](https://colorcross.github.io/feique/) | [快速开始](docs/getting-started.md) | [架构设计](docs/architecture.md) | [FAQ](docs/faq.md)
|
|
13
|
+
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
飞鹊 (Feique) 是**团队 AI 协作中枢**。它通过飞书连接 Codex CLI、Claude Code 等 AI 能力,让团队成员协作配合、相互促进——帮助发现问题和瓶颈、提升效率,推动从个人能力的提升,到团队协作的顺畅,再到整体能力的持续迭代。
|
|
19
|
+
|
|
20
|
+
当前已支持 AI 编程场景的完整链路:项目绑定按 `chat_id` 持久化,本地会话可接管,同仓库自动串行,排队和运行态在飞书里直接可见;最终回复支持富文本和卡片,并默认收口成更干净的单条结果消息。
|
|
21
|
+
|
|
22
|
+
## 🌟 核心特性
|
|
23
|
+
|
|
24
|
+
| 特性 | 描述 |
|
|
25
|
+
| :--- | :--- |
|
|
26
|
+
| **项目路由 (Sticky Routing)** | 项目选择按 `chat_id` 记住。群里切一次项目,整群后续会继承;私聊也会记住各自的当前项目。 |
|
|
27
|
+
| **会话接管 (Session Adoption)** | 既能 resume 桥接器自己的 session,也能通过 `/session adopt` 直接接管 `~/.codex/sessions` 或 `~/.claude/sessions` 里的本地原生会话。 |
|
|
28
|
+
| **并发保护 (Runtime Guard)** | `queue key` + `project.root` 双层串行。同项目 thread 不会乱写,不同群同时操作同一仓库也会被自动收口并显示排队状态。 |
|
|
29
|
+
| **飞书对象工具面 (Docs / Base / Tasks)** | 除了 `/wiki` 和 `/kb search`,还支持直接读取/创建飞书文档、列任务/建任务/完结任务,以及查看/写入多维表格记录。 |
|
|
30
|
+
| **多模态上下文 (Media Aware)** | 图片、文件、音频、富文本消息会被解析成结构化元数据,并带进 Codex 提示词。 |
|
|
31
|
+
| **MCP 接口 (MCP Surface)** | 不只给飞书用,运行 `feique mcp` 即可通过 `stdio` 或 `HTTP/SSE` 暴露能力,支持多 token 轮换鉴权,并可给 OpenClaw 等客户端开放项目切换、会话接管和自然语言控制。 |
|
|
32
|
+
| **权限分层 (Access Roles)** | 支持 `viewer / operator / admin` 三档角色,并补了 session / run / config / service 级能力名单。 |
|
|
33
|
+
| **记忆系统 (Memory System)** | 支持项目记忆与群共享记忆,SQLite + FTS5 检索,可配置 TTL、置顶策略和后台定时清理。 |
|
|
34
|
+
| **项目隔离 (Project Isolation)** | 下载、临时文件、缓存和项目审计默认落到 `state/projects/<alias>/...`,也可按项目单独指定。 |
|
|
35
|
+
| **可观测性 (Observability)** | 内置 `/healthz`、`/readyz`、`/metrics`,支持 Prometheus / Alertmanager / Grafana,并补齐启动告警、运行链路日志和审计。 |
|
|
36
|
+
| **多后端支持 (Multi-Backend)** | 同一桥接器可同时管理 Codex 和 Claude Code 后端,通过 `[backend]` 配置全局默认或按项目覆盖。Claude 后端支持 `--model`、`--permission-mode`、`--max-budget-usd` 等高级选项。 |
|
|
37
|
+
| **团队协作态势 (Team Awareness)** | `/team` 实时查看谁在用 AI 做什么,自动冲突预警。 |
|
|
38
|
+
| **知识回路 (Knowledge Loop)** | `/learn` `/recall` 团队知识沉淀与语义检索,AI 自动提取。 |
|
|
39
|
+
| **接力评审 (Handoff & Review)** | `/handoff` `/pickup` `/review` `/approve` `/reject` 会话交接与评审流程。 |
|
|
40
|
+
| **瓶颈诊断 (Team Insights)** | `/insights` 重试模式 / 重复劳动 / 队列瓶颈 / 错误集群检测。 |
|
|
41
|
+
| **信任边界 (Trust Boundaries)** | `/trust` 渐进式信任:observe → suggest → execute → autonomous。 |
|
|
42
|
+
| **上下文连续性 (Context Continuity)** | `/timeline` 项目时间线,新人自动获得历史上下文。 |
|
|
43
|
+
| **团队日报 (Team Digest)** | `/digest` 定时推送团队 AI 协作日报。 |
|
|
44
|
+
| **Web 仪表板 (Dashboard)** | `GET /dashboard` 嵌入式 Web UI,可视化查看运行态和团队状态。 |
|
|
45
|
+
| **成本追踪 (Cost Tracking)** | token 用量按项目 / 用户统计,预估成本。 |
|
|
46
|
+
|
|
47
|
+
## 🚀 快速开始
|
|
48
|
+
|
|
49
|
+
### 1. 安装
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm install -g feique
|
|
53
|
+
feique init --mode global
|
|
54
|
+
|
|
55
|
+
# 创建一个新项目目录并接入配置
|
|
56
|
+
feique create-project repo-new /srv/codex/repo-new
|
|
57
|
+
|
|
58
|
+
# 绑定已有目录为项目
|
|
59
|
+
feique bind repo-a /path/to/repo-a
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 2. 配置环境变量
|
|
63
|
+
|
|
64
|
+
只需设置飞书应用的凭证即可快速启动(默认使用 `long-connection` 模式,无需公网 IP):
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
export FEISHU_APP_ID=cli_xxx
|
|
68
|
+
export FEISHU_APP_SECRET=***
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 3. 检查与启动
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# 检查环境与连通性
|
|
75
|
+
feique doctor --remote
|
|
76
|
+
|
|
77
|
+
# 启动服务
|
|
78
|
+
feique start
|
|
79
|
+
|
|
80
|
+
# 查看日志
|
|
81
|
+
feique logs --follow
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 💬 飞书内交互示例
|
|
85
|
+
|
|
86
|
+
在飞书里,你可以直接使用自然语言或斜杠命令与 Codex 交互:
|
|
87
|
+
|
|
88
|
+
```text
|
|
89
|
+
# 项目管理
|
|
90
|
+
/projects
|
|
91
|
+
/project repo-a
|
|
92
|
+
/admin project create repo-new /srv/codex/repo-new
|
|
93
|
+
|
|
94
|
+
# 会话管理
|
|
95
|
+
/session adopt latest
|
|
96
|
+
/session list
|
|
97
|
+
|
|
98
|
+
# 知识库操作
|
|
99
|
+
/wiki search 部署文档
|
|
100
|
+
/kb search 架构设计
|
|
101
|
+
/doc read doxcn123
|
|
102
|
+
/task create 跟进发布检查
|
|
103
|
+
/base records app_token tbl_id 5
|
|
104
|
+
|
|
105
|
+
# 团队协作
|
|
106
|
+
/team # 查看谁在用 AI 做什么
|
|
107
|
+
/learn 部署前必须跑完 e2e # 沉淀团队知识
|
|
108
|
+
/recall 部署流程 # 语义检索已有知识
|
|
109
|
+
/handoff @张三 继续修复 # 将当前会话交接给队友
|
|
110
|
+
/pickup # 接手交接给你的会话
|
|
111
|
+
/review # 发起评审
|
|
112
|
+
/approve # 批准评审
|
|
113
|
+
/reject 需要补测试用例 # 打回评审并注明原因
|
|
114
|
+
/insights # 查看团队瓶颈诊断
|
|
115
|
+
/trust suggest # 设置当前项目信任级别
|
|
116
|
+
/timeline # 查看项目时间线
|
|
117
|
+
/digest # 手动触发团队日报
|
|
118
|
+
|
|
119
|
+
# 自然语言命令
|
|
120
|
+
切换到项目 repo-a
|
|
121
|
+
接管最新会话
|
|
122
|
+
查看详细状态
|
|
123
|
+
团队现在谁在忙?
|
|
124
|
+
帮我把会话交给小王
|
|
125
|
+
这个项目最近都发生了什么?
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## 🏗️ 架构概览
|
|
129
|
+
|
|
130
|
+
```text
|
|
131
|
+
[ Feishu App ] <---> [ Transport (WS/Webhook) ]
|
|
132
|
+
|
|
|
133
|
+
v
|
|
134
|
+
[ Project Router ] ---> [ Session Manager ] ---> [ Concurrency Queue ]
|
|
135
|
+
| | |
|
|
136
|
+
v v v
|
|
137
|
+
[ Team Awareness ] [ Memory / Wiki ] [ Backend (Codex / Claude) ]
|
|
138
|
+
[ Trust Boundaries] [ Knowledge Loop ] |
|
|
139
|
+
[ Cost Tracking ] [ Context Continuity ] v
|
|
140
|
+
| | [ Local Workspace ]
|
|
141
|
+
v v
|
|
142
|
+
[ Dashboard ] [ Handoff & Review ]
|
|
143
|
+
[ Team Digest ] [ Team Insights ]
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
详细的架构设计请参考 [架构文档](docs/architecture.md)。
|
|
147
|
+
|
|
148
|
+
## ⚙️ 最小配置示例
|
|
149
|
+
|
|
150
|
+
配置文件默认位于 `~/.feique/config.toml`:
|
|
151
|
+
|
|
152
|
+
```toml
|
|
153
|
+
version = 1
|
|
154
|
+
|
|
155
|
+
[service]
|
|
156
|
+
default_project = "default"
|
|
157
|
+
reply_mode = "card" # text | post | card
|
|
158
|
+
|
|
159
|
+
[codex]
|
|
160
|
+
bin = "codex"
|
|
161
|
+
default_sandbox = "workspace-write"
|
|
162
|
+
run_timeout_ms = 1800000 # 30 minutes
|
|
163
|
+
|
|
164
|
+
# (可选) 如果要使用 Claude Code 后端
|
|
165
|
+
# [backend]
|
|
166
|
+
# default = "claude" # codex | claude
|
|
167
|
+
#
|
|
168
|
+
# [claude]
|
|
169
|
+
# bin = "claude"
|
|
170
|
+
# default_permission_mode = "auto"
|
|
171
|
+
# default_model = "sonnet"
|
|
172
|
+
|
|
173
|
+
[storage]
|
|
174
|
+
dir = "~/.feique/state"
|
|
175
|
+
|
|
176
|
+
[embedding]
|
|
177
|
+
provider = "ollama"
|
|
178
|
+
ollama_model = "auto" # 自动探测本地最优嵌入模型
|
|
179
|
+
|
|
180
|
+
[security]
|
|
181
|
+
allowed_project_roots = ["/srv/repos"]
|
|
182
|
+
viewer_chat_ids = ["oc_viewer_chat_1"]
|
|
183
|
+
operator_chat_ids = ["oc_operator_chat_2"]
|
|
184
|
+
admin_chat_ids = ["oc_admin_chat_1"]
|
|
185
|
+
service_observer_chat_ids = ["oc_service_observer_1"]
|
|
186
|
+
service_restart_chat_ids = ["oc_service_restart_1"]
|
|
187
|
+
config_admin_chat_ids = ["oc_config_admin_1"]
|
|
188
|
+
|
|
189
|
+
[mcp]
|
|
190
|
+
transport = "http" # stdio | http
|
|
191
|
+
host = "127.0.0.1"
|
|
192
|
+
port = 8765
|
|
193
|
+
path = "/mcp"
|
|
194
|
+
sse_path = "/mcp/sse"
|
|
195
|
+
message_path = "/mcp/message"
|
|
196
|
+
active_auth_token_id = "primary"
|
|
197
|
+
[[mcp.auth_tokens]]
|
|
198
|
+
id = "primary"
|
|
199
|
+
token = "env:MCP_AUTH_TOKEN_PRIMARY"
|
|
200
|
+
enabled = true
|
|
201
|
+
[[mcp.auth_tokens]]
|
|
202
|
+
id = "rollover"
|
|
203
|
+
token = "env:MCP_AUTH_TOKEN_ROLLOVER"
|
|
204
|
+
enabled = true
|
|
205
|
+
|
|
206
|
+
[feishu]
|
|
207
|
+
app_id = "env:FEISHU_APP_ID"
|
|
208
|
+
app_secret = "env:FEISHU_APP_SECRET"
|
|
209
|
+
transport = "long-connection"
|
|
210
|
+
|
|
211
|
+
[projects.default]
|
|
212
|
+
root = "/srv/repos/repo-a"
|
|
213
|
+
session_scope = "chat"
|
|
214
|
+
run_priority = 200
|
|
215
|
+
operator_chat_ids = ["oc_repo_operator_1"]
|
|
216
|
+
session_operator_chat_ids = ["oc_repo_session_operator_1"]
|
|
217
|
+
run_operator_chat_ids = ["oc_repo_run_operator_1"]
|
|
218
|
+
config_admin_chat_ids = ["oc_repo_config_admin_1"]
|
|
219
|
+
download_dir = "/srv/feique/projects/repo-a/downloads"
|
|
220
|
+
temp_dir = "/srv/feique/projects/repo-a/tmp"
|
|
221
|
+
cache_dir = "/srv/feique/projects/repo-a/cache"
|
|
222
|
+
log_dir = "/srv/feique/projects/repo-a/logs"
|
|
223
|
+
# backend = "claude" # 项目级后端覆盖
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
权限说明:
|
|
227
|
+
|
|
228
|
+
- `viewer`:可见项目、查看 `/projects`、`/status`、`/session list`
|
|
229
|
+
- `operator`:额外可切项目、接管会话、取消运行、查看 `/admin runs`
|
|
230
|
+
- `admin`:额外可改配置、增删项目、重启服务
|
|
231
|
+
- `session_operator_chat_ids`:只放宽会话接管和会话切换
|
|
232
|
+
- `run_operator_chat_ids`:只放宽运行和取消运行
|
|
233
|
+
- `service_observer_chat_ids / service_restart_chat_ids / config_admin_chat_ids`:把运行观察、服务重启、配置治理拆开授权
|
|
234
|
+
|
|
235
|
+
MCP 说明:
|
|
236
|
+
|
|
237
|
+
- `feique mcp` 默认仍可跑 `stdio`
|
|
238
|
+
- 加 `--transport http` 或配置 `[mcp] transport = "http"` 后,会暴露 JSON-RPC + SSE 端点
|
|
239
|
+
- 如启用 HTTP,建议使用 `mcp.auth_tokens` 做多 token 轮换,并通过 `active_auth_token_id` 标记当前主 token
|
|
240
|
+
- 老配置里的 `mcp.auth_token` 仍兼容,但更适合单机本地接入
|
|
241
|
+
|
|
242
|
+
飞书对象与状态卡片:
|
|
243
|
+
|
|
244
|
+
- `/doc read <url|token>`、`/doc create <title>`:直接读写飞书文档
|
|
245
|
+
- `/task list|get|create|complete`:在飞书任务里查看、创建和完成任务
|
|
246
|
+
- `/base tables|records|create|update`:查看或写入多维表格
|
|
247
|
+
- 对文档、任务、多维表格这类飞书对象写操作,会直接执行并回写同一条状态消息
|
|
248
|
+
- 文本执行请求会先立即回复一条运行态消息,再更新为 `已接收 / 排队中 / 处理中 / 已完成 / 失败`
|
|
249
|
+
- 运行态卡片会区分 `排队中 / 准备上下文 / 生成中 / 执行中 / 已完成 / 失败 / 已取消`
|
|
250
|
+
|
|
251
|
+
## 📚 文档导航
|
|
252
|
+
|
|
253
|
+
- [快速开始](docs/getting-started.md) - 从零到一的完整指南
|
|
254
|
+
- [架构设计](docs/architecture.md) - 深入了解内部机制
|
|
255
|
+
- [FAQ](docs/faq.md) - 常见问题解答
|
|
256
|
+
- [部署指南](docs/deployment.md) - 生产环境部署建议
|
|
257
|
+
- [贡献指南](CONTRIBUTING.md) - 如何参与项目开发
|
|
258
|
+
|
|
259
|
+
## 🤝 参与贡献
|
|
260
|
+
|
|
261
|
+
我们欢迎各种形式的贡献!无论是提交 Bug、提出新功能建议,还是直接提交 Pull Request。请在贡献前阅读我们的 [贡献指南](CONTRIBUTING.md)。
|
|
262
|
+
|
|
263
|
+
## 📄 开源协议
|
|
264
|
+
|
|
265
|
+
本项目采用 [MIT License](LICENSE) 开源协议。
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Backend, BackendEvent, BackendRunOptions, BackendRunResult, IndexedSession } from './types.js';
|
|
2
|
+
export type ClaudePermissionMode = 'acceptEdits' | 'bypassPermissions' | 'default' | 'dontAsk' | 'plan' | 'auto';
|
|
3
|
+
export interface ClaudeBackendConfig {
|
|
4
|
+
bin: string;
|
|
5
|
+
shell?: string;
|
|
6
|
+
preExec?: string;
|
|
7
|
+
defaultPermissionMode: ClaudePermissionMode;
|
|
8
|
+
defaultModel?: string;
|
|
9
|
+
maxBudgetUsd?: number;
|
|
10
|
+
allowedTools?: string[];
|
|
11
|
+
systemPromptAppend?: string;
|
|
12
|
+
runTimeoutMs: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ClaudeProjectConfig {
|
|
15
|
+
permissionMode?: ClaudePermissionMode;
|
|
16
|
+
model?: string;
|
|
17
|
+
maxBudgetUsd?: number;
|
|
18
|
+
allowedTools?: string[];
|
|
19
|
+
systemPromptAppend?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare class ClaudeBackend implements Backend {
|
|
22
|
+
private readonly config;
|
|
23
|
+
private readonly claudeHomeDir;
|
|
24
|
+
readonly name: "claude";
|
|
25
|
+
constructor(config: ClaudeBackendConfig, claudeHomeDir?: string);
|
|
26
|
+
run(options: BackendRunOptions & {
|
|
27
|
+
projectConfig?: ClaudeProjectConfig;
|
|
28
|
+
}): Promise<BackendRunResult>;
|
|
29
|
+
summarizeEvent(event: BackendEvent): string | null;
|
|
30
|
+
listProjectSessions(projectRoot: string, limit?: number): Promise<IndexedSession[]>;
|
|
31
|
+
findLatestSession(projectRoot: string): Promise<IndexedSession | null>;
|
|
32
|
+
findSessionById(projectRoot: string, sessionId: string): Promise<IndexedSession | null>;
|
|
33
|
+
private buildArgs;
|
|
34
|
+
private buildSpawnSpec;
|
|
35
|
+
private scanSessions;
|
|
36
|
+
}
|