@geekbeer/minion 4.2.1 → 4.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/lib/bundled-skills.js +94 -0
- package/docs/api-reference.md +117 -7
- package/docs/task-guides.md +19 -0
- package/linux/server.js +24 -0
- package/package.json +1 -1
- package/roles/accountant.md +12 -3
- package/rules/core.md +62 -0
- package/skills/accounting-bookkeeping/SKILL.md +94 -21
- package/skills/accounting-bookkeeping/references/api-counterparties.md +24 -40
- package/skills/accounting-bookkeeping/references/api-expense-reimbursement.md +47 -134
- package/skills/accounting-bookkeeping/references/api-journal-entries.md +29 -12
- package/skills/accounting-bookkeeping/references/api-receipts.md +75 -0
- package/skills/accounting-bookkeeping/references/api-reports-tax.md +106 -0
- package/skills/accounting-bookkeeping/references/troubleshooting.md +42 -25
- package/win/server.js +24 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundled skill deployment.
|
|
3
|
+
*
|
|
4
|
+
* Skills shipped inside the `@geekbeer/minion` package (`skills/`) must reach the
|
|
5
|
+
* LLM skill directories (`~/.claude/skills/`, etc.) for the agent to actually use
|
|
6
|
+
* them. `minion-cli configure` copies them at setup time, but a plain package
|
|
7
|
+
* update (`update-agent` = `npm install -g @geekbeer/minion@latest && restart`)
|
|
8
|
+
* refreshes the files under node_modules WITHOUT re-running configure — so without
|
|
9
|
+
* this, bundled skill fixes never reach a running minion.
|
|
10
|
+
*
|
|
11
|
+
* Unlike rules/roles/docs (which the servers re-copy unconditionally on every
|
|
12
|
+
* startup because they are purely package-owned), skills can be customized per
|
|
13
|
+
* workspace via `minion-cli skill push` / `fetch`, which writes into the same
|
|
14
|
+
* skill directories. Overwriting on every restart would clobber those custom
|
|
15
|
+
* versions. So this sync is **version-gated**: bundled skills are (re)deployed
|
|
16
|
+
* only when the package version differs from the last recorded sync. An
|
|
17
|
+
* `update-agent` bumps the version → defaults refresh once; ordinary restarts
|
|
18
|
+
* leave HQ-fetched customizations intact.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
const fs = require('fs')
|
|
22
|
+
const path = require('path')
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* (Re)deploy bundled skills into the given target directories when the package
|
|
26
|
+
* version has changed since the last sync.
|
|
27
|
+
*
|
|
28
|
+
* @param {object} opts
|
|
29
|
+
* @param {string} opts.packageRoot Absolute path to the package root (contains `skills/`)
|
|
30
|
+
* @param {string} opts.version Current package version (used as the gate key)
|
|
31
|
+
* @param {string[]} opts.targetDirs Skill directories to deploy into (e.g. ~/.claude/skills)
|
|
32
|
+
* @param {string} opts.markerPath File path storing the last-synced version
|
|
33
|
+
* @param {Console} [opts.logger] Logger (defaults to console)
|
|
34
|
+
* @returns {{ synced: boolean, skills?: number, dirs?: number, reason?: string }}
|
|
35
|
+
*/
|
|
36
|
+
function syncBundledSkills({ packageRoot, version, targetDirs, markerPath, logger = console }) {
|
|
37
|
+
const bundledSkillsDir = path.join(packageRoot, 'skills')
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
if (!fs.existsSync(bundledSkillsDir)) {
|
|
41
|
+
return { synced: false, reason: 'no_bundled_skills' }
|
|
42
|
+
}
|
|
43
|
+
if (!version) {
|
|
44
|
+
return { synced: false, reason: 'no_version' }
|
|
45
|
+
}
|
|
46
|
+
if (!Array.isArray(targetDirs) || targetDirs.length === 0) {
|
|
47
|
+
return { synced: false, reason: 'no_target_dirs' }
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Version gate: skip if we already deployed this exact version.
|
|
51
|
+
let lastSynced = null
|
|
52
|
+
try {
|
|
53
|
+
lastSynced = fs.readFileSync(markerPath, 'utf8').trim()
|
|
54
|
+
} catch {
|
|
55
|
+
/* no marker yet → first deploy */
|
|
56
|
+
}
|
|
57
|
+
if (lastSynced === version) {
|
|
58
|
+
return { synced: false, reason: 'up_to_date' }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const skillNames = fs.readdirSync(bundledSkillsDir).filter((name) => {
|
|
62
|
+
try {
|
|
63
|
+
return fs.statSync(path.join(bundledSkillsDir, name)).isDirectory()
|
|
64
|
+
} catch {
|
|
65
|
+
return false
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
for (const targetDir of targetDirs) {
|
|
70
|
+
fs.mkdirSync(targetDir, { recursive: true })
|
|
71
|
+
for (const name of skillNames) {
|
|
72
|
+
const src = path.join(bundledSkillsDir, name)
|
|
73
|
+
const dest = path.join(targetDir, name)
|
|
74
|
+
// Clean replace so files removed from the bundle don't linger.
|
|
75
|
+
fs.rmSync(dest, { recursive: true, force: true })
|
|
76
|
+
fs.cpSync(src, dest, { recursive: true })
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
fs.mkdirSync(path.dirname(markerPath), { recursive: true })
|
|
81
|
+
fs.writeFileSync(markerPath, version)
|
|
82
|
+
|
|
83
|
+
logger.log(
|
|
84
|
+
`[Skills] Re-deployed ${skillNames.length} bundled skill(s) to ${targetDirs.length} dir(s) for v${version}` +
|
|
85
|
+
(lastSynced ? ` (was v${lastSynced})` : ' (first deploy)'),
|
|
86
|
+
)
|
|
87
|
+
return { synced: true, skills: skillNames.length, dirs: targetDirs.length }
|
|
88
|
+
} catch (err) {
|
|
89
|
+
logger.error(`[Skills] Failed to sync bundled skills: ${err.message}`)
|
|
90
|
+
return { synced: false, reason: 'error' }
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
module.exports = { syncBundledSkills }
|
package/docs/api-reference.md
CHANGED
|
@@ -2358,22 +2358,132 @@ POST レスポンス例:
|
|
|
2358
2358
|
| 409 | `version_conflict` (他者の編集と衝突)、`name_conflict`、`order_key_collision` (同時挿入の競合、再送可) |
|
|
2359
2359
|
| 410 | `deck_in_trash` (デッキがゴミ箱にある) |
|
|
2360
2360
|
|
|
2361
|
-
### Accounting
|
|
2361
|
+
### Accounting (HQ, experimental, v4.3.0〜)
|
|
2362
2362
|
|
|
2363
2363
|
`workspaces.feature_flags.experimental_accounting = true` のワークスペース向け。
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
|
|
2364
|
+
**全エンドポイントが accountant ロール必須** — 対象 workspace 内のいずれかのプロジェクトで
|
|
2365
|
+
accountant ロールが付与されたミニオンのみアクセスできる (職務分掌の原則)。
|
|
2366
|
+
|
|
2367
|
+
不正アクセス時のレスポンス:
|
|
2368
|
+
- 403 `{error, code: 'accountant_role_required'}` — ロール無し
|
|
2369
|
+
- 403 `{error, code: 'no_projects'}` — workspace にプロジェクトが存在せず検証不能
|
|
2370
|
+
- 403 `{error, code: 'feature_disabled'}` — accounting フラグ OFF
|
|
2371
|
+
- 401 `{error: 'Missing or invalid Authorization header'}` / `{error: 'Invalid API token'}`
|
|
2372
|
+
|
|
2373
|
+
書き込み API は `created_by_minion_id` / `updated_by_minion_id` 列に呼び出し元ミニオン ID を記録する (HQ UI で「ミニオンが書き込み」バッジが表示される)。仕訳の `source` は常に `'ai_generated'` で記録される。
|
|
2374
|
+
|
|
2375
|
+
**人間専用操作** (ミニオンから提供しない API):
|
|
2376
|
+
|
|
2377
|
+
以下は会計データの根幹に影響するため、ミニオンが自律的に実行することを禁じている。
|
|
2378
|
+
ミニオンは [Threads API](#threads-hq) で `@user` メンションして人間に依頼すること。
|
|
2379
|
+
|
|
2380
|
+
- 決算期の `close` / `reopen` / 期首残高設定
|
|
2381
|
+
- 法人税計算の `finalize` / `journalize` / `reopen`
|
|
2382
|
+
- 仕訳・科目・取引先・立替・税計算の `DELETE`
|
|
2383
|
+
- 勘定科目の rename / アーカイブ (`PATCH`) — ミニオンは作成 (POST) のみ。編集・アーカイブは人間専用
|
|
2384
|
+
- 立替経費の `settle` / `bulk-settle`
|
|
2385
|
+
- レシートの `attach` / `detach` (= 仕訳との紐付け)
|
|
2386
|
+
|
|
2387
|
+
人間依頼の Threads body 例:
|
|
2388
|
+
```json
|
|
2389
|
+
{
|
|
2390
|
+
"thread_type": "help",
|
|
2391
|
+
"mentions": ["user"],
|
|
2392
|
+
"title": "法人税計算 FY3 の finalize お願いします",
|
|
2393
|
+
"content": "計算ID xxxx の入力が完了しました。\nHQダッシュボード /accounting/tax-calculations/xxxx でレビュー後、Finalize → Journalize ボタンを押してください。",
|
|
2394
|
+
"context": { "accounting_action": "tax_finalize", "calculation_id": "xxxx" }
|
|
2395
|
+
}
|
|
2396
|
+
```
|
|
2397
|
+
|
|
2398
|
+
#### Books / Periods
|
|
2399
|
+
|
|
2400
|
+
| Method | Endpoint | 説明 |
|
|
2401
|
+
|--------|----------|-------------|
|
|
2402
|
+
| GET | `/api/minion/workspaces/:id/accounting/books` | 帳簿メタ取得 (org_type, currency, accounting_start_date, closed_through 等)。未存在なら自動作成 |
|
|
2403
|
+
| GET | `/api/minion/workspaces/:id/accounting/periods` | 決算期一覧 (FY1, FY2, ... と status: open/closed) |
|
|
2404
|
+
|
|
2405
|
+
#### Accounts
|
|
2406
|
+
|
|
2407
|
+
| Method | Endpoint | 説明 |
|
|
2408
|
+
|--------|----------|-------------|
|
|
2409
|
+
| GET | `/api/minion/workspaces/:id/accounting/accounts` | 勘定科目一覧。Query: `?type=asset\|liability\|equity\|revenue\|expense`, `?include_archived=true\|false` (default false) |
|
|
2410
|
+
| POST | `/api/minion/workspaces/:id/accounting/accounts` | 勘定科目追加。Body: `{ code?, name, type, is_wallet?, sort_order? }` |
|
|
2411
|
+
|
|
2412
|
+
#### Counterparties (取引先マスタ)
|
|
2413
|
+
|
|
2414
|
+
| Method | Endpoint | 説明 |
|
|
2415
|
+
|--------|----------|-------------|
|
|
2416
|
+
| GET | `/api/minion/workspaces/:id/accounting/counterparties` | 取引先一覧。Query: `?kind=vendor\|customer\|director\|employee\|other`, `?include_archived=true\|false` |
|
|
2417
|
+
| GET | `/api/minion/workspaces/:id/accounting/counterparties/:counterpartyId` | 取引先詳細 + 残高 (`{counterparty, balance: {debit_total, credit_total, net}}`) |
|
|
2418
|
+
| POST | `/api/minion/workspaces/:id/accounting/counterparties` | 取引先追加。Body: `{ name, kind, member_id?, default_payable_account_id? }` |
|
|
2419
|
+
| PATCH | `/api/minion/workspaces/:id/accounting/counterparties/:counterpartyId` | 取引先更新。Body: `{ name?, kind?, member_id?, default_payable_account_id?, is_archived? }` |
|
|
2420
|
+
|
|
2421
|
+
#### Journal Entries (仕訳)
|
|
2422
|
+
|
|
2423
|
+
| Method | Endpoint | 説明 |
|
|
2424
|
+
|--------|----------|-------------|
|
|
2425
|
+
| GET | `/api/minion/workspaces/:id/accounting/entries` | 仕訳一覧。Query: `?from=YYYY-MM-DD&to=YYYY-MM-DD&entry_type=income,expense,...&limit=100&offset=0` |
|
|
2426
|
+
| GET | `/api/minion/workspaces/:id/accounting/entries/:entryId` | 仕訳詳細 (lines 込み) |
|
|
2427
|
+
| POST | `/api/minion/workspaces/:id/accounting/entries` | 仕訳作成。`source='ai_generated'` で記録。期締め後の日付は 409 `code: 'period_closed'` |
|
|
2428
|
+
| PATCH | `/api/minion/workspaces/:id/accounting/entries/:entryId` | 仕訳更新。**`source='ai_generated'` の仕訳のみ更新可** (人間作成仕訳は 409 `code: 'human_owned_entry'`) |
|
|
2429
|
+
|
|
2430
|
+
仕訳 Body の形式は `SimpleEntryInput` (income/expense/transfer) と `ManualEntryInput` (manual) があり、後者は明細を直接指定する。詳細は `src/lib/accounting/entry-builder.ts` を参照。
|
|
2431
|
+
|
|
2432
|
+
#### Receipts (レシート添付)
|
|
2367
2433
|
|
|
2368
2434
|
| Method | Endpoint | 説明 |
|
|
2369
2435
|
|--------|----------|-------------|
|
|
2370
2436
|
| GET | `/api/minion/workspaces/:id/accounting/receipts` | レシート一覧。Query: `?attached=true\|false\|all` (default `false`), `?limit=100` (max 500) |
|
|
2371
2437
|
| GET | `/api/minion/workspaces/:id/accounting/receipts/:receiptId` | メタデータ |
|
|
2372
2438
|
| GET | `/api/minion/workspaces/:id/accounting/receipts/:receiptId/download` | 60秒有効な signed URL を返す (`{ url, mime_type, file_name, expires_in_seconds }`) |
|
|
2373
|
-
|
|
2439
|
+
|
|
2440
|
+
**破壊的変更 (v4.3.0)**: 以前は workspace メンバー全員に開いていたが、accountant ロール必須化。
|
|
2441
|
+
attach/detach (`PATCH`) は人間専用化したので、ミニオンが OCR → 仕訳作成した場合は HQ UI から
|
|
2442
|
+
ユーザーが添付する運用にする。
|
|
2374
2443
|
|
|
2375
2444
|
レシートのMIME種別は `image/png`, `image/jpeg`, `image/webp`, `image/gif`, `image/heic`, `image/heif`, `application/pdf` のいずれか。
|
|
2376
2445
|
|
|
2377
|
-
|
|
2378
|
-
|
|
2446
|
+
#### Expense Reimbursements (立替経費)
|
|
2447
|
+
|
|
2448
|
+
| Method | Endpoint | 説明 |
|
|
2449
|
+
|--------|----------|-------------|
|
|
2450
|
+
| GET | `/api/minion/workspaces/:id/accounting/reimbursements` | 立替経費一覧。Query: `?status=settled\|unsettled\|all`, `?counterparty_id=<uuid>`, `?limit=100&offset=0` |
|
|
2451
|
+
| POST | `/api/minion/workspaces/:id/accounting/reimbursements` | 立替経費追加。Body: `{ paid_by_counterparty_id, occurred_on, amount, description?, expense_account_id, payable_account_id? }`。仕訳 (借方=expense, 貸方=payable) を自動生成 |
|
|
2452
|
+
|
|
2453
|
+
#### Reports (試算表 / B/S / P/L)
|
|
2454
|
+
|
|
2455
|
+
| Method | Endpoint | 説明 |
|
|
2456
|
+
|--------|----------|-------------|
|
|
2457
|
+
| GET | `/api/minion/workspaces/:id/accounting/reports/trial-balance` | 試算表 + B/S + P/L 一括。Query: `?from&to&includeZero=true\|false`。`netAssetBalanceSheet` (正味財産区分付き B/S) は 一般社団法人プロファイルのときのみ含まれる |
|
|
2458
|
+
| GET | `/api/minion/workspaces/:id/accounting/reports/income-statement` | P/L のみ (軽量) |
|
|
2459
|
+
| GET | `/api/minion/workspaces/:id/accounting/reports/balance-sheet` | B/S のみ (軽量) |
|
|
2460
|
+
|
|
2461
|
+
#### Tax Calculations (法人税計算ウィザード)
|
|
2462
|
+
|
|
2463
|
+
`org_type=corporation` または `general_incorporated_association` のみ。それ以外は 403 `code: 'org_type_ineligible'`。
|
|
2464
|
+
|
|
2465
|
+
| Method | Endpoint | 説明 |
|
|
2466
|
+
|--------|----------|-------------|
|
|
2467
|
+
| GET | `/api/minion/workspaces/:id/accounting/tax-calculations` | 計算一覧。Query: `?fiscal_period_id=<uuid>&status=draft,finalized,journalized` |
|
|
2468
|
+
| GET | `/api/minion/workspaces/:id/accounting/tax-calculations/:calcId` | 詳細 `{calculation, adjustments, components}` |
|
|
2469
|
+
| POST | `/api/minion/workspaces/:id/accounting/tax-calculations` | 計算新規作成。Body: `{ fiscal_period_id, notes? }`。6 税目を seed する |
|
|
2470
|
+
| PATCH | `/api/minion/workspaces/:id/accounting/tax-calculations/:calcId` | pretax_income / notes 更新 |
|
|
2471
|
+
| GET | `/api/minion/workspaces/:id/accounting/tax-calculations/:calcId/pretax-income` | P/L から税引前当期純利益を再計算 (法人税科目は除外) |
|
|
2472
|
+
| GET | `/api/minion/workspaces/:id/accounting/tax-calculations/:calcId/ensure-accounts` | 必要4科目 (法人税費用 / 未払 / 仮払 / 未収還付) の存在状況確認 |
|
|
2473
|
+
| POST | `/api/minion/workspaces/:id/accounting/tax-calculations/:calcId/ensure-accounts` | 不足4科目をテンプレから自動追加 |
|
|
2474
|
+
| POST | `/api/minion/workspaces/:id/accounting/tax-calculations/:calcId/adjustments` | 別表四相当の加算/減算追加。Body: `{ adjustment_type: addition\|deduction, category, amount, description?, sort_order? }`。category は `entertainment_excess` / `depreciation_excess` / `executive_salary_excess` / `reserve_addition` / `dividend_excluded` / `tax_refund_excluded` / `custom` |
|
|
2475
|
+
| PATCH | `/api/minion/workspaces/:id/accounting/tax-calculations/:calcId/adjustments/:adjId` | 加算/減算更新 |
|
|
2476
|
+
| DELETE | `/api/minion/workspaces/:id/accounting/tax-calculations/:calcId/adjustments/:adjId` | 加算/減算削除 |
|
|
2477
|
+
| PATCH | `/api/minion/workspaces/:id/accounting/tax-calculations/:calcId/components/:compId` | 税目別の税率・中間納付・(均等割のみ) 直接税額を更新。`tax_rate` は % 表記 (例 `23.2`)。`calculated_amount` は `tax_type='inhabitant_per_capita'` のみ受理 |
|
|
2478
|
+
|
|
2479
|
+
**status 遷移**: ミニオンが触れるのは `draft` のみ。`finalized` / `journalized` 状態の calc を更新しようとすると 409 `code: 'invalid_status'`。reopen も人間専用。
|
|
2480
|
+
|
|
2481
|
+
**典型ワークフロー**:
|
|
2482
|
+
1. `GET /periods` で期一覧を取得し、対象期 (status='open') の id を選ぶ
|
|
2483
|
+
2. `POST /tax-calculations` で新規作成 (pretax_income は P/L から自動取得)
|
|
2484
|
+
3. `POST /tax-calculations/:calcId/ensure-accounts` で必要科目を揃える
|
|
2485
|
+
4. 国税庁・自治体サイトで税率調査 → `PATCH /components/:compId` で各税目の `tax_rate` を入力
|
|
2486
|
+
5. 各税目の中間納付額がある場合 `PATCH /components/:compId` で `prepaid_amount` を入力
|
|
2487
|
+
6. 必要なら `POST /adjustments` で別表四相当の加減算を追加 (調査・税理士相談の上)
|
|
2488
|
+
7. `POST /api/threads` で人間に finalize 依頼
|
|
2379
2489
|
|
package/docs/task-guides.md
CHANGED
|
@@ -152,6 +152,25 @@ minion-cli skill list
|
|
|
152
152
|
minion-cli skill fetch <name>
|
|
153
153
|
```
|
|
154
154
|
|
|
155
|
+
`skill fetch` は **HQ レジストリ** から取得する操作です。HQ に push されていないスキルは
|
|
156
|
+
`Skill not found` になります。
|
|
157
|
+
|
|
158
|
+
### 4. バンドルスキルの配布 (パッケージ同梱スキル)
|
|
159
|
+
|
|
160
|
+
`@geekbeer/minion` パッケージには既定スキル (例: `accounting-bookkeeping`) が同梱されています。
|
|
161
|
+
これらは **HQ レジストリとは別系統** で、以下のタイミングで `~/.claude/skills/` (および有効な
|
|
162
|
+
他 LLM のスキルディレクトリ) へ自動配備されます:
|
|
163
|
+
|
|
164
|
+
- `minion-cli configure` 実行時 (初期セットアップ / HQ接続)
|
|
165
|
+
- **パッケージ更新後のエージェント再起動時** (v4.3.3〜) — `update-agent` で `npm install` した後、
|
|
166
|
+
サーバー起動時に **パッケージのバージョンが変わっていれば** バンドルスキルを再配備する
|
|
167
|
+
(`~/.minion/skills-sync-version` で前回配備バージョンを記録)
|
|
168
|
+
|
|
169
|
+
そのため、バンドルスキルの修正を反映するのに `skill fetch` は不要です。`update-agent` →
|
|
170
|
+
再起動だけで最新版が `~/.claude/skills/` に反映されます。HQ にカスタム版を登録している場合は、
|
|
171
|
+
通常の再起動ではそのカスタム版が保持され (バージョン未変更時は再配備しない)、パッケージ更新時
|
|
172
|
+
のみバンドル既定版で上書きされます。ローカルのスキルは `minion-cli skill list --local` で確認できます。
|
|
173
|
+
|
|
155
174
|
---
|
|
156
175
|
|
|
157
176
|
## DAG ワークフロー (ノード/エッジ形式)
|
package/linux/server.js
CHANGED
|
@@ -58,6 +58,10 @@ const { startTerminalProxy, stopTerminalProxy } = require('./terminal-proxy')
|
|
|
58
58
|
// Config warnings (included in heartbeat)
|
|
59
59
|
const { getConfigWarnings } = require('../core/lib/config-warnings')
|
|
60
60
|
|
|
61
|
+
// Bundled skill deployment (version-gated, see core/lib/bundled-skills.js)
|
|
62
|
+
const { syncBundledSkills } = require('../core/lib/bundled-skills')
|
|
63
|
+
const { getActiveSkillDirs } = require('../core/llm-plugins/lib/skill-dirs')
|
|
64
|
+
|
|
61
65
|
// Pull-model daemons (from core/)
|
|
62
66
|
const stepPoller = require('../core/lib/step-poller')
|
|
63
67
|
const dagStepPoller = require('../core/lib/dag-step-poller')
|
|
@@ -280,6 +284,25 @@ function syncBundledDocs() {
|
|
|
280
284
|
}
|
|
281
285
|
}
|
|
282
286
|
|
|
287
|
+
/**
|
|
288
|
+
* (Re)deploy bundled skills to the active LLM skill directories when the package
|
|
289
|
+
* version changed. Lets `update-agent` (npm install + restart) propagate skill
|
|
290
|
+
* fixes without re-running configure, while preserving HQ-fetched customizations
|
|
291
|
+
* across ordinary restarts. See core/lib/bundled-skills.js.
|
|
292
|
+
*/
|
|
293
|
+
function syncBundledSkillsOnStartup() {
|
|
294
|
+
try {
|
|
295
|
+
syncBundledSkills({
|
|
296
|
+
packageRoot: PACKAGE_ROOT,
|
|
297
|
+
version,
|
|
298
|
+
targetDirs: getActiveSkillDirs(),
|
|
299
|
+
markerPath: path.join(config.HOME_DIR, '.minion', 'skills-sync-version'),
|
|
300
|
+
})
|
|
301
|
+
} catch (err) {
|
|
302
|
+
console.error(`[Skills] Bundled skill sync skipped: ${err.message}`)
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
283
306
|
/**
|
|
284
307
|
* Register all routes (shared + Linux-specific)
|
|
285
308
|
*/
|
|
@@ -339,6 +362,7 @@ async function start() {
|
|
|
339
362
|
syncBundledRules()
|
|
340
363
|
syncBundledRoles()
|
|
341
364
|
syncBundledDocs()
|
|
365
|
+
syncBundledSkillsOnStartup()
|
|
342
366
|
syncPermissions()
|
|
343
367
|
syncTmuxConfig()
|
|
344
368
|
|
package/package.json
CHANGED
package/roles/accountant.md
CHANGED
|
@@ -5,22 +5,31 @@
|
|
|
5
5
|
## 責務
|
|
6
6
|
|
|
7
7
|
- **記帳**: 取引(仕訳)をHQの会計帳簿に正確に記録する
|
|
8
|
-
- **立替経費の処理**:
|
|
8
|
+
- **立替経費の処理**: 役員・従業員が立て替えた経費を記帳する(精算の実行は人間に依頼)
|
|
9
9
|
- **取引先マスタの整備**: 仕入先・顧客・役員・従業員などの取引先を整備する
|
|
10
10
|
- **補助元帳の照会**: 取引先別の残高・明細を確認し、PMやユーザーへ報告する
|
|
11
|
+
- **勘定科目の追加**: テンプレートに不足している科目を追加する(rename/アーカイブ/削除は人間専用)
|
|
12
|
+
- **財務諸表の照会・報告**: 試算表・B/S・P/L を取得し、PMやユーザーへ報告する
|
|
13
|
+
- **法人税計算の補助**: 税引前利益の確認・税率調査・別表四加減算の入力を行い、finalize/journalize は人間に依頼する
|
|
11
14
|
|
|
12
15
|
## 利用するスキル
|
|
13
16
|
|
|
14
17
|
会計操作の具体手順とAPI仕様は専用スキルにまとまっています。コアルールにはあえて含めていません(トークン圧迫を避けるため)。
|
|
15
18
|
|
|
16
|
-
- `/accounting-bookkeeping` —
|
|
19
|
+
- `/accounting-bookkeeping` — 取引記帳・立替経費・補助元帳・財務諸表照会・法人税計算の標準フロー
|
|
17
20
|
- 詳細仕様は `~/.claude/skills/accounting-bookkeeping/references/` 配下を必要時に参照
|
|
18
21
|
|
|
19
|
-
|
|
22
|
+
このスキルは `@geekbeer/minion` パッケージに同梱されており、セットアップ時およびパッケージ更新後の
|
|
23
|
+
エージェント再起動時に `~/.claude/skills/` へ自動配備されます。通常 `skill fetch` は不要です。
|
|
24
|
+
万一ローカルに存在しない場合は `minion-cli skill list --local` で確認し、HQ にカスタム版を登録している
|
|
25
|
+
場合のみ `minion-cli skill fetch accounting-bookkeeping` で取得してください
|
|
26
|
+
(バンドル版は HQ には登録されていないため、未カスタムだと `Skill not found` になります)。
|
|
20
27
|
|
|
21
28
|
## 重要な原則
|
|
22
29
|
|
|
30
|
+
- **高リスク操作は人間に依頼する。** 決算期の close/reopen、法人税計算の finalize/journalize、各リソースの DELETE、勘定科目の rename/アーカイブ、立替経費の精算(settle)はミニオンに提供されていません。必要な場合は `POST /api/threads` で `@user` メンションして HQ UI 操作を依頼すること。
|
|
23
31
|
- **仕訳の確定済み(closed)期は修正しない。** 締め後の仕訳訂正はPMの承認が必要です。
|
|
32
|
+
- **編集できる仕訳は自分(AI)が作成したものだけ。** 人間作成仕訳の PATCH は 409 `human_owned_entry` で弾かれます。訂正が必要なら人間に依頼。
|
|
24
33
|
- **立替経費は取引先(counterparty)を必ず紐付ける。** 「誰の立替か」を後から照会できるようにするため。
|
|
25
34
|
- **default_payable_account_id 未設定の取引先には立替記帳できない。** API が 422 を返します。先に取引先ページで貸方科目を設定してください。
|
|
26
35
|
- **判断に迷ったら勝手に進めない。** 不明な取引・推測の余地がある仕訳は、threadで PM にエスカレーションすること。
|
package/rules/core.md
CHANGED
|
@@ -514,6 +514,68 @@ cp /tmp/report.pdf ~/files/reports/2026-04/report.pdf
|
|
|
514
514
|
- テキスト成果物 → ローカルメモリ (`POST /api/memory`) に保存
|
|
515
515
|
- バイナリファイル → `~/files/` に保存
|
|
516
516
|
|
|
517
|
+
## Accounting Operations (会計操作, v4.3.0〜)
|
|
518
|
+
|
|
519
|
+
会計データは法的責任を伴うため、**accountant ロールを付与されたミニオンのみ** 操作可能。
|
|
520
|
+
|
|
521
|
+
### アクセス要件
|
|
522
|
+
|
|
523
|
+
- 対象 workspace 内の **いずれかのプロジェクト** で `accountant` ロールを持っていること
|
|
524
|
+
- workspace で `experimental_accounting` feature flag が ON であること
|
|
525
|
+
- 不在の場合は 403 `code: 'accountant_role_required'` / `'feature_disabled'` が返る
|
|
526
|
+
|
|
527
|
+
### API
|
|
528
|
+
|
|
529
|
+
エンドポイントは `/api/minion/workspaces/:id/accounting/*`。詳細は `~/.minion/docs/api-reference.md` の「Accounting」セクションを参照。
|
|
530
|
+
|
|
531
|
+
主なリソース:
|
|
532
|
+
- **Books / Periods / Reports** — 帳簿メタ、決算期、試算表 / B/S / P/L (照会のみ)
|
|
533
|
+
- **Accounts** — 勘定科目の照会 (GET) と追加 (POST) のみ。rename / アーカイブ / 削除は人間専用
|
|
534
|
+
- **Counterparties** — 取引先マスタの照会・追加・更新 (GET / POST / PATCH。`is_archived` でアーカイブ可)
|
|
535
|
+
- **Journal Entries** — 仕訳の作成 (POST) と AI 生成仕訳の更新 (PATCH)
|
|
536
|
+
- **Receipts** — レシート一覧 / ダウンロード
|
|
537
|
+
- **Expense Reimbursements** — 立替経費の登録
|
|
538
|
+
- **Tax Calculations** — 法人税計算ウィザード (別表四相当の加減算 + 6 税目別税率入力 + 仕訳生成準備)
|
|
539
|
+
|
|
540
|
+
### 守るべきルール
|
|
541
|
+
|
|
542
|
+
1. **仕訳は `source='ai_generated'` で自動記録される** — ミニオン経由で作成した仕訳は HQ UI で 🤖 バッジ付きで表示される。人間がレビューしてから承認する前提で動くこと。
|
|
543
|
+
2. **人間作成仕訳 (`source='manual'` / `'import'`) は更新できない** — PATCH すると 409 `code: 'human_owned_entry'`。修正が必要なら人間に依頼する。
|
|
544
|
+
3. **税率はユーザー責任で入力する** — 法人税計算ウィザードの税率欄は国税庁・自治体サイトで最新値を調査して入力すること。本ツールは税率テーブルを持たない。
|
|
545
|
+
|
|
546
|
+
### 人間専用操作 (ミニオンから提供されない API)
|
|
547
|
+
|
|
548
|
+
以下はデータの根幹に影響するため、ミニオンが自律実行することを禁止している。
|
|
549
|
+
ミニオンは **threads で `@user` メンション + 計算 ID / 期 ID をリンクして人間に依頼** すること。
|
|
550
|
+
|
|
551
|
+
| 操作 | 依頼すべき相手 / 方法 |
|
|
552
|
+
|------|---------------------|
|
|
553
|
+
| 決算期の `close` / `reopen` / 期首残高設定 | HQ ダッシュボード `/accounting/periods` から人間が実行 |
|
|
554
|
+
| 法人税計算の `finalize` / `journalize` / `reopen` | `/accounting/tax-calculations/:id` のウィザード末尾ボタン |
|
|
555
|
+
| 仕訳・科目・取引先・税計算の `DELETE` | HQ UI 各リスト画面 |
|
|
556
|
+
| 勘定科目の rename / アーカイブ (`PATCH`) | `/accounting/accounts` から人間が実行 (ミニオンは POST のみ) |
|
|
557
|
+
| 立替経費の `settle` / `bulk-settle` | `/accounting/reimbursements` の精算ボタン |
|
|
558
|
+
| レシートと仕訳の `attach` / `detach` | HQ UI で人間が判断 |
|
|
559
|
+
|
|
560
|
+
依頼スレッドの body 例:
|
|
561
|
+
```bash
|
|
562
|
+
curl -X POST -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \
|
|
563
|
+
http://localhost:8080/api/threads \
|
|
564
|
+
-d '{
|
|
565
|
+
"thread_type": "help",
|
|
566
|
+
"mentions": ["user"],
|
|
567
|
+
"title": "法人税計算 FY3 の finalize お願いします",
|
|
568
|
+
"content": "計算ID XXXX の入力が完了しました。HQダッシュボードでレビュー後、Finalize → Journalize ボタンを押してください。",
|
|
569
|
+
"context": { "accounting_action": "tax_finalize", "calculation_id": "XXXX" }
|
|
570
|
+
}'
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
### 監査と可視化
|
|
574
|
+
|
|
575
|
+
ミニオン書き込みは以下で記録・可視化される:
|
|
576
|
+
- DB: `created_by_minion_id` / `updated_by_minion_id` 列 (主要 7 テーブル)
|
|
577
|
+
- HQ UI: 仕訳一覧 / 取引先 / 立替経費 / 法人税計算ウィザードの各項目に 🤖 バッジ表示
|
|
578
|
+
|
|
517
579
|
## Documentation
|
|
518
580
|
|
|
519
581
|
API仕様やタスク手順の詳細は以下を参照:
|
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: accounting-bookkeeping
|
|
3
|
-
description:
|
|
3
|
+
description: 会計帳簿の記帳・立替経費の処理・補助元帳の照会・財務諸表の照会・法人税計算の補助を行うワークフロー。使用タイミング:(1) 取引を仕訳として記録する時、(2) 役員・従業員の立替経費を記帳する時、(3) 取引先別の残高を確認する時、(4) 試算表・B/S・P/L を取得して報告する時、(5) 法人税計算ウィザードに入力する時。accountantロールのミニオンが主に使用する。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Accounting Bookkeeping
|
|
7
7
|
|
|
8
8
|
会計帳簿(HQ Accounting API)を操作するためのスキル。複式簿記の整合性を保ちながら、AI(ミニオン)が安全に記帳できるよう設計されている。
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## 前提・アクセス要件
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
このスキルが叩くのは **ミニオン専用の会計 API** (`$HQ_URL/api/minion/workspaces/:id/accounting/*`)。
|
|
13
|
+
人間用の `/api/accounting/*` (Supabase セッション認証) とは別系統で、**ミニオンは必ずこちらを使う**こと。
|
|
14
|
+
|
|
15
|
+
- 認証は `Authorization: Bearer $API_TOKEN`。`:id` は対象 **ワークスペース ID**(パスに含める)
|
|
16
|
+
- 対象 workspace 内の **いずれかのプロジェクト**で `accountant` ロールを持っていること
|
|
17
|
+
(持たない場合は 403 `code: 'accountant_role_required'`)
|
|
18
|
+
- workspace で `experimental_accounting` feature flag が ON であること
|
|
19
|
+
(OFF なら 403 `code: 'feature_disabled'`)
|
|
20
|
+
- 1ワークスペース1帳簿の前提。`GET .../books` で帳簿を取得し、勘定科目テンプレートはデフォルトで投入済み
|
|
21
|
+
- 書き込みは `created_by_minion_id` / `updated_by_minion_id` に呼び出し元ミニオン ID が記録され、HQ UI で 🤖 バッジ表示される。仕訳の `source` は常に `'ai_generated'`
|
|
22
|
+
|
|
23
|
+
API 全体のエンドポイント表は `~/.minion/docs/api-reference.md` の「Accounting」セクションを参照。
|
|
15
24
|
|
|
16
25
|
## 語彙
|
|
17
26
|
|
|
@@ -26,12 +35,14 @@ description: 会計帳簿の記帳・立替経費の処理・補助元帳の照
|
|
|
26
35
|
|
|
27
36
|
## 典型フロー
|
|
28
37
|
|
|
38
|
+
> 以下のパスはすべて `$HQ_URL/api/minion/workspaces/:id/accounting/` を基準とした相対表記。
|
|
39
|
+
|
|
29
40
|
### A) 通常取引の記帳
|
|
30
41
|
|
|
31
42
|
```
|
|
32
|
-
1. GET /
|
|
43
|
+
1. GET /accounts で勘定科目一覧取得
|
|
33
44
|
2. 入金/出金口座(is_wallet=true)と相手勘定(費用 or 収益)を特定
|
|
34
|
-
3. POST /
|
|
45
|
+
3. POST /entries でシンプル仕訳を作成
|
|
35
46
|
body: { entry_type: 'expense'|'income', entry_date, amount, wallet_account_id, category_account_id, description }
|
|
36
47
|
```
|
|
37
48
|
|
|
@@ -41,37 +52,82 @@ description: 会計帳簿の記帳・立替経費の処理・補助元帳の照
|
|
|
41
52
|
|
|
42
53
|
```
|
|
43
54
|
1. 立替者(役員/従業員)の counterparty を確認
|
|
44
|
-
- GET /
|
|
45
|
-
- 見つからなければ POST /
|
|
55
|
+
- GET /counterparties?kind=director,employee
|
|
56
|
+
- 見つからなければ POST /counterparties で作成
|
|
46
57
|
- default_payable_account_id が未設定なら PATCH で先に設定する
|
|
47
|
-
2. POST /
|
|
58
|
+
2. POST /reimbursements で記帳
|
|
48
59
|
body: { paid_by_counterparty_id, occurred_on, amount, expense_account_id, description }
|
|
49
60
|
→ 内部で「(借)費用 / (貸)立替者の負債科目」の仕訳が自動生成される
|
|
50
|
-
3. レシートがあれば事前に
|
|
61
|
+
3. レシートがあれば事前に GET /receipts で対象を確認 (アップロードと仕訳への attach は人間が HQ UI で行う)
|
|
51
62
|
```
|
|
52
63
|
|
|
53
64
|
詳細: `references/api-expense-reimbursement.md`
|
|
54
65
|
|
|
55
|
-
###
|
|
66
|
+
### B') レシートの照会・OCR
|
|
56
67
|
|
|
57
68
|
```
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
body: { settled_on, wallet_account_id }
|
|
61
|
-
→ 内部で「(借)立替者の負債科目 / (貸)現金or預金」の仕訳が自動生成される
|
|
69
|
+
GET /receipts?attached=false → 未処理(未添付)レシート一覧
|
|
70
|
+
GET /receipts/:receiptId/download → 60秒有効な signed URL を取得し画像/PDFを読み取り (OCR)
|
|
62
71
|
```
|
|
63
72
|
|
|
64
|
-
|
|
73
|
+
読み取った内容から仕訳/立替を作成する。アップロードと仕訳への attach/detach は人間専用。
|
|
74
|
+
詳細: `references/api-receipts.md`
|
|
75
|
+
|
|
76
|
+
### C) 立替経費の精算 — **人間専用**
|
|
77
|
+
|
|
78
|
+
精算 (`settle` / `bulk-settle`) は実際の出金を伴うため**ミニオンからは実行できない**。
|
|
79
|
+
未精算リストを `GET /reimbursements?status=unsettled` で把握し、精算が必要な分は
|
|
80
|
+
`POST /api/threads` で `@user` メンションして HQ UI の精算ボタンを依頼すること。
|
|
65
81
|
|
|
66
82
|
### D) 補助元帳の照会
|
|
67
83
|
|
|
68
84
|
```
|
|
69
|
-
GET /
|
|
70
|
-
→
|
|
85
|
+
GET /counterparties/:counterpartyId
|
|
86
|
+
→ 取引先の詳細 + 残高サマリ ({ counterparty, balance: { debit_total, credit_total, net } }) を返す
|
|
71
87
|
```
|
|
72
88
|
|
|
73
89
|
詳細: `references/api-counterparties.md`
|
|
74
90
|
|
|
91
|
+
### E) 財務諸表の照会・報告
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
GET /reports/trial-balance → 試算表 + B/S + P/L 一括 (Query: ?from&to&includeZero)
|
|
95
|
+
GET /reports/income-statement → P/L のみ (軽量)
|
|
96
|
+
GET /reports/balance-sheet → B/S のみ (軽量)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
PM やユーザーへの月次報告などで使う。取得した数値は**ノート (`hq note create`)** にまとめて共有するとよい。
|
|
100
|
+
詳細: `references/api-reports-tax.md`
|
|
101
|
+
|
|
102
|
+
### F) 法人税計算ウィザードの入力補助
|
|
103
|
+
|
|
104
|
+
`org_type=corporation` / `general_incorporated_association` の帳簿のみ対象 (それ以外は 403 `org_type_ineligible`)。
|
|
105
|
+
ミニオンが触れるのは `draft` 状態のみ。**`finalize` / `journalize` は人間専用**。
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
1. GET /periods で対象期 (status='open') を選ぶ
|
|
109
|
+
2. POST /tax-calculations で新規作成 (pretax_income は P/L から自動取得)
|
|
110
|
+
3. POST /tax-calculations/:calcId/ensure-accounts で必要4科目を揃える
|
|
111
|
+
4. 国税庁・自治体サイトで最新税率を調査 → PATCH /tax-calculations/:calcId/components/:compId で各税目の tax_rate を入力
|
|
112
|
+
5. 中間納付があれば PATCH /components/:compId で prepaid_amount を入力
|
|
113
|
+
6. 必要なら POST /tax-calculations/:calcId/adjustments で別表四相当の加減算を追加
|
|
114
|
+
7. POST /api/threads で人間に finalize → journalize を依頼
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
詳細: `references/api-reports-tax.md`
|
|
118
|
+
|
|
119
|
+
### G) 勘定科目の追加
|
|
120
|
+
|
|
121
|
+
テンプレートに不足している科目(例: 立替用の「役員借入金」)は追加できる。
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
POST /accounts
|
|
125
|
+
body: { name, type: 'asset'|'liability'|'equity'|'revenue'|'expense', code?, is_wallet?, sort_order? }
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**科目の rename / アーカイブ / 削除はミニオンからは実行できない**(人間専用)。
|
|
129
|
+
不要・誤った科目の整理が必要な場合は `POST /api/threads` で人間に HQ UI 操作を依頼すること。
|
|
130
|
+
|
|
75
131
|
## エラーレスポンスの読み方
|
|
76
132
|
|
|
77
133
|
会計APIは AI 向けに以下の構造でエラーを返す:
|
|
@@ -80,7 +136,7 @@ GET /api/accounting/counterparties/<id>/balance
|
|
|
80
136
|
{
|
|
81
137
|
"error": "missing_default_payable_account",
|
|
82
138
|
"message": "取引先「山田太郎」に立替用の貸方科目が未設定です",
|
|
83
|
-
"next_action": "PATCH /
|
|
139
|
+
"next_action": "PATCH /counterparties/<id> で default_payable_account_id を設定してください...",
|
|
84
140
|
"context": { "counterparty_id": "..." }
|
|
85
141
|
}
|
|
86
142
|
```
|
|
@@ -89,9 +145,26 @@ GET /api/accounting/counterparties/<id>/balance
|
|
|
89
145
|
|
|
90
146
|
主要エラーパターンと対処は `references/troubleshooting.md` を参照。
|
|
91
147
|
|
|
148
|
+
## 人間専用操作 (ミニオンから提供されない)
|
|
149
|
+
|
|
150
|
+
以下はデータの根幹に影響するため、ミニオンが自律実行することを禁じている。
|
|
151
|
+
必要な場合は `POST /api/threads` で `@user` メンション + 対象 ID をリンクして人間に依頼する。
|
|
152
|
+
|
|
153
|
+
| 操作 | 依頼先 (HQ UI) |
|
|
154
|
+
|------|---------------|
|
|
155
|
+
| 決算期の close / reopen / 期首残高設定 | `/accounting/periods` |
|
|
156
|
+
| 法人税計算の finalize / journalize / reopen | `/accounting/tax-calculations/:id` ウィザード末尾 |
|
|
157
|
+
| 仕訳・科目・取引先・立替・税計算の DELETE | 各リスト画面 |
|
|
158
|
+
| 科目の rename / アーカイブ (PATCH) | `/accounting/accounts` |
|
|
159
|
+
| 立替経費の settle / bulk-settle | `/accounting/reimbursements` |
|
|
160
|
+
| レシートと仕訳の attach / detach | 各画面 |
|
|
161
|
+
| 人間作成仕訳 (`source='manual'`/`'import'`) の編集 | HQ UI (PATCH は 409 `human_owned_entry`) |
|
|
162
|
+
|
|
92
163
|
## 重要な制約
|
|
93
164
|
|
|
94
|
-
- **確定済み期間(closed)の日付では記帳できない。**
|
|
165
|
+
- **確定済み期間(closed)の日付では記帳できない。** 409 `period_closed` で拒否される。日付を変えるか PM に再オープン依頼
|
|
166
|
+
- **PATCH できる仕訳は `source='ai_generated'` のものだけ。** 人間作成仕訳は 409 `human_owned_entry`
|
|
95
167
|
- **立替の貸方科目は負債(liability) or 純資産(equity)のみ許容。** 資産勘定の「立替金」(他人のために会社が立て替える勘定)は逆向きなので NG
|
|
96
168
|
- **counterparty マスタは book スコープ。** 別帳簿のIDは使えない
|
|
97
169
|
- **複式簿記の借方=貸方は trigger で強制される。** 自前で計算してから POST すること
|
|
170
|
+
- **税率はユーザー責任で入力する。** 本ツールは税率テーブルを持たない。最新値を調査して入力すること
|