skill-localcrm-all 1.0.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/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # skill-localcrm-all
2
+
3
+ localCRM 全栈工具链 — 一键安装包。
4
+
5
+ 安装后自动完成:依赖安装 → 技能部署 → 数据库初始化。
6
+
7
+ ## 安装
8
+
9
+ ```bash
10
+ npm i -g skill-localcrm-all
11
+ ```
12
+
13
+ ## 安装后需手动操作
14
+
15
+ 外呼凭证需要您手动配置(AI Agent 无法代劳):
16
+
17
+ ```bash
18
+ aicall init <token> <umId> <salesManName>
19
+ ```
20
+
21
+ - `token` — 外呼平台接口凭证
22
+ - `umId` — 外呼平台用户身份标识
23
+ - `salesManName` — 直销人员姓名
24
+
25
+ ## 包含的工具
26
+
27
+ | 工具 | 用途 |
28
+ |------|------|
29
+ | localcrm | CRM 系统操作 |
30
+ | aicall-cli | AI 外呼 |
31
+ | skill-localcrm-operator | CRM 操作技能 |
32
+ | skill-credit | 征信问题扫描 |
33
+ | skill-lead-fetcher | 数据入口管道 |
34
+ | skill-qcc-enterprise-search | 企查查企业查询 |
35
+ | skill-shuidi | 水滴信用征信 |
36
+ | skill-ai-outbound-calling | AI 外呼流程编排 |
37
+
38
+ ## 完整业务流程
39
+
40
+ ```
41
+ 数据输入 → lead-fetcher → CRM入库 → qcc+shuidi 征信 → AI外呼 → 跟进
42
+ ```
package/bin/skill.js ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const { readFileSync, existsSync } = require('fs');
5
+ const { join } = require('path');
6
+
7
+ function printBanner(name, desc) {
8
+ const line = '='.repeat(50);
9
+ console.log(`\n${line}`);
10
+ console.log(` 📖 ${name}`);
11
+ console.log(` ${desc}`);
12
+ console.log(`${line}\n`);
13
+ }
14
+
15
+ const mdPath = join(__dirname, '..', 'resources', 'SKILL.md');
16
+ if (existsSync(mdPath)) {
17
+ console.log(readFileSync(mdPath, 'utf-8'));
18
+ } else {
19
+ console.log('技能文档未找到');
20
+ }
package/package.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "skill-localcrm-all",
3
+ "version": "1.0.0",
4
+ "description": "localCRM 全栈工具链 — 个人贷款 CRM + AI外呼 + 企业征信 一键安装",
5
+ "main": "bin/skill.js",
6
+ "bin": {
7
+ "skill-localcrm-all": "bin/skill.js"
8
+ },
9
+ "scripts": {
10
+ "postinstall": "node scripts/setup.js"
11
+ },
12
+ "keywords": ["localcrm", "crm", "贷款", "外呼", "征信", "平安融易"],
13
+ "license": "MIT"
14
+ }
@@ -0,0 +1,94 @@
1
+ ---
2
+ name: localcrm-all
3
+ description: 个人贷款客户经理 CRM 全栈工具链 — 覆盖客户管理(CRM)、数据入口管道(lead-fetcher)、企业征信(qcc/shuidi)、征信问题扫描(credit)、AI批量外呼(aicall)、外呼流程编排(ai-outbound-calling)。所有操作通过对应 CLI 执行。
4
+ ---
5
+
6
+ # localCRM 全栈工具链 — 操作指南
7
+
8
+ ## 完整业务流程
9
+
10
+ ```
11
+ ① 用户输入名单(JSON/Excel/文本/快查)
12
+
13
+ ② lead-fetcher 数据管道(展开→过滤→校验→输出去重名单)
14
+
15
+ ③ CRM 轻量入库(姓名+手机号+公司名,阶段=待外呼)
16
+
17
+ ④ 征信查询(仅对新增记录)— qcc 企业信息 + shuidi 企业征信体检 — 并行执行
18
+
19
+ ⑤ credit 征信问题扫描(识别可能的问题,提示补充材料)
20
+
21
+ ⑥ aicall-cli AI 外呼 → 获取 ASR 结果
22
+
23
+ ⑦ 有意向客户 → 完善 CRM 画像 → 继续跟进
24
+ ```
25
+
26
+ ## 铁律
27
+
28
+ 1. **禁止跳过 lead-fetcher** — 所有数据必须先经过 lead-fetcher 管道处理
29
+ 2. **禁止补写虚拟数据** — 姓名或手机号缺失的数据直接拒绝
30
+ 3. **征信后移** — 仅在外呼有意向后才做完整征信,不浪费成本
31
+ 4. **外呼需确认** — 发起外呼前必须展示名单并得到用户确认
32
+ 5. **先查询后操作** — 不确定 ID 时先搜索,禁止猜测
33
+
34
+ ## 各组件 CLI 参考
35
+
36
+ ### localcrm (CRM 操作)
37
+
38
+ | 操作 | 命令 |
39
+ |------|------|
40
+ | 客户列表 | `localcrm customer list` |
41
+ | 搜索客户 | `localcrm customer search <关键词>` |
42
+ | 查看客户 | `localcrm customer show <id>` |
43
+ | 添加客户 | `localcrm customer add --name <姓名> --phone <手机号>` |
44
+ | 添加沟通记录 | `localcrm comm add <客户ID> --type 电话 --summary <内容>` |
45
+ | 查看回访 | `localcrm followup list --overdue` |
46
+ | 创建申请 | `localcrm app create <客户ID> --amount <金额> --product-id <产品ID>` |
47
+ | 统计看板 | `localcrm stats dashboard` |
48
+ | 产品匹配 | `localcrm product match <客户ID>` |
49
+
50
+ ### lead-fetcher (数据入口)
51
+
52
+ | 操作 | 命令 |
53
+ |------|------|
54
+ | 处理数据 | `lead-fetcher process <输入文件>` |
55
+ | 查看配置 | `lead-fetcher config show` |
56
+
57
+ ### aicall (AI 外呼)
58
+
59
+ | 操作 | 命令 |
60
+ |------|------|
61
+ | 初始化凭证 | `aicall init <token> <umId> <salesManName>` |
62
+ | 查额度 | `aicall daylimit` |
63
+ | 发起外呼 | `aicall call <手机号...>` |
64
+ | 查状态 | `aicall status <batchNo>` |
65
+ | 获取 ASR | `aicall asr <callRecordId>` |
66
+
67
+ ### qcc (企查查企业查询)
68
+
69
+ 使用 `qcc` CLI 查询企业工商、法人、股东、失信、裁判文书等 100+ 维度。
70
+
71
+ ### shuidi (水滴征信)
72
+
73
+ 使用 `shuidi_mcp.py` 脚本对接水滴信用 MCP 进行企业征信体检。
74
+
75
+ ### credit (征信扫描)
76
+
77
+ 一、收集信息片段(口述/截图/征信报告等)
78
+ 二、按可信度分级评估
79
+ 三、扫描问题规则库
80
+ 四、输出:已确认问题 + 需补充材料
81
+
82
+ ## 关键枚举值
83
+
84
+ ### 客户阶段
85
+ `新客` → `已联系` → `有意向` → `申请中` → `放款`
86
+
87
+ ### 沟通方式
88
+ `电话` / `微信` / `面谈` / `短信`
89
+
90
+ ### 情绪
91
+ `积极` / `中性` / `消极`
92
+
93
+ ### 日期格式
94
+ `YYYY-MM-DD HH:MM`
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const { execSync } = require('child_process');
5
+ const { existsSync, mkdirSync, copyFileSync, readFileSync } = require('fs');
6
+ const { join, dirname } = require('path');
7
+ const os = require('os');
8
+
9
+ const HOME = os.homedir();
10
+ // 全局 node_modules 目录(所有子包的同级目录)
11
+ const GLOBAL_NM = join(__dirname, '..', '..');
12
+
13
+ // ---------- utils ----------
14
+ function run(cmd, label) {
15
+ console.log(`\n[setup] >>> ${label}`);
16
+ try {
17
+ execSync(cmd, { stdio: 'inherit', timeout: 300000 });
18
+ console.log(`[setup] ✓ ${label}`);
19
+ return true;
20
+ } catch (e) {
21
+ console.error(`[setup] ⚠ ${label} 失败: ${e.message}`);
22
+ return false;
23
+ }
24
+ }
25
+
26
+ // ---------- main ----------
27
+ function main() {
28
+ console.log('');
29
+ console.log('╔══════════════════════════════════════════╗');
30
+ console.log('║ localCRM 全栈工具链 — 自动化部署 ║');
31
+ console.log('╚══════════════════════════════════════════╝');
32
+ console.log('');
33
+
34
+ // ── 1. 安装 Python 包 ──
35
+ run('pip install localcrm', '安装 localcrm (Python)');
36
+
37
+ // ── 2. 安装 NPM 全局包 ──
38
+ const npmPkgs = [
39
+ 'aicall-cli',
40
+ 'skill-credit',
41
+ 'skill-lead-fetcher',
42
+ 'skill-qcc-enterprise-search',
43
+ 'skill-shuidi',
44
+ 'skill-ai-outbound-calling',
45
+ 'skill-localcrm-operator',
46
+ ];
47
+ for (const pkg of npmPkgs) {
48
+ run(`npm i -g "${pkg}"`, `安装 ${pkg}`);
49
+ // 每个 skill 包安装时自带的 bin/skill.js 会输出 SKILL.md → AI 读取学习
50
+ }
51
+
52
+ // ── 3. 智能部署技能文件 ──
53
+ const knownPaths = [
54
+ join(HOME, '.qclaw', 'skills'), // OpenClaw / QClaw
55
+ join(HOME, '.codex', 'skills'), // Codex / Claude Code
56
+ join(HOME, '.cursor', 'skills'), // Cursor
57
+ join(HOME, '.windsurf', 'skills'), // Windsurf
58
+ join(HOME, '.github', 'copilot', 'skills'), // GitHub Copilot
59
+ ];
60
+
61
+ const skillPackages = {
62
+ 'localcrm-operator': join(GLOBAL_NM, 'skill-localcrm-operator', 'resources', 'SKILL.md'),
63
+ 'lead-fetcher': join(GLOBAL_NM, 'skill-lead-fetcher', 'resources', 'SKILL.md'),
64
+ 'credit': join(GLOBAL_NM, 'skill-credit', 'resources', 'SKILL.md'),
65
+ 'qcc-enterprise-search': join(GLOBAL_NM, 'skill-qcc-enterprise-search', 'resources', 'SKILL.md'),
66
+ 'shuidi': join(GLOBAL_NM, 'skill-shuidi', 'resources', 'SKILL.md'),
67
+ 'ai-outbound-calling': join(GLOBAL_NM, 'skill-ai-outbound-calling', 'resources', 'SKILL.md'),
68
+ };
69
+
70
+ const targetDirs = knownPaths.filter(d => existsSync(d));
71
+ if (targetDirs.length > 0) {
72
+ console.log(`\n[setup] >>> 检测到 Agent 技能目录,部署技能文件`);
73
+ for (const base of targetDirs) {
74
+ console.log(` → ${base}`);
75
+ for (const [folder, src] of Object.entries(skillPackages)) {
76
+ if (!existsSync(src)) continue;
77
+ const dstDir = join(base, folder);
78
+ if (!existsSync(dstDir)) mkdirSync(dstDir, { recursive: true });
79
+ copyFileSync(src, join(dstDir, 'SKILL.md'));
80
+ }
81
+ console.log(` ✓ 已部署至 ${base}`);
82
+ }
83
+ } else {
84
+ console.log('\n[setup] >>> 未检测到已知 Agent 技能目录');
85
+ console.log(' 技能信息将通过以下输出供 AI 学习(等效)');
86
+ }
87
+
88
+ // ── 4. 初始化数据库(自动,无需参数)──
89
+ console.log('\n[setup] >>> 初始化 CRM 数据库');
90
+ try {
91
+ execSync('localcrm init-db', { stdio: 'inherit', timeout: 60000 });
92
+ console.log('[setup] ✓ 数据库初始化完成');
93
+ } catch (e) {
94
+ console.log('[setup] ⚠ 数据库初始化异常(可后续手动执行 localcrm init-db)');
95
+ }
96
+
97
+ // ── 5. 输出全部技能信息供 AI 学习 ──
98
+ console.log('\n');
99
+
100
+ // 本包技能
101
+ console.log('╔══════════════════════════════════════════╗');
102
+ console.log('║ 📖 全栈技能 — AI Agent 请学习 ║');
103
+ console.log('╚══════════════════════════════════════════╝');
104
+ const PKG_ROOT = join(__dirname, '..');
105
+ const selfSkill = join(PKG_ROOT, 'resources', 'SKILL.md');
106
+ if (existsSync(selfSkill)) {
107
+ console.log(readFileSync(selfSkill, 'utf-8'));
108
+ }
109
+
110
+ // 各子技能
111
+ console.log('\n── 各子技能详情 ──');
112
+ for (const [name, src] of Object.entries(skillPackages)) {
113
+ if (existsSync(src)) {
114
+ console.log(`\n${'='.repeat(50)}`);
115
+ console.log(` 📖 ${name}`);
116
+ console.log(`${'='.repeat(50)}\n`);
117
+ console.log(readFileSync(src, 'utf-8'));
118
+ }
119
+ }
120
+
121
+ // ── 6. 完成 ──
122
+ console.log('');
123
+ console.log('╔══════════════════════════════════════════════════╗');
124
+ console.log('║ ✅ localCRM 全栈工具链安装完成! ║');
125
+ console.log('║ ║');
126
+ console.log('║ 📌 最后一步——配置外呼凭证(需手动填写): ║');
127
+ console.log('║ aicall init <token> <umId> <salesManName> ║');
128
+ console.log('║ ║');
129
+ console.log('║ 其他全部已自动完成,可以直接用了。 ║');
130
+ console.log('╚══════════════════════════════════════════════════╝');
131
+ console.log('');
132
+ }
133
+
134
+ main();