{
  "schemaVersion": "1.0",
  "item": {
    "slug": "gridtrx",
    "name": "GridTRX",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/737999/gridtrx",
    "canonicalUrl": "https://clawhub.ai/737999/gridtrx",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/gridtrx",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=gridtrx",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "cli.py",
      "run.py",
      "sample_2025_bank.csv",
      "ai.txt",
      "mcp_server.py",
      "models.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/gridtrx"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/gridtrx",
    "agentPageUrl": "https://openagent3.xyz/skills/gridtrx/agent",
    "manifestUrl": "https://openagent3.xyz/skills/gridtrx/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/gridtrx/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Demo",
        "body": "Watch the demo: Full accounting cycle in 15 minutes"
      },
      {
        "title": "What it does",
        "body": "Use this skill when the user asks you to \"do the books,\" \"categorize expenses,\" \"import bank transactions,\" \"run a balance sheet,\" or any bookkeeping task. GridTRX is a full-cycle double-entry accounting engine. You prompt in plain English, and the agent completes the books correctly. Every transaction balances. Every amount is deterministic. All data is local — no cloud services, no external APIs.\n\nGridTRX produces a full set of auditable books: balance sheet, income statement, general ledger, trial balance, adjusting journal entries, retained earnings rollforward. Reports are exportable to CSV and PDF for any time period."
      },
      {
        "title": "Architecture",
        "body": "GridTRX has three interfaces to the same engine (models.py → books.db):\n\nMCP Server (preferred for agents) — Structured JSON tools. 20 tools (12 read, 8 write) wrapping models.py directly. No text parsing, typed parameters, deterministic output.\nCLI (fallback for agents, power users) — One-shot shell commands via python cli.py. Zero dependencies beyond Python 3.7+ standard library. Any terminal-based agent can drive it via subprocess.\nBrowser UI (for humans) — Flask web interface at localhost:5000 via python run.py. Ledger browsing, report viewer with drill-down, comparative reports up to 13 columns, bank import with rule preview, reconciliation marking, dark mode.\n\nAll three hit the same models.py data layer. Nothing is out of sync. Use MCP when available. Fall back to CLI otherwise. The browser UI is for human review."
      },
      {
        "title": "Prerequisites",
        "body": "Install dependencies before first use (one-time setup):\n\npip install -r requirements.txt\n\nOr install individually: pip install mcp (MCP server), pip install flask (browser UI). The CLI has no dependencies beyond the Python 3.7+ standard library.\n\nNo packages are installed at runtime. All dependencies must be pre-installed."
      },
      {
        "title": "MCP Setup",
        "body": "Add to the agent's MCP config with GRIDTRX_WORKSPACE set to the user's client folder:\n\n{\n  \"command\": \"python\",\n  \"args\": [\"/path/to/mcp_server.py\"],\n  \"env\": {\"GRIDTRX_WORKSPACE\": \"/path/to/clients\"}\n}\n\nGRIDTRX_WORKSPACE is mandatory — the MCP server will refuse to start without it. Any db_path outside the workspace is rejected at runtime. Every MCP tool takes db_path as its first parameter, which must resolve to a books.db file inside the workspace."
      },
      {
        "title": "CLI Usage",
        "body": "GRIDTRX_WORKSPACE=/path/to/clients python cli.py /path/to/clients/acme/books.db <command>\n\nRuns one command, prints plain text to stdout, exits. When GRIDTRX_WORKSPACE is set, the CLI enforces the same workspace boundary as the MCP server — paths outside the workspace are rejected."
      },
      {
        "title": "Inputs needed",
        "body": "The absolute path to the client's books (books.db file or its parent folder).\nThe absolute path to the bank file (.csv, .ofx, or .qbo).\nThe bank account name to post against (typically BANK.CHQ for chequing)."
      },
      {
        "title": "Core concepts",
        "body": "Double-entry: Every transaction is a balanced zero-sum entry. Debits = Credits. Always.\nSign convention: Positive = Debit. Parentheses (1,500.00) = Credit. — = Zero.\nAmounts: Stored as integer cents internally. Displayed as dollars with two decimals.\nAccount names: Case-insensitive, UPPER by convention. Common prefixes: BANK. EX. REV. AR. AP. GST. RE. SHL. — When importing a trial balance or creating accounts, ALWAYS use GridTRX naming. Never use numeric account codes. If the source data has numeric codes (1010, 5800, etc.), ignore the codes and map by description to the nearest GridTRX account name. If no match exists, create the account using the EX. or REV. prefix convention. Always call list_accounts first before creating anything.\nEX.SUSP (Suspense): Where unrecognized transactions land. This is the triage queue. Tell the AI what the suspense items are and it will clear them. Or clear them yourself through the GUI.\nImport rules: Keyword → account mappings. Case-insensitive match, highest priority wins. Optional tax code splits the amount into net + tax automatically.\nLock date: Prevents changes to closed periods. Check before importing historical data.\nArchitecture: Each client is one SQLite file. Copy it, back it up, email it. One data layer (models.py) — CLI, MCP server, and browser UI all call the same functions."
      },
      {
        "title": "Step 1: Initialize (if no books exist)",
        "body": "MCP: No direct tool — use exec to run CLI.\nCLI: python cli.py then new /path/to/folder \"Company Name\"\n\nThis creates books.db with a full chart of accounts (~60 posting accounts), five reports (BS, IS, AJE, TRX, RE.OFS), 60+ import rules, and four tax codes. Always use starter books as the base — they include the critical perpetual retained earnings chain (IS → NI → RE.CLOSE → RE on BS, plus RE.OFS/RE.OPEN for year-end). Never build reports from scratch without this chain. The fiscal year ceiling (fy_end_date) is automatically set to the current fiscal year end.\n\nAfter setup, run validate to confirm the report chain is intact:\nCLI: python cli.py /path/to/books.db validate"
      },
      {
        "title": "Step 2: Import bank data",
        "body": "MCP (preferred):\n\nCSV: import_csv(db_path, csv_path, \"BANK.CHQ\")\nOFX/QBO: import_ofx(db_path, ofx_path, \"BANK.CHQ\")\n\nCLI fallback:\n\nCSV: python cli.py /path/to/books.db importcsv /path/to/file.csv BANK.CHQ\nOFX: python cli.py /path/to/books.db importofx /path/to/file.qbo BANK.CHQ\n\nThe import applies all rules automatically. Check the result summary: posted, skipped, to_suspense.\n\nCaseWare AJE import:\n\nMCP: import_aje(db_path, file_path, \"25AJE\")\nCLI: python cli.py /path/to/books.db importaje /path/to/aje_export.iif 25AJE\nSupports QuickBooks IIF and Venice/MYOB text formats. Maps CsW account descriptions to Grid account codes."
      },
      {
        "title": "Step 3: Audit suspense",
        "body": "MCP: get_ledger(db_path, \"EX.SUSP\")\nCLI: python cli.py /path/to/books.db ledger EX.SUSP\n\nEvery entry here is an unrecognized transaction. Note the description and transaction ID for each."
      },
      {
        "title": "Step 4: Resolve suspense with the user",
        "body": "Present each suspense item to the user. Ask: \"What category is this?\"\n\nDo NOT guess. If the description is ambiguous (e.g., \"AMAZON\", \"BEST BUY\", \"TRANSFER\"), ask the user for business context before categorizing.\n\nOnce the user answers, add a rule so future imports are automatic:\n\nMCP: add_rule(db_path, \"AMAZON\", \"EX.OFFICE\", \"G5\", 0)\nCLI: python cli.py /path/to/books.db addrule AMAZON EX.OFFICE G5 0\n\nTax code is optional. Common codes: G5 (GST 5%), H13 (HST 13%), H15 (HST 15%), E (exempt)."
      },
      {
        "title": "Step 5: Clear the bad suspense entries and re-import",
        "body": "Delete each suspense transaction, then re-import so the new rules apply:\n\nMCP: delete_transaction(db_path, txn_id) for each, then import_csv(...) or import_ofx(...) again.\nCLI: python cli.py /path/to/books.db delete <txn_id> for each, then re-run the import command.\n\nRepeat Steps 3-5 until suspense is empty."
      },
      {
        "title": "Step 6: Verify and report",
        "body": "MCP:\n\ntrial_balance(db_path) — debits must equal credits\ngenerate_report(db_path, \"BS\") — Balance Sheet\ngenerate_report(db_path, \"IS\") — Income Statement\n\nCLI:\n\npython cli.py /path/to/books.db tb\npython cli.py /path/to/books.db report BS\npython cli.py /path/to/books.db report IS"
      },
      {
        "title": "Step 7: Year-end rollforward",
        "body": "When the fiscal year is complete:\n\nMCP: rollforward(db_path, \"2025-12-31\")\nCLI: python cli.py /path/to/books.db rollforward 2025-12-31\n\nThis reads RE.CLOSE from the IS, posts Dr RE.OFS / Cr RE.OPEN, sets the lock date, and advances the FY ceiling to the next year. Then repeat from Step 2 for the next fiscal year. Rows beyond the ceiling are automatically skipped during import."
      },
      {
        "title": "Recovery: Undoing a bad import",
        "body": "If the user uploaded the wrong file or you imported against the wrong account:\n\nFind the bad transactions: search_transactions(db_path, \"some description\") or via CLI search <keyword>.\nDelete them one by one: delete_transaction(db_path, txn_id) or CLI delete <txn_id>.\nVerify the trial balance still balances after cleanup.\nRe-import the correct file.\n\nThere is no bulk undo. Deletions are individual and respect the lock date — you cannot delete transactions in a locked period."
      },
      {
        "title": "Read tools",
        "body": "ToolPurposelist_accounts(db_path, query?)List/search chart of accountsget_balance(db_path, account_name, date_from?, date_to?)Single account balanceget_ledger(db_path, account_name, date_from?, date_to?)Account ledger with running balancetrial_balance(db_path, as_of_date?)Trial balance — all accounts, Dr/Cr columnsgenerate_report(db_path, report_name, date_from?, date_to?)Run a report (BS, IS, AJE, etc.)get_transaction(db_path, txn_id)Single transaction with all journal linessearch_transactions(db_path, query, limit?)Search by description/referencelist_reports(db_path)List available reportslist_rules(db_path)List import rulesget_info(db_path)Company name, fiscal year, lock date"
      },
      {
        "title": "Write tools",
        "body": "ToolPurposepost_transaction(db_path, date, description, amount, debit_account, credit_account)Post a simple 2-line entrydelete_transaction(db_path, txn_id)Delete a transaction (respects lock date)add_account(db_path, name, normal_balance, description?)Add a posting accountadd_rule(db_path, keyword, account_name, tax_code?, priority?)Add an import ruledelete_rule(db_path, rule_id)Delete an import ruleimport_csv(db_path, csv_path, bank_account)Import bank CSVimport_ofx(db_path, ofx_path, bank_account)Import bank OFX/QBOimport_aje(db_path, file_path, ref_prefix)Import CaseWare AJE export (IIF or Venice)rollforward(db_path, ye_date)Year-end rollforward (posts RE closing, sets lock, advances ceiling)year_end(db_path, ye_date)Alias for rollforwardset_lock_date(db_path, lock_date?)Show or set the lock dateset_ceiling(db_path, date?)Show or set the fiscal year ceilingbulk_report_layout(db_path, report_name, items, after_account?, mode?)Batch-place items on a report (accounts, totals, labels, separators)"
      },
      {
        "title": "Guardrails",
        "body": "NEVER GUESS CATEGORIES. If a transaction description is ambiguous, let it go to EX.SUSP and ask the user. Do not assume \"AMAZON\" is office supplies — it could be inventory, personal, or cost of sales.\nNEVER MODIFY books.db DIRECTLY. All writes go through cli.py commands or MCP tools. Never use file tools to read or write the SQLite database.\nSTAY IN THE WORKSPACE. Only operate on books.db files within the user's GridTRX workspace. Both the MCP server and CLI enforce this when GRIDTRX_WORKSPACE is set — the MCP server will not start without it, and both interfaces reject any path outside the workspace.\nNO OUTBOUND NETWORK REQUESTS. GridTRX processes data locally. It does not phone home, call APIs, or transmit data. Do not attempt to \"verify\" transactions against external services.\nRESPECT THE POSTING WINDOW. Before importing, check the lock date and FY ceiling with get_info(). You cannot post on or before the lock date, or after the FY ceiling. Run rollforward to advance to the next fiscal year.\nPRESERVE RAW OUTPUT. When presenting financial data to the user, use the exact numbers from GridTRX. Do not round, reformat, or flip signs. Positive = Debit. Parentheses = Credit.\nTRIAL BALANCE MUST BALANCE. After any operation, if the trial balance shows unequal debits and credits, something is wrong. Stop and investigate before proceeding.\nLIMIT EXEC SCOPE. When using exec, only run python cli.py commands against books within the workspace. Do not run arbitrary shell commands, install packages, start background processes, or execute scripts other than cli.py. The MCP server is the preferred interface — use CLI only when MCP is unavailable."
      }
    ],
    "body": "Skill: GridTRX Accounting\nDemo\n\nWatch the demo: Full accounting cycle in 15 minutes\n\nWhat it does\n\nUse this skill when the user asks you to \"do the books,\" \"categorize expenses,\" \"import bank transactions,\" \"run a balance sheet,\" or any bookkeeping task. GridTRX is a full-cycle double-entry accounting engine. You prompt in plain English, and the agent completes the books correctly. Every transaction balances. Every amount is deterministic. All data is local — no cloud services, no external APIs.\n\nGridTRX produces a full set of auditable books: balance sheet, income statement, general ledger, trial balance, adjusting journal entries, retained earnings rollforward. Reports are exportable to CSV and PDF for any time period.\n\nArchitecture\n\nGridTRX has three interfaces to the same engine (models.py → books.db):\n\nMCP Server (preferred for agents) — Structured JSON tools. 20 tools (12 read, 8 write) wrapping models.py directly. No text parsing, typed parameters, deterministic output.\nCLI (fallback for agents, power users) — One-shot shell commands via python cli.py. Zero dependencies beyond Python 3.7+ standard library. Any terminal-based agent can drive it via subprocess.\nBrowser UI (for humans) — Flask web interface at localhost:5000 via python run.py. Ledger browsing, report viewer with drill-down, comparative reports up to 13 columns, bank import with rule preview, reconciliation marking, dark mode.\n\nAll three hit the same models.py data layer. Nothing is out of sync. Use MCP when available. Fall back to CLI otherwise. The browser UI is for human review.\n\nPrerequisites\n\nInstall dependencies before first use (one-time setup):\n\npip install -r requirements.txt\n\n\nOr install individually: pip install mcp (MCP server), pip install flask (browser UI). The CLI has no dependencies beyond the Python 3.7+ standard library.\n\nNo packages are installed at runtime. All dependencies must be pre-installed.\n\nMCP Setup\n\nAdd to the agent's MCP config with GRIDTRX_WORKSPACE set to the user's client folder:\n\n{\n  \"command\": \"python\",\n  \"args\": [\"/path/to/mcp_server.py\"],\n  \"env\": {\"GRIDTRX_WORKSPACE\": \"/path/to/clients\"}\n}\n\n\nGRIDTRX_WORKSPACE is mandatory — the MCP server will refuse to start without it. Any db_path outside the workspace is rejected at runtime. Every MCP tool takes db_path as its first parameter, which must resolve to a books.db file inside the workspace.\n\nCLI Usage\nGRIDTRX_WORKSPACE=/path/to/clients python cli.py /path/to/clients/acme/books.db <command>\n\n\nRuns one command, prints plain text to stdout, exits. When GRIDTRX_WORKSPACE is set, the CLI enforces the same workspace boundary as the MCP server — paths outside the workspace are rejected.\n\nInputs needed\nThe absolute path to the client's books (books.db file or its parent folder).\nThe absolute path to the bank file (.csv, .ofx, or .qbo).\nThe bank account name to post against (typically BANK.CHQ for chequing).\nCore concepts\nDouble-entry: Every transaction is a balanced zero-sum entry. Debits = Credits. Always.\nSign convention: Positive = Debit. Parentheses (1,500.00) = Credit. — = Zero.\nAmounts: Stored as integer cents internally. Displayed as dollars with two decimals.\nAccount names: Case-insensitive, UPPER by convention. Common prefixes: BANK. EX. REV. AR. AP. GST. RE. SHL. — When importing a trial balance or creating accounts, ALWAYS use GridTRX naming. Never use numeric account codes. If the source data has numeric codes (1010, 5800, etc.), ignore the codes and map by description to the nearest GridTRX account name. If no match exists, create the account using the EX. or REV. prefix convention. Always call list_accounts first before creating anything.\nEX.SUSP (Suspense): Where unrecognized transactions land. This is the triage queue. Tell the AI what the suspense items are and it will clear them. Or clear them yourself through the GUI.\nImport rules: Keyword → account mappings. Case-insensitive match, highest priority wins. Optional tax code splits the amount into net + tax automatically.\nLock date: Prevents changes to closed periods. Check before importing historical data.\nArchitecture: Each client is one SQLite file. Copy it, back it up, email it. One data layer (models.py) — CLI, MCP server, and browser UI all call the same functions.\nWorkflow\nStep 1: Initialize (if no books exist)\n\nMCP: No direct tool — use exec to run CLI. CLI: python cli.py then new /path/to/folder \"Company Name\"\n\nThis creates books.db with a full chart of accounts (~60 posting accounts), five reports (BS, IS, AJE, TRX, RE.OFS), 60+ import rules, and four tax codes. Always use starter books as the base — they include the critical perpetual retained earnings chain (IS → NI → RE.CLOSE → RE on BS, plus RE.OFS/RE.OPEN for year-end). Never build reports from scratch without this chain. The fiscal year ceiling (fy_end_date) is automatically set to the current fiscal year end.\n\nAfter setup, run validate to confirm the report chain is intact: CLI: python cli.py /path/to/books.db validate\n\nStep 2: Import bank data\n\nMCP (preferred):\n\nCSV: import_csv(db_path, csv_path, \"BANK.CHQ\")\nOFX/QBO: import_ofx(db_path, ofx_path, \"BANK.CHQ\")\n\nCLI fallback:\n\nCSV: python cli.py /path/to/books.db importcsv /path/to/file.csv BANK.CHQ\nOFX: python cli.py /path/to/books.db importofx /path/to/file.qbo BANK.CHQ\n\nThe import applies all rules automatically. Check the result summary: posted, skipped, to_suspense.\n\nCaseWare AJE import:\n\nMCP: import_aje(db_path, file_path, \"25AJE\")\nCLI: python cli.py /path/to/books.db importaje /path/to/aje_export.iif 25AJE\nSupports QuickBooks IIF and Venice/MYOB text formats. Maps CsW account descriptions to Grid account codes.\nStep 3: Audit suspense\n\nMCP: get_ledger(db_path, \"EX.SUSP\") CLI: python cli.py /path/to/books.db ledger EX.SUSP\n\nEvery entry here is an unrecognized transaction. Note the description and transaction ID for each.\n\nStep 4: Resolve suspense with the user\n\nPresent each suspense item to the user. Ask: \"What category is this?\"\n\nDo NOT guess. If the description is ambiguous (e.g., \"AMAZON\", \"BEST BUY\", \"TRANSFER\"), ask the user for business context before categorizing.\n\nOnce the user answers, add a rule so future imports are automatic:\n\nMCP: add_rule(db_path, \"AMAZON\", \"EX.OFFICE\", \"G5\", 0) CLI: python cli.py /path/to/books.db addrule AMAZON EX.OFFICE G5 0\n\nTax code is optional. Common codes: G5 (GST 5%), H13 (HST 13%), H15 (HST 15%), E (exempt).\n\nStep 5: Clear the bad suspense entries and re-import\n\nDelete each suspense transaction, then re-import so the new rules apply:\n\nMCP: delete_transaction(db_path, txn_id) for each, then import_csv(...) or import_ofx(...) again. CLI: python cli.py /path/to/books.db delete <txn_id> for each, then re-run the import command.\n\nRepeat Steps 3-5 until suspense is empty.\n\nStep 6: Verify and report\n\nMCP:\n\ntrial_balance(db_path) — debits must equal credits\ngenerate_report(db_path, \"BS\") — Balance Sheet\ngenerate_report(db_path, \"IS\") — Income Statement\n\nCLI:\n\npython cli.py /path/to/books.db tb\npython cli.py /path/to/books.db report BS\npython cli.py /path/to/books.db report IS\nStep 7: Year-end rollforward\n\nWhen the fiscal year is complete:\n\nMCP: rollforward(db_path, \"2025-12-31\") CLI: python cli.py /path/to/books.db rollforward 2025-12-31\n\nThis reads RE.CLOSE from the IS, posts Dr RE.OFS / Cr RE.OPEN, sets the lock date, and advances the FY ceiling to the next year. Then repeat from Step 2 for the next fiscal year. Rows beyond the ceiling are automatically skipped during import.\n\nRecovery: Undoing a bad import\n\nIf the user uploaded the wrong file or you imported against the wrong account:\n\nFind the bad transactions: search_transactions(db_path, \"some description\") or via CLI search <keyword>.\nDelete them one by one: delete_transaction(db_path, txn_id) or CLI delete <txn_id>.\nVerify the trial balance still balances after cleanup.\nRe-import the correct file.\n\nThere is no bulk undo. Deletions are individual and respect the lock date — you cannot delete transactions in a locked period.\n\nMCP tools reference (20 tools)\nRead tools\nTool\tPurpose\nlist_accounts(db_path, query?)\tList/search chart of accounts\nget_balance(db_path, account_name, date_from?, date_to?)\tSingle account balance\nget_ledger(db_path, account_name, date_from?, date_to?)\tAccount ledger with running balance\ntrial_balance(db_path, as_of_date?)\tTrial balance — all accounts, Dr/Cr columns\ngenerate_report(db_path, report_name, date_from?, date_to?)\tRun a report (BS, IS, AJE, etc.)\nget_transaction(db_path, txn_id)\tSingle transaction with all journal lines\nsearch_transactions(db_path, query, limit?)\tSearch by description/reference\nlist_reports(db_path)\tList available reports\nlist_rules(db_path)\tList import rules\nget_info(db_path)\tCompany name, fiscal year, lock date\nWrite tools\nTool\tPurpose\npost_transaction(db_path, date, description, amount, debit_account, credit_account)\tPost a simple 2-line entry\ndelete_transaction(db_path, txn_id)\tDelete a transaction (respects lock date)\nadd_account(db_path, name, normal_balance, description?)\tAdd a posting account\nadd_rule(db_path, keyword, account_name, tax_code?, priority?)\tAdd an import rule\ndelete_rule(db_path, rule_id)\tDelete an import rule\nimport_csv(db_path, csv_path, bank_account)\tImport bank CSV\nimport_ofx(db_path, ofx_path, bank_account)\tImport bank OFX/QBO\nimport_aje(db_path, file_path, ref_prefix)\tImport CaseWare AJE export (IIF or Venice)\nrollforward(db_path, ye_date)\tYear-end rollforward (posts RE closing, sets lock, advances ceiling)\nyear_end(db_path, ye_date)\tAlias for rollforward\nset_lock_date(db_path, lock_date?)\tShow or set the lock date\nset_ceiling(db_path, date?)\tShow or set the fiscal year ceiling\nbulk_report_layout(db_path, report_name, items, after_account?, mode?)\tBatch-place items on a report (accounts, totals, labels, separators)\nGuardrails\nNEVER GUESS CATEGORIES. If a transaction description is ambiguous, let it go to EX.SUSP and ask the user. Do not assume \"AMAZON\" is office supplies — it could be inventory, personal, or cost of sales.\nNEVER MODIFY books.db DIRECTLY. All writes go through cli.py commands or MCP tools. Never use file tools to read or write the SQLite database.\nSTAY IN THE WORKSPACE. Only operate on books.db files within the user's GridTRX workspace. Both the MCP server and CLI enforce this when GRIDTRX_WORKSPACE is set — the MCP server will not start without it, and both interfaces reject any path outside the workspace.\nNO OUTBOUND NETWORK REQUESTS. GridTRX processes data locally. It does not phone home, call APIs, or transmit data. Do not attempt to \"verify\" transactions against external services.\nRESPECT THE POSTING WINDOW. Before importing, check the lock date and FY ceiling with get_info(). You cannot post on or before the lock date, or after the FY ceiling. Run rollforward to advance to the next fiscal year.\nPRESERVE RAW OUTPUT. When presenting financial data to the user, use the exact numbers from GridTRX. Do not round, reformat, or flip signs. Positive = Debit. Parentheses = Credit.\nTRIAL BALANCE MUST BALANCE. After any operation, if the trial balance shows unequal debits and credits, something is wrong. Stop and investigate before proceeding.\nLIMIT EXEC SCOPE. When using exec, only run python cli.py commands against books within the workspace. Do not run arbitrary shell commands, install packages, start background processes, or execute scripts other than cli.py. The MCP server is the preferred interface — use CLI only when MCP is unavailable."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/737999/gridtrx",
    "publisherUrl": "https://clawhub.ai/737999/gridtrx",
    "owner": "737999",
    "version": "0.1.21",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/gridtrx",
    "downloadUrl": "https://openagent3.xyz/downloads/gridtrx",
    "agentUrl": "https://openagent3.xyz/skills/gridtrx/agent",
    "manifestUrl": "https://openagent3.xyz/skills/gridtrx/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/gridtrx/agent.md"
  }
}