skill-localcrm-all 1.0.0 → 1.0.1

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