python3 {baseDir}/scripts/cli.py providers --json when you need to show the currently supported mailbox providers and their setup notes.python3 {baseDir}/scripts/cli.py doctor --json first. If it returns setup_required: true, guide the user through setup and wait for confirmation.python3 {baseDir}/scripts/cli.py setup for an interactive setup wizard, or pass --mail-provider 126|163|gmail|custom plus --provider system|env|config|prompt for scripted setup.python3 {baseDir}/scripts/cli.py sync --month YYYY-MM --json to pull a month into the local archive.python3 {baseDir}/scripts/cli.py report --month YYYY-MM --json to inspect totals, duplicates, conflicts, and failures.python3 {baseDir}/scripts/cli.py deliver --month YYYY-MM --json to prepare a zip plus summary for the current chat.doctor.doctor reports setup_required, ask the user which mailbox provider they want first: 126, 163, gmail, or custom.
system credential store, environment variables, config file, or prompt-each-session.
setup with the chosen mailbox provider and auth mode, then wait for the user to confirm they completed any external steps, such as exporting environment variables.doctor again to confirm the setup works.list --month YYYY-MM --limit 20 --json when you need a quick mailbox preview without downloading files.sync --month YYYY-MM --json to archive candidate invoices into ~/Documents/invoice-archive/YYYY-MM/.report --month YYYY-MM --json after sync and summarize:total amount, canonical invoice count, high-value invoices, duplicates, conflicts, and failures.
deliver --month YYYY-MM --json, then attach the returned zip file in the current chat and paste the summary.env on Windows, offer one of these exact snippets and wait for confirmation before rerunning doctor.$env:MAIL_INVOICE_ARCHIVER_EMAIL = "your-mail@example.com"
$env:MAIL_INVOICE_ARCHIVER_AUTH_CODE = "your-provider-secret"
python "{baseDir}/scripts/cli.py" doctor --json
set MAIL_INVOICE_ARCHIVER_EMAIL=your-mail@example.com
set MAIL_INVOICE_ARCHIVER_AUTH_CODE=your-provider-secret
python "{baseDir}\scripts\cli.py" doctor --json
MAIL_INVOICE_ARCHIVER_AUTH_CODE must be a Gmail app password, not the normal Google account password.system auth on macOS and Windows, env on Linux, CI, or headless sessions, and prompt only when the user does not want to persist the secret anywhere.system currently means macOS Keychain on macOS and Windows Credential Manager on Windows.126, 163, and gmail.appleimap.126.com as the preferred 126 IMAP host.ID only when that provider needs it. Today that means 126 and 163; Gmail does not need it.storage duplicates by message UID / part / SHA256;
business duplicates by invoice number + amount.
¥ amount. PDF text extraction may reorder the invoice area and expose tax base amount, tax amount, and total amount in the wrong sequence.名称: 名称: layouts after text extraction. Prefer layout-aware extraction over a single regex when distinguishing buyer and seller.duplicate against an older canonical row outside the month window. Summaries should aggregate by current-month business keys, not only by status='saved' rows inside the month.价税合计 for totals, record and honor that rule consistently in later extraction and reporting.When this skill needs Feishu app credentials for local delivery helpers or follow-up integrations, do not store real secrets inside the published skill directory.
Use this split instead:
config/feishu/config.example.yaml~/.config/openclaw/mail_invoice_archiver/feishu.config.yamlWhy this rule exists:
.gitignore reduces Git commit risk, but should not be treated as the security boundary for skill publishing.Recommended loading order for Feishu credentials:
~/.config/openclaw/mail_invoice_archiver/feishu.config.yamlEnvironment variable names:
MAIL_INVOICE_ARCHIVER_FEISHU_APP_IDMAIL_INVOICE_ARCHIVER_FEISHU_APP_SECRETMAIL_INVOICE_ARCHIVER_FEISHU_RECEIVE_ID_TYPEMAIL_INVOICE_ARCHIVER_FEISHU_CONFIGNever publish or share the real local config file.
If config/feishu/config.yaml appears inside the skill directory, treat it as an unsafe misconfiguration. The runtime should fail fast and require moving that file out of the skill.
共 1 个版本