refactor: rename CLI command 'inkreach' -> 'inkreach-teable'
Rename the command (and its config namespace) to match the project name: - bin: inkreach -> inkreach-teable - program name: inkreach -> inkreach-teable - config dir: ~/.inkreach/ -> ~/.inkreach-teable/ - env vars: INKREACH_* -> INKREACH_TEABLE_* - all docs (SKILL.md, guides, api-reference, AGENTS.md, design doc, install.sh) Unchanged (intentional): - npm package name: @inkreach/teable-cli - package directory: packages/inkreach-cli/ - skill name: inkreach-teable-ops - organization/authors: 'inkreach' (npm scope @inkreach) Existing config auto-migrated (~/.inkreach -> ~/.inkreach-teable). Verified end-to-end: auth status, workflow list (636), build clean.
This commit is contained in:
Vendored
+3
-3
@@ -2,7 +2,7 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
/**
|
||||
* inkreach — CLI for operating inkreach-teable.
|
||||
* inkreach-teable — CLI for operating inkreach-teable.
|
||||
*
|
||||
* Entry point. Sets up the global commander program and mounts command groups.
|
||||
*/
|
||||
@@ -14,10 +14,10 @@ const resources_1 = require("./commands/resources");
|
||||
const extras_1 = require("./commands/extras");
|
||||
const program = new commander_1.Command();
|
||||
program
|
||||
.name('inkreach')
|
||||
.name('inkreach-teable')
|
||||
.description('Operate inkreach-teable: tables, fields, records, views, and the self-built automation engine (8 triggers + 6 actions).\n' +
|
||||
'Use --json for machine-readable output (agent parsing).')
|
||||
.version(`inkreach ${package_json_1.version}`, '-v, --version');
|
||||
.version(`inkreach-teable ${package_json_1.version}`, '-v, --version');
|
||||
// Global options (highest precedence over config file + env).
|
||||
program
|
||||
.option('--endpoint <url>', 'Backend URL (default http://localhost:3000)')
|
||||
|
||||
Vendored
+2
-2
@@ -2,7 +2,7 @@
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.authCommand = void 0;
|
||||
/**
|
||||
* `inkreach auth` — authentication & config commands.
|
||||
* `inkreach-teable auth` — authentication & config commands.
|
||||
*/
|
||||
const commander_1 = require("commander");
|
||||
const ctx_1 = require("../lib/ctx");
|
||||
@@ -115,7 +115,7 @@ function authCommand() {
|
||||
['token', created.token],
|
||||
['', ''],
|
||||
['note', 'Save this token now — it cannot be retrieved again.'],
|
||||
['use', 'inkreach auth login --token <above>'],
|
||||
['use', 'inkreach-teable auth login --token <above>'],
|
||||
]);
|
||||
}
|
||||
}));
|
||||
|
||||
Vendored
+4
-4
@@ -2,10 +2,10 @@
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.sqlCommand = exports.fireCommand = exports.runsCommand = exports.secretCommand = void 0;
|
||||
/**
|
||||
* `inkreach secret` — manage workflow automation secrets.
|
||||
* `inkreach runs` — execution history.
|
||||
* `inkreach fire` — manual trigger testing (button-click / webhook).
|
||||
* `inkreach sql` — read-only SQL queries.
|
||||
* `inkreach-teable secret` — manage workflow automation secrets.
|
||||
* `inkreach-teable runs` — execution history.
|
||||
* `inkreach-teable fire` — manual trigger testing (button-click / webhook).
|
||||
* `inkreach-teable sql` — read-only SQL queries.
|
||||
*/
|
||||
const commander_1 = require("commander");
|
||||
const ctx_1 = require("../lib/ctx");
|
||||
|
||||
Vendored
+1
-1
@@ -2,7 +2,7 @@
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.baseResourceCommands = void 0;
|
||||
/**
|
||||
* `inkreach base|table|field|record|view` — resource CRUD commands.
|
||||
* `inkreach-teable base|table|field|record|view` — resource CRUD commands.
|
||||
*
|
||||
* These endpoints are compatible with official teable open-api.
|
||||
*/
|
||||
|
||||
Vendored
+6
-6
@@ -2,9 +2,9 @@
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.buildActionConfig = exports.actionCommand = exports.buildTriggerConfig = exports.triggerCommand = exports.workflowCommand = void 0;
|
||||
/**
|
||||
* `inkreach workflow` — workflow CRUD + lifecycle.
|
||||
* `inkreach trigger` — set the trigger node's type & config.
|
||||
* `inkreach action` — add/update/delete action nodes.
|
||||
* `inkreach-teable workflow` — workflow CRUD + lifecycle.
|
||||
* `inkreach-teable trigger` — set the trigger node's type & config.
|
||||
* `inkreach-teable action` — add/update/delete action nodes.
|
||||
*
|
||||
* All node-mutating commands operate via PUT /node (whole-graph replacement),
|
||||
* so they internally GET the full graph, mutate, then PUT it back.
|
||||
@@ -109,7 +109,7 @@ function workflowCommand() {
|
||||
['name', wf.name],
|
||||
['baseId', wf.baseId],
|
||||
['', ''],
|
||||
['next', `inkreach trigger set ${wf.id} --type <T> ...`],
|
||||
['next', `inkreach-teable trigger set ${wf.id} --type <T> ...`],
|
||||
]);
|
||||
}
|
||||
}));
|
||||
@@ -264,7 +264,7 @@ function triggerCommand() {
|
||||
['triggerType', opts.type],
|
||||
['config', JSON.stringify(config)],
|
||||
['', ''],
|
||||
['next', `inkreach action add ${workflowId} --type script ...`],
|
||||
['next', `inkreach-teable action add ${workflowId} --type script ...`],
|
||||
]);
|
||||
}
|
||||
}));
|
||||
@@ -400,7 +400,7 @@ function actionCommand() {
|
||||
['type', opts.type],
|
||||
['config', JSON.stringify(config)],
|
||||
['', ''],
|
||||
['next', `inkreach workflow activate ${workflowId}`],
|
||||
['next', `inkreach-teable workflow activate ${workflowId}`],
|
||||
]);
|
||||
}
|
||||
}));
|
||||
|
||||
Vendored
+7
-7
@@ -25,16 +25,16 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.configPath = exports.resolveConfig = exports.writeConfigFile = exports.readConfigFile = exports.DEFAULT_ENDPOINT = void 0;
|
||||
/**
|
||||
* Config storage for inkreach CLI.
|
||||
* Config storage for inkreach-teable CLI.
|
||||
*
|
||||
* Stores endpoint + token at ~/.inkreach/config.json, with environment variable
|
||||
* overrides INKREACH_ENDPOINT / INKREACH_TOKEN. The --endpoint / --token / --base-id
|
||||
* Stores endpoint + token at ~/.inkreach-teable/config.json, with environment variable
|
||||
* overrides INKREACH_TEABLE_ENDPOINT / INKREACH_TEABLE_TOKEN. The --endpoint / --token / --base-id
|
||||
* global flags take the highest precedence (handled by resolveOptions()).
|
||||
*/
|
||||
const fs = __importStar(require("node:fs"));
|
||||
const path = __importStar(require("node:path"));
|
||||
const os = __importStar(require("node:os"));
|
||||
const CONFIG_DIR = path.join(os.homedir(), '.inkreach');
|
||||
const CONFIG_DIR = path.join(os.homedir(), '.inkreach-teable');
|
||||
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
|
||||
exports.DEFAULT_ENDPOINT = 'http://localhost:3000';
|
||||
function readConfigFile() {
|
||||
@@ -59,11 +59,11 @@ function resolveConfig(overrides) {
|
||||
const file = readConfigFile();
|
||||
return {
|
||||
endpoint: overrides?.endpoint ||
|
||||
process.env.INKREACH_ENDPOINT ||
|
||||
process.env.INKREACH_TEABLE_ENDPOINT ||
|
||||
file.endpoint ||
|
||||
exports.DEFAULT_ENDPOINT,
|
||||
token: overrides?.token || process.env.INKREACH_TOKEN || file.token || '',
|
||||
baseId: overrides?.baseId || process.env.INKREACH_BASE_ID || file.baseId,
|
||||
token: overrides?.token || process.env.INKREACH_TEABLE_TOKEN || file.token || '',
|
||||
baseId: overrides?.baseId || process.env.INKREACH_TEABLE_BASE_ID || file.baseId,
|
||||
};
|
||||
}
|
||||
exports.resolveConfig = resolveConfig;
|
||||
|
||||
Vendored
+1
-1
@@ -65,7 +65,7 @@ function findRoot(cmd) {
|
||||
function requireBaseId(ctx, flagVal) {
|
||||
const baseId = flagVal || ctx.baseId;
|
||||
if (!baseId) {
|
||||
throw new client_1.ApiError(0, 'MISSING_BASE_ID', 'No base id. Pass --base-id <id>, set a default with `inkreach auth login --base-id <id>`, or export INKREACH_BASE_ID.');
|
||||
throw new client_1.ApiError(0, 'MISSING_BASE_ID', 'No base id. Pass --base-id <id>, set a default with `inkreach-teable auth login --base-id <id>`, or export INKREACH_TEABLE_BASE_ID.');
|
||||
}
|
||||
return baseId;
|
||||
}
|
||||
|
||||
+14
-14
@@ -8,7 +8,7 @@
|
||||
|
||||
inkreach-teable(本项目)自研了一套自动化(workflow)引擎,与官方 teable 的自动化**完全不兼容**:
|
||||
|
||||
| 维度 | 官方 teable | 本项目(inkreach) |
|
||||
| 维度 | 官方 teable | 本项目(inkreach-teable) |
|
||||
|---|---|---|
|
||||
| 过滤条件键名 | `filter` | `conditions` |
|
||||
| 监听字段键名 | `watchFieldIds` | `fieldIds` |
|
||||
@@ -19,11 +19,11 @@ inkreach-teable(本项目)自研了一套自动化(workflow)引擎,与
|
||||
|
||||
官方 `teable` CLI(v0.6.22)按官方契约调用,**无法操作本项目自动化**(已实测:列自动化时 404/契约不匹配)。表格/字段/记录/视图的 REST API 则与官方完全兼容。
|
||||
|
||||
**结论**:必须自研一个 `inkreach` CLI 包装本项目真实契约,并配套一个 skill 教 Agent 如何使用。
|
||||
**结论**:必须自研一个 `inkreach-teable` CLI 包装本项目真实契约,并配套一个 skill 教 Agent 如何使用。
|
||||
|
||||
## 2. 目标
|
||||
|
||||
1. **`inkreach` CLI**(`packages/inkreach-cli/`):Node.js 命令行工具,封装本项目全部 REST API,重点是自研自动化契约。
|
||||
1. **`inkreach-teable` CLI**(`packages/inkreach-cli/`):Node.js 命令行工具,封装本项目全部 REST API,重点是自研自动化契约。
|
||||
2. **`inkreach-teable-ops` skill**(`.agents/skills/inkreach-teable-ops/`):教 Agent 何时用哪个 CLI 命令、配置表格与自动化的正确姿势、本项目的部署/开发约定。
|
||||
3. **端到端验证**:在本地实例真实跑通"建表 → 建自动化 → 配 buttonClick 触发器 → 激活 → 查执行历史"全链路。
|
||||
|
||||
@@ -34,14 +34,14 @@ inkreach-teable(本项目)自研了一套自动化(workflow)引擎,与
|
||||
- **运行时**:Node.js(无额外运行时依赖,项目已是 Node 栈)。
|
||||
- **框架**:`commander`(成熟、零学习成本、官方 teable CLI 也用 commander)。
|
||||
- **HTTP**:`node:https`/`node:http`(**不用** `fetch`——Node v24 全局 fetch 会吞 Authorization 头,这是本会话已确认的坑)。封装一个 `request()`。
|
||||
- **配置存储**:`~/.inkreach/config.json`(endpoint + token),支持环境变量覆盖 `INKREACH_ENDPOINT` / `INKREACH_TOKEN`。
|
||||
- **配置存储**:`~/.inkreach-teable/config.json`(endpoint + token),支持环境变量覆盖 `INKREACH_TEABLE_ENDPOINT` / `INKREACH_TEABLE_TOKEN`。
|
||||
- **输出**:默认人类可读(表格/着色),`--json` 输出原始 JSON 供 Agent 解析。
|
||||
- **零运行时依赖**优先(commander 是唯一依赖),便于 `node bin.js` 直接跑、便于打包。
|
||||
|
||||
### 3.2 命令树
|
||||
|
||||
```
|
||||
inkreach [全局选项] <命令>
|
||||
inkreach-teable [全局选项] <命令>
|
||||
|
||||
全局选项:
|
||||
--endpoint <url> 覆盖配置的 endpoint(默认 http://localhost:3000)
|
||||
@@ -142,7 +142,7 @@ YAML frontmatter(name + 极详细的 description 触发条件)+ 以下章节
|
||||
├── SKILL.md 入口
|
||||
├── metadata.json 版本元数据
|
||||
├── scripts/
|
||||
│ └── install.sh 安装/升级 inkreach CLI(pnpm build + link)
|
||||
│ └── install.sh 安装/升级 inkreach-teable CLI(pnpm build + link)
|
||||
└── guides/ 与 api-reference/ 按需加载
|
||||
├── guides/
|
||||
│ ├── instance-access.md 本实例访问信息(endpoint、服务状态、凭据获取)
|
||||
@@ -177,14 +177,14 @@ YAML frontmatter(name + 极详细的 description 触发条件)+ 以下章节
|
||||
|
||||
## 6. 验证标准
|
||||
|
||||
- `inkreach auth status` 返回当前用户。
|
||||
- `inkreach workflow list --base-id bseeZR7yiDNeMPCa4CN` 列出自动化。
|
||||
- `inkreach workflow create --name "CLI测试" --base-id bseeZR7yiDNeMPCa4CN` 创建成功。
|
||||
- `inkreach trigger set <wfId> --type buttonClick --table-id tblXXX --field-ids '["fldXXX"]'` 正确配置。
|
||||
- `inkreach action add <wfId> --type script --code '...'` 正确添加节点。
|
||||
- `inkreach workflow activate <wfId>` 激活成功(返回 snapshotId)。
|
||||
- `inkreach fire button-click ...` 触发执行。
|
||||
- `inkreach runs list <wfId>` 能看到刚才的执行。
|
||||
- `inkreach-teable auth status` 返回当前用户。
|
||||
- `inkreach-teable workflow list --base-id bseeZR7yiDNeMPCa4CN` 列出自动化。
|
||||
- `inkreach-teable workflow create --name "CLI测试" --base-id bseeZR7yiDNeMPCa4CN` 创建成功。
|
||||
- `inkreach-teable trigger set <wfId> --type buttonClick --table-id tblXXX --field-ids '["fldXXX"]'` 正确配置。
|
||||
- `inkreach-teable action add <wfId> --type script --code '...'` 正确添加节点。
|
||||
- `inkreach-teable workflow activate <wfId>` 激活成功(返回 snapshotId)。
|
||||
- `inkreach-teable fire button-click ...` 触发执行。
|
||||
- `inkreach-teable runs list <wfId>` 能看到刚才的执行。
|
||||
- skill 被 Agent 正确加载(出现在 available_skills)。
|
||||
|
||||
## 7. 非目标
|
||||
|
||||
+2
-2
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "@inkreach/teable-cli",
|
||||
"version": "0.1.0",
|
||||
"description": "CLI for operating inkreach-teable: tables, fields, records, views, and the self-built automation engine (8 triggers + 6 actions).",
|
||||
"description": "CLI (command: inkreach-teable) for operating inkreach-teable: tables, fields, records, views, and the self-built automation engine (8 triggers + 6 actions).",
|
||||
"license": "MIT",
|
||||
"type": "commonjs",
|
||||
"bin": {
|
||||
"inkreach": "./dist/bin.js"
|
||||
"inkreach-teable": "./dist/bin.js"
|
||||
},
|
||||
"main": "dist/bin.js",
|
||||
"scripts": {
|
||||
|
||||
+3
-3
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* inkreach — CLI for operating inkreach-teable.
|
||||
* inkreach-teable — CLI for operating inkreach-teable.
|
||||
*
|
||||
* Entry point. Sets up the global commander program and mounts command groups.
|
||||
*/
|
||||
@@ -14,12 +14,12 @@ import { secretCommand, runsCommand, fireCommand, sqlCommand } from './commands/
|
||||
const program = new Command();
|
||||
|
||||
program
|
||||
.name('inkreach')
|
||||
.name('inkreach-teable')
|
||||
.description(
|
||||
'Operate inkreach-teable: tables, fields, records, views, and the self-built automation engine (8 triggers + 6 actions).\n' +
|
||||
'Use --json for machine-readable output (agent parsing).'
|
||||
)
|
||||
.version(`inkreach ${version}`, '-v, --version');
|
||||
.version(`inkreach-teable ${version}`, '-v, --version');
|
||||
|
||||
// Global options (highest precedence over config file + env).
|
||||
program
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* `inkreach auth` — authentication & config commands.
|
||||
* `inkreach-teable auth` — authentication & config commands.
|
||||
*/
|
||||
import { Command } from 'commander';
|
||||
import { run, requireBaseId } from '../lib/ctx';
|
||||
@@ -126,7 +126,7 @@ export function authCommand(): Command {
|
||||
['token', created.token],
|
||||
['', ''],
|
||||
['note', 'Save this token now — it cannot be retrieved again.'],
|
||||
['use', 'inkreach auth login --token <above>'],
|
||||
['use', 'inkreach-teable auth login --token <above>'],
|
||||
]);
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/**
|
||||
* `inkreach secret` — manage workflow automation secrets.
|
||||
* `inkreach runs` — execution history.
|
||||
* `inkreach fire` — manual trigger testing (button-click / webhook).
|
||||
* `inkreach sql` — read-only SQL queries.
|
||||
* `inkreach-teable secret` — manage workflow automation secrets.
|
||||
* `inkreach-teable runs` — execution history.
|
||||
* `inkreach-teable fire` — manual trigger testing (button-click / webhook).
|
||||
* `inkreach-teable sql` — read-only SQL queries.
|
||||
*/
|
||||
import { Command } from 'commander';
|
||||
import { run, requireBaseId } from '../lib/ctx';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* `inkreach base|table|field|record|view` — resource CRUD commands.
|
||||
* `inkreach-teable base|table|field|record|view` — resource CRUD commands.
|
||||
*
|
||||
* These endpoints are compatible with official teable open-api.
|
||||
*/
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* `inkreach workflow` — workflow CRUD + lifecycle.
|
||||
* `inkreach trigger` — set the trigger node's type & config.
|
||||
* `inkreach action` — add/update/delete action nodes.
|
||||
* `inkreach-teable workflow` — workflow CRUD + lifecycle.
|
||||
* `inkreach-teable trigger` — set the trigger node's type & config.
|
||||
* `inkreach-teable action` — add/update/delete action nodes.
|
||||
*
|
||||
* All node-mutating commands operate via PUT /node (whole-graph replacement),
|
||||
* so they internally GET the full graph, mutate, then PUT it back.
|
||||
@@ -123,7 +123,7 @@ export function workflowCommand(): Command {
|
||||
['name', wf.name],
|
||||
['baseId', wf.baseId],
|
||||
['', ''],
|
||||
['next', `inkreach trigger set ${wf.id} --type <T> ...`],
|
||||
['next', `inkreach-teable trigger set ${wf.id} --type <T> ...`],
|
||||
]);
|
||||
}
|
||||
})
|
||||
@@ -296,7 +296,7 @@ export function triggerCommand(): Command {
|
||||
['triggerType', opts.type],
|
||||
['config', JSON.stringify(config)],
|
||||
['', ''],
|
||||
['next', `inkreach action add ${workflowId} --type script ...`],
|
||||
['next', `inkreach-teable action add ${workflowId} --type script ...`],
|
||||
]);
|
||||
}
|
||||
})
|
||||
@@ -432,7 +432,7 @@ export function actionCommand(): Command {
|
||||
['type', opts.type],
|
||||
['config', JSON.stringify(config)],
|
||||
['', ''],
|
||||
['next', `inkreach workflow activate ${workflowId}`],
|
||||
['next', `inkreach-teable workflow activate ${workflowId}`],
|
||||
]);
|
||||
}
|
||||
})
|
||||
|
||||
+7
-7
@@ -1,8 +1,8 @@
|
||||
/**
|
||||
* Config storage for inkreach CLI.
|
||||
* Config storage for inkreach-teable CLI.
|
||||
*
|
||||
* Stores endpoint + token at ~/.inkreach/config.json, with environment variable
|
||||
* overrides INKREACH_ENDPOINT / INKREACH_TOKEN. The --endpoint / --token / --base-id
|
||||
* Stores endpoint + token at ~/.inkreach-teable/config.json, with environment variable
|
||||
* overrides INKREACH_TEABLE_ENDPOINT / INKREACH_TEABLE_TOKEN. The --endpoint / --token / --base-id
|
||||
* global flags take the highest precedence (handled by resolveOptions()).
|
||||
*/
|
||||
import * as fs from 'node:fs';
|
||||
@@ -15,7 +15,7 @@ export interface IConfig {
|
||||
baseId?: string;
|
||||
}
|
||||
|
||||
const CONFIG_DIR = path.join(os.homedir(), '.inkreach');
|
||||
const CONFIG_DIR = path.join(os.homedir(), '.inkreach-teable');
|
||||
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
|
||||
|
||||
export const DEFAULT_ENDPOINT = 'http://localhost:3000';
|
||||
@@ -42,11 +42,11 @@ export function resolveConfig(overrides?: Partial<IConfig>): IConfig {
|
||||
return {
|
||||
endpoint:
|
||||
overrides?.endpoint ||
|
||||
process.env.INKREACH_ENDPOINT ||
|
||||
process.env.INKREACH_TEABLE_ENDPOINT ||
|
||||
file.endpoint ||
|
||||
DEFAULT_ENDPOINT,
|
||||
token: overrides?.token || process.env.INKREACH_TOKEN || file.token || '',
|
||||
baseId: overrides?.baseId || process.env.INKREACH_BASE_ID || file.baseId,
|
||||
token: overrides?.token || process.env.INKREACH_TEABLE_TOKEN || file.token || '',
|
||||
baseId: overrides?.baseId || process.env.INKREACH_TEABLE_BASE_ID || file.baseId,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -85,7 +85,7 @@ export function requireBaseId(ctx: Ctx, flagVal?: string): string {
|
||||
throw new ApiError(
|
||||
0,
|
||||
'MISSING_BASE_ID',
|
||||
'No base id. Pass --base-id <id>, set a default with `inkreach auth login --base-id <id>`, or export INKREACH_BASE_ID.'
|
||||
'No base id. Pass --base-id <id>, set a default with `inkreach-teable auth login --base-id <id>`, or export INKREACH_TEABLE_BASE_ID.'
|
||||
);
|
||||
}
|
||||
return baseId;
|
||||
|
||||
Reference in New Issue
Block a user