Compare commits

...

7 Commits
v0.0.4 ... main

Author SHA1 Message Date
ywkj 9fe8ab94e8 feat: auth-rt 改用 Go 二进制,install.sh 自动下载
register-skill-release / register (push) Successful in 13s Details
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 20:52:02 +08:00
ywkj f4fe52aff1 fix: auth-rt auto-install 使用永久路径 ~/.local/share/auth-runtime
修复之前 clone 到 /tmp 后删除导致 wrapper 指向不存在路径的问题。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 20:34:21 +08:00
ywkj b29037526b feat: install.sh 自动下载安装 auth-rt(无需手动 clone)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 18:36:47 +08:00
ywkj ece7db4cf2 chore: auth-rt 默认路径改为 ~/.local/bin/
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 18:35:37 +08:00
ywkj 2f4f8d4030 fix: auth-cli.ts 修复 HOME 路径解析 + shell wrapper 兼容
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 18:31:06 +08:00
ywkj 47d3711f43 refactor: auth-cli.ts 改用 auth-rt 二进制
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 18:26:29 +08:00
ywkj 2beb7e1051 refactor: 移除 @clawd/auth-runtime npm 依赖,改用 CLI subprocess 调用
通过内置 auth-cli.ts 薄 wrapper 调用 auth-runtime CLI,
消除 npm git 依赖带来的缓存和更新问题。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 14:38:05 +08:00
5 changed files with 143 additions and 7 deletions

View File

@ -2,6 +2,25 @@
set -euo pipefail set -euo pipefail
cd "$(dirname "$0")" cd "$(dirname "$0")"
# Always fetch latest git dependencies # Auto-install auth-rt if not found
rm -rf node_modules/@clawd if ! command -v auth-rt &>/dev/null && [ ! -x "$HOME/.local/bin/auth-rt" ]; then
echo "auth-rt not found, installing..."
_FORGEJO="http://192.168.0.108:3030"
_OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
_ARCH="$(uname -m)"; case "$_ARCH" in x86_64) _ARCH="amd64";; aarch64) _ARCH="arm64";; esac
_URL="$_FORGEJO/agent-skills/auth-runtime/releases/download/latest/auth-rt-${_OS}-${_ARCH}"
mkdir -p "$HOME/.local/bin"
if curl -fsSL "$_URL" -o "$HOME/.local/bin/auth-rt" 2>/dev/null; then
chmod +x "$HOME/.local/bin/auth-rt"
echo "auth-rt installed (downloaded)"
else
echo "Download failed, building from source..."
_SRC="$HOME/.local/share/auth-runtime"
if [ -d "$_SRC/.git" ]; then git -C "$_SRC" pull --ff-only
else git clone --depth 1 "$_FORGEJO/agent-skills/auth-runtime.git" "$_SRC"
fi
bash "$_SRC/install.sh"
fi
fi
npm install npm install

View File

@ -18,7 +18,5 @@
"peerDependencies": { "peerDependencies": {
"typescript": "^5.0.0" "typescript": "^5.0.0"
}, },
"dependencies": { "dependencies": {}
"@clawd/auth-runtime": "git+http://192.168.0.108:3030/agent-skills/auth-runtime.git"
}
} }

119
src/auth-cli.ts Normal file
View File

@ -0,0 +1,119 @@
/**
* Thin CLI wrapper for auth-runtime.
*
* Copy this file into your skill's src/ directory. It calls the
* `auth-rt` binary (a standalone Go executable), so the skill has
* zero npm/runtime dependency on auth-runtime.
*
* Prerequisites:
* `auth-rt` must be in PATH or at ~/.local/bin/auth-rt
* (install.sh handles this automatically)
*
* Usage:
* import { createSkillClient } from './auth-cli.ts';
* const client = createSkillClient();
* const res = await client.post('/ecom/tasks/scrape', { url: '...' });
*/
import { spawnSync } from 'child_process';
import * as path from 'path';
import * as os from 'os';
const home = process.env.HOME || os.homedir();
const AUTH_RT_BIN = process.env.AUTH_RT_BIN
|| (() => {
// Check if auth-rt is in PATH
const which = spawnSync('which', ['auth-rt'], { encoding: 'utf-8' });
if (which.status === 0 && which.stdout.trim()) {
return which.stdout.trim();
}
return path.join(home, '.local', 'bin', 'auth-rt');
})();
export interface ApiResponse {
status: number;
body: string;
}
export interface SessionResponse {
accessToken: string;
expiresIn: number;
ownerSessionToken?: string;
hookUrl?: string;
hookToken?: string;
}
export interface SkillClientOptions {
apiBase?: string;
dryRun?: boolean;
}
function runCli(...args: string[]): string {
const result = spawnSync(AUTH_RT_BIN, args, {
encoding: 'utf-8',
timeout: 60_000,
});
if (result.error) {
throw new Error(`auth-rt spawn failed: ${result.error.message}`);
}
if (result.status !== 0) {
throw new Error(`auth-rt failed (exit ${result.status}): ${(result.stderr || '').trim()}`);
}
return (result.stdout || '').trim();
}
export class SkillClient {
private readonly apiBase?: string;
private readonly dryRun: boolean;
constructor(options: SkillClientOptions = {}) {
this.apiBase = options.apiBase;
this.dryRun = options.dryRun ?? false;
}
async session(): Promise<SessionResponse> {
if (this.dryRun) {
return { accessToken: '<dry-run-token>', expiresIn: 900 };
}
return JSON.parse(runCli('session'));
}
async get(urlPath: string): Promise<ApiResponse> {
return this.request('GET', urlPath);
}
async post(urlPath: string, body?: unknown): Promise<ApiResponse> {
return this.request('POST', urlPath, body);
}
async put(urlPath: string, body?: unknown): Promise<ApiResponse> {
return this.request('PUT', urlPath, body);
}
async patch(urlPath: string, body?: unknown): Promise<ApiResponse> {
return this.request('PATCH', urlPath, body);
}
async delete(urlPath: string, body?: unknown): Promise<ApiResponse> {
return this.request('DELETE', urlPath, body);
}
private async request(method: string, urlPath: string, body?: unknown): Promise<ApiResponse> {
if (this.dryRun) {
return { status: 200, body: JSON.stringify({ dryRun: true, method, path: urlPath }) };
}
const args = ['request', method, urlPath];
if (body != null) {
args.push('--body', JSON.stringify(body));
}
if (this.apiBase) {
args.push('--api-base', this.apiBase);
}
return JSON.parse(runCli(...args));
}
}
export function createSkillClient(options?: SkillClientOptions): SkillClient {
return new SkillClient(options);
}

View File

@ -1,5 +1,5 @@
import type { OutputResult } from './types.js'; import type { OutputResult } from './types.js';
import { createSkillClient } from '@clawd/auth-runtime'; import { createSkillClient } from './auth-cli.ts';
import { normalizeQuery, resolveExpansion } from './expansion.js'; import { normalizeQuery, resolveExpansion } from './expansion.js';
import { startWorkflow } from './workflow.js'; import { startWorkflow } from './workflow.js';

View File

@ -1,4 +1,4 @@
import type { SkillClient } from '@clawd/auth-runtime'; import type { SkillClient } from './auth-cli.ts';
import { WorkflowStartResponse } from './types.js'; import { WorkflowStartResponse } from './types.js';
/** /**