@lark-apaas/coding-steering 0.1.6-alpha.4 → 0.1.6-alpha.5
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/README.md +11 -2
- package/package.json +1 -1
- package/steering/design-stack/skills/client-add-aily-web-chat/SKILL.md +139 -0
- package/steering/design-stack/skills/client-builtins-user-service/SKILL.md +628 -0
- package/steering/design-stack/skills/code-fix/SKILL.md +246 -0
- package/steering/design-stack/skills/feishu/SKILL.md +270 -0
- package/steering/design-stack/skills/feishu/references/approval.md +214 -0
- package/steering/design-stack/skills/feishu/references/attendance.md +163 -0
- package/steering/design-stack/skills/feishu/references/bitable.md +309 -0
- package/steering/design-stack/skills/feishu/references/calendar.md +190 -0
- package/steering/design-stack/skills/feishu/references/contacts.md +160 -0
- package/steering/design-stack/skills/feishu/references/doc.md +256 -0
- package/steering/design-stack/skills/feishu/references/drive.md +103 -0
- package/steering/design-stack/skills/feishu/references/events.md +198 -0
- package/steering/design-stack/skills/feishu/references/id-convert.md +128 -0
- package/steering/design-stack/skills/feishu/references/messaging.md +207 -0
- package/steering/design-stack/skills/feishu/references/oauth.md +164 -0
- package/steering/design-stack/skills/feishu/references/perm.md +90 -0
- package/steering/design-stack/skills/feishu/references/wiki.md +164 -0
- package/steering/design-stack/skills/user-identity/SKILL.md +300 -0
- package/steering/nestjs-react-fullstack/skills/authn-guide/SKILL.md +122 -0
- package/steering/nestjs-react-fullstack/skills/client-add-aily-web-chat/SKILL.md +139 -0
- package/steering/nestjs-react-fullstack/skills/client-builtins-user-service/SKILL.md +628 -0
- package/steering/nestjs-react-fullstack/skills/feishu/SKILL.md +270 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/approval.md +214 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/attendance.md +163 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/bitable.md +309 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/calendar.md +190 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/contacts.md +160 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/doc.md +256 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/drive.md +103 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/events.md +198 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/id-convert.md +128 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/messaging.md +207 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/oauth.md +164 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/perm.md +90 -0
- package/steering/nestjs-react-fullstack/skills/feishu/references/wiki.md +164 -0
- package/steering/nestjs-react-fullstack/skills/openapi-guide/SKILL.md +267 -0
- package/steering/nestjs-react-fullstack/skills/trigger-guide/SKILL.md +452 -0
- package/steering/nestjs-react-fullstack/skills/user-identity/SKILL.md +300 -0
- package/steering/nestjs-react-fullstack/skills_local/code-fix/SKILL.md +246 -0
- package/steering/nestjs-react-fullstack/skills_local/coding-guide/SKILL.md +707 -0
- package/steering/nestjs-react-fullstack/skills/.gitkeep +0 -0
- package/steering/nestjs-react-fullstack/tech.md +0 -21
package/README.md
CHANGED
|
@@ -12,7 +12,9 @@ steering/
|
|
|
12
12
|
│ └── skills/ # cross-stack shared skills
|
|
13
13
|
├── <stack>/
|
|
14
14
|
│ ├── tech.md # always-loaded, injected into agent system prompt
|
|
15
|
-
│
|
|
15
|
+
│ ├── skills/<id>/SKILL.md # progressive disclosure, triggered by description match
|
|
16
|
+
│ └── skills_local/<id>/SKILL.md # local-only variant; overrides skills/<id> when syncing
|
|
17
|
+
│ # to a local-dev project (e.g. via lark-cli)
|
|
16
18
|
└── ...
|
|
17
19
|
```
|
|
18
20
|
|
|
@@ -24,9 +26,16 @@ Top-level directory names (other than `_common`) ARE the stackId — discovery i
|
|
|
24
26
|
|---|---|
|
|
25
27
|
| `steering/<stack>/tech.md` | `.agent/steering/tech.md` |
|
|
26
28
|
| `steering/<stack>/skills/<id>/**` | `.agent/steering/skills/<id>/**` |
|
|
29
|
+
| `steering/<stack>/skills_local/<id>/**` | `.agent/steering/skills/<id>/**` (local-dev sync only) |
|
|
27
30
|
| `steering/_common/skills/<id>/**` | `.agent/steering/skills/<id>/**` |
|
|
28
31
|
|
|
29
|
-
|
|
32
|
+
Precedence when the same `<id>` exists in multiple sources (lowest → highest, later wins):
|
|
33
|
+
`_common/skills` → `<stack>/skills` → `<stack>/skills_local` (local-dev sync only).
|
|
34
|
+
|
|
35
|
+
`skills_local` is a stack-specific variant intended for the local-development sync path
|
|
36
|
+
(`miaoda skills sync --local`, driven by `lark-cli apps`). The cloud sandbox sync path
|
|
37
|
+
ignores `skills_local` and uses `skills` as-is, so authors of `skills_local` content can
|
|
38
|
+
assume "本地 agent" semantics (no `ddl_sql` / `plugin_instance` / sandbox-log tools, etc.).
|
|
30
39
|
|
|
31
40
|
## Writing rules
|
|
32
41
|
|
package/package.json
CHANGED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: client-add-aily-web-chat
|
|
3
|
+
description: Use when integrating Aily AI chat panel into a web app using @lark-apaas/client-toolkit/aily-chat. 触发词:Aily 聊天, Aily 对话面板, Aily chat, aily-chat SDK, AI 对话组件集成
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 添加 Aily Web 对话面板
|
|
7
|
+
|
|
8
|
+
使用 `@lark-apaas/client-toolkit/aily-chat` 将 Aily 对话面板集成到 Web 应用。SDK 与框架无关(纯 DOM 操作)。
|
|
9
|
+
|
|
10
|
+
## Quick Reference
|
|
11
|
+
|
|
12
|
+
| 操作 | 方法 |
|
|
13
|
+
|------|------|
|
|
14
|
+
| 初始化 | `await initAilyChat(container, config)` |
|
|
15
|
+
| 发送消息 | `chatPanel.sendMessage({ content, skillID? })` |
|
|
16
|
+
| 清空记录 | `chatPanel.clear()` |
|
|
17
|
+
| 清空并停止 | `chatPanel.clearAndStop()` |
|
|
18
|
+
| 更新配置 | `chatPanel.updateConfig(partialConfig)` |
|
|
19
|
+
| 销毁 | `chatPanel.destroy()` |
|
|
20
|
+
|
|
21
|
+
## 核心流程
|
|
22
|
+
|
|
23
|
+
### 1. 向用户获取 appKey
|
|
24
|
+
|
|
25
|
+
实现前必须先询问用户:
|
|
26
|
+
|
|
27
|
+
> "请提供你的 Aily `appKey` 以配置对话组件。你可以在 [Aily 平台](https://apaas.feishu.cn/ai/projects) 中找到对应应用的 appKey。"
|
|
28
|
+
|
|
29
|
+
### 2. 集成代码
|
|
30
|
+
|
|
31
|
+
React 组件示例(vanilla JS 同理,对 DOM 元素调用 `initAilyChat` 即可):
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
import { useEffect, useRef } from "react";
|
|
35
|
+
import { initAilyChat, type ChatPanel } from "@lark-apaas/client-toolkit/aily-chat";
|
|
36
|
+
|
|
37
|
+
interface AilyChatProps {
|
|
38
|
+
appKey: string;
|
|
39
|
+
anonymous?: boolean;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const containerStyle = { width: "100%", height: "500px" };
|
|
43
|
+
|
|
44
|
+
const AilyChat = ({ appKey, anonymous }: AilyChatProps) => {
|
|
45
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
46
|
+
const chatPanelRef = useRef<ChatPanel | null>(null);
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (!containerRef.current) return;
|
|
50
|
+
let destroyed = false;
|
|
51
|
+
|
|
52
|
+
initAilyChat(containerRef.current, {
|
|
53
|
+
appKey,
|
|
54
|
+
anonymous,
|
|
55
|
+
conversion: { needAvatar: true },
|
|
56
|
+
events: {
|
|
57
|
+
onReady: () => console.log("对话就绪"),
|
|
58
|
+
onError: (err) => console.error("对话错误", err),
|
|
59
|
+
},
|
|
60
|
+
}).then((panel) => {
|
|
61
|
+
if (destroyed) panel.destroy();
|
|
62
|
+
else chatPanelRef.current = panel;
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return () => {
|
|
66
|
+
destroyed = true;
|
|
67
|
+
chatPanelRef.current?.destroy();
|
|
68
|
+
chatPanelRef.current = null;
|
|
69
|
+
};
|
|
70
|
+
}, [appKey, anonymous]);
|
|
71
|
+
|
|
72
|
+
return <div ref={containerRef} style={containerStyle} />;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export default AilyChat;
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 3. 告知用户 UI 定制选项
|
|
79
|
+
|
|
80
|
+
代码集成完成后,**必须**向用户展示以下可定制选项:
|
|
81
|
+
|
|
82
|
+
- 修改组件标题/顶部标题
|
|
83
|
+
- 关闭/开启组件标题栏
|
|
84
|
+
- 显示/隐藏关闭按钮
|
|
85
|
+
- 隐藏/展示用户头像、隐藏/展示系统头像
|
|
86
|
+
- 修改用户头像或系统头像,并发送新头像图片
|
|
87
|
+
- 隐藏/展示组件欢迎语
|
|
88
|
+
|
|
89
|
+
## 配置参考
|
|
90
|
+
|
|
91
|
+
### WebSDKConfig(顶层)
|
|
92
|
+
|
|
93
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
94
|
+
|------|------|------|------|
|
|
95
|
+
| `appKey` | string | 是 | 应用标识 |
|
|
96
|
+
| `uuid` | string | 否 | 用户标识,启用 `needCache` 时必填 |
|
|
97
|
+
| `anonymous` | boolean | 否 | `true` 开启匿名模式,跳过登录。**须在 Aily 应用「渠道管理」中将 SDK 模式开启匿名访问,否则会报错「匿名SDK没有开启支持使用应用身份调用API和SDK」** |
|
|
98
|
+
| `conversion` | object | 否 | 对话配置(头像、缓存、欢迎语) |
|
|
99
|
+
| `editor` | object | 否 | 顶部栏配置(标题、关闭按钮) |
|
|
100
|
+
| `events` | object | 否 | 事件回调 |
|
|
101
|
+
|
|
102
|
+
### conversion
|
|
103
|
+
|
|
104
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
105
|
+
|------|------|--------|------|
|
|
106
|
+
| `needCache` | boolean | `false` | 启用消息缓存(需同时提供 `uuid`) |
|
|
107
|
+
| `storageType` | string | `"memory"` | `memory` / `sessionStorage` / `localStorage` / `indexDB` / `server` |
|
|
108
|
+
|
|
109
|
+
> 头像和欢迎语相关字段见上方「UI 定制选项」表。
|
|
110
|
+
|
|
111
|
+
### editor
|
|
112
|
+
|
|
113
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
114
|
+
|------|------|--------|------|
|
|
115
|
+
| `display` | boolean | `true` | 是否显示编辑器 |
|
|
116
|
+
| `needHeader` | boolean | `true` | 是否显示顶部 header(含标题和新建对话按钮),仅 V2 生效 |
|
|
117
|
+
| `headerTitle` | string | 应用名称 | 对话标题,显示在 header 中 |
|
|
118
|
+
| `needCloseButton` | boolean | `false` | 是否显示关闭按钮。配合 `events.onClose` 监听点击 |
|
|
119
|
+
|
|
120
|
+
### events
|
|
121
|
+
|
|
122
|
+
| 事件 | 签名 | 说明 |
|
|
123
|
+
|------|------|------|
|
|
124
|
+
| `onReady` | `() => void` | 对话就绪 |
|
|
125
|
+
| `onError` | `(error: Error) => void` | 发生错误 |
|
|
126
|
+
| `onMessage` | `(message: unknown) => void` | 收到消息 |
|
|
127
|
+
| `onInited` | `(data: { sessionId, conversationId, handler }) => void` | 会话已创建 |
|
|
128
|
+
| `onInitedWithWelcome` | `() => void` | 欢迎语已创建 |
|
|
129
|
+
| `onClose` | `() => void` | 用户点击关闭按钮时触发(需配合 `editor.needCloseButton: true`) |
|
|
130
|
+
|
|
131
|
+
## Common Mistakes
|
|
132
|
+
|
|
133
|
+
| 错误 | 正确做法 |
|
|
134
|
+
|------|----------|
|
|
135
|
+
| 忘记在 useEffect 清理时调用 `destroy()` | 必须在 cleanup 中销毁 ChatPanel,否则内存泄漏 |
|
|
136
|
+
| 启用 `needCache` 但未传 `uuid` | 缓存依赖 `uuid` 识别用户,缺失则无法恢复历史消息 |
|
|
137
|
+
| 容器元素无固定宽高 | 容器必须有明确尺寸,否则面板不可见 |
|
|
138
|
+
| 在 React 严格模式下未处理重复初始化 | 用 `destroyed` 标志防止 StrictMode 双重 mount 导致重复面板 |
|
|
139
|
+
| 设置 `anonymous: true` 但未在 Aily 平台开启匿名访问 | 须前往 Aily 应用「渠道管理」将 SDK 模式开启匿名访问,否则报错「匿名SDK没有开启支持使用应用身份调用API和SDK」 |
|