Token导航 LogoToken导航TokenDH.com
研究检索敏感数据clawhub未标认证来源可访问clear审计通过

portable-tools便携式工具

Agent Skill

portable-tools 用于查找、检索和筛选相关信息,适合在 OpenClaw 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

87,144

周安装

3,631

GitHub Stars

1

下载量

29,048
OpenClaw

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

MIT-0

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:portable-tools(便携式工具)
来源仓库:https://github.com/tunaissacoding/portable-tools
安装命令:
openclaw skills install portable-tools
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install portable-tools

简介

跨平台便携工具集,解决硬编码路径与账户名的通用性问题。

  • 适合多设备协作或CI/CD流水线中保持配置一致性。
  • 自动适配不同操作系统环境,简化部署与迁移流程。
  • 需确保各平台依赖项已正确安装,避免运行时缺失组件。
  • 建议根据具体项目需求选择子工具组合使用。portable-tools 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

SKILL.md

name
portable-tools
description
Build cross-device tools without hardcoding paths or account names

Portable Tools - Cross-Device Development Methodology

Methodology for building tools that work across different devices, naming schemes, and configurations. Based on lessons from OAuth refresher debugging session (2026-01-23).

Core Principle

Never assume your device is the only device.

Your local setup is just one of many possible configurations. Build for the general case, not the specific instance.


The Three Questions (Before Writing Code)

1. "What varies between devices?"

Before writing any code that reads configuration, data, or credentials:

Ask:

  • File paths? (macOS vs Linux, different home dirs)
  • Account names? (user123 vs default vs oauth)
  • Service names? (slight variations in spelling/capitalization)
  • Data structure? (different versions, different formats)
  • Environment? (different shells, different tools available)

Example from OAuth refresher:

  • ❌ Assumed: Account is always "claude"
  • ✅ Reality: Could be "claude", "Claude Code", "default", etc.

Action: List variables, make them configurable or auto-discoverable


2. "How do I prove this works?"

Before claiming success:

Require:

  • Concrete BEFORE state (exact values)
  • Concrete AFTER state (exact values)
  • Proof they're different (side-by-side comparison)

Example from OAuth refresher:

BEFORE:
- Access Token: POp5z1fi...eSN9VAAA
- Expires: 1769189639000

AFTER:
- Access Token: 01v0RrFG...eOE9QAA ✅ Different
- Expires: 1769190268000 ✅ Extended

Action: Always show data transformation with real values


3. "What happens when it breaks?"

Before pushing to production:

Test:

  • Wrong configuration (intentionally break config)
  • Missing data (remove expected fields)
  • Multiple entries (ambiguous case)
  • Edge cases (empty values, special characters)

Example from OAuth refresher:

  • Test with keychain_account: "wrong-name" → Fallback should work
  • Test with incomplete keychain data → Should fail gracefully with helpful error

Action: Test failure modes, not just happy path


Mandatory Patterns

Pattern 1: Explicit Over Implicit

❌ Wrong:

# Ambiguous - returns first match
security find-generic-password -s "Service" -w

✅ Correct:

# Explicit - returns specific entry
security find-generic-password -s "Service" -a "account" -w

Rule: If a command can be ambiguous, make it explicit.


Pattern 2: Validate Before Use

❌ Wrong:

DATA=$(read_config)
USE_VALUE="$DATA"  # Hope it's valid

✅ Correct:

DATA=$(read_config)
if ! validate_structure "$DATA"; then
    error "Invalid data structure"
fi
USE_VALUE="$DATA"

Rule: Never assume data has expected structure.


Pattern 3: Fallback Chains

❌ Wrong:

ACCOUNT="claude"  # Hardcoded

✅ Correct:

# Try configured → Try common → Error with help
ACCOUNT="${CONFIG_ACCOUNT}"
if ! has_data "$ACCOUNT"; then
    for fallback in "claude" "default" "oauth"; do
        if has_data "$fallback"; then
            ACCOUNT="$fallback"
            break
        fi
    done
fi
[[ -z "$ACCOUNT" ]] && error "No account found. Tried: ..."

Rule: Provide automatic fallbacks for common variations.


Pattern 4: Helpful Errors

❌ Wrong:

[[ -z "$TOKEN" ]] && error "No token"

✅ Correct:

[[ -z "$TOKEN" ]] && error "No token found

Checked:
- Config: $CONFIG_FILE
- Field: $FIELD_NAME
- Expected: { \"tokens\": { \"refresh\": \"...\" } }

Verify with:
  cat $CONFIG_FILE | jq '.tokens'
"

Rule: Error messages should help user diagnose and fix.


Debugging Methodology (Patrick's Approach)

Step 1: Get Exact Data

Don't ask: "Is it broken?" Ask: "What exact values do you see? How many entries exist? Which one has the data?"

Example:

# Vague
"Check keychain"

# Specific
"Run: security find-generic-password -l 'Service' | grep 'acct'"
"Tell me: 1. How many entries 2. Which has tokens 3. Last modified"

Step 2: Prove With Concrete Examples

Don't say: "It should work now" Show: "Here's the BEFORE token (POp5z...), here's AFTER (01v0R...), they're different"

Template:

BEFORE:
- Field1: <exact_value>
- Field2: <exact_value>

AFTER:
- Field1: <new_value> ✅ Changed
- Field2: <new_value> ✅ Changed

PROOF: Values are different

Step 3: Think Cross-Device Immediately

Don't think: "Works on my machine" Think: "What if their setup differs in [X]?"

Checklist:

  • [ ] Different account names?
  • [ ] Different file paths?
  • [ ] Different tools/versions?
  • [ ] Different permissions?
  • [ ] Different data formats?

Pre-Flight Checklist (Before Publishing)

Discovery Phase

  • [ ] List all external dependencies (files, commands, services)
  • [ ] Document what each dependency provides
  • [ ] Identify which parts could vary between devices

Implementation Phase

  • [ ] Make variations configurable (with sensible defaults)
  • [ ] Add validation for each input
  • [ ] Build fallback chains for common variations
  • [ ] Add --dry-run or --test mode

Testing Phase

  • [ ] Test with correct config → Should work
  • [ ] Test with wrong config → Should fallback or fail gracefully
  • [ ] Test with missing data → Should give helpful error
  • [ ] Test with multiple entries → Should handle ambiguity

Documentation Phase

  • [ ] Document default assumptions
  • [ ] Document how to verify local setup
  • [ ] Document common variations and how to handle them
  • [ ] Include data flow diagram
  • [ ] Add troubleshooting section

Real-World Example: OAuth Refresher

Original (Broken)

# Assumes single entry, no validation, no fallback
KEYCHAIN_DATA=$(security find-generic-password -s "Service" -w)
REFRESH_TOKEN=$(echo "$KEYCHAIN_DATA" | jq -r '.refreshToken')
# Use token (hope it's valid)

Problems:

  • Returns first alphabetical match (wrong entry)
  • No validation (could be empty/malformed)
  • No fallback (fails if account name differs)

Fixed (Portable)

# Explicit account with validation and fallback
validate_data() {
    echo "$1" | jq -e '.claudeAiOauth.refreshToken' > /dev/null 2>&1
}

# Try configured account
DATA=$(security find-generic-password -s "$SERVICE" -a "$ACCOUNT" -w 2>&1)
if validate_data "$DATA"; then
    log "✓ Using account: $ACCOUNT"
else
    log "⚠ Trying fallback accounts..."
    for fallback in "claude" "Claude Code" "default"; do
        DATA=$(security find-generic-password -s "$SERVICE" -a "$fallback" -w 2>&1)
        if validate_data "$DATA"; then
            ACCOUNT="$fallback"
            log "✓ Found data in: $fallback"
            break
        fi
    done
fi

[[ -z "$DATA" ]] || ! validate_data "$DATA" && error "No valid data found
Tried accounts: $ACCOUNT, claude, Claude Code, default
Verify with: security find-generic-password -l '$SERVICE'"

REFRESH_TOKEN=$(echo "$DATA" | jq -r '.claudeAiOauth.refreshToken')

Improvements:

  • ✅ Explicit account parameter
  • ✅ Validates data structure
  • ✅ Automatic fallback to common names
  • ✅ Helpful error with verification command

Common Anti-Patterns

Anti-Pattern 1: "Works On My Machine"

FILE="/Users/patrick/.config/app.json"  # Hardcoded path

Fix: Use $HOME, detect OS, or make configurable


Anti-Pattern 2: "Hope It's There"

TOKEN=$(cat config.json | jq -r '.token')
# What if .token doesn't exist? Script continues with empty value

Fix: Validate before using

TOKEN=$(cat config.json | jq -r '.token // empty')
[[ -z "$TOKEN" ]] && error "No token in config"

Anti-Pattern 3: "First Match Is Right"

# If multiple entries exist, which one?
ENTRY=$(find_entry "service")

Fix: Be explicit or enumerate all

ENTRY=$(find_entry "service" "account")  # Specific
# OR
ALL=$(find_all_entries "service")
for entry in $ALL; do
    validate_and_use "$entry"
done

Anti-Pattern 4: "Silent Failures"

process_data || true  # Ignore errors

Fix: Fail loudly with context

process_data || error "Failed to process
Data: $DATA
Expected: { ... }
Check: command_to_verify"

Integration With Existing Workflows

With sprint-plan.md

Add to testing section:

## Cross-Device Testing
- [ ] Test with different account names
- [ ] Test with wrong config values
- [ ] Test with missing data
- [ ] Document fallback behavior

With PRIVACY-CHECKLIST.md

Add before publishing:

## Portability Check
- [ ] No hardcoded paths (use $HOME, detect OS)
- [ ] No hardcoded names (use config or fallback)
- [ ] Validation on all inputs
- [ ] Helpful errors for common issues

With skill-creator

When building new skills:

  1. List what varies between devices
  2. Make it configurable or auto-discoverable
  3. Test with wrong config
  4. Document troubleshooting

Quick Reference Card

Before writing code:

  1. What varies between devices?
  2. How do I prove this works?
  3. What happens when it breaks?

Mandatory patterns:

  • Explicit over implicit
  • Validate before use
  • Fallback chains
  • Helpful errors

Testing:

  • Correct config → Works
  • Wrong config → Fallback or helpful error
  • Missing data → Clear diagnostic

Documentation:

  • Data flow diagram
  • Common variations
  • Troubleshooting guide

Success Criteria

A tool is portable when:

  1. ✅ Works on different devices without modification
  2. ✅ Auto-discovers common variations in setup
  3. ✅ Fails gracefully with actionable error messages
  4. ✅ Can be debugged by reading the error output
  5. ✅ Documentation covers "what if my setup differs"

Test: Give it to someone with a different setup. If they need to ask you questions, the tool isn't portable yet.


Origin Story

This methodology emerged from debugging the OAuth refresher (2026-01-23):

  • Script read wrong keychain entry (didn't specify account)
  • Assumed single entry existed (multiple did)
  • No validation (used empty data)
  • No fallback (failed on different account names)

Patrick's approach:

  1. Asked for exact data (how many entries, which has tokens)
  2. Demanded proof (show BEFORE/AFTER tokens)
  3. Thought cross-device (what if naming differs?)

Result: Tool went from single-device/broken to universal/production-ready.

Key insight: The bugs weren't in the logic - they were in the assumptions.


When To Use This Skill

Use when:

  • Building tools that read system configuration
  • Working with keychains, credentials, environment variables
  • Creating scripts that run on multiple machines
  • Publishing skills to ClawdHub (others will use them)

Apply:

  1. Before implementing: Answer the three questions
  2. During implementation: Use mandatory patterns
  3. Before testing: Run pre-flight checklist
  4. After testing: Document variations and troubleshooting

Remember: Your device is just one case. Build for the general case.

适合场景

01

OpenClaw 用户查找和安装 Skill 时

02

用户想查找某类 Agent Skill 时

03

需要根据任务场景推荐可安装能力包时

04

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenClaw

77.07%
按下载量换算22,387

安全审计

VirusTotal

通过

ClawScan

通过

Static analysis

未展示

权限和风险

敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills