@geekbeer/minion 4.2.1 → 4.3.4

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.
@@ -2,19 +2,35 @@
2
2
 
3
3
  会計APIで遭遇しやすいエラーパターンと対処。
4
4
 
5
+ > パスはすべて **ミニオン用** `$HQ_URL/api/minion/workspaces/:id/accounting/` を基準とした相対表記。
6
+
5
7
  ## エラーレスポンスの構造
6
8
 
7
9
  ```json
8
10
  {
9
11
  "error": "missing_default_payable_account",
10
12
  "message": "取引先「山田太郎」に立替用の貸方科目が未設定です",
11
- "next_action": "PATCH /api/accounting/counterparties/<id> で...",
13
+ "next_action": "PATCH /counterparties/<id> で default_payable_account_id を設定してください",
12
14
  "context": { "counterparty_id": "..." }
13
15
  }
14
16
  ```
15
17
 
16
18
  **必ず `next_action` を読み、その指示に従うこと。** 指示が曖昧な場合のみ自己判断する。
17
19
 
20
+ ## アクセス・認証まわり
21
+
22
+ ### `accountant_role_required` (403)
23
+
24
+ **原因:** 呼び出しミニオンが workspace 内のどのプロジェクトでも accountant ロールを持っていない。
25
+
26
+ **対処:** 自己解決不可。`POST /api/threads` で `@user` メンションし、accountant ロール付与を依頼する。
27
+
28
+ ### `feature_disabled` (403)
29
+
30
+ **原因:** workspace で `experimental_accounting` フラグが OFF。
31
+
32
+ **対処:** 自己解決不可。人間にフラグ有効化を依頼する。
33
+
18
34
  ## 立替経費まわり
19
35
 
20
36
  ### `missing_default_payable_account` (422)
@@ -23,9 +39,9 @@
23
39
 
24
40
  **対処:**
25
41
  1. liability 型の科目「役員借入金」「従業員未払金」などがあるか確認
26
- - `GET /api/accounting/accounts` で `type=liability` をフィルタ
27
- 2. 無ければ作成: `POST /api/accounting/accounts` で `{ name: "役員借入金", type: "liability" }`
28
- 3. counterparty に紐付け: `PATCH /api/accounting/counterparties/<id>` で `{ default_payable_account_id: "..." }`
42
+ - `GET /accounts?type=liability`
43
+ 2. 無ければ作成: `POST /accounts` で `{ name: "役員借入金", type: "liability" }`
44
+ 3. counterparty に紐付け: `PATCH /counterparties/<id>` で `{ default_payable_account_id: "..." }`
29
45
  4. 立替記帳をリトライ
30
46
 
31
47
  ### `counterparty_not_found` (404)
@@ -33,8 +49,8 @@
33
49
  **原因:** 立替者の counterparty が未登録。
34
50
 
35
51
  **対処:**
36
- 1. `GET /api/accounting/counterparties?q=<name>` で typo の可能性を確認
37
- 2. 該当者がいなければ `POST /api/accounting/counterparties` で作成
52
+ 1. `GET /counterparties?kind=director,employee` で typo の可能性を確認
53
+ 2. 該当者がいなければ `POST /counterparties` で作成
38
54
  - 役員なら `kind: "director"`、従業員なら `kind: "employee"`
39
55
  - 可能なら `default_payable_account_id` も同時に設定
40
56
 
@@ -47,11 +63,15 @@
47
63
  - 同一人物なら既存IDを使う
48
64
  - 別人なら名前を変える(例: "山田太郎(役員)" vs "山田太郎(従業員)")
49
65
 
50
- ### `already_settled` (409)
66
+ ### 記帳は成功したのに立替精算リストに出ない
51
67
 
52
- **原因:** 精算しようとした立替が既に精算済み。
68
+ **原因:** 立替を `/reimbursements` ではなく**手動仕訳 (`/entries`)** で記帳した。
69
+ `counterparty_id` を行に付けても、`accounting_expense_reimbursements` レコードが作られないため、
70
+ 立替精算リスト (`GET /reimbursements`) には出ない (取引先別補助元帳には出る)。
53
71
 
54
- **対処:** `context.settled_at` と `context.settlement_journal_entry_id` を確認し、二重精算を回避
72
+ **対処:**
73
+ 1. 誤って `/entries` で作った立替仕訳は、ミニオンからは DELETE できない → 人間に取消を依頼
74
+ 2. 改めて `POST /reimbursements` で記帳し直す (借方が会社の負債なら `expense_account_id` に負債科目を渡す)
55
75
 
56
76
  ## 期間まわり
57
77
 
@@ -60,23 +80,22 @@
60
80
  **原因:** 指定日付が締め済期間内。
61
81
 
62
82
  **対処:**
63
- - 締めはPMの権限。勝手に再オープンしない
83
+ - 締めはPMの権限。勝手に再オープンしない(再オープンは人間専用)
64
84
  - 締め後の取引なら日付を調整(後日付に変更)、または PM にエスカレーション
65
85
  - threadで `mentions: ["role:pm"]` を付けて「<DATE> の取引が締め後だが記帳が必要」と相談
66
86
 
67
87
  ## 科目まわり
68
88
 
69
- ### `invalid_expense_account_type` (400)
89
+ ### 立替の借方科目 (`expense_account_id`) に何を指定できるか
70
90
 
71
- **原因:** 立替経費の費用科目に expense 型でない科目を指定した。
91
+ `/reimbursements` `expense_account_id` (= 借方) は**型チェックされず**、費用に限らない。
92
+ 立替で何を支払ったかに応じて選ぶ:
93
+ - 経費の立替 → 費用科目 (`GET /accounts?type=expense`)
94
+ - 会社の負債 (未払金・未払税金) の立替払い → 負債科目 (`GET /accounts?type=liability`)
95
+ - 創立費等の立替 → 繰延資産科目
72
96
 
73
- **対処:** `GET /api/accounting/accounts` で type=expense の科目を取得して使用
74
-
75
- ### `not_a_wallet_account` (400)
76
-
77
- **原因:** 精算時の支払口座に `is_wallet=false` の科目を指定した。
78
-
79
- **対処:** `is_wallet=true` の科目(現金/普通預金)を選択
97
+ (以前のドキュメントには「expense 型でないと `invalid_expense_account_type` で弾かれる」とあったが、
98
+ `/reimbursements` ルートはこの検証を行わない。負債を借方に置く立替も正しく記帳できる。)
80
99
 
81
100
  ### `invalid_default_payable_account` (400)
82
101
 
@@ -84,6 +103,11 @@
84
103
 
85
104
  **対処:** liability 型(または equity 型)の科目を指定する。「立替金」(asset)は逆向きなので使わない
86
105
 
106
+ ### 科目の rename / アーカイブが必要なとき — **人間専用**
107
+
108
+ ミニオンは `POST /accounts`(作成)のみ可能。誤って作った科目の修正・アーカイブ・削除はできない。
109
+ `POST /api/threads` で `@user` メンションして HQ UI `/accounting/accounts` での操作を依頼する。
110
+
87
111
  ## 仕訳整合性
88
112
 
89
113
  ### `at least 2 lines required` / `debit/credit must balance`
@@ -95,6 +119,13 @@
95
119
  - 借方合計 = 貸方合計 を自前で計算してから POST
96
120
  - DB trigger は不整合を必ず検出するので、ローカル検算が大事
97
121
 
122
+ ### `human_owned_entry` (409)
123
+
124
+ **原因:** 人間が作成した仕訳 (`source='manual'`/`'import'`) を PATCH しようとした。
125
+
126
+ **対処:** ミニオンは自分が作成した仕訳 (`source='ai_generated'`) しか編集できない。
127
+ 人間作成仕訳の訂正が必要なら `POST /api/threads` で人間に依頼する。
128
+
98
129
  ## 取引先のアーカイブ
99
130
 
100
131
  ### `has_unsettled_reimbursements` (409)
@@ -102,9 +133,9 @@
102
133
  **原因:** 未精算の立替が残っている取引先をアーカイブしようとした。
103
134
 
104
135
  **対処:**
105
- 1. `GET /api/accounting/expense-reimbursements?counterparty_id=<id>&settled=false` で未精算リスト取得
106
- 2. 各立替を精算 (`POST /<id>/settle`)
107
- 3. アーカイブを再実行
136
+ 1. `GET /reimbursements?counterparty_id=<id>&status=unsettled` で未精算リスト取得
137
+ 2. **精算は人間専用** `POST /api/threads` で `@user` に精算を依頼する
138
+ 3. 全件精算後にアーカイブを再実行
108
139
 
109
140
  ## 自己解決できない場合
110
141
 
@@ -112,6 +143,7 @@
112
143
 
113
144
  1. プロジェクトメモリーで過去事例を検索
114
145
  2. なければ `POST /api/threads` でヘルプスレッド起票
115
- - `thread_type: "help"`, `mentions: ["role:pm"]`
146
+ - `thread_type: "help"`, `mentions: ["role:pm"]` (人間判断が要るなら `["user"]`)
116
147
  - `attempted_resolution` に試したことを必ず書く
117
- 3. **仕訳を中途半端な状態で残さない。** 失敗した立替記帳は `DELETE /api/accounting/expense-reimbursements/<id>` で取り消してからエスカレーション
148
+ 3. **仕訳を中途半端な状態で残さない。** ただしミニオンは仕訳・立替を DELETE できないため、
149
+ 取消が必要な場合は状況を thread に明記して人間に削除を依頼する
package/win/server.js CHANGED
@@ -33,6 +33,10 @@ const boardTaskRunner = require('./board-task-runner')
33
33
  // Config warnings (included in heartbeat)
34
34
  const { getConfigWarnings } = require('../core/lib/config-warnings')
35
35
 
36
+ // Bundled skill deployment (version-gated, see core/lib/bundled-skills.js)
37
+ const { syncBundledSkills } = require('../core/lib/bundled-skills')
38
+ const { getActiveSkillDirs } = require('../core/llm-plugins/lib/skill-dirs')
39
+
36
40
  // Pull-model daemons (from core/)
37
41
  const stepPoller = require('../core/lib/step-poller')
38
42
  const dagStepPoller = require('../core/lib/dag-step-poller')
@@ -214,6 +218,25 @@ function syncBundledDocs() {
214
218
  }
215
219
  }
216
220
 
221
+ /**
222
+ * (Re)deploy bundled skills to the active LLM skill directories when the package
223
+ * version changed. Lets `update-agent` (npm install + restart) propagate skill
224
+ * fixes without re-running configure, while preserving HQ-fetched customizations
225
+ * across ordinary restarts. See core/lib/bundled-skills.js.
226
+ */
227
+ function syncBundledSkillsOnStartup() {
228
+ try {
229
+ syncBundledSkills({
230
+ packageRoot: path.join(__dirname, '..'),
231
+ version,
232
+ targetDirs: getActiveSkillDirs(),
233
+ markerPath: path.join(config.HOME_DIR, '.minion', 'skills-sync-version'),
234
+ })
235
+ } catch (err) {
236
+ console.error(`[Skills] Bundled skill sync skipped: ${err.message}`)
237
+ }
238
+ }
239
+
217
240
  /**
218
241
  * Register all routes (compatible + Windows-specific)
219
242
  */
@@ -285,6 +308,7 @@ async function start() {
285
308
  syncBundledRules()
286
309
  syncBundledRoles()
287
310
  syncBundledDocs()
311
+ syncBundledSkillsOnStartup()
288
312
  syncPermissions()
289
313
  // Note: tmux.conf sync is skipped on Windows (not needed)
290
314